summaryrefslogtreecommitdiffstats
path: root/java/com/android/voicemail
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/voicemail')
-rw-r--r--java/com/android/voicemail/VoicemailClient.java32
-rw-r--r--java/com/android/voicemail/VoicemailPermissionHelper.java60
-rw-r--r--java/com/android/voicemail/impl/ActivationTask.java21
-rw-r--r--java/com/android/voicemail/impl/AndroidManifest.xml26
-rw-r--r--java/com/android/voicemail/impl/OmtpReceiver.java2
-rw-r--r--java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java2
-rw-r--r--java/com/android/voicemail/impl/StatusCheckJobService.java71
-rw-r--r--java/com/android/voicemail/impl/StatusCheckTask.java128
-rw-r--r--java/com/android/voicemail/impl/VoicemailBootReceiver.java31
-rw-r--r--java/com/android/voicemail/impl/VoicemailClientImpl.java19
-rw-r--r--java/com/android/voicemail/impl/VoicemailModule.java19
-rw-r--r--java/com/android/voicemail/impl/VvmPackageInstallReceiver.java34
-rw-r--r--java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java10
-rw-r--r--java/com/android/voicemail/impl/mail/Address.java8
-rw-r--r--java/com/android/voicemail/impl/mail/internet/MimeMessage.java40
-rw-r--r--java/com/android/voicemail/impl/mail/internet/MimeUtility.java9
-rw-r--r--java/com/android/voicemail/impl/mail/store/ImapFolder.java36
-rw-r--r--java/com/android/voicemail/impl/mail/store/ImapStore.java3
-rw-r--r--java/com/android/voicemail/impl/protocol/Vvm3Protocol.java11
-rw-r--r--java/com/android/voicemail/impl/res/values-af/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-am/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ar/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-az/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-b+sr+Latn/strings.xml53
-rw-r--r--java/com/android/voicemail/impl/res/values-be/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-bg/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-bn/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-bs/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ca/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-cs/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-da/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-de/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-el/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-en-rAU/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-en-rGB/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-en-rIN/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-es-rUS/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-es/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-et/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-eu/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-fa/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-fi/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-fr-rCA/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-fr/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-gl/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-gu/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-hi/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-hr/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-hu/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-hy/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-in/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-is/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-it/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-iw/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ja/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ka/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-kk/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-km/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-kn/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ko/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ky/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-lo/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-lt/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-lv/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-mk/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ml/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-mn/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-mr/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ms/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-my/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-nb/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ne/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-nl/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-no/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-pa/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-pl/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-pt-rBR/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-pt-rPT/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-pt/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ro/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ru/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-si/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-sk/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-sl/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-sq/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-sr/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-sv/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-sw/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ta/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-te/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-th/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-tl/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-tr/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-uk/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-ur/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-uz/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-vi/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-zh-rCN/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-zh-rHK/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-zh-rTW/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values-zu/strings.xml1
-rw-r--r--java/com/android/voicemail/impl/res/values/strings.xml5
-rw-r--r--java/com/android/voicemail/impl/scheduling/BaseTask.java36
-rw-r--r--java/com/android/voicemail/impl/scheduling/BlockerTask.java14
-rw-r--r--java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java5
-rw-r--r--java/com/android/voicemail/impl/scheduling/Policy.java4
-rw-r--r--java/com/android/voicemail/impl/scheduling/PostponePolicy.java6
-rw-r--r--java/com/android/voicemail/impl/scheduling/RetryPolicy.java11
-rw-r--r--java/com/android/voicemail/impl/scheduling/Task.java38
-rw-r--r--java/com/android/voicemail/impl/scheduling/TaskQueue.java149
-rw-r--r--java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java158
-rw-r--r--java/com/android/voicemail/impl/scheduling/TaskSchedulerService.java294
-rw-r--r--java/com/android/voicemail/impl/scheduling/Tasks.java73
-rw-r--r--java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java2
-rw-r--r--java/com/android/voicemail/impl/settings/VoicemailChangePinActivity.java7
-rw-r--r--java/com/android/voicemail/impl/settings/VoicemailSettingsFragment.java4
-rw-r--r--java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java92
-rw-r--r--java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java33
-rw-r--r--java/com/android/voicemail/impl/sync/SyncOneTask.java20
-rw-r--r--java/com/android/voicemail/impl/sync/SyncTask.java18
-rw-r--r--java/com/android/voicemail/impl/sync/UploadTask.java7
-rw-r--r--java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java36
-rw-r--r--java/com/android/voicemail/impl/utils/LoggerUtils.java33
-rw-r--r--java/com/android/voicemail/stub/StubVoicemailClient.java14
124 files changed, 1352 insertions, 403 deletions
diff --git a/java/com/android/voicemail/VoicemailClient.java b/java/com/android/voicemail/VoicemailClient.java
index 74823384c..97b824b27 100644
--- a/java/com/android/voicemail/VoicemailClient.java
+++ b/java/com/android/voicemail/VoicemailClient.java
@@ -39,12 +39,34 @@ public interface VoicemailClient {
* android.content.Intent#ACTION_PROVIDER_CHANGED} will always be a self-change even if the UI is
* external to the client.
*/
- String ACTION_UPLOAD = "com.android.voicemailomtp.VoicemailClient.ACTION_UPLOAD";
+ String ACTION_UPLOAD = "com.android.voicemail.VoicemailClient.ACTION_UPLOAD";
/** Common key for passing {@link PhoneAccountHandle} in bundles. */
String PARAM_PHONE_ACCOUNT_HANDLE = "phone_account_handle";
/**
+ * Broadcast from the client to inform the app to show a legacy voicemail notification. This
+ * broadcast is same as {@link TelephonyManager#ACTION_SHOW_VOICEMAIL_NOTIFICATION}.
+ */
+ String ACTION_SHOW_LEGACY_VOICEMAIL =
+ "com.android.voicemail.VoicemailClient.ACTION_SHOW_LEGACY_VOICEMAIL";
+
+ /**
+ * Whether the visual voicemail service is enabled for the {@code phoneAccountHandle}. "Enable"
+ * means the user "wants" to have this service on, and does not mean the service is actually
+ * functional(For example, the service is blocked on the carrier side. The service will be
+ * "enabled" but all it will do is show the error).
+ */
+ boolean isVoicemailEnabled(Context context, PhoneAccountHandle phoneAccountHandle);
+
+ /**
+ * Enable or disable visual voicemail service for the {@code phoneAccountHandle}. Setting to
+ * enabled will initiate provisioning and activation. Setting to disabled will initiate
+ * deactivation.
+ */
+ void setVoicemailEnabled(Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled);
+
+ /**
* Appends the selection to ignore voicemails from non-active OMTP voicemail package. In OC there
* can be multiple packages handling OMTP voicemails which represents the same source of truth.
* These packages should mark their voicemails as {@link Voicemails#IS_OMTP_VOICEMAIL} and only
@@ -92,4 +114,12 @@ public interface VoicemailClient {
* when calling into the mailbox.
*/
Intent getSetPinIntent(Context context, PhoneAccountHandle phoneAccountHandle);
+
+ /**
+ * Whether the client is activated and handling visual voicemail for the {@code
+ * phoneAccountHandle}. "Enable" is the intention to use VVM. For example VVM can be enabled but
+ * prevented from working because the carrier blocked it, or a connection problem is blocking the
+ * provisioning. Being "activated" means all setup are completed, and VVM is expected to work.
+ */
+ boolean isActivated(Context context, PhoneAccountHandle phoneAccountHandle);
}
diff --git a/java/com/android/voicemail/VoicemailPermissionHelper.java b/java/com/android/voicemail/VoicemailPermissionHelper.java
new file mode 100644
index 000000000..1a09d45fd
--- /dev/null
+++ b/java/com/android/voicemail/VoicemailPermissionHelper.java
@@ -0,0 +1,60 @@
+/*
+ * 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.voicemail;
+
+import android.Manifest.permission;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.support.annotation.NonNull;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Handles permission checking for the voicemail module. Currently "phone" and "sms" permissions are
+ * required.
+ */
+public class VoicemailPermissionHelper {
+
+ /** *_VOICEMAIL permissions are auto-granted by being the default dialer. */
+ private static final String[] VOICEMAIL_PERMISSIONS = {
+ permission.ADD_VOICEMAIL,
+ permission.WRITE_VOICEMAIL,
+ permission.READ_VOICEMAIL,
+ permission.READ_PHONE_STATE,
+ permission.SEND_SMS
+ };
+
+ /**
+ * Returns {@code true} if the app has all permissions required for the voicemail module to
+ * operate.
+ */
+ public static boolean hasPermissions(Context context) {
+ return getMissingPermissions(context).isEmpty();
+ }
+
+ /** Returns a list of permission that is missing for the voicemail module to operate. */
+ @NonNull
+ public static List<String> getMissingPermissions(Context context) {
+ List<String> result = new ArrayList<>();
+ for (String permission : VOICEMAIL_PERMISSIONS) {
+ if (context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
+ result.add(permission);
+ }
+ }
+ return result;
+ }
+}
diff --git a/java/com/android/voicemail/impl/ActivationTask.java b/java/com/android/voicemail/impl/ActivationTask.java
index c53d3c722..b0ad3bafc 100644
--- a/java/com/android/voicemail/impl/ActivationTask.java
+++ b/java/com/android/voicemail/impl/ActivationTask.java
@@ -29,8 +29,8 @@ import android.support.annotation.WorkerThread;
import android.telecom.PhoneAccountHandle;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.proguard.UsedByReflection;
import com.android.voicemail.impl.protocol.VisualVoicemailProtocol;
import com.android.voicemail.impl.scheduling.BaseTask;
import com.android.voicemail.impl.scheduling.RetryPolicy;
@@ -40,6 +40,7 @@ import com.android.voicemail.impl.sms.StatusSmsFetcher;
import com.android.voicemail.impl.sync.OmtpVvmSyncService;
import com.android.voicemail.impl.sync.SyncTask;
import com.android.voicemail.impl.sync.VvmAccountManager;
+import com.android.voicemail.impl.utils.LoggerUtils;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
@@ -55,6 +56,7 @@ import java.util.concurrent.TimeoutException;
* spontaneously sent a STATUS SMS.
*/
@TargetApi(VERSION_CODES.O)
+@UsedByReflection(value = "Tasks.java")
public class ActivationTask extends BaseTask {
private static final String TAG = "VvmActivationTask";
@@ -107,14 +109,15 @@ public class ActivationTask extends BaseTask {
}
@Override
- public void onCreate(Context context, Intent intent, int flags, int startId) {
- super.onCreate(context, intent, flags, startId);
- mMessageData = intent.getParcelableExtra(EXTRA_MESSAGE_DATA_BUNDLE);
+ public void onCreate(Context context, Bundle extras) {
+ super.onCreate(context, extras);
+ mMessageData = extras.getParcelable(EXTRA_MESSAGE_DATA_BUNDLE);
}
@Override
public Intent createRestartIntent() {
- Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_AUTO_RETRY_ACTIVATION);
+ LoggerUtils.logImpressionOnMainThread(
+ getContext(), DialerImpression.Type.VVM_AUTO_RETRY_ACTIVATION);
Intent intent = super.createRestartIntent();
// mMessageData is discarded, request a fresh STATUS SMS for retries.
return intent;
@@ -124,7 +127,8 @@ public class ActivationTask extends BaseTask {
@WorkerThread
public void onExecuteInBackgroundThread() {
Assert.isNotMainThread();
- Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_ACTIVATION_STARTED);
+ LoggerUtils.logImpressionOnMainThread(
+ getContext(), DialerImpression.Type.VVM_ACTIVATION_STARTED);
PhoneAccountHandle phoneAccountHandle = getPhoneAccountHandle();
if (phoneAccountHandle == null) {
// This should never happen
@@ -234,7 +238,8 @@ public class ActivationTask extends BaseTask {
helper.handleEvent(status, OmtpEvents.CONFIG_SERVICE_NOT_AVAILABLE);
}
}
- Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_ACTIVATION_COMPLETED);
+ LoggerUtils.logImpressionOnMainThread(
+ getContext(), DialerImpression.Type.VVM_ACTIVATION_COMPLETED);
}
public static void updateSource(
diff --git a/java/com/android/voicemail/impl/AndroidManifest.xml b/java/com/android/voicemail/impl/AndroidManifest.xml
index 97e397385..47a4b2dd3 100644
--- a/java/com/android/voicemail/impl/AndroidManifest.xml
+++ b/java/com/android/voicemail/impl/AndroidManifest.xml
@@ -80,6 +80,16 @@
android:name="com.android.voicemail.impl.scheduling.TaskSchedulerService"
android:exported="false"/>
+ <service
+ android:name="com.android.voicemail.impl.scheduling.TaskSchedulerJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE"
+ android:exported="false"/>
+
+ <service
+ android:name="com.android.voicemail.impl.StatusCheckJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE"
+ android:exported="false"/>
+
<receiver android:name="com.android.voicemail.impl.OmtpReceiver"
android:exported="true">
<intent-filter>
@@ -92,5 +102,21 @@
android:exported="false"
android:windowSoftInputMode="stateVisible|adjustResize">
</activity>
+
+ <receiver android:name="com.android.voicemail.impl.VoicemailBootReceiver"
+ android:exported="false">
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
+ </intent-filter>
+ </receiver>
+
+ <receiver android:name="com.android.voicemail.impl.VvmPackageInstallReceiver">
+ <intent-filter>
+ <!-- New O broadcast, can be received in background. Only applies to installation and not
+ updates -->
+ <action android:name="android.intent.action.PACKAGE_FIRST_ADDED" />
+ <data android:scheme="package"/>
+ </intent-filter>
+ </receiver>
</application>
</manifest>
diff --git a/java/com/android/voicemail/impl/OmtpReceiver.java b/java/com/android/voicemail/impl/OmtpReceiver.java
index 239a544c4..9baf95415 100644
--- a/java/com/android/voicemail/impl/OmtpReceiver.java
+++ b/java/com/android/voicemail/impl/OmtpReceiver.java
@@ -24,8 +24,8 @@ import android.os.Build.VERSION_CODES;
import android.telecom.PhoneAccountHandle;
import android.telephony.VisualVoicemailSms;
import com.android.dialer.common.Assert;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.voicemail.VoicemailComponent;
import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil;
import com.android.voicemail.impl.sync.VvmAccountManager;
diff --git a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
index 095f00bb7..2f1df09dd 100644
--- a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
+++ b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
@@ -336,9 +336,11 @@ public class OmtpVvmCarrierConfigHelper {
public void startDeactivation() {
Assert.checkArgument(isValid());
+ VvmLog.i(TAG, "startDeactivation");
if (!isLegacyModeEnabled()) {
// SMS should still be filtered in legacy mode
VisualVoicemailService.setSmsFilterSettings(mContext, getPhoneAccountHandle(), null);
+ VvmLog.i(TAG, "filter disabled");
}
if (mProtocol != null) {
mProtocol.startDeactivation(this);
diff --git a/java/com/android/voicemail/impl/StatusCheckJobService.java b/java/com/android/voicemail/impl/StatusCheckJobService.java
new file mode 100644
index 000000000..870c5b471
--- /dev/null
+++ b/java/com/android/voicemail/impl/StatusCheckJobService.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * <p>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
+ *
+ * <p>http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * <p>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.voicemail.impl;
+
+import android.annotation.TargetApi;
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Build.VERSION_CODES;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import com.android.dialer.constants.ScheduledJobIds;
+import com.android.voicemail.impl.sync.VvmAccountManager;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A job to perform {@link StatusCheckTask} once per day, performing book keeping to ensure the
+ * credentials and status for a activated voicemail account is still correct. A task will be
+ * scheduled for each active voicemail account. The status is expected to be always in sync, the
+ * check is a failsafe to mimic the previous status check on signal return behavior.
+ */
+@TargetApi(VERSION_CODES.O)
+public class StatusCheckJobService extends JobService {
+
+ public static void schedule(Context context) {
+ JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
+ if (jobScheduler.getPendingJob(ScheduledJobIds.VVM_STATUS_CHECK_JOB) != null) {
+ VvmLog.i("StatusCheckJobService.schedule", "job already scheduled");
+ return;
+ }
+
+ jobScheduler.schedule(
+ new JobInfo.Builder(
+ ScheduledJobIds.VVM_STATUS_CHECK_JOB,
+ new ComponentName(context, StatusCheckJobService.class))
+ .setPeriodic(TimeUnit.DAYS.toMillis(1))
+ .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
+ .setRequiresCharging(true)
+ .build());
+ }
+
+ @Override
+ public boolean onStartJob(JobParameters params) {
+ for (PhoneAccountHandle phoneAccountHandle :
+ getSystemService(TelecomManager.class).getCallCapablePhoneAccounts()) {
+ if (VvmAccountManager.isAccountActivated(this, phoneAccountHandle)) {
+ StatusCheckTask.start(this, phoneAccountHandle);
+ }
+ }
+ return false; // not running in background
+ }
+
+ @Override
+ public boolean onStopJob(JobParameters params) {
+ return false; // don't retry
+ }
+}
diff --git a/java/com/android/voicemail/impl/StatusCheckTask.java b/java/com/android/voicemail/impl/StatusCheckTask.java
new file mode 100644
index 000000000..7699e9848
--- /dev/null
+++ b/java/com/android/voicemail/impl/StatusCheckTask.java
@@ -0,0 +1,128 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * <p>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
+ *
+ * <p>http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * <p>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.voicemail.impl;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build.VERSION_CODES;
+import android.os.Bundle;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyManager;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.proguard.UsedByReflection;
+import com.android.voicemail.impl.scheduling.BaseTask;
+import com.android.voicemail.impl.sms.StatusMessage;
+import com.android.voicemail.impl.sms.StatusSmsFetcher;
+import com.android.voicemail.impl.sync.VvmAccountManager;
+import com.android.voicemail.impl.utils.LoggerUtils;
+import java.io.IOException;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Task to verify the account status is still correct. This task is only for book keeping so any
+ * error is ignored and will not retry. If the provision status sent by the carrier is "ready" the
+ * access credentials will be updated (although it is not expected to change without the carrier
+ * actively sending out an STATUS SMS which will be handled by {@link
+ * com.android.voicemail.impl.sms.OmtpMessageReceiver}). If the provisioning status is not ready an
+ * {@link ActivationTask} will be launched to attempt to correct it.
+ */
+@TargetApi(VERSION_CODES.O)
+@UsedByReflection(value = "Tasks.java")
+public class StatusCheckTask extends BaseTask {
+
+ public StatusCheckTask() {
+ super(TASK_STATUS_CHECK);
+ }
+
+ public static void start(Context context, PhoneAccountHandle phoneAccountHandle) {
+ Intent intent = BaseTask.createIntent(context, StatusCheckTask.class, phoneAccountHandle);
+ context.startService(intent);
+ }
+
+ @Override
+ public void onExecuteInBackgroundThread() {
+ TelephonyManager telephonyManager =
+ getContext()
+ .getSystemService(TelephonyManager.class)
+ .createForPhoneAccountHandle(getPhoneAccountHandle());
+
+ if (telephonyManager == null) {
+ VvmLog.w(
+ "StatusCheckTask.onExecuteInBackgroundThread",
+ getPhoneAccountHandle() + " no longer valid");
+ return;
+ }
+ if (telephonyManager.getServiceState().getState() != ServiceState.STATE_IN_SERVICE) {
+ VvmLog.i(
+ "StatusCheckTask.onExecuteInBackgroundThread",
+ getPhoneAccountHandle() + " not in service");
+ return;
+ }
+ OmtpVvmCarrierConfigHelper config =
+ new OmtpVvmCarrierConfigHelper(getContext(), getPhoneAccountHandle());
+ if (!config.isValid()) {
+ VvmLog.e(
+ "StatusCheckTask.onExecuteInBackgroundThread",
+ "config no longer valid for " + getPhoneAccountHandle());
+ VvmAccountManager.removeAccount(getContext(), getPhoneAccountHandle());
+ return;
+ }
+
+ Bundle data;
+ try (StatusSmsFetcher fetcher = new StatusSmsFetcher(getContext(), getPhoneAccountHandle())) {
+ config.getProtocol().requestStatus(config, fetcher.getSentIntent());
+ // Both the fetcher and OmtpMessageReceiver will be triggered, but
+ // OmtpMessageReceiver will just route the SMS back to ActivationTask, which will be
+ // rejected because the task is still running.
+ data = fetcher.get();
+ } catch (TimeoutException e) {
+ VvmLog.e("StatusCheckTask.onExecuteInBackgroundThread", "timeout requesting status");
+ return;
+ } catch (CancellationException e) {
+ VvmLog.e("StatusCheckTask.onExecuteInBackgroundThread", "Unable to send status request SMS");
+ return;
+ } catch (InterruptedException | ExecutionException | IOException e) {
+ VvmLog.e("StatusCheckTask.onExecuteInBackgroundThread", "can't get future STATUS SMS", e);
+ return;
+ }
+
+ StatusMessage message = new StatusMessage(data);
+ VvmLog.i(
+ "StatusCheckTask.onExecuteInBackgroundThread",
+ "STATUS SMS received: st="
+ + message.getProvisioningStatus()
+ + ", rc="
+ + message.getReturnCode());
+ if (message.getProvisioningStatus().equals(OmtpConstants.SUBSCRIBER_READY)) {
+ VvmLog.i(
+ "StatusCheckTask.onExecuteInBackgroundThread",
+ "subscriber ready, no activation required");
+ LoggerUtils.logImpressionOnMainThread(
+ getContext(), DialerImpression.Type.VVM_STATUS_CHECK_READY);
+ VvmAccountManager.addAccount(getContext(), getPhoneAccountHandle(), message);
+ } else {
+ VvmLog.i(
+ "StatusCheckTask.onExecuteInBackgroundThread",
+ "subscriber not ready, attempting reactivation");
+ VvmAccountManager.removeAccount(getContext(), getPhoneAccountHandle());
+ LoggerUtils.logImpressionOnMainThread(
+ getContext(), DialerImpression.Type.VVM_STATUS_CHECK_REACTIVATION);
+ ActivationTask.start(getContext(), getPhoneAccountHandle(), data);
+ }
+ }
+}
diff --git a/java/com/android/voicemail/impl/VoicemailBootReceiver.java b/java/com/android/voicemail/impl/VoicemailBootReceiver.java
new file mode 100644
index 000000000..0a3e61a01
--- /dev/null
+++ b/java/com/android/voicemail/impl/VoicemailBootReceiver.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * <p>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
+ *
+ * <p>http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * <p>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.voicemail.impl;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import com.android.voicemail.VoicemailComponent;
+
+/** Receives {@link Intent#ACTION_BOOT_COMPLETED} for the voicemail module. */
+public class VoicemailBootReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (!VoicemailComponent.get(context).getVoicemailClient().isVoicemailModuleEnabled()) {
+ return;
+ }
+ StatusCheckJobService.schedule(context);
+ }
+}
diff --git a/java/com/android/voicemail/impl/VoicemailClientImpl.java b/java/com/android/voicemail/impl/VoicemailClientImpl.java
index 31a12791c..7747b2486 100644
--- a/java/com/android/voicemail/impl/VoicemailClientImpl.java
+++ b/java/com/android/voicemail/impl/VoicemailClientImpl.java
@@ -31,6 +31,7 @@ import com.android.voicemail.VoicemailClient;
import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil;
import com.android.voicemail.impl.settings.VoicemailChangePinActivity;
import com.android.voicemail.impl.settings.VoicemailSettingsFragment;
+import com.android.voicemail.impl.sync.VvmAccountManager;
import java.util.List;
import javax.inject.Inject;
@@ -67,6 +68,17 @@ public class VoicemailClientImpl implements VoicemailClient {
return true;
}
+ @Override
+ public boolean isVoicemailEnabled(Context context, PhoneAccountHandle phoneAccountHandle) {
+ return VisualVoicemailSettingsUtil.isEnabled(context, phoneAccountHandle);
+ }
+
+ @Override
+ public void setVoicemailEnabled(
+ Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled) {
+ VisualVoicemailSettingsUtil.setEnabled(context, phoneAccountHandle, enabled);
+ }
+
@Nullable
@Override
public String getSettingsFragment() {
@@ -85,7 +97,7 @@ public class VoicemailClientImpl implements VoicemailClient {
return false;
}
- if (!ConfigProviderBindings.get(context).getBoolean(ALLOW_VOICEMAIL_ARCHIVE, true)) {
+ if (!ConfigProviderBindings.get(context).getBoolean(ALLOW_VOICEMAIL_ARCHIVE, false)) {
LogUtil.i(
"VoicemailClientImpl.isVoicemailArchiveAllowed",
"feature disabled by config: %s",
@@ -109,6 +121,11 @@ public class VoicemailClientImpl implements VoicemailClient {
return intent;
}
+ @Override
+ public boolean isActivated(Context context, PhoneAccountHandle phoneAccountHandle) {
+ return VvmAccountManager.isAccountActivated(context, phoneAccountHandle);
+ }
+
@TargetApi(VERSION_CODES.O)
@Override
public void appendOmtpVoicemailSelectionClause(
diff --git a/java/com/android/voicemail/impl/VoicemailModule.java b/java/com/android/voicemail/impl/VoicemailModule.java
index c3e5714d5..5a4e739f5 100644
--- a/java/com/android/voicemail/impl/VoicemailModule.java
+++ b/java/com/android/voicemail/impl/VoicemailModule.java
@@ -16,8 +16,10 @@
package com.android.voicemail.impl;
+import android.content.Context;
import android.support.v4.os.BuildCompat;
import com.android.voicemail.VoicemailClient;
+import com.android.voicemail.VoicemailPermissionHelper;
import com.android.voicemail.stub.StubVoicemailClient;
import dagger.Module;
import dagger.Provides;
@@ -29,12 +31,21 @@ public final class VoicemailModule {
@Provides
@Singleton
- static VoicemailClient provideVoicemailClient() {
- if (BuildCompat.isAtLeastO()) {
- return new VoicemailClientImpl();
- } else {
+ static VoicemailClient provideVoicemailClient(Context context) {
+ if (!BuildCompat.isAtLeastO()) {
+ VvmLog.i("VoicemailModule.provideVoicemailClient", "SDK below O");
return new StubVoicemailClient();
}
+
+ if (!VoicemailPermissionHelper.hasPermissions(context)) {
+ VvmLog.i(
+ "VoicemailModule.provideVoicemailClient",
+ "missing permissions " + VoicemailPermissionHelper.getMissingPermissions(context));
+ return new StubVoicemailClient();
+ }
+
+ VvmLog.i("VoicemailModule.provideVoicemailClient", "providing VoicemailClientImpl");
+ return new VoicemailClientImpl();
}
private VoicemailModule() {}
diff --git a/java/com/android/voicemail/impl/VvmPackageInstallReceiver.java b/java/com/android/voicemail/impl/VvmPackageInstallReceiver.java
index d92012147..1e2de6070 100644
--- a/java/com/android/voicemail/impl/VvmPackageInstallReceiver.java
+++ b/java/com/android/voicemail/impl/VvmPackageInstallReceiver.java
@@ -25,7 +25,8 @@ import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil;
/**
* When a new package is installed, check if it matches any of the vvm carrier apps of the currently
- * enabled dialer vvm sources.
+ * enabled dialer VVM sources. The dialer VVM client will be disabled upon carrier VVM app
+ * installation, unless it was explicitly enabled by the user.
*/
public class VvmPackageInstallReceiver extends BroadcastReceiver {
@@ -46,25 +47,34 @@ public class VvmPackageInstallReceiver extends BroadcastReceiver {
return;
}
+ // This get called every time an app is installed and will be noisy. Don't log until the app
+ // is identified as a carrier VVM app.
for (PhoneAccountHandle phoneAccount :
context.getSystemService(TelecomManager.class).getCallCapablePhoneAccounts()) {
- if (VisualVoicemailSettingsUtil.isEnabledUserSet(context, phoneAccount)) {
- // Skip the check if this voicemail source's setting is overridden by the user.
- continue;
- }
-
OmtpVvmCarrierConfigHelper carrierConfigHelper =
new OmtpVvmCarrierConfigHelper(context, phoneAccount);
+ if (!carrierConfigHelper.isValid()) {
+ continue;
+ }
if (carrierConfigHelper.getCarrierVvmPackageNames() == null) {
continue;
}
- if (carrierConfigHelper.getCarrierVvmPackageNames().contains(packageName)) {
- // Force deactivate the client. The user can re-enable it in the settings.
- // There is no need to update the settings for deactivation. At this point, if the
- // default value is used it should be false because a carrier package is present.
- VvmLog.i(TAG, "Carrier VVM package installed, disabling system VVM client");
- VisualVoicemailSettingsUtil.setEnabled(context, phoneAccount, false);
+ if (!carrierConfigHelper.getCarrierVvmPackageNames().contains(packageName)) {
+ continue;
}
+
+ VvmLog.i(TAG, "Carrier app installed");
+ if (VisualVoicemailSettingsUtil.isEnabledUserSet(context, phoneAccount)) {
+ // Skip the check if this voicemail source's setting is overridden by the user.
+ VvmLog.i(TAG, "VVM enabled by user, not disabling");
+ continue;
+ }
+
+ // Force deactivate the client. The user can re-enable it in the settings.
+ // There is no need to update the settings for deactivation. At this point, if the
+ // default value is used it should be false because a carrier package is present.
+ VvmLog.i(TAG, "Carrier VVM package installed, disabling system VVM client");
+ VisualVoicemailSettingsUtil.setEnabled(context, phoneAccount, false);
}
}
}
diff --git a/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java b/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
index b0285672e..0348a60c5 100644
--- a/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
+++ b/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
@@ -120,6 +120,16 @@ public class FetchVoicemailReceiver extends BroadcastReceiver {
new PhoneAccountHandle(
ComponentName.unflattenFromString(cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME)),
cursor.getString(PHONE_ACCOUNT_ID));
+ TelephonyManager telephonyManager =
+ context
+ .getSystemService(TelephonyManager.class)
+ .createForPhoneAccountHandle(mPhoneAccount);
+ if (telephonyManager == null) {
+ // can happen when trying to fetch voicemails from a SIM that is no longer on the
+ // device
+ VvmLog.e(TAG, "account no longer valid, cannot retrieve message");
+ return;
+ }
if (!VvmAccountManager.isAccountActivated(context, mPhoneAccount)) {
mPhoneAccount = getAccountFromMarshmallowAccount(context, mPhoneAccount);
if (mPhoneAccount == null) {
diff --git a/java/com/android/voicemail/impl/mail/Address.java b/java/com/android/voicemail/impl/mail/Address.java
index 3a7a86607..ac8e8a294 100644
--- a/java/com/android/voicemail/impl/mail/Address.java
+++ b/java/com/android/voicemail/impl/mail/Address.java
@@ -25,8 +25,9 @@ import android.text.util.Rfc822Tokenizer;
import com.android.voicemail.impl.mail.utils.LogUtils;
import java.util.ArrayList;
import java.util.regex.Pattern;
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.codec.DecoderUtil;
import org.apache.james.mime4j.codec.EncoderUtil;
-import org.apache.james.mime4j.decoder.DecoderUtil;
/**
* This class represent email address.
@@ -121,7 +122,8 @@ public class Address implements Parcelable {
if (TextUtils.isEmpty(rawAddress)) {
return null;
}
- String name, address;
+ String name;
+ String address;
final Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(rawAddress);
if (tokens.length > 0) {
final String tokenizedName = tokens[0].getName();
@@ -171,7 +173,7 @@ public class Address implements Parcelable {
if (personal != null) {
personal = REMOVE_OPTIONAL_DQUOTE.matcher(personal).replaceAll("$1");
personal = UNQUOTE.matcher(personal).replaceAll("$1");
- personal = DecoderUtil.decodeEncodedWords(personal);
+ personal = DecoderUtil.decodeEncodedWords(personal, DecodeMonitor.STRICT);
if (personal.length() == 0) {
personal = null;
}
diff --git a/java/com/android/voicemail/impl/mail/internet/MimeMessage.java b/java/com/android/voicemail/impl/mail/internet/MimeMessage.java
index dfb7d7c25..589720660 100644
--- a/java/com/android/voicemail/impl/mail/internet/MimeMessage.java
+++ b/java/com/android/voicemail/impl/mail/internet/MimeMessage.java
@@ -34,12 +34,14 @@ import java.util.Date;
import java.util.Locale;
import java.util.Stack;
import java.util.regex.Pattern;
-import org.apache.james.mime4j.BodyDescriptor;
-import org.apache.james.mime4j.ContentHandler;
-import org.apache.james.mime4j.EOLConvertingInputStream;
-import org.apache.james.mime4j.MimeStreamParser;
-import org.apache.james.mime4j.field.DateTimeField;
-import org.apache.james.mime4j.field.Field;
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.dom.field.DateTimeField;
+import org.apache.james.mime4j.field.DefaultFieldParser;
+import org.apache.james.mime4j.io.EOLConvertingInputStream;
+import org.apache.james.mime4j.parser.ContentHandler;
+import org.apache.james.mime4j.parser.MimeStreamParser;
+import org.apache.james.mime4j.stream.BodyDescriptor;
+import org.apache.james.mime4j.stream.Field;
/**
* An implementation of Message that stores all of its metadata in RFC 822 and RFC 2045 style
@@ -64,7 +66,6 @@ public class MimeMessage extends Message {
private Body mBody;
protected int mSize;
private boolean mInhibitLocalMessageId = false;
- private boolean mComplete = true;
// Shared random source for generating local message-id values
private static final java.util.Random sRandom = new java.util.Random();
@@ -114,7 +115,7 @@ public class MimeMessage extends Message {
* @throws IOException
* @throws MessagingException
*/
- public MimeMessage(InputStream in) throws IOException, MessagingException {
+ public MimeMessage(InputStream in) throws IOException, MessagingException, MimeException {
parse(in);
}
@@ -136,17 +137,9 @@ public class MimeMessage extends Message {
return parser;
}
- protected void parse(InputStream in) throws IOException, MessagingException {
+ public void parse(InputStream in) throws IOException, MessagingException, MimeException {
final MimeStreamParser parser = init();
parser.parse(new EOLConvertingInputStream(in));
- mComplete = !parser.getPrematureEof();
- }
-
- public void parse(InputStream in, EOLConvertingInputStream.Callback callback)
- throws IOException, MessagingException {
- final MimeStreamParser parser = init();
- parser.parse(new EOLConvertingInputStream(in, getSize(), callback));
- mComplete = !parser.getPrematureEof();
}
/**
@@ -171,7 +164,8 @@ public class MimeMessage extends Message {
try {
DateTimeField field =
(DateTimeField)
- Field.parse("Date: " + MimeUtility.unfoldAndDecode(getFirstHeader("Date")));
+ DefaultFieldParser.parse(
+ "Date: " + MimeUtility.unfoldAndDecode(getFirstHeader("Date")));
mSentDate = field.getDate();
// TODO: We should make it more clear what exceptions can be thrown here,
// and whether they reflect a normal or error condition.
@@ -184,7 +178,7 @@ public class MimeMessage extends Message {
try {
DateTimeField field =
(DateTimeField)
- Field.parse(
+ DefaultFieldParser.parse(
"Date: " + MimeUtility.unfoldAndDecode(getFirstHeader("Delivery-date")));
mSentDate = field.getDate();
// TODO: We should make it more clear what exceptions can be thrown here,
@@ -228,10 +222,6 @@ public class MimeMessage extends Message {
}
}
- public boolean isComplete() {
- return mComplete;
- }
-
@Override
public String getMimeType() throws MessagingException {
return MimeUtility.getHeaderParameter(getContentType(), null);
@@ -577,10 +567,10 @@ public class MimeMessage extends Message {
}
@Override
- public void field(String fieldData) {
+ public void field(Field rawField) {
expect(Part.class);
try {
- final String[] tokens = fieldData.split(":", 2);
+ final String[] tokens = rawField.getRaw().toString().split(":", 2);
((Part) stack.peek()).addHeader(tokens[0], tokens[1].trim());
} catch (MessagingException me) {
throw new Error(me);
diff --git a/java/com/android/voicemail/impl/mail/internet/MimeUtility.java b/java/com/android/voicemail/impl/mail/internet/MimeUtility.java
index 99846027b..bd85e478c 100644
--- a/java/com/android/voicemail/impl/mail/internet/MimeUtility.java
+++ b/java/com/android/voicemail/impl/mail/internet/MimeUtility.java
@@ -34,9 +34,10 @@ import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.IOUtils;
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.codec.DecoderUtil;
import org.apache.james.mime4j.codec.EncoderUtil;
-import org.apache.james.mime4j.decoder.DecoderUtil;
-import org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
+import org.apache.james.mime4j.codec.QuotedPrintableInputStream;
import org.apache.james.mime4j.util.CharsetUtil;
public class MimeUtility {
@@ -65,7 +66,7 @@ public class MimeUtility {
if (s == null) {
return null;
}
- return DecoderUtil.decodeEncodedWords(s);
+ return DecoderUtil.decodeEncodedWords(s, DecodeMonitor.STRICT);
}
public static String unfoldAndDecode(String s) {
@@ -235,7 +236,7 @@ public class MimeUtility {
/*
* See if there is conversion from the MIME charset to the Java one.
*/
- charset = CharsetUtil.toJavaCharset(charset);
+ charset = CharsetUtil.lookup(charset).name();
}
/*
* No encoding, so use us-ascii, which is the standard.
diff --git a/java/com/android/voicemail/impl/mail/store/ImapFolder.java b/java/com/android/voicemail/impl/mail/store/ImapFolder.java
index 1d9b01120..5760ee216 100644
--- a/java/com/android/voicemail/impl/mail/store/ImapFolder.java
+++ b/java/com/android/voicemail/impl/mail/store/ImapFolder.java
@@ -22,6 +22,7 @@ import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Base64DataException;
import com.android.voicemail.impl.OmtpEvents;
+import com.android.voicemail.impl.VvmLog;
import com.android.voicemail.impl.mail.AuthenticationFailedException;
import com.android.voicemail.impl.mail.Body;
import com.android.voicemail.impl.mail.FetchProfile;
@@ -41,7 +42,6 @@ import com.android.voicemail.impl.mail.store.imap.ImapElement;
import com.android.voicemail.impl.mail.store.imap.ImapList;
import com.android.voicemail.impl.mail.store.imap.ImapResponse;
import com.android.voicemail.impl.mail.store.imap.ImapString;
-import com.android.voicemail.impl.mail.utils.LogUtils;
import com.android.voicemail.impl.mail.utils.Utility;
import java.io.IOException;
import java.io.InputStream;
@@ -66,7 +66,7 @@ public class ImapFolder {
private String mMode;
private boolean mExists;
/** A set of hashes that can be used to track dirtiness */
- Object mHash[];
+ Object[] mHash;
public static final String MODE_READ_ONLY = "mode_read_only";
public static final String MODE_READ_WRITE = "mode_read_write";
@@ -136,7 +136,7 @@ public class ImapFolder {
try {
expunge();
} catch (MessagingException e) {
- LogUtils.e(TAG, e, "Messaging Exception");
+ VvmLog.e(TAG, "Messaging Exception", e);
}
}
mMessageCount = -1;
@@ -174,13 +174,13 @@ public class ImapFolder {
try {
final String command = ImapConstants.UID_SEARCH + " " + searchCriteria;
final String[] result = getSearchUids(mConnection.executeSimpleCommand(command));
- LogUtils.d(TAG, "searchForUids '" + searchCriteria + "' results: " + result.length);
+ VvmLog.d(TAG, "searchForUids '" + searchCriteria + "' results: " + result.length);
return result;
} catch (ImapException me) {
- LogUtils.d(TAG, "ImapException in search: " + searchCriteria, me);
+ VvmLog.d(TAG, "ImapException in search: " + searchCriteria, me);
return Utility.EMPTY_STRINGS; // Not found
} catch (IOException ioe) {
- LogUtils.d(TAG, "IOException in search: " + searchCriteria, ioe);
+ VvmLog.d(TAG, "IOException in search: " + searchCriteria, ioe);
mStore.getImapHelper().handleEvent(OmtpEvents.DATA_GENERIC_IMAP_IOE);
throw ioExceptionHandler(mConnection, ioe);
}
@@ -199,7 +199,7 @@ public class ImapFolder {
return new ImapMessage(uid, this);
}
}
- LogUtils.e(TAG, "UID " + uid + " not found on server");
+ VvmLog.e(TAG, "UID " + uid + " not found on server");
return null;
}
@@ -235,7 +235,7 @@ public class ImapFolder {
try {
fetchInternal(messages, fp, listener);
} catch (RuntimeException e) { // Probably a parser error.
- LogUtils.w(TAG, "Exception detected: " + e.getMessage());
+ VvmLog.w(TAG, "Exception detected: " + e.getMessage());
throw e;
}
}
@@ -346,7 +346,11 @@ public class ImapFolder {
message.setInternalDate(internalDate);
message.setSize(size);
- message.parse(Utility.streamFromAsciiString(header));
+ try {
+ message.parse(Utility.streamFromAsciiString(header));
+ } catch (Exception e) {
+ VvmLog.e(TAG, "Error parsing header %s", e);
+ }
}
if (fp.contains(FetchProfile.Item.STRUCTURE)) {
ImapList bs = fetchList.getKeyedListOrEmpty(ImapConstants.BODYSTRUCTURE);
@@ -354,7 +358,7 @@ public class ImapFolder {
try {
parseBodyStructure(bs, message, ImapConstants.TEXT);
} catch (MessagingException e) {
- LogUtils.v(TAG, e, "Error handling message");
+ VvmLog.v(TAG, "Error handling message", e);
message.setBody(null);
}
}
@@ -365,11 +369,15 @@ public class ImapFolder {
// TODO Should we accept "RFC822" as well??
ImapString body = fetchList.getKeyedStringOrEmpty("BODY[]", true);
InputStream bodyStream = body.getAsStream();
- message.parse(bodyStream);
+ try {
+ message.parse(bodyStream);
+ } catch (Exception e) {
+ VvmLog.e(TAG, "Error parsing body %s", e);
+ }
}
if (fetchPart != null) {
InputStream bodyStream = fetchList.getKeyedStringOrEmpty("BODY[", true).getAsStream();
- String encodings[] = fetchPart.getHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING);
+ String[] encodings = fetchPart.getHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING);
String contentTransferEncoding = null;
if (encodings != null && encodings.length > 0) {
@@ -397,7 +405,7 @@ public class ImapFolder {
// from here. This blanket catch-all is because we're not sure what to
// do if we don't have a contentTransferEncoding, and we don't have
// time to figure out what exceptions might be thrown.
- LogUtils.e(TAG, "Error fetching body %s", e);
+ VvmLog.e(TAG, "Error fetching body %s", e);
}
}
@@ -782,7 +790,7 @@ public class ImapFolder {
}
private MessagingException ioExceptionHandler(ImapConnection connection, IOException ioe) {
- LogUtils.d(TAG, "IO Exception detected: ", ioe);
+ VvmLog.d(TAG, "IO Exception detected: ", ioe);
connection.close();
if (connection == mConnection) {
mConnection = null; // To prevent close() from returning the connection to the pool.
diff --git a/java/com/android/voicemail/impl/mail/store/ImapStore.java b/java/com/android/voicemail/impl/mail/store/ImapStore.java
index cadbe593f..838bae257 100644
--- a/java/com/android/voicemail/impl/mail/store/ImapStore.java
+++ b/java/com/android/voicemail/impl/mail/store/ImapStore.java
@@ -25,6 +25,7 @@ import com.android.voicemail.impl.mail.MessagingException;
import com.android.voicemail.impl.mail.internet.MimeMessage;
import java.io.IOException;
import java.io.InputStream;
+import org.apache.james.mime4j.MimeException;
public class ImapStore {
/**
@@ -112,7 +113,7 @@ public class ImapStore {
}
@Override
- public void parse(InputStream in) throws IOException, MessagingException {
+ public void parse(InputStream in) throws IOException, MessagingException, MimeException {
super.parse(in);
}
diff --git a/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java b/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java
index 5a720c609..fc7fdf3d4 100644
--- a/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java
+++ b/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java
@@ -25,8 +25,7 @@ import android.os.Bundle;
import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
import android.text.TextUtils;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
+import com.android.dialer.logging.DialerImpression;
import com.android.voicemail.impl.ActivationTask;
import com.android.voicemail.impl.OmtpConstants;
import com.android.voicemail.impl.OmtpEvents;
@@ -45,6 +44,7 @@ import com.android.voicemail.impl.sms.Vvm3MessageSender;
import com.android.voicemail.impl.sync.VvmNetworkRequest;
import com.android.voicemail.impl.sync.VvmNetworkRequest.NetworkWrapper;
import com.android.voicemail.impl.sync.VvmNetworkRequest.RequestFailedException;
+import com.android.voicemail.impl.utils.LoggerUtils;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.Locale;
@@ -116,7 +116,8 @@ public class Vvm3Protocol extends VisualVoicemailProtocol {
StatusMessage message,
Bundle data) {
VvmLog.i(TAG, "start vvm3 provisioning");
- Logger.get(config.getContext()).logImpression(DialerImpression.Type.VVM_PROVISIONING_STARTED);
+ LoggerUtils.logImpressionOnMainThread(
+ config.getContext(), DialerImpression.Type.VVM_PROVISIONING_STARTED);
if (OmtpConstants.SUBSCRIBER_UNKNOWN.equals(message.getProvisioningStatus())) {
VvmLog.i(TAG, "Provisioning status: Unknown");
if (VVM3_UNKNOWN_SUBSCRIBER_CAN_SUBSCRIBE_RESPONSE_CODE.equals(message.getReturnCode())) {
@@ -229,8 +230,8 @@ public class Vvm3Protocol extends VisualVoicemailProtocol {
// Only close new user tutorial if the PIN has been changed.
helper.closeNewUserTutorial();
VvmLog.i(TAG, "new user: NUT closed");
- Logger.get(config.getContext())
- .logImpression(DialerImpression.Type.VVM_PROVISIONING_COMPLETED);
+ LoggerUtils.logImpressionOnMainThread(
+ config.getContext(), DialerImpression.Type.VVM_PROVISIONING_COMPLETED);
config.requestStatus(null);
}
} catch (InitializingException | MessagingException | IOException e) {
diff --git a/java/com/android/voicemail/impl/res/values-af/strings.xml b/java/com/android/voicemail/impl/res/values-af/strings.xml
index b209eea0d..71263217f 100644
--- a/java/com/android/voicemail/impl/res/values-af/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-af/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Gevorderde instellings"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visuele stemboodskap"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Ekstra rugsteun en berging"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Dit is \'n eksperimentele kenmerk"</i></b>" wat ons tans toets. Dit kan potensieel stemboodskappe van jou stemboodskapbediener af uitvee. Daar is geen waarborg dat hierdie kenmerk in die toekoms gesteun sal word nie. Ons sal egter graag terugvoer oor die kenmerk wil hê."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Stel PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Verander PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Visuele stemboodskap moet geaktiveer wees om PIN te verander"</string>
diff --git a/java/com/android/voicemail/impl/res/values-am/strings.xml b/java/com/android/voicemail/impl/res/values-am/strings.xml
index 4124de5f7..d350bbd94 100644
--- a/java/com/android/voicemail/impl/res/values-am/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-am/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"የላቁ ቅንብሮች"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"ምስላዊ የድምፅ መልዕክት"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"ተጨማሪ ምትኬ እና ማከማቻ"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"ይህ የሙከራ ባህሪ ነው"</i></b>" አሁን እየሞከርን ነው። ይህ ምናልባት ከድምፅ መልዕክት አገልጋይዎ ላይ የድምፅ መልዕክቶችን ሊሰርዝ ይችላል። ለወደፊቱ ይህን ባህሪ የመደገፍ ዋስትናዎችም የሉም። ነገር ግን በባህሪው ላይ ግብረመልስ ብናገኝ እንወዳለን።"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"ፒን ያዘጋጁ"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"ፒን ይቀይሩ"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"ፒን ለመቀየር የእይታ የድምጽ መልዕክት መንቃት አለበት"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ar/strings.xml b/java/com/android/voicemail/impl/res/values-ar/strings.xml
index 5d6fbba37..679dcce9c 100644
--- a/java/com/android/voicemail/impl/res/values-ar/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ar/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"الإعدادات المتقدمة"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"بريد صوتي مرئي"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"نسخة احتياطية وسعة تخزين إضافية"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"هذه الميزة تجريبية"</i></b>" نحن حاليًا في مرحلة اختبار. سيؤدي هذا على الأرجح إلى حذف رسائل البريد الصوتي من خادم البريد الصوتي. لا توجد أي ضمانات بشأن دعم هذه الميزة مستقبلاً. إلا أننا نود الحصول على تعليقات بشأن هذه الميزة."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"تعيين رقم التعريف الشخصي"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"تغيير رقم التعريف الشخصي"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"ينبغي تشغيل البريد الصوتي المرئي لتغيير رقم التعريف الشخصي"</string>
diff --git a/java/com/android/voicemail/impl/res/values-az/strings.xml b/java/com/android/voicemail/impl/res/values-az/strings.xml
index ce68f9963..87b4c0692 100644
--- a/java/com/android/voicemail/impl/res/values-az/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-az/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Qabaqcıl Ayarlar"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Görünən Səsli e-poçt"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Əlavə yedəkləmə və yaddaş"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" Bu, hazırda yoxladığımız "<b><i>"eksperimantal funksiyadır"</i></b>". Bununla səsli e-poçt serverindən səsli e-məktublar potensial olaraq silinəcək. Gələcəkdə bu funksiyanın dəstəklənəcəyinə zəmanət verilmir. Lakin funksiya haqqında əks əlaqənizi istərdik."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN ayarlayın"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN-i dəyişin"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN-i dəyişmək üçün görünən səsli e-poçt aktiv olmalıdır"</string>
diff --git a/java/com/android/voicemail/impl/res/values-b+sr+Latn/strings.xml b/java/com/android/voicemail/impl/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000..193913081
--- /dev/null
+++ b/java/com/android/voicemail/impl/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="voicemail_settings_with_label" msgid="563926539137546586">"Govorna pošta (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="voicemail_settings_title" msgid="6685263321755930738">"Govorna pošta"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibracija"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibracija"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Zvuk"</string>
+ <string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Napredna podešavanja"</string>
+ <string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vizuelna govorna pošta"</string>
+ <string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Dodatne rezervne kopije i prostor"</string>
+ <string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Podesite PIN"</string>
+ <string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Promenite PIN"</string>
+ <string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Morate da omogućite vizuelnu govornu poštu da biste promenili PIN"</string>
+ <string name="voicemail_change_pin_preference_summary_not_activated" msgid="8794039647258533633">"Vizuelna govorna pošta još uvek nije aktivirana, probajte ponovo kasnije"</string>
+ <string name="vm_change_pin_old_pin" msgid="3732582036597386047">"Stari PIN"</string>
+ <string name="vm_change_pin_new_pin" msgid="5167496290646066333">"Novi PIN"</string>
+ <string name="vm_change_pin_progress_message" msgid="4143209637626661679">"Sačekajte."</string>
+ <string name="vm_change_pin_error_too_short" msgid="2825020644385639921">"Novi PIN je prekratak."</string>
+ <string name="vm_change_pin_error_too_long" msgid="683260438529171998">"Novi PIN je predugačak."</string>
+ <string name="vm_change_pin_error_too_weak" msgid="5865254034338293113">"Novi PIN je preslab. Jaka lozinka ne treba da sadrži uzastopni niz ni ponovljene cifre."</string>
+ <string name="vm_change_pin_error_mismatch" msgid="3682667971009913553">"Stari PIN se ne podudara."</string>
+ <string name="vm_change_pin_error_invalid" msgid="4317397281749196545">"Novi PIN sadrži nevažeće znakove."</string>
+ <string name="vm_change_pin_error_system_error" msgid="5972056058776852411">"Promena PIN-a nije uspela"</string>
+ <string name="vvm_unsupported_message_format" msgid="2746490691815392491">"Nepodržani tip poruke. Pozovite <xliff:g id="NUMBER">%s</xliff:g> da biste je preslušali."</string>
+ <string name="change_pin_title" msgid="1363830310845461697">"Promenite PIN kôd govorne pošte"</string>
+ <string name="change_pin_continue_label" msgid="9184635195162827832">"Nastavi"</string>
+ <string name="change_pin_cancel_label" msgid="7258783861113501519">"Otkaži"</string>
+ <string name="change_pin_ok_label" msgid="4527043915415428629">"Potvrdi"</string>
+ <string name="change_pin_enter_old_pin_header" msgid="1375728090965833028">"Potvrdite stari PIN"</string>
+ <string name="change_pin_enter_old_pin_hint" msgid="1654231195871094175">"Unesite PIN kôd govorne pošte da biste nastavili."</string>
+ <string name="change_pin_enter_new_pin_header" msgid="7142620840890909719">"Podesite novi PIN"</string>
+ <string name="change_pin_enter_new_pin_hint" msgid="1289662932759932217">"Broj cifara koje PIN mora da sadrži: <xliff:g id="MIN">%1$d</xliff:g>–<xliff:g id="MAX">%2$d</xliff:g>."</string>
+ <string name="change_pin_confirm_pin_header" msgid="7282604363655862136">"Potvrdite PIN"</string>
+ <string name="change_pin_confirm_pins_dont_match" msgid="8626742552205369433">"PIN-ovi se ne podudaraju"</string>
+ <string name="change_pin_succeeded" msgid="6869403202124894671">"PIN kôd govorne pošte je ažuriran"</string>
+ <string name="change_pin_system_error" msgid="5762853042379833829">"Podešavanje PIN-a nije uspelo"</string>
+</resources>
diff --git a/java/com/android/voicemail/impl/res/values-be/strings.xml b/java/com/android/voicemail/impl/res/values-be/strings.xml
index ea4a00ca0..874b4791a 100644
--- a/java/com/android/voicemail/impl/res/values-be/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-be/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Пашыраныя налады"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Візуальная галасавая пошта"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Дадатковае рэзервовае капір. і сховішча"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Гэта эксперыментальная характарыстыка"</i></b>", якую мы тэсціруем. Патэнцыяльна яна будзе выдаляць паведамленні галасавой пошты з вашага сервера галасавой пошты. Падтрымка гэтай характарыстыкі ў будучым не гарантуецца. Але мы будзем вельмі ўдзячны за водгукі на гэту характарыстыку."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Задаць PIN-код"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Змяніць PIN-код"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Трэба ўключыць візуальную галасавую пошту, каб змяніць PIN-код"</string>
diff --git a/java/com/android/voicemail/impl/res/values-bg/strings.xml b/java/com/android/voicemail/impl/res/values-bg/strings.xml
index 95cc05f36..f987015e9 100644
--- a/java/com/android/voicemail/impl/res/values-bg/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-bg/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Разширени настройки"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Визуална гласова поща"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Допълнителни резервни копия и хранилище"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Това е експериментална функция"</i></b>", която тестваме понастоящем. Тя потенциално може да изтрие гласови съобщения от сървъра ви за гласова поща. Няма гаранции за поддръжката й в бъдеще. Но ще се радваме на отзиви за нея."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Задаване на ПИН код"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Промяна на ПИН кода"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"За промяна на ПИН кода трябва да бъде активирана визуалната гласова поща"</string>
diff --git a/java/com/android/voicemail/impl/res/values-bn/strings.xml b/java/com/android/voicemail/impl/res/values-bn/strings.xml
index dbbeb4d9f..699576d41 100644
--- a/java/com/android/voicemail/impl/res/values-bn/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-bn/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"উন্নত সেটিংস"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"ভিজ্যুয়াল ভয়েসমেল"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"অতিরিক্ত ব্যাক আপ এবং সঞ্চয়স্থান"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"এটি একটি পরীক্ষামূলক বৈশিষ্ট্য"</i></b>" যা আমরা বর্তমানে পরীক্ষা করছি। এটি সম্ভবত আপনার ভয়েসমেল সার্ভার থেকে ভয়েসমেলগুলি মুছবে। যদিও ভবিষ্যতে এই বৈশিষ্ট্যতে সমর্থন পাওয়ার কোন গ্যারান্টি নেই। যদিও আমরা এই বৈশিষ্ট্যটির উপর মতামত পেলে খুব খুশি হব।"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"পিন সেট করুন"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"পিন পরিবর্তন করুন"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"পিন পরিবর্তন করতে ভিজ্যুয়াল ভয়েসমেল অবশ্যই সক্ষম করতে হবে"</string>
diff --git a/java/com/android/voicemail/impl/res/values-bs/strings.xml b/java/com/android/voicemail/impl/res/values-bs/strings.xml
index 6d2b5b30c..2c8cc7682 100644
--- a/java/com/android/voicemail/impl/res/values-bs/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-bs/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Napredne postavke"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vizuelna govorna pošta"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Dodatna sigurnosna kopija i pohrana"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Ovo je eksperimentalna funkcija"</i></b>" koju trenutno testiramo. Moguće je da ova radnja izbriše poruke govorne pošte sa servera govorne pošte. Nema garancije da će ova funkcija biti podržana u budućnosti. Ipak bismo željeli primiti povratne informacije o funkciji."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Postavite PIN kôd"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Promijenite PIN kôd"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Vizuelna govorna pošta mora biti omogućena za promjenu PIN kôda"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ca/strings.xml b/java/com/android/voicemail/impl/res/values-ca/strings.xml
index bbac25294..b6525d02b 100644
--- a/java/com/android/voicemail/impl/res/values-ca/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ca/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Configuració avançada"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Bústia de veu visual"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Còpia de seguretat addicional i emmagatz."</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Aquesta funció està en mode de prova"</i></b>" i és possible que suprimeixi els missatges de veu del servidor de la bústia. No podem garantir-ne la continuïtat en el futur. De tota manera, ens agradaria saber què en penses."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Defineix el PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Canvia el PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"La bústia de veu visual ha d\'estar activada per poder canviar el PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-cs/strings.xml b/java/com/android/voicemail/impl/res/values-cs/strings.xml
index fb6be6cf4..987f9de01 100644
--- a/java/com/android/voicemail/impl/res/values-cs/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-cs/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Pokročilá nastavení"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vizuální hlasová schránka"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Další zálohování a úložiště"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Toto je experimentální funkce"</i></b>", kterou právě testujeme. Funkce vám může smazat hlasové zprávy ze serveru hlasové schránky. Nemůžeme zaručit, že bude podporována i v budoucnu, budeme vám ale vděční za zpětnou vazbu."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Nastavit kód PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Změnit kód PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Pokud chcete kód PIN změnit, musíte mít zapnutou vizuální hlasovou schránku"</string>
diff --git a/java/com/android/voicemail/impl/res/values-da/strings.xml b/java/com/android/voicemail/impl/res/values-da/strings.xml
index 760c3bc39..70ecb3699 100644
--- a/java/com/android/voicemail/impl/res/values-da/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-da/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Avancerede indstillinger"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visuel telefonsvarer"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Ekstra sikkerhedskopiering og lagerplads"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Dette er en eksperimental funktion,"</i></b>" som vi tester i øjeblikket. Der slettes måske talebeskeder fra din telefonsvarerserver. Der er ingen garanti for, at denne funktion understøttes fremover. Vi vil dog stadig gerne have feedback om funktionen."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Angiv pinkode"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Skift pinkode"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Visuel telefonsvarer skal være aktiveret, for at du kan skifte pinkode"</string>
diff --git a/java/com/android/voicemail/impl/res/values-de/strings.xml b/java/com/android/voicemail/impl/res/values-de/strings.xml
index bc5c70f5e..2746629e9 100644
--- a/java/com/android/voicemail/impl/res/values-de/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-de/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Erweiterte Einstellungen"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visuelle Mailbox"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Zusätzliche Sicherung und mehr Speicher"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Dies ist eine Funktion im Versuchsstadium"</i></b>", die gerade getestet wird. Hiermit werden möglicherweise Mailboxnachrichten von deinem Mailbox-Server gelöscht. Es wird nicht garantiert, dass diese Funktion auch in Zukunft unterstützt wird. Wir würden uns aber sehr über Feedback dazu freuen."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN festlegen"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN ändern"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Die visuelle Mailbox muss aktiviert sein, um die PIN zu ändern"</string>
diff --git a/java/com/android/voicemail/impl/res/values-el/strings.xml b/java/com/android/voicemail/impl/res/values-el/strings.xml
index a416936b9..e9f9835c6 100644
--- a/java/com/android/voicemail/impl/res/values-el/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-el/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Σύνθετες ρυθμίσεις"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Οπτικός αυτόματος τηλεφωνητής"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Επιπλέον αντίγραφα ασφ. και αποθήκευση"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Αυτή είναι μια πειραματική λειτουργία"</i></b>" που δοκιμάζουμε προς το παρόν. Ενδέχεται να έχει ως αποτέλεσμα τη διαγραφή φωνητικών μηνυμάτων από τον διακομιστή αυτόματου τηλεφωνητή σας. Δεν παρέχονται εγγυήσεις για την υποστήριξη αυτής της λειτουργίας μελλοντικά. Ωστόσο, θα εκτιμούσαμε τα σχόλιά σας για τη λειτουργία αυτή."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Ορισμός PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Αλλαγή κωδικού PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Για αλλαγή του PIN, ενεργοποιήστε τον οπτικό αυτόματο τηλεφωνητή"</string>
diff --git a/java/com/android/voicemail/impl/res/values-en-rAU/strings.xml b/java/com/android/voicemail/impl/res/values-en-rAU/strings.xml
index 9b6484b45..ec08faf22 100644
--- a/java/com/android/voicemail/impl/res/values-en-rAU/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-en-rAU/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Advanced settings"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visual voicemail"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Extra backup and storage"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"This is an experimental feature"</i></b>" that we are currently testing. This will potentially delete voicemail from your voicemail server. There are no guarantees that this feature will be supported in the future. We would love feedback on the feature though."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Set PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Change PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Visual voicemail must be enabled to change PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-en-rGB/strings.xml b/java/com/android/voicemail/impl/res/values-en-rGB/strings.xml
index 9b6484b45..ec08faf22 100644
--- a/java/com/android/voicemail/impl/res/values-en-rGB/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-en-rGB/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Advanced settings"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visual voicemail"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Extra backup and storage"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"This is an experimental feature"</i></b>" that we are currently testing. This will potentially delete voicemail from your voicemail server. There are no guarantees that this feature will be supported in the future. We would love feedback on the feature though."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Set PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Change PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Visual voicemail must be enabled to change PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-en-rIN/strings.xml b/java/com/android/voicemail/impl/res/values-en-rIN/strings.xml
index 9b6484b45..ec08faf22 100644
--- a/java/com/android/voicemail/impl/res/values-en-rIN/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-en-rIN/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Advanced settings"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visual voicemail"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Extra backup and storage"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"This is an experimental feature"</i></b>" that we are currently testing. This will potentially delete voicemail from your voicemail server. There are no guarantees that this feature will be supported in the future. We would love feedback on the feature though."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Set PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Change PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Visual voicemail must be enabled to change PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-es-rUS/strings.xml b/java/com/android/voicemail/impl/res/values-es-rUS/strings.xml
index 6ae227a81..fcd9cc7c3 100644
--- a/java/com/android/voicemail/impl/res/values-es-rUS/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-es-rUS/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Configuración avanzada"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Buzón de voz visual"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Copia de seguridad y almacenamiento adicional"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Esta es una función experimental"</i></b>" que estamos probando. Es posible que se borren los mensajes de voz del servidor correspondiente. No podemos garantizar la compatibilidad de la función en el futuro. Sin embargo, nos encantaría que nos hicieras comentarios acerca de ella."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Establecer PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Cambiar PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"El buzón de voz visual se debe activar para cambiar el PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-es/strings.xml b/java/com/android/voicemail/impl/res/values-es/strings.xml
index bab4e0326..f20ebc5cf 100644
--- a/java/com/android/voicemail/impl/res/values-es/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-es/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Configuración avanzada"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Buzón de voz visual"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Copias de seguridad y almacenamiento extra"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Se trata de una función experimental"</i></b>" que se encuentra actualmente en fase de prueba y que podría servir para eliminar los mensajes de tu servidor de buzón de voz. Aunque no garantizamos que esta función se siga admitiendo en el futuro, nos encantaría conocer tu opinión."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Establecer PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Cambiar PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Para poder cambiar el PIN, el buzón de voz visual debe estar habilitado"</string>
diff --git a/java/com/android/voicemail/impl/res/values-et/strings.xml b/java/com/android/voicemail/impl/res/values-et/strings.xml
index 02f13145d..dc7f685ba 100644
--- a/java/com/android/voicemail/impl/res/values-et/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-et/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Täpsemad seaded"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visuaalne kõnepost"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Lisavarundus ja -salvestusruum"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"See on katseline funktsioon"</i></b>", mida praegu testime. See võib teie kõnepostisõnumid kõnepostiserverist kustutada. Me ei garanteeri, et seda funktsiooni tulevikus toetatakse. Soovime selle kohta siiski tagasisidet saada."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN-koodi määramine"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN-koodi muutmine"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN-koodi muutmiseks peab olema lubatud visuaalne kõnepost"</string>
diff --git a/java/com/android/voicemail/impl/res/values-eu/strings.xml b/java/com/android/voicemail/impl/res/values-eu/strings.xml
index 89afb830c..8a3bd640a 100644
--- a/java/com/android/voicemail/impl/res/values-eu/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-eu/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Ezarpen aurreratuak"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Erantzungailu bisuala"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Babeskopiak eta edukia gordetzeko tokia"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" Oraindik probatzen ari garen "<b><i>"eginbide esperimentala da hau"</i></b>". Agian erantzungailuaren zerbitzarian gordetako mezuak ezabatuko dira. Ez dugu bermatzen egibide hau etorkizunean erabiltzeko aukera emango dugunik. Halere, bihotzez eskertuko genizuke eginbideari buruzko iritzia."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Ezarri PIN kodea"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Aldatu PIN kodea"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Ikusizko erantzungailuak gaituta egon behar du PIN kodea aldatu ahal izateko"</string>
diff --git a/java/com/android/voicemail/impl/res/values-fa/strings.xml b/java/com/android/voicemail/impl/res/values-fa/strings.xml
index 3db711b34..0b5d51333 100644
--- a/java/com/android/voicemail/impl/res/values-fa/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-fa/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"تنظیمات پیشرفته"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"پست صوتی تصویری"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"پشتیبان‌گیری و فضای ذخیره‌سازی اضافی"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"این یک قابلیت آزمایشی است"</i></b>" که درحال آزمایش آن هستیم. این قابلیت به‌طور بالقوه پست‌های صوتی را از سرور پست صوتی شما حذف خواهد کرد. ضمانتی برای پشتیبانی از این قابلیت در آینده وجود ندارد. با این حال مشتاقیم درباره آن بازخورد دریافت کنیم."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"تنظیم پین"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"تغییر پین"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"برای تغییر پین، پست صوتی تصویری باید فعال شود"</string>
diff --git a/java/com/android/voicemail/impl/res/values-fi/strings.xml b/java/com/android/voicemail/impl/res/values-fi/strings.xml
index 36f5fff5d..c20d3e481 100644
--- a/java/com/android/voicemail/impl/res/values-fi/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-fi/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Lisäasetukset"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visuaalinen vastaaja"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Lisävarmuuskopiointi ja ‑tallennustila"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Tämä on kokeellinen ominaisuus"</i></b>", jota testaamme parhaillaan. Vastaajaviestejä saatetaan poistaa vastaajapalvelimelta. Ominaisuuden tukemista tulevaisuudessa ei taata. Kuulemme kuitenkin mielellämme mielipiteesi ominaisuudesta."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Aseta PIN-koodi"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Vaihda PIN-koodi"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Ota visuaalinen puhelinvastaaja käyttöön, jotta voit vaihtaa PIN-koodin."</string>
diff --git a/java/com/android/voicemail/impl/res/values-fr-rCA/strings.xml b/java/com/android/voicemail/impl/res/values-fr-rCA/strings.xml
index 2c9a11a93..6bbd1341f 100644
--- a/java/com/android/voicemail/impl/res/values-fr-rCA/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-fr-rCA/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Paramètres avancés"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Messagerie vocale visuelle"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Espace suppl. de sauvegarde et stockage"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Fonction expérimentale"</i></b>" en cours de test."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Définir un NIP"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Modifier le NIP"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"La messagerie vocale visuelle doit être activée pour que vous puissiez modifier votre NIP"</string>
diff --git a/java/com/android/voicemail/impl/res/values-fr/strings.xml b/java/com/android/voicemail/impl/res/values-fr/strings.xml
index 391671c2e..dc21c76d3 100644
--- a/java/com/android/voicemail/impl/res/values-fr/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-fr/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Paramètres avancés"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Messagerie vocale visuelle"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Espace suppl. de sauvegarde et stockage"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Il s\'agit d\'une fonctionnalité expérimentale"</i></b>" en cours de test. Des messages risquent d\'être supprimés de votre serveur de messagerie vocale. Nous ne pouvons pas garantir le maintien de cette fonctionnalité. Toutefois, n\'hésitez pas à nous faire part de vos commentaires."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Définir le code secret"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Modifier le code secret"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Pour que vous puissiez modifier le code secret, la messagerie vocale visuelle doit être activée"</string>
diff --git a/java/com/android/voicemail/impl/res/values-gl/strings.xml b/java/com/android/voicemail/impl/res/values-gl/strings.xml
index 70b949e6c..81f6e679a 100644
--- a/java/com/android/voicemail/impl/res/values-gl/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-gl/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Configuración avanzada"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Correo de voz visual"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Copia de seguranza e almacenamento extra"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Esta función está en modo de proba"</i></b>", e é posible que elimine correos de voz do teu servidor de correo de voz. Non podemos garantir a súa continuidade no futuro. De todos modos, encantaríanos que nos deses a túa opinión."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Establecer PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Cambiar PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Para poder cambiar o PIN, o correo de voz visual ten que estar activado"</string>
diff --git a/java/com/android/voicemail/impl/res/values-gu/strings.xml b/java/com/android/voicemail/impl/res/values-gu/strings.xml
index f9187a7d3..3e8948d19 100644
--- a/java/com/android/voicemail/impl/res/values-gu/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-gu/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"વિગતવાર સેટિંગ્સ"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"વિઝ્યુઅલ વૉઇસમેઇલ"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"અતિરિક્ત બેકઅપ અને સ્ટોરેજ"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"આ એક પ્રાયોગિક સુવિધા છે"</i></b>" અમે હાલમાં પરીક્ષણ કરી રહ્યાં છીએ. આ તમારા વૉઇસમેઇલ સર્વરમાંથી સંભવિત રૂપે વૉઇસમેઇલ કાઢી નાખશે. ભવિષ્યમાં આ સુવિધાનું સમર્થન કરવાની કોઇ બાંંયધરી નથી. જોકે અમને આ સુવિધા પર પ્રતિસાદ ગમશે."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN સેટ કરો"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN બદલો"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN બદલવા માટે વિઝ્યુઅલ વૉઇસમેઇલ સક્ષમ હોય તે આવશ્યક છે"</string>
diff --git a/java/com/android/voicemail/impl/res/values-hi/strings.xml b/java/com/android/voicemail/impl/res/values-hi/strings.xml
index 488fba2a9..8daa3e3d7 100644
--- a/java/com/android/voicemail/impl/res/values-hi/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-hi/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"उन्नत सेटिंग"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"विज़ुअल वॉइसमेल"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"अतिरिक्त बैकअप और जगह"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"यह सुविधा एक तरह का प्रयोग है"</i></b>" जिसका हम अभी परीक्षण कर रहे हैं. हो सकता है कि यह आपके वॉइसमेल सर्वर से वॉइसमेल हटा दे. भविष्य में यह सुविधा दी जाएगी या नहीं इसकी कोई गारंटी नहीं है. फिर भी सुविधा पर आपका फ़ीडबैक हमें अच्छा लगेगा."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"पिन सेट करें"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"पिन बदलें"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"पिन बदलने के लिए विज़ुअल वॉइसमेल ज़रूर सक्षम होना चाहिए"</string>
diff --git a/java/com/android/voicemail/impl/res/values-hr/strings.xml b/java/com/android/voicemail/impl/res/values-hr/strings.xml
index 7d6695653..960909571 100644
--- a/java/com/android/voicemail/impl/res/values-hr/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-hr/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Napredne postavke"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vizualna govorna pošta"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Dodatno sigurnosno kopiranje i pohrana"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Ovo je eksperimentalna značajka"</i></b>" koju trenutačno testiramo. To će možda izbrisati poruke govorne pošte s vašeg poslužitelja govorne pošte. Nije sigurno da ćemo ovu značajku podržati u budućnosti. Međutim, voljeli bismo dobiti povratne informacije o njoj."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Postavljanje PIN-a"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Promjena PIN-a"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Za promjenu PIN-a potrebno je omogućiti vizualnu govornu poštu"</string>
diff --git a/java/com/android/voicemail/impl/res/values-hu/strings.xml b/java/com/android/voicemail/impl/res/values-hu/strings.xml
index fae3ef4c7..ce18af799 100644
--- a/java/com/android/voicemail/impl/res/values-hu/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-hu/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Speciális beállítások"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vizuális hangpostaüzenet"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Extra tárhely és biztonsági mentés"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Ez egy kísérleti funkció"</i></b>", amelyet jelenleg tesztelünk. Előfordulhat, hogy letörli az Ön hangüzeneteit a hangpostaszerverről. Nem garantáljuk, hogy a funkció a jövőben is megmarad, de nagy örömmel vennénk, ha megírná róla a véleményét."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN-kód beállítása"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN-kód módosítása"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"A PIN-kód módosításához engedélyezni kell a vizuális hangpostát."</string>
diff --git a/java/com/android/voicemail/impl/res/values-hy/strings.xml b/java/com/android/voicemail/impl/res/values-hy/strings.xml
index e4126f877..eaa987aa4 100644
--- a/java/com/android/voicemail/impl/res/values-hy/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-hy/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Ընդլայնված կարգավորումներ"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Տեսողական ձայնային փոստ"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Լրացուցիչ տարածք և պահուստավորում"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Սա փորձնական գործառույթ է,"</i></b>" որը գտնվում է փորձարկման փուլում: Այս ընթացքում ձայնային հաղորդագրությունները ձեր ձայնային փոստի սերվերից կարող են ջնջվել: Ոչ մի երաշխիք չկա, որ այն հետագայում կաջակցվի: Այդուհանդերձ, կցանկանայինք ձեր կարծիքն իմանալ այս գործառույթի մասին:"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Սահմանեք PIN կոդ"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Փոխեք PIN կոդը"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN կոդը փոխելու համար տեսողական ձայնային փոստը պետք է միացված լինի"</string>
diff --git a/java/com/android/voicemail/impl/res/values-in/strings.xml b/java/com/android/voicemail/impl/res/values-in/strings.xml
index d47bd9b9b..6f7e6377e 100644
--- a/java/com/android/voicemail/impl/res/values-in/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-in/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Setelan Lanjutan"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Pesan Suara Visual"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Penyimpanan dan backup ekstra"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Ini adalah fitur eksperimental"</i></b>" yang sedang kami uji. Fitur ini berpotensi menghapus pesan suara dari server pesan suara Anda. Tidak ada jaminan bahwa fitur ini akan didukung di masa mendatang. Kami akan menerima masukan terkait fitur ini dengan senang hati."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Setel PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Ubah PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Pesan suara visual harus diaktifkan untuk mengubah PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-is/strings.xml b/java/com/android/voicemail/impl/res/values-is/strings.xml
index c2019a3f5..5e00487af 100644
--- a/java/com/android/voicemail/impl/res/values-is/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-is/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Ítarlegar stillingar"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Myndrænt talhólf"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Viðbótaröryggisafritun og samstilling"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Þessi eiginleiki er í tilraunaútgáfu"</i></b>" sem við erum að prófa að svo stöddu. Þetta mun mögulega eyða talhólfsskilaboðum af vefþjóni talhólfsins. Engin trygging er fyrir því að þessi eiginleiki verði studdur í framtíðinni. Við kunnum virkilega að meta allar ábendingar varðandi þennan eiginleika."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Stilla PIN-númer"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Breyta PIN-númeri"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Kveikt þarf að vera á myndrænu talhólfi til að breyta PIN-númeri"</string>
diff --git a/java/com/android/voicemail/impl/res/values-it/strings.xml b/java/com/android/voicemail/impl/res/values-it/strings.xml
index 3aeaca901..2c37ba281 100644
--- a/java/com/android/voicemail/impl/res/values-it/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-it/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Impostazioni avanzate"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Leggi la segreteria"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Archiviazione supplementare e backup"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Questa è una funzionalità sperimentale"</i></b>" che si trova al momento in fase di test. È possibile che i messaggi vocali vengano eliminati dal server della segreteria. Non ci sono garanzie che la funzionalità continui a essere supportata in futuro, ma ci piacerebbe ricevere il tuo feedback."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Imposta PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Cambia PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"La lettura delle segreteria deve essere attivata per cambiare il PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-iw/strings.xml b/java/com/android/voicemail/impl/res/values-iw/strings.xml
index 98d31bc59..cdf58dd64 100644
--- a/java/com/android/voicemail/impl/res/values-iw/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-iw/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"הגדרות מתקדמות"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"דואר קולי ויזואלי"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"גיבוי ופינוי מקום"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"זוהי תכונה ניסיונית"</i></b>" שאנחנו בודקים כרגע. היא עלולה למחוק הודעות קוליות מתא הדואר הקולי שלך בשרת. אנחנו לא מתחייבים שהתכונה תהיה זמינה בעתיד, אך נשמח לקבל עליה משוב."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"הגדרת קוד גישה"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"שינוי קוד הגישה"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"צריך להפעיל את הדואר הקולי הוויזואלי כדי לשנות את קוד הגישה"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ja/strings.xml b/java/com/android/voicemail/impl/res/values-ja/strings.xml
index 90bce09fb..e35359f01 100644
--- a/java/com/android/voicemail/impl/res/values-ja/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ja/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"詳細設定"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"ビジュアル ボイスメール"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"追加のバックアップと保存容量"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"これは現在テスト中の試験運用機能"</i></b>"で、ボイスメール サーバーからボイスメールを削除することができます。今後この機能が正式にサポートされる保証はありませんが、フィードバックをお寄せいただければ幸いです。"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN の設定"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN の変更"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN を変更するには、ビジュアル ボイスメールを有効にする必要があります"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ka/strings.xml b/java/com/android/voicemail/impl/res/values-ka/strings.xml
index 4e1413287..7eb792fd0 100644
--- a/java/com/android/voicemail/impl/res/values-ka/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ka/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"გაფართოებული პარამეტრები"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"ვიზუალური ხმოვანი ფოსტა"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"დამატებითი სარეზ. ასლები და მეხსიერება"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"ეს არის ექსპერიმენტული ფუნქცია, რომელსაც"</i></b>" ამჟამად ტესტირებას ვუტარებთ. სავარაუდოდ, ეს წაშლის ხმოვან შეტყობინებებს თქვენი ხმოვანი ფოსტის სერვერიდან. გარანტია, რომ ეს ფუნქცია მომავალში მხარდაჭერილი იქნება, არ არსებობს. თუმცა ამ ფუნქციის შესახებ გამოხმაურებას ინტერესით გავეცნობოდით."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN-კოდის დაყენება"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN-კოდის შეცვლა"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN-კოდის შესაცვლელად ჩართული უნდა იყოს ვიზუალური ხმოვანი ფოსტა"</string>
diff --git a/java/com/android/voicemail/impl/res/values-kk/strings.xml b/java/com/android/voicemail/impl/res/values-kk/strings.xml
index 36ba090ea..a03171d01 100644
--- a/java/com/android/voicemail/impl/res/values-kk/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-kk/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Қосымша параметрлер"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Визуалды дауыстық пошта"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Қосымша сақтық көшірме жасау және сақтау"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Бұл — қазір тексеріліп жатқан, тәжірибелік мүмкіндік"</i></b>". Бұл дауыстық хабарларды дауыстық хабар серверінен өшіруі мүмкін. Осы мүмкіндікке алдағы уақытта қолдау көрсетілетініне ешқандай кепілдік жоқ. Сонда да осы мүмкіндікке қатысты пікір алғымыз келеді."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN кодын тағайындау"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN кодын өзгерту"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN кодын өзгерту үшін визуалды дауыс хабарын қосу қажет"</string>
diff --git a/java/com/android/voicemail/impl/res/values-km/strings.xml b/java/com/android/voicemail/impl/res/values-km/strings.xml
index f97ff3e5e..3d55d00bb 100644
--- a/java/com/android/voicemail/impl/res/values-km/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-km/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"ការ​កំណត់​កម្រិត​ខ្ពស់"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"សារជាសំឡេងអាចមើលឃើញ"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"ទំហំ​ផ្ទុក និង​ការ​បម្រុងទុក​បន្ថែម"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"នេះ​​គឺ​ជា​មុខងារ​សាកល្បង"</i></b>" បច្ចុប្បន្ន យើង​កំពុង​ធ្វើ​ការ​សាកល្បង។ វា​អាច​នឹង​លុប​សារ​ជា​សំឡេង​ពី​ម៉ាស៊ីន​មេ​សារ​ជា​សំឡេង​របស់​អ្នក។ មិន​មាន​ការ​ធានា​ធ្វើ​ឲ្យ​មុខងារ​នេះ​ដំណើរការ​នៅ​ថ្ងៃ​ក្រោយ​ទេ។ យើង​ចង់​ដឹង​មតិ​ស្ថាបនា​អំពី​មុខងារនេះ​ផង​ដែរ។"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"កំណត់​កូដ PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"ផ្លាស់ប្ដូរ​កូដ PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"សារ​​ជា​សំឡេង​ដែល​មើល​ឃើញ​ត្រូវតែ​បើកដំណើរការ ដើម្បី​ផ្លាស់ប្ដូរ PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-kn/strings.xml b/java/com/android/voicemail/impl/res/values-kn/strings.xml
index 6f8e21f88..379e656ce 100644
--- a/java/com/android/voicemail/impl/res/values-kn/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-kn/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"ಸುಧಾರಿತ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"ದೃಶ್ಯ ಧ್ವನಿಮೇಲ್"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"ಹೆಚ್ಚುವರಿ ಬ್ಯಾಕಪ್ ಮತ್ತು ಸಂಗ್ರಹಣೆ"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"ಇದು ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯವಾಗಿದೆ"</i></b>"ನಾವು ಪ್ರಸ್ತುತ ಪರೀಕ್ಷಿಸುತ್ತಿದ್ದೇವೆ. ಇದು ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಸರ್ವರ್‌ನಿಂದ ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಸಂಭಾವ್ಯವಾಗಿ ಅಳಿಸುತ್ತದೆ. ಭವಿಷ್ಯದಲ್ಲಿ ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬೆಂಬಲಿಸುವ ಯಾವುದೇ ಖಾತ್ರಿ ಇಲ್ಲ. ಆದರೂ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಗೆ ಸ್ವಾಗತ."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"ಪಿನ್ ಹೊಂದಿಸಿ"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"ಪಿನ್‌ ಬದಲಾಯಿಸಿ"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"ಪಿನ್ ಬದಲಾಯಿಸಲು ದೃಶ್ಯ ಧ್ವನಿಮೇಲ್ ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ko/strings.xml b/java/com/android/voicemail/impl/res/values-ko/strings.xml
index f18d1d711..513a67546 100644
--- a/java/com/android/voicemail/impl/res/values-ko/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ko/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"고급 설정"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"시각적 음성사서함"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"추가 백업 및 저장용량"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" 현재 테스트 중인 "<b><i>"실험적 기능입니다"</i></b>". 이 기능으로 인해 음성사서함 서버에서 메시지가 삭제될 수도 있습니다. 또한 Google에서는 추후 이 기능이 지원된다고 보장할 수 없습니다. 하지만 이 기능에 관해 의견을 주시면 감사하겠습니다."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN 설정"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN 변경"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN을 변경하려면 시각적 음성사서함이 사용 설정되어 있어야 합니다."</string>
diff --git a/java/com/android/voicemail/impl/res/values-ky/strings.xml b/java/com/android/voicemail/impl/res/values-ky/strings.xml
index f5219a91c..12b7f18c5 100644
--- a/java/com/android/voicemail/impl/res/values-ky/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ky/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Өркүндөтүлгөн жөндөөлөр"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Визуалдык үн почтасы"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Кошумча камдык көчүрмөнү сактоо жана сактагыч"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Бул, сыноодон өтүп жаткан"</i></b>" эксперименталдык функция. Үн каттарыңыз серверден өчүрүлүп калышы мүмкүн. Бул функциянын кийин да колдонулаарына кепилдик бере албайбыз бирок, ал жөнүндө пикириңизди билгибиз келет."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN код коюу"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN кодду өзгөртүү"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN кодду өзгөртүү үчүн визуладык үн почтасын иштетүү керек"</string>
diff --git a/java/com/android/voicemail/impl/res/values-lo/strings.xml b/java/com/android/voicemail/impl/res/values-lo/strings.xml
index 212b12fd2..f4f45e592 100644
--- a/java/com/android/voicemail/impl/res/values-lo/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-lo/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"ການຕັ້ງຄ່າຂັ້ນສູງ"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"ຂໍ້​ຄວາມ​ສຽງສະເໝືອນ"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"ການສຳຮອງ ແລະ ບ່ອນຈັດເກັບຂໍ້ມູນພິເສດ"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"ນີ້ເປັນຄຸນສົມບັດທີ່ຢູ່ໃນຂັ້ນຕອນທົດລອງຢູ່"</i></b>" ພວກເຮົາກຳລັງທົດສອບ. ມັນອາດລຶບຂໍ້ຄວາມສຽງອອກຈາກເຊີບເວີຂໍ້ຄວາມສຽງຂອງທ່ານໄດ້. ຈະບໍ່ມີການຮັບປະກັນການຊ່ວຍເຫຼືອຄຸນສົມບັດນີ້ໃນອະນາຄົດ. ຢ່າງໃດກໍຕາມພວກເຮົາຢາກຟັງຄຳຄິດເຫັນທີ່ມີຕໍ່ຄຸນສົມບັດດັ່ງກ່າວຈາກທ່ານ."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"ຕັ້ງລະຫັດ PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"​ປ່ຽນ​ລະຫັດ PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"ຈະຕ້ອງເປີດໃຊ້ຂໍ້ຄວາມສຽງສະເໝືອນເພື່ອປ່ຽນ PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-lt/strings.xml b/java/com/android/voicemail/impl/res/values-lt/strings.xml
index d4d9c4dc3..59a15f452 100644
--- a/java/com/android/voicemail/impl/res/values-lt/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-lt/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Išplėstiniai nustatymai"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vaizdinis balso paštas"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Papild. saug. vt. ir ats. kop. kūr. f."</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Tai yra eksperimentinė funkcija"</i></b>", kurią šiuo metu išbandome. Ją naudojant iš balso pašto serverio bus ištrinami balso pašto pranešimai. Negarantuojame, kad ateityje ši funkcija bus palaikoma, tačiau norėtume gauti atsiliepimų apie ją."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN kodo nustatymas"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN kodo keitimas"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Vaizdinis balso paštas turi būti įgalintas, kad būtų galima pakeisti PIN kodą"</string>
diff --git a/java/com/android/voicemail/impl/res/values-lv/strings.xml b/java/com/android/voicemail/impl/res/values-lv/strings.xml
index 1f758c467..0b8b2f92a 100644
--- a/java/com/android/voicemail/impl/res/values-lv/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-lv/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Papildu iestatījumi"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vizuālais balss pasts"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Papildu dublēšana un krātuve"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Šī ir eksperimentāla funkcija"</i></b>", ko mēs pašlaik testējam. Pastāv iespēja, ka no jūsu balss pasta servera tiks izdzēsti balss pasta ziņojumi. Mēs negarantējam šīs funkcijas turpmāku atbalstu, tomēr priecāsimies saņemt atsauksmes par to."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN iestatīšana"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN mainīšana"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Lai varētu mainīt PIN, ir jābūt iespējotam vizuālajam balss pastam."</string>
diff --git a/java/com/android/voicemail/impl/res/values-mk/strings.xml b/java/com/android/voicemail/impl/res/values-mk/strings.xml
index 39b8beefc..90c2f6cb2 100644
--- a/java/com/android/voicemail/impl/res/values-mk/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-mk/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Напредни поставки"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Визуелна говорна пошта"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Дополнителен бекап и склад"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Ова е експериментална функција"</i></b>" што моментално ја тестираме. Постои можност да брише говорни пораки од вашиот сервер за говорна пошта. Нема гаранција дека функцијава ќе се поддржува во иднина. Сепак, многу би ни значеле повратните информации за функцијата."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Поставете PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Променете PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"За променување на PIN-кодот, мора да се овозможи визуелна говорна пошта"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ml/strings.xml b/java/com/android/voicemail/impl/res/values-ml/strings.xml
index c30ebbcfe..d7fd31f1e 100644
--- a/java/com/android/voicemail/impl/res/values-ml/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ml/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"വിപുലമായ ക്രമീകരണം"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"വിഷ്വൽ വോയ്‌സ്‌മെയിൽ"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"അധിക ബായ്‌ക്കപ്പും സ്‌റ്റോറേജും"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" ഇത് നിലവിൽ ഞങ്ങൾ പരീക്ഷിക്കുന്ന "<b><i>"ഒരു പരീക്ഷണാത്മക ഫീച്ചറാണ്"</i></b>". ഇത് നിങ്ങളുടെ വോയ്‌സ്‌മെയിൽ സെർവറിൽ നിന്ന് വോയ്‌സ്‌മെയിലുകൾ ഇല്ലാതാക്കാൻ സാധ്യതയുണ്ട്. ഈ ഫീച്ചർ ഭാവിയിൽ ഉപയോഗിക്കാനാവുമെന്ന് ഉറപ്പൊന്നുമില്ല. എങ്കിലും ഈ ഫീച്ചറിനെക്കുറിച്ചുള്ള ഫീഡ്‌ബാക്ക് അറിയാൻ ഞങ്ങൾ താൽപ്പര്യപ്പെടുന്നു."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"പിൻ സജ്ജമാക്കുക"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"പിൻ മാറ്റുക"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"പിൻ മാറ്റുന്നതിന് വിഷ്വൽ വോയ്‌സ്‌മെയിൽ പ്രവർത്തനക്ഷമമാക്കേണ്ടതുണ്ട്"</string>
diff --git a/java/com/android/voicemail/impl/res/values-mn/strings.xml b/java/com/android/voicemail/impl/res/values-mn/strings.xml
index a559d1900..5f726342f 100644
--- a/java/com/android/voicemail/impl/res/values-mn/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-mn/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Нарийвчилсан тохиргоо"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Уншиж болохуйц дуут шуудан"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Нэмэлт нөөцлөлт болон хадгалах сан"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" Энэ бол бидний одоо шалгаж буй "<b><i>"туршилтын функц"</i></b>". Энэ таны дуут шуудангийн серверээс дуут шуудангуудыг устгах магадлалтай. Цаашид энэ функцийг дэмжих баталгаа байхгүй. Гэхдээ энэ функцийн талаар санал хүсэлт илгээвэл талархах болно."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN тохируулах"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN өөрчлөх"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Харагдах дуут шуудан PIN-г өөрчлөх боломжтой байх ёстой"</string>
diff --git a/java/com/android/voicemail/impl/res/values-mr/strings.xml b/java/com/android/voicemail/impl/res/values-mr/strings.xml
index 56e864b81..e8c546ce6 100644
--- a/java/com/android/voicemail/impl/res/values-mr/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-mr/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"प्रगत सेटिंग्ज"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"दृश्‍यमान व्हॉइसमेल"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"अतिरिक्त बॅक अप आणि संचय"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"हे प्रायोगिक वैशिष्ट्य आहे"</i></b>" आम्ही सध्‍या चाचणी घेत आहोत. हे आपल्या व्हॉइसमेल सर्व्हर मधून संभाव्यपणे व्हॉइसमेल हटवेल. भविष्‍यात या वैशिष्‍ट्यास समर्थन देण्याची हमी नाही. तरीही आम्ही वैशिष्‍ट्यावरील अभिप्राय घेऊ इच्छितो."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"पिन सेट करा"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"पिन बदला"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"पिन बदलण्‍यासाठी व्हिज्युअल व्हॉइसमेल सक्षम करणे आवश्‍यक आहे"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ms/strings.xml b/java/com/android/voicemail/impl/res/values-ms/strings.xml
index ea9b38f08..4468d49d7 100644
--- a/java/com/android/voicemail/impl/res/values-ms/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ms/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Tetapan Terperinci"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Mel Suara Visual"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Sandaran dan storan tambahan"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Ini ialah ciri percubaan"</i></b>" yang sedang kami uji. Ciri ini berupaya memadamkan mel suara daripada pelayan mel suara anda. Tiada jaminan bahawa ciri ini akan disokong pada masa hadapan. Namun begitu, kami berharap untuk menerima maklum balas tentang ciri ini."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Tetapkan PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Tukar PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Mel suara visual mesti didayakan untuk menukar PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-my/strings.xml b/java/com/android/voicemail/impl/res/values-my/strings.xml
index 6c789275a..41e88351d 100644
--- a/java/com/android/voicemail/impl/res/values-my/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-my/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"အဆင့်မြင့် ဆက်တင်များ"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"စာသားမှတ်တမ်းပါ အသံမေးလ်"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"အပိုဆောင်း မိတ္တူနှင့် သိုလှောင်မှု"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" ဤသည်မှာ "<b><i>"စမ်းသပ်ဆဲဝန်ဆောင်မှုတစ်ခု"</i></b>" ဖြစ်ပါသည်။ ၎င်းက သင်၏အသံမေးလ်ဆာဗာမှ အသံမေးလ်များကို ဖျက်ပစ်နိုင်ပါသည်။ ဤဝန်ဆောင်မှုကို အနာဂတ်တွင် ဆက်လက်ရရှိနိုင်မည်ဟု အာမခံထားခြင်း မရှိသော်လည်း ၎င်းနှင့်ပတ်သက်သည့် အကြံပြုချက်များကို ရရှိလိုပါသည်။"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"ပင်နံပါတ် သတ်မှတ်ပါ"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"ပင်နံပါတ် ပြောင်းပါ"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"ပင်နံပါတ်ပြောင်းရန် စာသားမှတ်တမ်းပါ အသံမေးလ်ကို ဖွင့်ထားရပါမည်"</string>
diff --git a/java/com/android/voicemail/impl/res/values-nb/strings.xml b/java/com/android/voicemail/impl/res/values-nb/strings.xml
index 93e9e2a2c..afbdd3bb8 100644
--- a/java/com/android/voicemail/impl/res/values-nb/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-nb/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Avanserte innstillinger"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visuell talepostkasse"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Ekstra sikkerhetskopi og lagring"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Denne funksjonen er fortsatt under utforskning"</i></b>", og det kan føre til at noen av talepostmelingene dine slettes. Vi kan dessverre ikke love at denne funksjonen støttes i fremtiden, men vi vil gjerne høre om hva du mener om den."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Angi PIN-kode"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Endre PIN-koden"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Du må slå på visuell talepost for å endre PIN-koden"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ne/strings.xml b/java/com/android/voicemail/impl/res/values-ne/strings.xml
index d729c2323..a186535b5 100644
--- a/java/com/android/voicemail/impl/res/values-ne/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ne/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"उन्नत सेटिङहरू"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"भिजुअल भ्वाइस मेल"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"अतिरिक्त ब्याकअप र भण्डारण"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"यो एउटा प्रयोगात्मक विशेषता हो"</i></b>" हामी अहिले परीक्षण गर्दैछौं। यसले सम्भवत: तपाईंको भ्वाइस मेल सर्भरका भ्वाइस मेलहरूलाई मेट्ने छ। भविष्यमा यो विशेषतालाई समर्थन गरिने कुराको ग्यारेन्टी छैन। तथापि हामी यो विशेषताका सम्बन्धमा प्रतिक्रिया आऊन् भन्ने चाहन्छौं।"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN सेट गर्नुहोस्"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN परिवर्तन गर्नुहोस्"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN परिवर्तन गर्न अनिवार्य रूपले भिजुअल भ्वाइस मेललाई सक्षम पारिनुपर्छ"</string>
diff --git a/java/com/android/voicemail/impl/res/values-nl/strings.xml b/java/com/android/voicemail/impl/res/values-nl/strings.xml
index 7ae9f4e0e..ed66ab303 100644
--- a/java/com/android/voicemail/impl/res/values-nl/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-nl/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Geavanceerde instellingen"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visuele voicemail"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Extra back-up en opslag"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Dit is een experimentele functie"</i></b>" die wordt getest. Mogelijk worden hierdoor voicemails van de voicemailserver verwijderd. Er is geen garantie dat we deze functie in de toekomst blijven ondersteunen. We zijn wel heel benieuwd naar jullie feedback over de functie."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Pincode instellen"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Pincode wijzigen"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Visuele voicemail moet zijn ingeschakeld om de pincode te wijzigen"</string>
diff --git a/java/com/android/voicemail/impl/res/values-no/strings.xml b/java/com/android/voicemail/impl/res/values-no/strings.xml
index 93e9e2a2c..afbdd3bb8 100644
--- a/java/com/android/voicemail/impl/res/values-no/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-no/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Avanserte innstillinger"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visuell talepostkasse"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Ekstra sikkerhetskopi og lagring"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Denne funksjonen er fortsatt under utforskning"</i></b>", og det kan føre til at noen av talepostmelingene dine slettes. Vi kan dessverre ikke love at denne funksjonen støttes i fremtiden, men vi vil gjerne høre om hva du mener om den."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Angi PIN-kode"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Endre PIN-koden"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Du må slå på visuell talepost for å endre PIN-koden"</string>
diff --git a/java/com/android/voicemail/impl/res/values-pa/strings.xml b/java/com/android/voicemail/impl/res/values-pa/strings.xml
index f3551cc6e..ec68867c6 100644
--- a/java/com/android/voicemail/impl/res/values-pa/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-pa/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"ਉੱਨਤ ਸੈਟਿੰਗਾਂ"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"ਦ੍ਰਿਸ਼ਟਾਂਤਕ ਵੌਇਸਮੇਲ"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"ਵਾਧੂ ਬੈਕਅੱਪ ਅਤੇ ਸਟੋਰੇਜ"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"ਇਹ ਇੱਕ ਪ੍ਰਯੋਗਾਤਮਕ ਵਿਸ਼ੇਸ਼ਤਾ ਹੈ"</i></b>" ਜਿਸਦੀ ਅਸੀਂ ਇਸ ਵੇਲੇ ਜਾਂਚ ਕਰ ਰਹੇ ਹਾਂ। ਇਹ ਸੰਭਾਵੀ ਤੌਰ \'ਤੇ ਤੁਹਾਡੇ ਵੌਇਸਮੇਲ ਸਰਵਰ ਤੋਂ ਵੌਇਸਮੇਲਾਂ ਨੂੰ ਮਿਟਾ ਦੇਵੇਗੀ। ਭਵਿੱਖ ਵਿੱਚ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦਾ ਸਮਰਥਨ ਕਰਨ ਦੀਆਂ ਕੋਈ ਗਾਰੰਟੀਆਂ ਨਹੀਂ ਹਨ। ਅਸੀਂ ਹਾਲਾਂਕਿ ਵਿਸ਼ੇਸ਼ਤਾ \'ਤੇ ਪ੍ਰਤੀਕਰਮ ਨੂੰ ਪਸੰਦ ਕਰਾਂਗੇ।"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN ਸੈੱਟ ਕਰੋ"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN ਬਦਲੋ"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"ਦ੍ਰਿਸ਼ਟਾਂਤਕ ਵੌਇਸਮੇਲ ਨੂੰ PIN ਬਦਲਣ ਲਈ ਯੋਗ ਬਣਾਇਆ ਜਾਣਾ ਲਾਜ਼ਮੀ ਹੈ"</string>
diff --git a/java/com/android/voicemail/impl/res/values-pl/strings.xml b/java/com/android/voicemail/impl/res/values-pl/strings.xml
index 83003df97..25b891475 100644
--- a/java/com/android/voicemail/impl/res/values-pl/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-pl/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Ustawienia zaawansowane"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Wizualna poczta głosowa"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Dodatkowe miejsce i kopia zapasowa"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"To jest funkcja eksperymentalna"</i></b>", którą obecnie testujemy. Może ona usunąć wiadomości głosowe z Twojego serwera poczty głosowej. Nie gwarantujemy, że ta funkcja będzie w przyszłości obsługiwana. Chętnie jednak dowiemy się, co o niej sądzisz."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Ustaw kod PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Zmień kod PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Aby można było zmienić kod PIN, wizualna poczta głosowa musi być włączona"</string>
diff --git a/java/com/android/voicemail/impl/res/values-pt-rBR/strings.xml b/java/com/android/voicemail/impl/res/values-pt-rBR/strings.xml
index a0eee43ae..c93402e36 100644
--- a/java/com/android/voicemail/impl/res/values-pt-rBR/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-pt-rBR/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Configurações avançadas"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Correio de voz visual"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Armazenamento extra e backup"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Este é um recurso experimental"</i></b>" que estamos testando. Talvez ele exclua os correios de voz do seu servidor. Não há garantias de suporte no futuro, mas gostaríamos de receber seu feedback."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Definir PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Alterar PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"O correio de voz visual precisa ser ativado para alterar o PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-pt-rPT/strings.xml b/java/com/android/voicemail/impl/res/values-pt-rPT/strings.xml
index 2be877e23..00ed0331b 100644
--- a/java/com/android/voicemail/impl/res/values-pt-rPT/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-pt-rPT/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Definições avançadas"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Mensagem de correio de voz visual"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Cópia de segurança e armazenamento extra"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"É uma funcionalidade experimental"</i></b>" que estamos a testar. Poderá eliminar mensagens de correio de voz do servidor de correio de voz. Não há garantias de suporte para esta funcionalidade. Gostaríamos de receber comentários sobre a mesma."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Definir PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Alterar PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"A mensagem de correio de voz visual tem de estar ativada para poder alterar o PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-pt/strings.xml b/java/com/android/voicemail/impl/res/values-pt/strings.xml
index a0eee43ae..c93402e36 100644
--- a/java/com/android/voicemail/impl/res/values-pt/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-pt/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Configurações avançadas"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Correio de voz visual"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Armazenamento extra e backup"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Este é um recurso experimental"</i></b>" que estamos testando. Talvez ele exclua os correios de voz do seu servidor. Não há garantias de suporte no futuro, mas gostaríamos de receber seu feedback."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Definir PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Alterar PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"O correio de voz visual precisa ser ativado para alterar o PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ro/strings.xml b/java/com/android/voicemail/impl/res/values-ro/strings.xml
index 1c98d5a20..9099065c1 100644
--- a/java/com/android/voicemail/impl/res/values-ro/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ro/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Setări avansate"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Mesagerie vocală vizuală"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Backup și spațiu de stocare suplimentare"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Aceasta este o funcție experimentală"</i></b>" în curs de testare. E posibil ca mesajele vocale de pe serverul de mesagerie vocală să fie șterse. Nu se poate garanta acceptarea acestei funcții pe viitor, însă feedbackul dvs. e bine-venit."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Setați codul PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Schimbați codul PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Mesageria vocală vizuală trebuie activată pentru a schimba codul PIN."</string>
diff --git a/java/com/android/voicemail/impl/res/values-ru/strings.xml b/java/com/android/voicemail/impl/res/values-ru/strings.xml
index f899f149e..322b41bfb 100644
--- a/java/com/android/voicemail/impl/res/values-ru/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ru/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Расширенные настройки"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Визуальная голосовая почта"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Дополнительное место для хранения и резервного копирования"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Это экспериментальная функция"</i></b>", которая сейчас проходит тестирование. Возможно, ваши голосовые сообщения будут удалены с вашего сервера. Поддержка этой функции в дальнейшем не гарантируется. Мы бы хотели узнать ваше мнение о ней."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Установка PIN-кода"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Изменение PIN-кода"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Чтобы изменить PIN-код, включите визуальную голосовую почту"</string>
diff --git a/java/com/android/voicemail/impl/res/values-si/strings.xml b/java/com/android/voicemail/impl/res/values-si/strings.xml
index b5dc7826c..8ad6f87e6 100644
--- a/java/com/android/voicemail/impl/res/values-si/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-si/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"උසස් සැකසීම්"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"දෘශ්‍ය හඬ තැපෑල"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"අතිරේක උපස්ථය සහ ගබඩාව"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"මෙය අත්හදා බැලීමේ විශේෂාංගයකි"</i></b>" අපි දැන් පරීක්ෂා කරමින් සිටිමු. මෙය විභව්‍යව හඬ තැපැල් ඔබේ සේවාදායකයෙන් මකනු ඇත. මෙම විශේෂාංගය අනාගතයේදී සහාය දැක්වීම ගැන ඇපවීම් නැත. එසේ වුවත් අපි විශේෂාංගය ගැන ප්‍රතිපෝෂණවලට ආදරය කරන්නෙමු."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN අංකය සකසන්න"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN අංකය වෙනස් කරන්න"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN අංකය වෙනස් කිරීමට දෘශ්‍ය හඬ තැපෑල සබල කළ යුතුය"</string>
diff --git a/java/com/android/voicemail/impl/res/values-sk/strings.xml b/java/com/android/voicemail/impl/res/values-sk/strings.xml
index 5a81a1bd4..80252d454 100644
--- a/java/com/android/voicemail/impl/res/values-sk/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-sk/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Rozšírené nastavenia"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vizuálna hlasová schránka"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Ďalšie zálohovanie a úložisko"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Toto je experimentálna funkcia"</i></b>", ktorú práve testujeme. Táto funkcia vám môže odstrániť hlasové správy zo servera hlasovej schránky. Nemôžeme zaručiť, že bude podporovaná aj v budúcnosti, no budeme vám vďační za poskytnutie spätnej väzby."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Nastavenie kódu PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Zmena kódu PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN možno zmeniť až po povolení vizuálnej hlasovej schránky"</string>
diff --git a/java/com/android/voicemail/impl/res/values-sl/strings.xml b/java/com/android/voicemail/impl/res/values-sl/strings.xml
index ce0f40ec8..b634d156a 100644
--- a/java/com/android/voicemail/impl/res/values-sl/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-sl/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Dodatne nastavitve"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vizualno sporočilo v odzivniku"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Dodatno varnostno kopiranje in shramba"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"To je poskusna funkcija"</i></b>", za katero trenutno izvajamo preskuse. Sporočila v odzivniku bodo morda izbrisana iz strežnika za sporočila v odzivniku. Ni mogoče jamčiti, da bo ta funkcija podprta tudi v prihodnje. Kljub temu bomo veseli vaših povratnih informacij o funkciji."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Nastavitev kode PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Sprememba kode PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Če želite spremeniti kodo PIN, morajo biti vizualna sporočila v odzivniku omogočena"</string>
diff --git a/java/com/android/voicemail/impl/res/values-sq/strings.xml b/java/com/android/voicemail/impl/res/values-sq/strings.xml
index 472e60c0d..59db0fd74 100644
--- a/java/com/android/voicemail/impl/res/values-sq/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-sq/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Cilësimet e përparuara"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Posta zanore vizuale"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Rezervimi dhe hapësira ruajtëse shtesë"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Ky është një funksion eksperimental"</i></b>" që po e testojmë aktualisht. Kjo mund të fshijë posta zanore nga serveri i postës zanore. Nuk ka garanci për mbështetjen e këtij funksioni në të ardhmen. Megjithatë do të na pëlqente të merrnim komente për funksionin."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Konfiguro kodin PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Ndrysho kodin PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Duhet të aktivizohet posta zanore vizuale për të ndryshuar kodin PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-sr/strings.xml b/java/com/android/voicemail/impl/res/values-sr/strings.xml
index 431d0dfb3..d4998ed2e 100644
--- a/java/com/android/voicemail/impl/res/values-sr/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-sr/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Напредна подешавања"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Визуелна говорна пошта"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Додатне резервне копије и простор"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Ово је експериментална функција"</i></b>" коју тренутно тестирамо. Тако ће се можда избрисати говорне поруке са сервера говорне поште. Нема гаранција да ће ова функција бити подржана и у будућности. Ипак, желимо да добијамо повратне информације о њој."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Подесите PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Промените PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Морате да омогућите визуелну говорну пошту да бисте променили PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-sv/strings.xml b/java/com/android/voicemail/impl/res/values-sv/strings.xml
index cba2b15c8..c69a2df5f 100644
--- a/java/com/android/voicemail/impl/res/values-sv/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-sv/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Avancerade inställningar"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visuell röstbrevlåda"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Extra säkerhetskopiering och lagring"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Det här är en experimentfunktion"</i></b>" som vi för närvarande testar. Den kan potentiellt radera röstmeddelanden på röstbrevlådans server. Vi garanterar inte support för den här funktionen i framtiden. Vi är dock tacksamma för synpunkter om funktionen."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Ställ in pinkod"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Ändra pinkod"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Visuell röstbrevlåda måste vara aktiverat för att ändra pinkoden"</string>
diff --git a/java/com/android/voicemail/impl/res/values-sw/strings.xml b/java/com/android/voicemail/impl/res/values-sw/strings.xml
index 99de90ca5..d1cccc78c 100644
--- a/java/com/android/voicemail/impl/res/values-sw/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-sw/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Mipangilio ya Kina"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Ujumbe wa Sauti Unaoonekana"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Nafasi ya ziada na hifadhi rudufu"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Hiki ni kipengele cha majaribio"</i></b>" tunachoijaribu kwa sasa. Huenda kitafuta ujumbe wa sauti kutoka kwenye seva yako ya ujumbe wa sauti. Hakuna hakikisho yoyote kwamba kipengele hiki kitatumika katika siku zijazo. Hata hivyo, tungependa kupata maoni yako kuhusu kipengele hiki."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Weka PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Badilisha PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Lazima uruhusu kipengele cha ujumbe wa sauti unaoonekana ili ubadilishe PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ta/strings.xml b/java/com/android/voicemail/impl/res/values-ta/strings.xml
index a6c97c112..0c3c454e1 100644
--- a/java/com/android/voicemail/impl/res/values-ta/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ta/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"மேம்பட்ட அமைப்புகள்"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"விஷூவல் குரலஞ்சல்"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"கூடுதல் காப்புப் பிரதியும் சேமிப்பகமும்"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" தற்போது நாங்கள் நடத்தி வரும் சோதனையில் "<b><i>"இது ஒரு சோதனை அம்சமாகும்"</i></b>". இது உங்கள் குரலஞ்சல் சேவையகத்திலிருந்து குரலஞ்சல்களை நீக்க சாத்தியமுள்ளது. இந்த அம்சம் எதிர்காலத்தில் ஆதரிக்கப்படும் என்பதற்கு உத்திரவாதம் இல்லை. இருப்பினும் இந்த அம்சத்தைப் பற்றிய கருத்தை வரவேற்கிறோம்."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"பின்னை அமை"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"பின்னை மாற்று"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"பின்னை மாற்ற, விஷுவல் குரலஞ்சலை இயக்க வேண்டும்"</string>
diff --git a/java/com/android/voicemail/impl/res/values-te/strings.xml b/java/com/android/voicemail/impl/res/values-te/strings.xml
index 2ad08cffe..7a865f43f 100644
--- a/java/com/android/voicemail/impl/res/values-te/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-te/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"అధునాతన సెట్టింగ్‌లు"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"దృశ్యమాన వాయిస్ మెయిల్"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"అదనపు బ్యాకప్ మరియు నిల్వ"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"ఇది ప్రయోగాత్మక లక్షణం"</i></b>" ప్రస్తుతం మేము దీన్ని పరీక్షిస్తున్నాము. దీని వలన మీ వాయిస్ మెయిల్ సర్వర్ నుండి సంభావ్యంగా వాయిస్ మెయిల్‌లు తొలగించబడతాయి. భవిష్యత్తులో ఈ లక్షణానికి మద్దతు ఉంటుందని ఎలాంటి హామీ అందించబడదు. అయితే, లక్షణంపై అభిప్రాయాన్ని అందిస్తే మేము సంతోషిస్తాము."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PINని సెట్ చేయండి"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PINను మార్చండి"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PINని మార్చడానికి తప్పనిసరిగా దృశ్యమాన వాయిస్ మెయిల్‌ను ప్రారంభించాలి"</string>
diff --git a/java/com/android/voicemail/impl/res/values-th/strings.xml b/java/com/android/voicemail/impl/res/values-th/strings.xml
index 49b07dfa2..68b32fb45 100644
--- a/java/com/android/voicemail/impl/res/values-th/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-th/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"การตั้งค่าขั้นสูง"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"ภาพแสดงข้อความเสียง"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"การสำรองข้อมูลและพื้นที่เก็บข้อมูลเพิ่มเติม"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"นี่คือคุณลักษณะทดลอง"</i></b>"ที่เรากำลังทดสอบการใช้งานอยู่ ซึ่งอาจลบข้อความเสียงออกจากเซิร์ฟเวอร์ข้อความเสียงได้ เราไม่รับประกันว่าจะรองรับคุณลักษณะนี้ในอนาคต แต่ยินดีรับฟังความคิดเห็น"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"ตั้งค่า PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"เปลี่ยน PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"ต้องเปิดใช้ข้อความเสียงพร้อมภาพเพื่อเปลี่ยน PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-tl/strings.xml b/java/com/android/voicemail/impl/res/values-tl/strings.xml
index 62623b633..c14919c03 100644
--- a/java/com/android/voicemail/impl/res/values-tl/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-tl/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Mga Advanced na Setting"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Visual na Voicemail"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Karagdagang backup at storage"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Eksperimental na feature ito"</i></b>" na kasalukuyan naming sinusubukan. Posible nitong i-delete ang mga voicemail mula sa iyong server ng voicemail. Walang garantiyang susuportahan ang feature na ito sa hinaharap. Gayunpaman, gusto naming makakuha ng feedback tungkol sa feature."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Magtakda ng PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Palitan ang PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Dapat naka-enable ang visual na voicemail upang palitan ang PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-tr/strings.xml b/java/com/android/voicemail/impl/res/values-tr/strings.xml
index aed722a11..e8f9336f3 100644
--- a/java/com/android/voicemail/impl/res/values-tr/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-tr/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Gelişmiş Ayarlar"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Görsel Sesli Mesaj"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Ekstra yedekleme ve depolama alanı"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b>"Bu, test etmekte olduğumuz "<i>"deneysel bir özelliktir"</i></b>". Bu özellik, sesli mesaj sunucunuzdaki mesajların silinmesine neden olabilir ve gelecekte desteklenmeyebilir. Yine de özellikle ilgili geri bildiriminizi öğrenmek isteriz."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN belirleyin"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN\'i değiştirin"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN\'i değiştirebilmek için görsel sesli mesaj etkinleştirilmelidir"</string>
diff --git a/java/com/android/voicemail/impl/res/values-uk/strings.xml b/java/com/android/voicemail/impl/res/values-uk/strings.xml
index c3cbee681..760177ca4 100644
--- a/java/com/android/voicemail/impl/res/values-uk/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-uk/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Розширені налаштування"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Візуальна голосова пошта"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Додаткова пам’ять і резервне копіювання"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Це експериментальна функція,"</i></b>" яку ми зараз тестуємо. У результаті її використання голосові повідомлення може бути видалено із сервера голосової пошти. Ми не гарантуємо, що ця функція підтримуватиметься в майбутньому, однак хочемо отримати відгук про неї."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Установити PIN-код"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Змінити PIN-код"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Щоб змінити PIN-код, потрібно ввімкнути візуальну голосову пошту"</string>
diff --git a/java/com/android/voicemail/impl/res/values-ur/strings.xml b/java/com/android/voicemail/impl/res/values-ur/strings.xml
index 201e6e910..2105fae08 100644
--- a/java/com/android/voicemail/impl/res/values-ur/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-ur/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"اعلی ترتیبات"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"بصری صوتی میل"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"اضافی بیک اپ اور اسٹوریج"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"یہ ایک تجرباتی خصوصیت ہے"</i></b>" جسے ابھی ہم ٹیسٹ کر رہے ہیں۔ یہ ممکنہ طور پر آپ کے صوتی میل سرور پر سے آپ کی صوتی میلز کو حذف کر دے گی۔ مستقبل میں اس خصوصیت کی معاونت کی کوئی ضمانت نہیں ہے۔ لیکن ہم اس خصوصیت پر تاثرات پسند کریں گے۔"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"‏PIN سیٹ کریں"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"‏PIN تبدیل کریں"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"‏PIN تبدیل کرنے کیلئے بصری صوتی میل اہل ہونی چاہئیے"</string>
diff --git a/java/com/android/voicemail/impl/res/values-uz/strings.xml b/java/com/android/voicemail/impl/res/values-uz/strings.xml
index 7f26475ec..fad79164d 100644
--- a/java/com/android/voicemail/impl/res/values-uz/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-uz/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Kengaytirilgan sozlamalar"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Vizual ovozli pochta"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Zaxira. va saqlash u-n qo‘shimcha xotira"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Bu – tajribaviy xususiyat bo‘lib,"</i></b>" u ayni vaqtda sinovdan o‘tkazilmoqda. Sizning ovozli xabarlaringiz, ehtimol, ovozli pochta serveridan o‘chirib tashlanadi. Bu xususiyatning keyinchalik qo‘llab-quvvatlanishi kafolatlanmaydi. Shunday bo‘lsa-da, u haqda fikr-mulohaza bildirishingizni xohlaymiz."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"PIN kod o‘rnatish"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"PIN kodni o‘zgartirish"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"PIN kodni o‘zgartirish uchun vizual ovozli pochtani yoqish lozim."</string>
diff --git a/java/com/android/voicemail/impl/res/values-vi/strings.xml b/java/com/android/voicemail/impl/res/values-vi/strings.xml
index a0b25f803..1d029ea12 100644
--- a/java/com/android/voicemail/impl/res/values-vi/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-vi/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Cài đặt nâng cao"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Thư thoại kèm theo hình ảnh"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Bộ nhớ và bản sao lưu bổ sung"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Đây là một tính năng thử nghiệm"</i></b>" chúng tôi hiện đang thử nghiệm. Tính năng này có khả năng sẽ xóa thư thoại khỏi máy chủ thư thoại của bạn. Không có đảm bảo về việc hỗ trợ tính năng này trong tương lai. Mặc dù vậy, chúng tôi vẫn mong muốn nhận được phản hồi về tính năng này."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Đặt mã PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Thay đổi mã PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Phải bật thư thoại kèm theo hình ảnh để thay đổi mã PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-zh-rCN/strings.xml b/java/com/android/voicemail/impl/res/values-zh-rCN/strings.xml
index 9bfbe368d..d70f1fa51 100644
--- a/java/com/android/voicemail/impl/res/values-zh-rCN/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-zh-rCN/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"高级设置"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"可视语音信箱"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"额外存储空间和备份功能"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"这是一项试验性功能"</i></b>" 我们目前正在进行测试。使用此功能可能会将语音邮件从您的语音邮件服务器上删除。我们不保证将来会支持此功能,但希望能收到针对此功能的反馈。"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"设置 PIN 码"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"更改 PIN 码"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"必须启用可视语音信箱才可更改 PIN 码"</string>
diff --git a/java/com/android/voicemail/impl/res/values-zh-rHK/strings.xml b/java/com/android/voicemail/impl/res/values-zh-rHK/strings.xml
index 6c1ed4d15..4adc3fd97 100644
--- a/java/com/android/voicemail/impl/res/values-zh-rHK/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-zh-rHK/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"進階設定"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"視像留言"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"額外備份功能和儲存空間"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"此為我們目前正在測試的實驗性功能"</i></b>",有可能會將您的留言從留言伺服器刪除。我們不保證日後會支援此功能,但還是歡迎您提供相關意見。"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"設定 PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"變更 PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"必須啟用視像留言才能變更 PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-zh-rTW/strings.xml b/java/com/android/voicemail/impl/res/values-zh-rTW/strings.xml
index 0af6ed152..6ff084f60 100644
--- a/java/com/android/voicemail/impl/res/values-zh-rTW/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-zh-rTW/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"進階設定"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"視覺化語音信箱"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"額外的備份功能和儲存空間"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b>"這是實驗性功能"<i></i></b>",目前正在測試階段,而且可能會從你的語音信箱伺服器中刪除語音留言。我們不保證日後會支援此功能,但還是希望聽聽你的寶貴意見。"</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"設定 PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"變更 PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"必須啟用視覺化語音信箱才能變更 PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values-zu/strings.xml b/java/com/android/voicemail/impl/res/values-zu/strings.xml
index 81d4d3548..5adf300e5 100644
--- a/java/com/android/voicemail/impl/res/values-zu/strings.xml
+++ b/java/com/android/voicemail/impl/res/values-zu/strings.xml
@@ -24,7 +24,6 @@
<string name="voicemail_advanced_settings_title" msgid="6390900339808156711">"Izilungiselelo ezithuthukisiwe"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="3158454817165714998">"Ivoyisimeyili ebonakalayo"</string>
<string name="voicemail_visual_voicemail_auto_archive_switch_title" msgid="7120443850486401455">"Isipele esingeziwe nesitoreji"</string>
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer" msgid="401509437213449235">" "<b><i>"Lesi isici sokuhlola"</i></b>" manje esisihlolayo. Lokhu kunamandla okususa amavoyisimeyili kusukela kuseva yakho yevoyisimeyili. Azikho iziqinisekiso zokusekela lesi sici ngokuzayo. Singathanda impendulo kusici yize kunjalo."</string>
<string name="voicemail_set_pin_preference_title" msgid="1034691230818233684">"Setha i-PIN"</string>
<string name="voicemail_change_pin_preference_title" msgid="8944570865151211693">"Shintsha i-PIN"</string>
<string name="voicemail_change_pin_preference_summary_disable" msgid="2787334822298063691">"Ivoyisimeyili ebonakalayo kumele inikwe amandla ukuze ishintshe i-PIN"</string>
diff --git a/java/com/android/voicemail/impl/res/values/strings.xml b/java/com/android/voicemail/impl/res/values/strings.xml
index c8085619b..bb754d18b 100644
--- a/java/com/android/voicemail/impl/res/values/strings.xml
+++ b/java/com/android/voicemail/impl/res/values/strings.xml
@@ -59,11 +59,6 @@
<string name="voicemail_visual_voicemail_auto_archive_switch_title">
Extra backup and storage
</string>
- <!-- Visual voicemail archive temporary description [CHAR LIMIT=40] -->
- <string name="voicemail_visual_voicemail_auto_archive_temporary_disclaimer">
- <b><i>This is a experimental feature</i></b> we are currently testing. This will potentially delete voicemails from your voicemail server. There are no guarantees of supporting this feature in the future. We would love feedback on the feature though."
- </string>
-
<!-- Voicemail change PIN dialog title [CHAR LIMIT=40] -->
<string name="voicemail_set_pin_preference_title">Set PIN</string>
diff --git a/java/com/android/voicemail/impl/scheduling/BaseTask.java b/java/com/android/voicemail/impl/scheduling/BaseTask.java
index 4cc6dd59e..0144e346f 100644
--- a/java/com/android/voicemail/impl/scheduling/BaseTask.java
+++ b/java/com/android/voicemail/impl/scheduling/BaseTask.java
@@ -18,12 +18,14 @@ package com.android.voicemail.impl.scheduling;
import android.content.Context;
import android.content.Intent;
+import android.os.Bundle;
import android.os.SystemClock;
import android.support.annotation.CallSuper;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.annotation.WorkerThread;
import android.telecom.PhoneAccountHandle;
+import com.android.dialer.proguard.UsedByReflection;
import com.android.voicemail.impl.Assert;
import com.android.voicemail.impl.NeededForTesting;
import java.util.ArrayList;
@@ -33,10 +35,15 @@ import java.util.List;
* Provides common utilities for task implementations, such as execution time and managing {@link
* Policy}
*/
+@UsedByReflection(value = "Tasks.java")
public abstract class BaseTask implements Task {
private static final String EXTRA_PHONE_ACCOUNT_HANDLE = "extra_phone_account_handle";
+ private static final String EXTRA_EXECUTION_TIME = "extra_execution_time";
+
+ private Bundle mExtras;
+
private Context mContext;
private int mId;
@@ -58,7 +65,7 @@ public abstract class BaseTask implements Task {
/**
* Modify the task ID to prevent arbitrary task from executing. Can only be called before {@link
- * #onCreate(Context, Intent, int, int)} returns.
+ * #onCreate(Context, Bundle)} returns.
*/
@MainThread
public void setId(int id) {
@@ -86,8 +93,7 @@ public abstract class BaseTask implements Task {
return mPhoneAccountHandle;
}
/**
- * Should be call in the constructor or {@link Policy#onCreate(BaseTask, Intent, int, int)} will
- * be missed.
+ * Should be call in the constructor or {@link Policy#onCreate(BaseTask, Bundle)} will be missed.
*/
@MainThread
public BaseTask addPolicy(Policy policy) {
@@ -107,6 +113,7 @@ public abstract class BaseTask implements Task {
mHasFailed = true;
}
+ /** @param timeMillis the time since epoch, in milliseconds. */
@MainThread
public void setExecutionTime(long timeMillis) {
Assert.isMainThread();
@@ -131,7 +138,7 @@ public abstract class BaseTask implements Task {
*/
public static Intent createIntent(
Context context, Class<? extends BaseTask> task, PhoneAccountHandle phoneAccountHandle) {
- Intent intent = TaskSchedulerService.createIntent(context, task);
+ Intent intent = Tasks.createIntent(context, task);
intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
return intent;
}
@@ -142,12 +149,27 @@ public abstract class BaseTask implements Task {
}
@Override
+ public Bundle toBundle() {
+ mExtras.putLong(EXTRA_EXECUTION_TIME, mExecutionTime);
+ return mExtras;
+ }
+
+ @Override
@CallSuper
- public void onCreate(Context context, Intent intent, int flags, int startId) {
+ public void onCreate(Context context, Bundle extras) {
mContext = context;
- mPhoneAccountHandle = intent.getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE);
+ mExtras = extras;
+ mPhoneAccountHandle = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
for (Policy policy : mPolicies) {
- policy.onCreate(this, intent, flags, startId);
+ policy.onCreate(this, extras);
+ }
+ }
+
+ @Override
+ @CallSuper
+ public void onRestore(Bundle extras) {
+ if (mExtras.containsKey(EXTRA_EXECUTION_TIME)) {
+ mExecutionTime = extras.getLong(EXTRA_EXECUTION_TIME);
}
}
diff --git a/java/com/android/voicemail/impl/scheduling/BlockerTask.java b/java/com/android/voicemail/impl/scheduling/BlockerTask.java
index 353508d56..1c8badaed 100644
--- a/java/com/android/voicemail/impl/scheduling/BlockerTask.java
+++ b/java/com/android/voicemail/impl/scheduling/BlockerTask.java
@@ -17,10 +17,12 @@
package com.android.voicemail.impl.scheduling;
import android.content.Context;
-import android.content.Intent;
+import android.os.Bundle;
+import com.android.dialer.proguard.UsedByReflection;
import com.android.voicemail.impl.VvmLog;
/** Task to block another task of the same ID from being queued for a certain amount of time. */
+@UsedByReflection(value = "Tasks.java")
public class BlockerTask extends BaseTask {
private static final String TAG = "BlockerTask";
@@ -33,10 +35,10 @@ public class BlockerTask extends BaseTask {
}
@Override
- public void onCreate(Context context, Intent intent, int flags, int startId) {
- super.onCreate(context, intent, flags, startId);
- setId(intent.getIntExtra(EXTRA_TASK_ID, TASK_INVALID));
- setExecutionTime(getTimeMillis() + intent.getIntExtra(EXTRA_BLOCK_FOR_MILLIS, 0));
+ public void onCreate(Context context, Bundle extras) {
+ super.onCreate(context, extras);
+ setId(extras.getInt(EXTRA_TASK_ID, TASK_INVALID));
+ setExecutionTime(getTimeMillis() + extras.getInt(EXTRA_BLOCK_FOR_MILLIS, 0));
}
@Override
@@ -46,6 +48,6 @@ public class BlockerTask extends BaseTask {
@Override
public void onDuplicatedTaskAdded(Task task) {
- VvmLog.v(TAG, task.toString() + "blocked, " + getReadyInMilliSeconds() + "millis remaining");
+ VvmLog.i(TAG, task + "blocked, " + getReadyInMilliSeconds() + "millis remaining");
}
}
diff --git a/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java b/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java
index 8b2fe7098..76fba4fb0 100644
--- a/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java
+++ b/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java
@@ -17,6 +17,7 @@
package com.android.voicemail.impl.scheduling;
import android.content.Intent;
+import android.os.Bundle;
import com.android.voicemail.impl.scheduling.Task.TaskId;
/**
@@ -35,7 +36,7 @@ public class MinimalIntervalPolicy implements Policy {
}
@Override
- public void onCreate(BaseTask task, Intent intent, int flags, int startId) {
+ public void onCreate(BaseTask task, Bundle extras) {
mTask = task;
mId = mTask.getId();
}
@@ -47,7 +48,7 @@ public class MinimalIntervalPolicy implements Policy {
public void onCompleted() {
if (!mTask.hasFailed()) {
Intent intent =
- mTask.createIntent(mTask.getContext(), BlockerTask.class, mId.phoneAccountHandle);
+ BaseTask.createIntent(mTask.getContext(), BlockerTask.class, mId.phoneAccountHandle);
intent.putExtra(BlockerTask.EXTRA_TASK_ID, mId.id);
intent.putExtra(BlockerTask.EXTRA_BLOCK_FOR_MILLIS, mBlockForMillis);
mTask.getContext().startService(intent);
diff --git a/java/com/android/voicemail/impl/scheduling/Policy.java b/java/com/android/voicemail/impl/scheduling/Policy.java
index 607782191..9624aeb7d 100644
--- a/java/com/android/voicemail/impl/scheduling/Policy.java
+++ b/java/com/android/voicemail/impl/scheduling/Policy.java
@@ -16,7 +16,7 @@
package com.android.voicemail.impl.scheduling;
-import android.content.Intent;
+import android.os.Bundle;
/**
* A set of listeners managed by {@link BaseTask} for common behaviors such as retrying. Call {@link
@@ -24,7 +24,7 @@ import android.content.Intent;
*/
public interface Policy {
- void onCreate(BaseTask task, Intent intent, int flags, int startId);
+ void onCreate(BaseTask task, Bundle extras);
void onBeforeExecute();
diff --git a/java/com/android/voicemail/impl/scheduling/PostponePolicy.java b/java/com/android/voicemail/impl/scheduling/PostponePolicy.java
index e24df0c7a..46773b53a 100644
--- a/java/com/android/voicemail/impl/scheduling/PostponePolicy.java
+++ b/java/com/android/voicemail/impl/scheduling/PostponePolicy.java
@@ -16,7 +16,7 @@
package com.android.voicemail.impl.scheduling;
-import android.content.Intent;
+import android.os.Bundle;
import com.android.voicemail.impl.VvmLog;
/**
@@ -37,7 +37,7 @@ public class PostponePolicy implements Policy {
}
@Override
- public void onCreate(BaseTask task, Intent intent, int flags, int startId) {
+ public void onCreate(BaseTask task, Bundle extras) {
mTask = task;
mTask.setExecutionTime(mTask.getTimeMillis() + mPostponeMillis);
}
@@ -62,7 +62,7 @@ public class PostponePolicy implements Policy {
if (mTask.hasStarted()) {
return;
}
- VvmLog.d(TAG, "postponing " + mTask);
+ VvmLog.i(TAG, "postponing " + mTask);
mTask.setExecutionTime(mTask.getTimeMillis() + mPostponeMillis);
}
}
diff --git a/java/com/android/voicemail/impl/scheduling/RetryPolicy.java b/java/com/android/voicemail/impl/scheduling/RetryPolicy.java
index a8e4a3d3c..b8703ea15 100644
--- a/java/com/android/voicemail/impl/scheduling/RetryPolicy.java
+++ b/java/com/android/voicemail/impl/scheduling/RetryPolicy.java
@@ -17,6 +17,7 @@
package com.android.voicemail.impl.scheduling;
import android.content.Intent;
+import android.os.Bundle;
import android.telecom.PhoneAccountHandle;
import com.android.voicemail.impl.VoicemailStatus;
import com.android.voicemail.impl.VvmLog;
@@ -60,11 +61,11 @@ public class RetryPolicy implements Policy {
}
@Override
- public void onCreate(BaseTask task, Intent intent, int flags, int startId) {
+ public void onCreate(BaseTask task, Bundle extras) {
mTask = task;
- mRetryCount = intent.getIntExtra(EXTRA_RETRY_COUNT, 0);
+ mRetryCount = extras.getInt(EXTRA_RETRY_COUNT, 0);
if (mRetryCount > 0) {
- VvmLog.d(
+ VvmLog.i(
TAG,
"retry #" + mRetryCount + " for " + mTask + " queued, executing in " + mRetryDelayMillis);
mTask.setExecutionTime(mTask.getTimeMillis() + mRetryDelayMillis);
@@ -85,10 +86,10 @@ public class RetryPolicy implements Policy {
public void onCompleted() {
if (!mFailed || !hasMoreRetries()) {
if (!mFailed) {
- VvmLog.d(TAG, mTask.toString() + " completed successfully");
+ VvmLog.i(TAG, mTask + " completed successfully");
}
if (!hasMoreRetries()) {
- VvmLog.d(TAG, "Retry limit for " + mTask + " reached");
+ VvmLog.i(TAG, "Retry limit for " + mTask + " reached");
}
VvmLog.i(TAG, "committing deferred status: " + mVoicemailStatusEditor.getValues());
mVoicemailStatusEditor.deferredApply();
diff --git a/java/com/android/voicemail/impl/scheduling/Task.java b/java/com/android/voicemail/impl/scheduling/Task.java
index 2d08f5b03..447a9db7b 100644
--- a/java/com/android/voicemail/impl/scheduling/Task.java
+++ b/java/com/android/voicemail/impl/scheduling/Task.java
@@ -17,26 +17,24 @@
package com.android.voicemail.impl.scheduling;
import android.content.Context;
-import android.content.Intent;
+import android.os.Bundle;
import android.support.annotation.MainThread;
import android.support.annotation.WorkerThread;
import android.telecom.PhoneAccountHandle;
import java.util.Objects;
/**
- * A task for {@link TaskSchedulerService} to execute. Since the task is sent through a intent to
- * the scheduler, The task must be constructable with the intent. Specifically, It must have a
- * constructor with zero arguments, and have all relevant data packed inside the intent. Use {@link
- * TaskSchedulerService#createIntent(Context, Class)} to create a intent that will construct the
- * Task.
+ * A task for {@link TaskSchedulerService} to execute. Since the task is sent through a bundle to
+ * the scheduler, The task must be constructable with the bundle. Specifically, It must have a
+ * constructor with zero arguments, and have all relevant data packed inside the bundle. Use {@link
+ * Tasks#createIntent(Context, Class)} to create a intent that will construct the Task.
*
* <p>Only {@link #onExecuteInBackgroundThread()} is run on the worker thread.
*/
public interface Task {
-
/**
* TaskId to indicate it has not be set. If a task does not provide a default TaskId it should be
- * set before {@link Task#onCreate(Context, Intent, int, int) returns}
+ * set before {@link Task#onCreate(Context, Bundle)} returns
*/
int TASK_INVALID = -1;
@@ -49,6 +47,7 @@ public interface Task {
int TASK_UPLOAD = 1;
int TASK_SYNC = 2;
int TASK_ACTIVATION = 3;
+ int TASK_STATUS_CHECK = 4;
/**
* Used to differentiate between types of tasks. If a task with the same TaskId is already in the
@@ -87,8 +86,29 @@ public interface Task {
TaskId getId();
+ /**
+ * Serializes the task into a bundle, which will be stored in a {@link android.app.job.JobInfo}
+ * and used to reconstruct the task even if the app is terminated. The task will be initialized
+ * with {@link #onCreate(Context, Bundle)}.
+ */
+ Bundle toBundle();
+
+ /**
+ * A task object is created through reflection, calling the default constructor. The actual
+ * initialization is done in this method. If the task is not a new instance, but being restored
+ * from a bundle, {@link #onRestore(Bundle)} will be called afterwards.
+ */
+ @MainThread
+ void onCreate(Context context, Bundle extras);
+
+ /**
+ * Called after {@link #onCreate(Context, Bundle)} if the task is being restored from a Bundle
+ * instead creating a new instance. For example, if the task is stored in {@link
+ * TaskSchedulerJobService} during a long sleep, this will be called when the job is ran again and
+ * the tasks are being restored from the saved state.
+ */
@MainThread
- void onCreate(Context context, Intent intent, int flags, int startId);
+ void onRestore(Bundle extras);
/**
* @return number of milliSeconds the scheduler should wait before running this task. A value less
diff --git a/java/com/android/voicemail/impl/scheduling/TaskQueue.java b/java/com/android/voicemail/impl/scheduling/TaskQueue.java
new file mode 100644
index 000000000..fc5aa947a
--- /dev/null
+++ b/java/com/android/voicemail/impl/scheduling/TaskQueue.java
@@ -0,0 +1,149 @@
+/*
+ * 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.voicemail.impl.scheduling;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import com.android.voicemail.impl.Assert;
+import com.android.voicemail.impl.VvmLog;
+import com.android.voicemail.impl.scheduling.Task.TaskId;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Queue;
+
+/**
+ * A queue that manages priority and duplication of {@link Task}. A task is identified by a {@link
+ * TaskId}, which consists of an integer representing the operation the task, and a {@link
+ * android.telecom.PhoneAccountHandle} representing which SIM it is operated on.
+ */
+class TaskQueue implements Iterable<Task> {
+
+ private final Queue<Task> queue = new ArrayDeque<>();
+
+ public List<Bundle> toBundles() {
+ List<Bundle> result = new ArrayList<>(queue.size());
+ for (Task task : queue) {
+ result.add(Tasks.toBundle(task));
+ }
+ return result;
+ }
+
+ public void fromBundles(Context context, List<Bundle> pendingTasks) {
+ Assert.isTrue(queue.isEmpty());
+ for (Bundle pendingTask : pendingTasks) {
+ Task task = Tasks.createTask(context, pendingTask);
+ task.onRestore(pendingTask);
+ add(task);
+ }
+ }
+
+ /**
+ * Add a new task to the queue. A new task with a TaskId collision will be discarded, and {@link
+ * Task#onDuplicatedTaskAdded(Task)} will be called on the existing task.
+ *
+ * @return {@code true} if the task is added, or {@code false} if the task is discarded due to
+ * collision.
+ */
+ public boolean add(Task task) {
+ if (task.getId().id == Task.TASK_INVALID) {
+ throw new AssertionError("Task id was not set to a valid value before adding.");
+ }
+ if (task.getId().id != Task.TASK_ALLOW_DUPLICATES) {
+ Task oldTask = getTask(task.getId());
+ if (oldTask != null) {
+ oldTask.onDuplicatedTaskAdded(task);
+ VvmLog.i("TaskQueue.add", "duplicated task added");
+ return false;
+ }
+ }
+ queue.add(task);
+ return true;
+ }
+
+ public void remove(Task task) {
+ queue.remove(task);
+ }
+
+ public Task getTask(TaskId id) {
+ Assert.isMainThread();
+ for (Task task : queue) {
+ if (task.getId().equals(id)) {
+ return task;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Packed return value of {@link #getNextTask(long)}. If a runnable task is found {@link
+ * #minimalWaitTimeMillis} will be {@code null}. If no tasks is runnable {@link #task} will be
+ * {@code null}, and {@link #minimalWaitTimeMillis} will contain the time to wait. If there are no
+ * tasks at all both will be {@code null}.
+ */
+ static final class NextTask {
+ @Nullable final Task task;
+ @Nullable final Long minimalWaitTimeMillis;
+
+ NextTask(@Nullable Task task, @Nullable Long minimalWaitTimeMillis) {
+ this.task = task;
+ this.minimalWaitTimeMillis = minimalWaitTimeMillis;
+ }
+ }
+
+ /**
+ * The next task is the first task with {@link Task#getReadyInMilliSeconds()} return a value less
+ * then {@code readyToleranceMillis}, in insertion order. If no task matches this criteria, the
+ * minimal value of {@link Task#getReadyInMilliSeconds()} is returned instead. If there are no
+ * tasks at all, the minimalWaitTimeMillis will also be null.
+ */
+ @NonNull
+ NextTask getNextTask(long readyToleranceMillis) {
+ Long minimalWaitTime = null;
+ for (Task task : queue) {
+ long waitTime = task.getReadyInMilliSeconds();
+ if (waitTime < readyToleranceMillis) {
+ return new NextTask(task, 0L);
+ } else {
+ if (minimalWaitTime == null || waitTime < minimalWaitTime) {
+ minimalWaitTime = waitTime;
+ }
+ }
+ }
+ return new NextTask(null, minimalWaitTime);
+ }
+
+ public void clear() {
+ queue.clear();
+ }
+
+ public int size() {
+ return queue.size();
+ }
+
+ public boolean isEmpty() {
+ return queue.isEmpty();
+ }
+
+ @Override
+ public Iterator<Task> iterator() {
+ return queue.iterator();
+ }
+}
diff --git a/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java b/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java
new file mode 100644
index 000000000..eab410eb0
--- /dev/null
+++ b/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java
@@ -0,0 +1,158 @@
+/*
+ * 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.voicemail.impl.scheduling;
+
+import android.annotation.TargetApi;
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Build.VERSION_CODES;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.Parcelable;
+import android.support.annotation.MainThread;
+import com.android.dialer.constants.ScheduledJobIds;
+import com.android.voicemail.impl.Assert;
+import com.android.voicemail.impl.VvmLog;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A {@link JobService} that will trigger the background execution of {@link TaskSchedulerService}.
+ */
+@TargetApi(VERSION_CODES.O)
+public class TaskSchedulerJobService extends JobService implements TaskSchedulerService.Job {
+
+ private static final String TAG = "TaskSchedulerJobService";
+
+ private static final String EXTRA_TASK_EXTRAS_ARRAY = "extra_task_extras_array";
+
+ private JobParameters jobParameters;
+ private TaskSchedulerService scheduler;
+
+ private final ServiceConnection mConnection =
+ new ServiceConnection() {
+
+ @Override
+ public void onServiceConnected(ComponentName className, IBinder binder) {
+ VvmLog.i(TAG, "TaskSchedulerService connected");
+ scheduler = ((TaskSchedulerService.LocalBinder) binder).getService();
+ scheduler.onStartJob(
+ TaskSchedulerJobService.this,
+ getBundleList(
+ jobParameters.getTransientExtras().getParcelableArray(EXTRA_TASK_EXTRAS_ARRAY)));
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName unused) {
+ // local service, process should always be killed together.
+ Assert.fail();
+ }
+ };
+
+ @Override
+ @MainThread
+ public boolean onStartJob(JobParameters params) {
+ jobParameters = params;
+ bindService(
+ new Intent(this, TaskSchedulerService.class), mConnection, Context.BIND_AUTO_CREATE);
+ return true /* job still running in background */;
+ }
+
+ @Override
+ @MainThread
+ public boolean onStopJob(JobParameters params) {
+ scheduler.onStopJob();
+ jobParameters = null;
+ return false /* don't reschedule. TaskScheduler service will post a new job */;
+ }
+
+ /**
+ * Schedule a job to run the {@code pendingTasks}. If a job is already scheduled it will be
+ * appended to the back of the queue and the job will be rescheduled.
+ *
+ * @param delayMillis delay before running the job. Must be 0 if{@code isNewJob} is true.
+ * @param isNewJob a new job will be forced to run immediately.
+ */
+ @MainThread
+ public static void scheduleJob(
+ Context context, List<Bundle> pendingTasks, long delayMillis, boolean isNewJob) {
+ Assert.isMainThread();
+ JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
+ JobInfo pendingJob = jobScheduler.getPendingJob(ScheduledJobIds.VVM_TASK_SCHEDULER_JOB);
+ VvmLog.i(TAG, "scheduling job with " + pendingTasks.size() + " tasks");
+ if (pendingJob != null) {
+ if (isNewJob) {
+ List<Bundle> existingTasks =
+ getBundleList(
+ pendingJob.getTransientExtras().getParcelableArray(EXTRA_TASK_EXTRAS_ARRAY));
+ VvmLog.i(TAG, "merging job with " + existingTasks.size() + " existing tasks");
+ TaskQueue queue = new TaskQueue();
+ queue.fromBundles(context, existingTasks);
+ for (Bundle pendingTask : pendingTasks) {
+ queue.add(Tasks.createTask(context, pendingTask));
+ }
+ pendingTasks = queue.toBundles();
+ }
+ VvmLog.i(TAG, "canceling existing job.");
+ jobScheduler.cancel(ScheduledJobIds.VVM_TASK_SCHEDULER_JOB);
+ }
+ Bundle extras = new Bundle();
+ extras.putParcelableArray(
+ EXTRA_TASK_EXTRAS_ARRAY, pendingTasks.toArray(new Bundle[pendingTasks.size()]));
+ JobInfo.Builder builder =
+ new JobInfo.Builder(
+ ScheduledJobIds.VVM_TASK_SCHEDULER_JOB,
+ new ComponentName(context, TaskSchedulerJobService.class))
+ .setTransientExtras(extras)
+ .setMinimumLatency(delayMillis)
+ .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
+ if (isNewJob) {
+ Assert.isTrue(delayMillis == 0);
+ builder.setOverrideDeadline(0);
+ VvmLog.i(TAG, "running job instantly.");
+ }
+ jobScheduler.schedule(builder.build());
+ VvmLog.i(TAG, "job scheduled");
+ }
+
+ /**
+ * The system will hold a wakelock when {@link #onStartJob(JobParameters)} is called to ensure the
+ * device will not sleep when the job is still running. Finish the job so the system will release
+ * the wakelock
+ */
+ @Override
+ public void finish() {
+ VvmLog.i(TAG, "finishing job and unbinding TaskSchedulerService");
+ jobFinished(jobParameters, false);
+ jobParameters = null;
+ unbindService(mConnection);
+ }
+
+ private static List<Bundle> getBundleList(Parcelable[] parcelables) {
+ List<Bundle> result = new ArrayList<>(parcelables.length);
+ for (Parcelable parcelable : parcelables) {
+ result.add((Bundle) parcelable);
+ }
+ return result;
+ }
+}
diff --git a/java/com/android/voicemail/impl/scheduling/TaskSchedulerService.java b/java/com/android/voicemail/impl/scheduling/TaskSchedulerService.java
index 81bd36fee..5ad2447de 100644
--- a/java/com/android/voicemail/impl/scheduling/TaskSchedulerService.java
+++ b/java/com/android/voicemail/impl/scheduling/TaskSchedulerService.java
@@ -16,20 +16,18 @@
package com.android.voicemail.impl.scheduling;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
+import android.annotation.TargetApi;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
+import android.os.Build.VERSION_CODES;
+import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.os.SystemClock;
import android.support.annotation.MainThread;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
@@ -37,20 +35,50 @@ import android.support.annotation.WorkerThread;
import com.android.voicemail.impl.Assert;
import com.android.voicemail.impl.NeededForTesting;
import com.android.voicemail.impl.VvmLog;
-import com.android.voicemail.impl.scheduling.Task.TaskId;
-import java.util.ArrayDeque;
-import java.util.Queue;
+import com.android.voicemail.impl.scheduling.TaskQueue.NextTask;
+import java.util.List;
/**
- * A service to queue and run {@link Task} on a worker thread. Only one task will be ran at a time,
- * and same task cannot exist in the queue at the same time. The service will be started when a
- * intent is received, and stopped when there are no more tasks in the queue.
+ * A service to queue and run {@link Task} with the {@link android.app.job.JobScheduler}. A task is
+ * queued using {@link Context#startService(Intent)}. The intent should contain enough information
+ * in {@link Intent#getExtras()} to construct the task (see {@link Tasks#createIntent(Context,
+ * Class)}).
+ *
+ * <p>All tasks are ran in the background with a wakelock being held by the {@link
+ * android.app.job.JobScheduler}, which is between {@link #onStartJob(Job, List)} and {@link
+ * #finishJob()}. The {@link TaskSchedulerJobService} also has a {@link TaskQueue}, but the data is
+ * stored in the {@link android.app.job.JobScheduler} instead of the process memory, so if the
+ * process is killed the queued tasks will be restored. If a new task is added, a new {@link
+ * TaskSchedulerJobService} will be scheduled to run the task. If the job is already scheduled, the
+ * new task will be pushed into the queue of the scheduled job. If the job is already running, the
+ * job will be queued in process memory.
+ *
+ * <p>Only one task will be ran at a time, and same task cannot exist in the queue at the same time.
+ * Refer to {@link TaskQueue} for queuing and execution order.
+ *
+ * <p>If there are still tasks in the queue but none are executable immediately, the service will
+ * enter a "sleep", pushing all remaining task into a new job and end the current job.
+ *
+ * <p>The service will be started when a intent is received, and stopped when there are no more
+ * tasks in the queue.
+ *
+ * <p>{@link android.app.job.JobScheduler} is not used directly due to:
+ *
+ * <ul>
+ * <li>The {@link android.telecom.PhoneAccountHandle} used to differentiate task can not be easily
+ * mapped into an integer for job id
+ * <li>A job cannot be mutated to store information such as retry count.
+ * </ul>
*/
+@SuppressWarnings("AndroidApiChecker") /* stream() */
+@TargetApi(VERSION_CODES.O)
public class TaskSchedulerService extends Service {
- private static final String TAG = "VvmTaskScheduler";
+ interface Job {
+ void finish();
+ }
- private static final String ACTION_WAKEUP = "action_wakeup";
+ private static final String TAG = "VvmTaskScheduler";
private static final int READY_TOLERANCE_MILLISECONDS = 100;
@@ -58,15 +86,13 @@ public class TaskSchedulerService extends Service {
* Threshold to determine whether to do a short or long sleep when a task is scheduled in the
* future.
*
- * <p>A short sleep will continue to held the wake lock and use {@link
- * Handler#postDelayed(Runnable, long)} to wait for the next task.
+ * <p>A short sleep will continue the job and use {@link Handler#postDelayed(Runnable, long)} to
+ * wait for the next task.
*
- * <p>A long sleep will release the wake lock and set a {@link AlarmManager} alarm. The alarm is
- * exact and will wake up the device. Note: as this service is run in the telephony process it
- * does not seem to be restricted by doze or sleep, it will fire exactly at the moment. The
- * unbundled version should take doze into account.
+ * <p>A long sleep will finish the job and schedule a new one. The exact execution time is
+ * subjected to {@link android.app.job.JobScheduler} battery optimization, and is not exact.
*/
- private static final int SHORT_SLEEP_THRESHOLD_MILLISECONDS = 60_000;
+ private static final int SHORT_SLEEP_THRESHOLD_MILLISECONDS = 10_000;
/**
* When there are no more tasks to be run the service should be stopped. But when all tasks has
* finished there might still be more tasks in the message queue waiting to be processed,
@@ -75,14 +101,9 @@ public class TaskSchedulerService extends Service {
*/
private static final int STOP_DELAY_MILLISECONDS = 5_000;
- private static final String EXTRA_CLASS_NAME = "extra_class_name";
-
- private static final String WAKE_LOCK_TAG = "TaskSchedulerService_wakelock";
-
// The thread to run tasks on
private volatile WorkerThreadHandler mWorkerThreadHandler;
- private Context mContext = this;
/**
* Used by tests to turn task handling into a single threaded process by calling {@link
* Handler#handleMessage(Message)} directly
@@ -91,21 +112,27 @@ public class TaskSchedulerService extends Service {
private MainThreadHandler mMainThreadHandler;
- private WakeLock mWakeLock;
+ // Binder given to clients
+ private final IBinder mBinder = new LocalBinder();
/** Main thread only, access through {@link #getTasks()} */
- private final Queue<Task> mTasks = new ArrayDeque<>();
+ private final TaskQueue mTasks = new TaskQueue();
private boolean mWorkerThreadIsBusy = false;
+ private Job mJob;
+
private final Runnable mStopServiceWithDelay =
new Runnable() {
+ @MainThread
@Override
public void run() {
- VvmLog.d(TAG, "Stopping service");
+ VvmLog.i(TAG, "Stopping service");
+ finishJob();
stopSelf();
}
};
+
/** Should attempt to run the next task when a task has finished or been added. */
private boolean mTaskAutoRunDisabledForTesting = false;
@@ -122,7 +149,7 @@ public class TaskSchedulerService extends Service {
Assert.isNotMainThread();
Task task = (Task) msg.obj;
try {
- VvmLog.v(TAG, "executing task " + task);
+ VvmLog.i(TAG, "executing task " + task);
task.onExecuteInBackgroundThread();
} catch (Throwable throwable) {
VvmLog.e(TAG, "Exception while executing task " + task + ":", throwable);
@@ -157,10 +184,6 @@ public class TaskSchedulerService extends Service {
@MainThread
public void onCreate() {
super.onCreate();
- mWakeLock =
- getSystemService(PowerManager.class)
- .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKE_LOCK_TAG);
- mWakeLock.setReferenceCounted(false);
HandlerThread thread = new HandlerThread("VvmTaskSchedulerService");
thread.start();
@@ -171,27 +194,27 @@ public class TaskSchedulerService extends Service {
@Override
public void onDestroy() {
mWorkerThreadHandler.getLooper().quit();
- mWakeLock.release();
}
@Override
@MainThread
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
Assert.isMainThread();
- // maybeRunNextTask() will release the wakelock either by entering a long sleep or stopping
- // the service.
- mWakeLock.acquire();
- if (ACTION_WAKEUP.equals(intent.getAction())) {
- VvmLog.d(TAG, "woke up by AlarmManager");
+ if (intent == null) {
+ VvmLog.w(TAG, "null intent received");
+ return START_NOT_STICKY;
+ }
+ Task task = Tasks.createTask(this, intent.getExtras());
+ Assert.isTrue(task != null);
+ addTask(task);
+
+ mMainThreadHandler.removeCallbacks(mStopServiceWithDelay);
+ VvmLog.i(TAG, "task added");
+ if (mJob == null) {
+ scheduleJob(0, true);
} else {
- Task task = createTask(intent, flags, startId);
- if (task == null) {
- VvmLog.e(TAG, "cannot create task form intent");
- } else {
- addTask(task);
- }
+ maybeRunNextTask();
}
- maybeRunNextTask();
// STICKY means the service will be automatically restarted will the last intent if it is
// killed.
return START_NOT_STICKY;
@@ -201,66 +224,14 @@ public class TaskSchedulerService extends Service {
@VisibleForTesting
void addTask(Task task) {
Assert.isMainThread();
- if (task.getId().id == Task.TASK_INVALID) {
- throw new AssertionError("Task id was not set to a valid value before adding.");
- }
- if (task.getId().id != Task.TASK_ALLOW_DUPLICATES) {
- Task oldTask = getTask(task.getId());
- if (oldTask != null) {
- oldTask.onDuplicatedTaskAdded(task);
- return;
- }
- }
- mMainThreadHandler.removeCallbacks(mStopServiceWithDelay);
getTasks().add(task);
- maybeRunNextTask();
- }
-
- @MainThread
- @Nullable
- private Task getTask(TaskId taskId) {
- Assert.isMainThread();
- for (Task task : getTasks()) {
- if (task.getId().equals(taskId)) {
- return task;
- }
- }
- return null;
}
@MainThread
- private Queue<Task> getTasks() {
- Assert.isMainThread();
- return mTasks;
- }
-
- /** Create an intent that will queue the <code>task</code> */
- public static Intent createIntent(Context context, Class<? extends Task> task) {
- Intent intent = new Intent(context, TaskSchedulerService.class);
- intent.putExtra(EXTRA_CLASS_NAME, task.getName());
- return intent;
- }
-
@VisibleForTesting
- @MainThread
- @Nullable
- Task createTask(@Nullable Intent intent, int flags, int startId) {
+ TaskQueue getTasks() {
Assert.isMainThread();
- if (intent == null) {
- return null;
- }
- String className = intent.getStringExtra(EXTRA_CLASS_NAME);
- VvmLog.d(TAG, "create task:" + className);
- if (className == null) {
- throw new IllegalArgumentException("EXTRA_CLASS_NAME expected");
- }
- try {
- Task task = (Task) Class.forName(className).newInstance();
- task.onCreate(mContext, intent, flags, startId);
- return task;
- } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
- throw new IllegalArgumentException(e);
- }
+ return mTasks;
}
@MainThread
@@ -282,37 +253,31 @@ public class TaskSchedulerService extends Service {
@MainThread
void runNextTask() {
Assert.isMainThread();
- // The current alarm is no longer valid, a new one will be set up if required.
- getSystemService(AlarmManager.class).cancel(getWakeupIntent());
if (getTasks().isEmpty()) {
prepareStop();
return;
}
- Long minimalWaitTime = null;
- for (Task task : getTasks()) {
- long waitTime = task.getReadyInMilliSeconds();
- if (waitTime < READY_TOLERANCE_MILLISECONDS) {
- task.onBeforeExecute();
- Message message = mWorkerThreadHandler.obtainMessage();
- message.obj = task;
- mWorkerThreadIsBusy = true;
- mMessageSender.send(message);
- return;
- } else {
- if (minimalWaitTime == null || waitTime < minimalWaitTime) {
- minimalWaitTime = waitTime;
- }
- }
+ NextTask nextTask = getTasks().getNextTask(READY_TOLERANCE_MILLISECONDS);
+
+ if (nextTask.task != null) {
+ nextTask.task.onBeforeExecute();
+ Message message = mWorkerThreadHandler.obtainMessage();
+ message.obj = nextTask.task;
+ mWorkerThreadIsBusy = true;
+ mMessageSender.send(message);
+ return;
}
- VvmLog.d(TAG, "minimal wait time:" + minimalWaitTime);
- if (!mTaskAutoRunDisabledForTesting && minimalWaitTime != null) {
+ VvmLog.i(TAG, "minimal wait time:" + nextTask.minimalWaitTimeMillis);
+ if (!mTaskAutoRunDisabledForTesting && nextTask.minimalWaitTimeMillis != null) {
// No tasks are currently ready. Sleep until the next one should be.
// If a new task is added during the sleep the service will wake immediately.
- sleep(minimalWaitTime);
+ sleep(nextTask.minimalWaitTimeMillis);
}
}
+ @MainThread
private void sleep(long timeMillis) {
+ VvmLog.i(TAG, "sleep for " + timeMillis + " millis");
if (timeMillis < SHORT_SLEEP_THRESHOLD_MILLISECONDS) {
mMainThreadHandler.postDelayed(
new Runnable() {
@@ -324,34 +289,24 @@ public class TaskSchedulerService extends Service {
timeMillis);
return;
}
-
- // Tasks does not have a strict timing requirement, use AlarmManager.set() so the OS could
- // optimize the battery usage. As this service currently run in the telephony process the
- // OS give it privileges to behave the same as setExact(), but set() is the targeted
- // behavior once this is unbundled.
- getSystemService(AlarmManager.class)
- .set(
- AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() + timeMillis,
- getWakeupIntent());
- mWakeLock.release();
- VvmLog.d(TAG, "Long sleep for " + timeMillis + " millis");
+ finishJob();
+ mMainThreadHandler.post(() -> scheduleJob(timeMillis, false));
}
- private PendingIntent getWakeupIntent() {
- Intent intent = new Intent(ACTION_WAKEUP, null, this, getClass());
- return PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ private List<Bundle> serializePendingTasks() {
+ return getTasks().toBundles();
}
private void prepareStop() {
- VvmLog.d(
+ VvmLog.i(
TAG,
- "No more tasks, stopping service if no task are added in "
+ "no more tasks, stopping service if no task are added in "
+ STOP_DELAY_MILLISECONDS
+ " millis");
mMainThreadHandler.postDelayed(mStopServiceWithDelay, STOP_DELAY_MILLISECONDS);
}
+ @NeededForTesting
static class MessageSender {
public void send(Message message) {
@@ -360,11 +315,6 @@ public class TaskSchedulerService extends Service {
}
@NeededForTesting
- void setContextForTest(Context context) {
- mContext = context;
- }
-
- @NeededForTesting
void setTaskAutoRunDisabledForTest(boolean value) {
mTaskAutoRunDisabledForTesting = value;
}
@@ -374,15 +324,65 @@ public class TaskSchedulerService extends Service {
mMessageSender = sender;
}
- @NeededForTesting
- void clearTasksForTest() {
+ /**
+ * The {@link TaskSchedulerJobService} has started and all queued task should be executed in the
+ * worker thread.
+ */
+ @MainThread
+ public void onStartJob(Job job, List<Bundle> pendingTasks) {
+ VvmLog.i(TAG, "onStartJob");
+ mJob = job;
+ mTasks.fromBundles(this, pendingTasks);
+ maybeRunNextTask();
+ }
+
+ /**
+ * The {@link TaskSchedulerJobService} is being terminated by the system (timeout or network
+ * lost). A new job will be queued to resume all pending tasks. The current unfinished job may be
+ * ran again.
+ */
+ @MainThread
+ public void onStopJob() {
+ VvmLog.e(TAG, "onStopJob");
+ if (isJobRunning()) {
+ finishJob();
+ mMainThreadHandler.post(() -> scheduleJob(0, true));
+ }
+ }
+
+ /**
+ * Serializes all pending tasks and schedule a new {@link TaskSchedulerJobService}.
+ *
+ * @param delayMillis the delay before stating the job, see {@link
+ * android.app.job.JobInfo.Builder#setMinimumLatency(long)}. This must be 0 if {@code
+ * isNewJob} is true.
+ * @param isNewJob a new job will be requested to run immediately, bypassing all requirements.
+ */
+ @MainThread
+ private void scheduleJob(long delayMillis, boolean isNewJob) {
+ Assert.isMainThread();
+ TaskSchedulerJobService.scheduleJob(this, serializePendingTasks(), delayMillis, isNewJob);
mTasks.clear();
}
+ /**
+ * Signals {@link TaskSchedulerJobService} the current session of tasks has finished, and the wake
+ * lock can be released. Note: this only takes effect after the main thread has been returned. If
+ * a new job need to be scheduled, it should be posted on the main thread handler instead of
+ * calling directly.
+ */
+ @MainThread
+ private void finishJob() {
+ Assert.isMainThread();
+ VvmLog.i(TAG, "finishing Job");
+ mJob.finish();
+ mJob = null;
+ }
+
@Override
@Nullable
public IBinder onBind(Intent intent) {
- return new LocalBinder();
+ return mBinder;
}
@NeededForTesting
@@ -393,4 +393,8 @@ public class TaskSchedulerService extends Service {
return TaskSchedulerService.this;
}
}
+
+ private boolean isJobRunning() {
+ return mJob != null;
+ }
}
diff --git a/java/com/android/voicemail/impl/scheduling/Tasks.java b/java/com/android/voicemail/impl/scheduling/Tasks.java
new file mode 100644
index 000000000..34debaf29
--- /dev/null
+++ b/java/com/android/voicemail/impl/scheduling/Tasks.java
@@ -0,0 +1,73 @@
+/*
+ * 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.voicemail.impl.scheduling;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import com.android.voicemail.impl.VvmLog;
+
+/** Common operations on {@link Task} */
+final class Tasks {
+
+ private Tasks() {}
+
+ static final String EXTRA_CLASS_NAME = "extra_class_name";
+
+ /**
+ * Create a task from a bundle. The bundle is created either with {@link #toBundle(Task)} or
+ * {@link #createIntent(Context, Class)} from the target {@link Task}
+ */
+ public static Task createTask(Context context, Bundle extras) {
+ // The extra contains custom parcelables which cannot be unmarshalled by the framework class
+ // loader.
+ extras.setClassLoader(context.getClassLoader());
+ String className = extras.getString(EXTRA_CLASS_NAME);
+ VvmLog.i("Task.createTask", "create task:" + className);
+ if (className == null) {
+ throw new IllegalArgumentException("EXTRA_CLASS_NAME expected");
+ }
+ try {
+ Task task = (Task) Class.forName(className).getDeclaredConstructor().newInstance();
+ task.onCreate(context, extras);
+ return task;
+ } catch (ReflectiveOperationException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ /**
+ * Serializes necessary states to a bundle that can be used to restore the task with {@link
+ * #createTask(Context, Bundle)}
+ */
+ public static Bundle toBundle(Task task) {
+ Bundle result = task.toBundle();
+ result.putString(EXTRA_CLASS_NAME, task.getClass().getName());
+ return result;
+ }
+
+ /**
+ * Create an intent that when called with {@link Context#startService(Intent)}, will queue the
+ * <code>task</code>. Implementations of {@link Task} should use the result of this and fill in
+ * necessary information.
+ */
+ public static Intent createIntent(Context context, Class<? extends Task> task) {
+ Intent intent = new Intent(context, TaskSchedulerService.class);
+ intent.putExtra(EXTRA_CLASS_NAME, task.getName());
+ return intent;
+ }
+}
diff --git a/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java b/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java
index 4c95e7783..9ce32a97c 100644
--- a/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java
+++ b/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java
@@ -22,6 +22,7 @@ import com.android.voicemail.VoicemailComponent;
import com.android.voicemail.impl.OmtpVvmCarrierConfigHelper;
import com.android.voicemail.impl.R;
import com.android.voicemail.impl.VisualVoicemailPreferences;
+import com.android.voicemail.impl.VvmLog;
import com.android.voicemail.impl.sync.VvmAccountManager;
/** Save whether or not a particular account is enabled in shared to be retrieved later. */
@@ -31,6 +32,7 @@ public class VisualVoicemailSettingsUtil {
public static void setEnabled(
Context context, PhoneAccountHandle phoneAccount, boolean isEnabled) {
+ VvmLog.i("VisualVoicemailSettingsUtil.setEnable", phoneAccount + " enabled:" + isEnabled);
new VisualVoicemailPreferences(context, phoneAccount)
.edit()
.putBoolean(IS_ENABLED_KEY, isEnabled)
diff --git a/java/com/android/voicemail/impl/settings/VoicemailChangePinActivity.java b/java/com/android/voicemail/impl/settings/VoicemailChangePinActivity.java
index 330dc3621..b22a765cf 100644
--- a/java/com/android/voicemail/impl/settings/VoicemailChangePinActivity.java
+++ b/java/com/android/voicemail/impl/settings/VoicemailChangePinActivity.java
@@ -45,8 +45,7 @@ import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
+import com.android.dialer.logging.DialerImpression;
import com.android.voicemail.impl.OmtpConstants;
import com.android.voicemail.impl.OmtpConstants.ChangePinResult;
import com.android.voicemail.impl.OmtpEvents;
@@ -59,6 +58,7 @@ import com.android.voicemail.impl.imap.ImapHelper;
import com.android.voicemail.impl.imap.ImapHelper.InitializingException;
import com.android.voicemail.impl.mail.MessagingException;
import com.android.voicemail.impl.sync.VvmNetworkRequestCallback;
+import com.android.voicemail.impl.utils.LoggerUtils;
/**
* Dialog to change the voicemail PIN. The TUI (Telephony User Interface) PIN is used when accessing
@@ -278,7 +278,8 @@ public class VoicemailChangePinActivity extends Activity
activity.handleOmtpEvent(OmtpEvents.CONFIG_PIN_SET);
activity.finish();
- Logger.get(activity).logImpression(DialerImpression.Type.VVM_CHANGE_PIN_COMPLETED);
+ LoggerUtils.logImpressionOnMainThread(
+ activity, DialerImpression.Type.VVM_CHANGE_PIN_COMPLETED);
Toast.makeText(
activity, activity.getString(R.string.change_pin_succeeded), Toast.LENGTH_SHORT)
.show();
diff --git a/java/com/android/voicemail/impl/settings/VoicemailSettingsFragment.java b/java/com/android/voicemail/impl/settings/VoicemailSettingsFragment.java
index 716f503ff..423fd11b4 100644
--- a/java/com/android/voicemail/impl/settings/VoicemailSettingsFragment.java
+++ b/java/com/android/voicemail/impl/settings/VoicemailSettingsFragment.java
@@ -27,8 +27,8 @@ import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
import android.telephony.TelephonyManager;
import com.android.dialer.common.Assert;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.voicemail.VoicemailClient;
import com.android.voicemail.VoicemailComponent;
import com.android.voicemail.impl.OmtpVvmCarrierConfigHelper;
@@ -164,8 +164,6 @@ public class VoicemailSettingsFragment extends PreferenceFragment
VisualVoicemailSettingsUtil.isEnabled(getContext(), phoneAccountHandle));
autoArchiveSwitchPreference.setOnPreferenceChangeListener(this);
- autoArchiveSwitchPreference.setSummary(
- getText(R.string.voicemail_visual_voicemail_auto_archive_temporary_disclaimer));
autoArchiveSwitchPreference.setChecked(
VisualVoicemailSettingsUtil.isArchiveEnabled(getContext(), phoneAccountHandle));
} else {
diff --git a/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java b/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java
index 1d1a639c5..5decf6376 100644
--- a/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java
+++ b/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 Google Inc. All Rights Reserved.
+ * Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,13 +16,21 @@
package com.android.voicemail.impl.sms;
+import android.annotation.TargetApi;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build.VERSION_CODES;
import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
+import android.telephony.TelephonyManager;
import android.telephony.VisualVoicemailSms;
+import com.android.voicemail.VoicemailClient;
import com.android.voicemail.impl.OmtpConstants;
import com.android.voicemail.impl.OmtpVvmCarrierConfigHelper;
-import com.android.voicemail.impl.TelephonyManagerStub;
import com.android.voicemail.impl.VvmLog;
/**
@@ -30,37 +38,95 @@ import com.android.voicemail.impl.VvmLog;
*
* @see OmtpVvmCarrierConfigHelper#isLegacyModeEnabled()
*/
+@TargetApi(VERSION_CODES.O)
public class LegacyModeSmsHandler {
private static final String TAG = "LegacyModeSmsHandler";
+ private static final int CALL_VOICEMAIL_REQUEST_CODE = 1;
+ private static final int LAUNCH_VOICEMAIL_SETTINGS_REQUEST_CODE = 2;
+
public static void handle(Context context, VisualVoicemailSms sms) {
- VvmLog.v(TAG, "processing VVM SMS on legacy mode");
+ VvmLog.i(TAG, "processing VVM SMS on legacy mode");
String eventType = sms.getPrefix();
Bundle data = sms.getFields();
PhoneAccountHandle handle = sms.getPhoneAccountHandle();
if (eventType.equals(OmtpConstants.SYNC_SMS_PREFIX)) {
SyncMessage message = new SyncMessage(data);
- VvmLog.v(
+ VvmLog.i(
TAG, "Received SYNC sms for " + handle + " with event " + message.getSyncTriggerEvent());
switch (message.getSyncTriggerEvent()) {
case OmtpConstants.NEW_MESSAGE:
case OmtpConstants.MAILBOX_UPDATE:
- // The user has called into the voicemail and the new message count could
- // change.
- // For some carriers new message count could be set to 0 even if there are still
- // unread messages, to clear the message waiting indicator.
- VvmLog.v(TAG, "updating MWI");
-
- // Setting voicemail message count to non-zero will show the telephony voicemail
- // notification, and zero will clear it.
- TelephonyManagerStub.showVoicemailNotification(message.getNewMessageCount());
+ sendLegacyVoicemailNotification(context, handle, message.getNewMessageCount());
+
break;
default:
break;
}
}
}
+
+ private static void sendLegacyVoicemailNotification(
+ Context context, PhoneAccountHandle phoneAccountHandle, int messageCount) {
+ // The user has called into the voicemail and the new message count could
+ // change.
+ // For some carriers new message count could be set to 0 even if there are still
+ // unread messages, to clear the message waiting indicator.
+
+ VvmLog.i(TAG, "sending voicemail notification");
+ Intent intent = new Intent(VoicemailClient.ACTION_SHOW_LEGACY_VOICEMAIL);
+ intent.setPackage(context.getPackageName());
+ intent.putExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
+ // Setting voicemail message count to non-zero will show the telephony voicemail
+ // notification, and zero will clear it.
+ intent.putExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, messageCount);
+
+ String voicemailNumber = getVoicemailNumber(context, phoneAccountHandle);
+ PendingIntent callVoicemailPendingIntent = null;
+ PendingIntent launchVoicemailSettingsPendingIntent = null;
+
+ if (voicemailNumber != null) {
+ callVoicemailPendingIntent =
+ PendingIntent.getActivity(
+ context,
+ CALL_VOICEMAIL_REQUEST_CODE,
+ new Intent(
+ Intent.ACTION_CALL, Uri.fromParts(PhoneAccount.SCHEME_VOICEMAIL, "", null)),
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ } else {
+ Intent launchVoicemailSettingsIntent =
+ new Intent(TelephonyManager.ACTION_CONFIGURE_VOICEMAIL);
+ launchVoicemailSettingsIntent.putExtra(TelephonyManager.EXTRA_HIDE_PUBLIC_SETTINGS, true);
+
+ launchVoicemailSettingsPendingIntent =
+ PendingIntent.getActivity(
+ context,
+ LAUNCH_VOICEMAIL_SETTINGS_REQUEST_CODE,
+ launchVoicemailSettingsIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
+ intent.putExtra(TelephonyManager.EXTRA_VOICEMAIL_NUMBER, voicemailNumber);
+ intent.putExtra(TelephonyManager.EXTRA_CALL_VOICEMAIL_INTENT, callVoicemailPendingIntent);
+ intent.putExtra(
+ TelephonyManager.EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT,
+ launchVoicemailSettingsPendingIntent);
+
+ context.sendBroadcast(intent);
+ }
+
+ @Nullable
+ private static String getVoicemailNumber(Context context, PhoneAccountHandle phoneAccountHandle) {
+ TelephonyManager telephonyManager =
+ context
+ .getSystemService(TelephonyManager.class)
+ .createForPhoneAccountHandle(phoneAccountHandle);
+ if (telephonyManager == null) {
+ return null;
+ }
+ return telephonyManager.getVoiceMailNumber();
+ }
}
diff --git a/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java b/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java
index 83a3960dd..af934dd3c 100644
--- a/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java
+++ b/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java
@@ -24,8 +24,7 @@ import android.support.v4.os.BuildCompat;
import android.telecom.PhoneAccountHandle;
import android.text.TextUtils;
import android.util.ArrayMap;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
+import com.android.dialer.logging.DialerImpression;
import com.android.voicemail.VoicemailComponent;
import com.android.voicemail.impl.ActivationTask;
import com.android.voicemail.impl.Assert;
@@ -41,6 +40,7 @@ import com.android.voicemail.impl.scheduling.BaseTask;
import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil;
import com.android.voicemail.impl.sync.VvmNetworkRequest.NetworkWrapper;
import com.android.voicemail.impl.sync.VvmNetworkRequest.RequestFailedException;
+import com.android.voicemail.impl.utils.LoggerUtils;
import com.android.voicemail.impl.utils.VoicemailDatabaseUtil;
import java.util.List;
import java.util.Map;
@@ -98,7 +98,7 @@ public class OmtpVvmSyncService {
}
OmtpVvmCarrierConfigHelper config = new OmtpVvmCarrierConfigHelper(mContext, phoneAccount);
- Logger.get(mContext).logImpression(DialerImpression.Type.VVM_SYNC_STARTED);
+ LoggerUtils.logImpressionOnMainThread(mContext, DialerImpression.Type.VVM_SYNC_STARTED);
// DATA_IMAP_OPERATION_STARTED posting should not be deferred. This event clears all data
// channel errors, which should happen when the task starts, not when it ends. It is the
// "Sync in progress..." status.
@@ -136,7 +136,7 @@ public class OmtpVvmSyncService {
imapHelper.updateQuota();
autoDeleteAndArchiveVM(imapHelper, phoneAccount);
imapHelper.handleEvent(OmtpEvents.DATA_IMAP_OPERATION_COMPLETED);
- Logger.get(mContext).logImpression(DialerImpression.Type.VVM_SYNC_COMPLETED);
+ LoggerUtils.logImpressionOnMainThread(mContext, DialerImpression.Type.VVM_SYNC_COMPLETED);
} else {
task.fail();
}
@@ -158,14 +158,15 @@ public class OmtpVvmSyncService {
> AUTO_DELETE_ARCHIVE_VM_THRESHOLD) {
deleteAndArchiveVM(imapHelper);
imapHelper.updateQuota();
- Logger.get(mContext)
- .logImpression(DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETED_VM_FROM_SERVER);
+ LoggerUtils.logImpressionOnMainThread(
+ mContext, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETED_VM_FROM_SERVER);
} else {
VvmLog.i(TAG, "no need to archive and auto delete VM, quota below threshold");
}
} else {
- VvmLog.i(TAG, "isArchiveAllowedAndEnabled is false");
- Logger.get(mContext).logImpression(DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETE_TURNED_OFF);
+ VvmLog.i(TAG, "autoDeleteAndArchiveVM is turned off");
+ LoggerUtils.logImpressionOnMainThread(
+ mContext, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETE_TURNED_OFF);
}
}
@@ -214,7 +215,7 @@ public class OmtpVvmSyncService {
boolean downloadSuccess = true;
if (SYNC_FULL_SYNC.equals(action) || SYNC_UPLOAD_ONLY.equals(action)) {
- uploadSuccess = upload(imapHelper);
+ uploadSuccess = upload(account, imapHelper);
}
if (SYNC_FULL_SYNC.equals(action) || SYNC_DOWNLOAD_ONLY.equals(action)) {
downloadSuccess = download(imapHelper, account);
@@ -242,9 +243,9 @@ public class OmtpVvmSyncService {
new TranscriptionFetchedCallback(mContext, voicemail), voicemail.getSourceData());
}
- private boolean upload(ImapHelper imapHelper) {
- List<Voicemail> readVoicemails = mQueryHelper.getReadVoicemails();
- List<Voicemail> deletedVoicemails = mQueryHelper.getDeletedVoicemails();
+ private boolean upload(PhoneAccountHandle phoneAccountHandle, ImapHelper imapHelper) {
+ List<Voicemail> readVoicemails = mQueryHelper.getReadVoicemails(phoneAccountHandle);
+ List<Voicemail> deletedVoicemails = mQueryHelper.getDeletedVoicemails(phoneAccountHandle);
boolean success = true;
@@ -271,7 +272,7 @@ public class OmtpVvmSyncService {
private boolean download(ImapHelper imapHelper, PhoneAccountHandle account) {
List<Voicemail> serverVoicemails = imapHelper.fetchAllVoicemails();
- List<Voicemail> localVoicemails = mQueryHelper.getAllVoicemails();
+ List<Voicemail> localVoicemails = mQueryHelper.getAllVoicemails(account);
if (localVoicemails == null || serverVoicemails == null) {
// Null value means the query failed.
@@ -302,7 +303,8 @@ public class OmtpVvmSyncService {
if (!TextUtils.isEmpty(remoteVoicemail.getTranscription())
&& TextUtils.isEmpty(localVoicemail.getTranscription())) {
- Logger.get(mContext).logImpression(DialerImpression.Type.VVM_TRANSCRIPTION_DOWNLOADED);
+ LoggerUtils.logImpressionOnMainThread(
+ mContext, DialerImpression.Type.VVM_TRANSCRIPTION_DOWNLOADED);
mQueryHelper.updateWithTranscription(localVoicemail, remoteVoicemail.getTranscription());
}
}
@@ -312,7 +314,8 @@ public class OmtpVvmSyncService {
boolean prefetchEnabled = shouldPerformPrefetch(account, imapHelper);
for (Voicemail remoteVoicemail : remoteMap.values()) {
if (!TextUtils.isEmpty(remoteVoicemail.getTranscription())) {
- Logger.get(mContext).logImpression(DialerImpression.Type.VVM_TRANSCRIPTION_DOWNLOADED);
+ LoggerUtils.logImpressionOnMainThread(
+ mContext, DialerImpression.Type.VVM_TRANSCRIPTION_DOWNLOADED);
}
Uri uri = VoicemailDatabaseUtil.insert(mContext, remoteVoicemail);
if (prefetchEnabled) {
diff --git a/java/com/android/voicemail/impl/sync/SyncOneTask.java b/java/com/android/voicemail/impl/sync/SyncOneTask.java
index e57235e4b..19419ec8a 100644
--- a/java/com/android/voicemail/impl/sync/SyncOneTask.java
+++ b/java/com/android/voicemail/impl/sync/SyncOneTask.java
@@ -18,18 +18,21 @@ package com.android.voicemail.impl.sync;
import android.content.Context;
import android.content.Intent;
+import android.os.Bundle;
import android.telecom.PhoneAccountHandle;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.proguard.UsedByReflection;
import com.android.voicemail.impl.Voicemail;
import com.android.voicemail.impl.VoicemailStatus;
import com.android.voicemail.impl.scheduling.BaseTask;
import com.android.voicemail.impl.scheduling.RetryPolicy;
+import com.android.voicemail.impl.utils.LoggerUtils;
/**
* Task to download a single voicemail from the server. This task is initiated by a SMS notifying
* the new voicemail arrival, and ignores the duplicated tasks constraint.
*/
+@UsedByReflection(value = "Tasks.java")
public class SyncOneTask extends BaseTask {
private static final int RETRY_TIMES = 2;
@@ -56,11 +59,12 @@ public class SyncOneTask extends BaseTask {
addPolicy(new RetryPolicy(RETRY_TIMES, RETRY_INTERVAL_MILLIS));
}
- public void onCreate(Context context, Intent intent, int flags, int startId) {
- super.onCreate(context, intent, flags, startId);
- mPhone = intent.getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE);
- mSyncType = intent.getStringExtra(EXTRA_SYNC_TYPE);
- mVoicemail = intent.getParcelableExtra(EXTRA_VOICEMAIL);
+ @Override
+ public void onCreate(Context context, Bundle extras) {
+ super.onCreate(context, extras);
+ mPhone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
+ mSyncType = extras.getString(EXTRA_SYNC_TYPE);
+ mVoicemail = extras.getParcelable(EXTRA_VOICEMAIL);
}
@Override
@@ -71,7 +75,7 @@ public class SyncOneTask extends BaseTask {
@Override
public Intent createRestartIntent() {
- Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_AUTO_RETRY_SYNC);
+ LoggerUtils.logImpressionOnMainThread(getContext(), DialerImpression.Type.VVM_AUTO_RETRY_SYNC);
Intent intent = super.createRestartIntent();
intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, mPhone);
intent.putExtra(EXTRA_SYNC_TYPE, mSyncType);
diff --git a/java/com/android/voicemail/impl/sync/SyncTask.java b/java/com/android/voicemail/impl/sync/SyncTask.java
index a9e592068..27f803401 100644
--- a/java/com/android/voicemail/impl/sync/SyncTask.java
+++ b/java/com/android/voicemail/impl/sync/SyncTask.java
@@ -18,14 +18,17 @@ package com.android.voicemail.impl.sync;
import android.content.Context;
import android.content.Intent;
+import android.os.Bundle;
import android.telecom.PhoneAccountHandle;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.proguard.UsedByReflection;
import com.android.voicemail.impl.scheduling.BaseTask;
import com.android.voicemail.impl.scheduling.MinimalIntervalPolicy;
import com.android.voicemail.impl.scheduling.RetryPolicy;
+import com.android.voicemail.impl.utils.LoggerUtils;
/** System initiated sync request. */
+@UsedByReflection(value = "Tasks.java")
public class SyncTask extends BaseTask {
// Try sync for a total of 5 times, should take around 5 minutes before finally giving up.
@@ -55,10 +58,11 @@ public class SyncTask extends BaseTask {
addPolicy(new MinimalIntervalPolicy(MINIMAL_INTERVAL_MILLIS));
}
- public void onCreate(Context context, Intent intent, int flags, int startId) {
- super.onCreate(context, intent, flags, startId);
- mPhone = intent.getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE);
- mSyncType = intent.getStringExtra(EXTRA_SYNC_TYPE);
+ @Override
+ public void onCreate(Context context, Bundle extras) {
+ super.onCreate(context, extras);
+ mPhone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
+ mSyncType = extras.getString(EXTRA_SYNC_TYPE);
}
@Override
@@ -69,7 +73,7 @@ public class SyncTask extends BaseTask {
@Override
public Intent createRestartIntent() {
- Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_AUTO_RETRY_SYNC);
+ LoggerUtils.logImpressionOnMainThread(getContext(), DialerImpression.Type.VVM_AUTO_RETRY_SYNC);
Intent intent = super.createRestartIntent();
intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, mPhone);
intent.putExtra(EXTRA_SYNC_TYPE, mSyncType);
diff --git a/java/com/android/voicemail/impl/sync/UploadTask.java b/java/com/android/voicemail/impl/sync/UploadTask.java
index 7d1a79756..403074572 100644
--- a/java/com/android/voicemail/impl/sync/UploadTask.java
+++ b/java/com/android/voicemail/impl/sync/UploadTask.java
@@ -18,7 +18,9 @@ package com.android.voicemail.impl.sync;
import android.content.Context;
import android.content.Intent;
+import android.os.Bundle;
import android.telecom.PhoneAccountHandle;
+import com.android.dialer.proguard.UsedByReflection;
import com.android.voicemail.impl.VoicemailStatus;
import com.android.voicemail.impl.VvmLog;
import com.android.voicemail.impl.scheduling.BaseTask;
@@ -28,6 +30,7 @@ import com.android.voicemail.impl.scheduling.PostponePolicy;
* Upload task triggered by database changes. Will wait until the database has been stable for
* {@link #POSTPONE_MILLIS} to execute.
*/
+@UsedByReflection(value = "Tasks.java")
public class UploadTask extends BaseTask {
private static final String TAG = "VvmUploadTask";
@@ -45,8 +48,8 @@ public class UploadTask extends BaseTask {
}
@Override
- public void onCreate(Context context, Intent intent, int flags, int startId) {
- super.onCreate(context, intent, flags, startId);
+ public void onCreate(Context context, Bundle extras) {
+ super.onCreate(context, extras);
}
@Override
diff --git a/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java b/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java
index fc8119a80..bfc2e5f20 100644
--- a/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java
+++ b/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java
@@ -25,7 +25,9 @@ import android.net.Uri;
import android.os.Build.VERSION_CODES;
import android.provider.VoicemailContract;
import android.provider.VoicemailContract.Voicemails;
+import android.support.annotation.NonNull;
import android.telecom.PhoneAccountHandle;
+import android.text.TextUtils;
import com.android.dialer.common.Assert;
import com.android.voicemail.impl.Voicemail;
import java.util.ArrayList;
@@ -52,6 +54,12 @@ public class VoicemailsQueryHelper {
Voicemails.DIRTY + "=1 AND " + Voicemails.DELETED + "!=1 AND " + Voicemails.IS_READ + "=1";
static final String DELETED_SELECTION = Voicemails.DELETED + "=1";
static final String ARCHIVED_SELECTION = Voicemails.ARCHIVED + "=0";
+ private static final String PHONE_ACCOUNT_HANDLE_SELECTION =
+ "("
+ + Voicemails.PHONE_ACCOUNT_COMPONENT_NAME
+ + "=? AND "
+ + Voicemails.PHONE_ACCOUNT_ID
+ + "=?)";
private Context mContext;
private ContentResolver mContentResolver;
@@ -68,8 +76,8 @@ public class VoicemailsQueryHelper {
*
* @return A list of read voicemails.
*/
- public List<Voicemail> getReadVoicemails() {
- return getLocalVoicemails(READ_SELECTION);
+ public List<Voicemail> getReadVoicemails(@NonNull PhoneAccountHandle phoneAccountHandle) {
+ return getLocalVoicemails(phoneAccountHandle, READ_SELECTION);
}
/**
@@ -77,8 +85,8 @@ public class VoicemailsQueryHelper {
*
* @return A list of deleted voicemails.
*/
- public List<Voicemail> getDeletedVoicemails() {
- return getLocalVoicemails(DELETED_SELECTION);
+ public List<Voicemail> getDeletedVoicemails(@NonNull PhoneAccountHandle phoneAccountHandle) {
+ return getLocalVoicemails(phoneAccountHandle, DELETED_SELECTION);
}
/**
@@ -86,8 +94,8 @@ public class VoicemailsQueryHelper {
*
* @return A list of all locally stored voicemails.
*/
- public List<Voicemail> getAllVoicemails() {
- return getLocalVoicemails(null);
+ public List<Voicemail> getAllVoicemails(@NonNull PhoneAccountHandle phoneAccountHandle) {
+ return getLocalVoicemails(phoneAccountHandle, null);
}
/**
@@ -96,8 +104,20 @@ public class VoicemailsQueryHelper {
* @param selection A filter declaring which rows to return. {@code null} returns all rows.
* @return A list of voicemails according to the selection statement.
*/
- private List<Voicemail> getLocalVoicemails(String selection) {
- Cursor cursor = mContentResolver.query(mSourceUri, PROJECTION, selection, null, null);
+ private List<Voicemail> getLocalVoicemails(
+ @NonNull PhoneAccountHandle phoneAccountHandle, String selection) {
+
+ String[] selectionArgs =
+ new String[] {
+ phoneAccountHandle.getComponentName().flattenToString(), phoneAccountHandle.getId()
+ };
+ if (TextUtils.isEmpty(selection)) {
+ selection = PHONE_ACCOUNT_HANDLE_SELECTION;
+ } else {
+ selection = PHONE_ACCOUNT_HANDLE_SELECTION + " AND (" + selection + ")";
+ }
+
+ Cursor cursor = mContentResolver.query(mSourceUri, PROJECTION, selection, selectionArgs, null);
if (cursor == null) {
return null;
}
diff --git a/java/com/android/voicemail/impl/utils/LoggerUtils.java b/java/com/android/voicemail/impl/utils/LoggerUtils.java
new file mode 100644
index 000000000..070772f2f
--- /dev/null
+++ b/java/com/android/voicemail/impl/utils/LoggerUtils.java
@@ -0,0 +1,33 @@
+/*
+ * 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.voicemail.impl.utils;
+
+import android.content.Context;
+import android.support.annotation.AnyThread;
+import com.android.dialer.common.concurrent.ThreadUtil;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.logging.Logger;
+
+/** Common utility method when using {@link Logger} */
+public class LoggerUtils {
+
+ /** Posts the impression logging to the main thread so it will be thread safe. */
+ @AnyThread
+ public static void logImpressionOnMainThread(Context context, DialerImpression.Type impression) {
+ ThreadUtil.postOnUiThread(() -> Logger.get(context).logImpression(impression));
+ }
+}
diff --git a/java/com/android/voicemail/stub/StubVoicemailClient.java b/java/com/android/voicemail/stub/StubVoicemailClient.java
index 172b3ffcc..e2b470799 100644
--- a/java/com/android/voicemail/stub/StubVoicemailClient.java
+++ b/java/com/android/voicemail/stub/StubVoicemailClient.java
@@ -37,6 +37,15 @@ public final class StubVoicemailClient implements VoicemailClient {
}
@Override
+ public boolean isVoicemailEnabled(Context context, PhoneAccountHandle phoneAccountHandle) {
+ return false;
+ }
+
+ @Override
+ public void setVoicemailEnabled(
+ Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled) {}
+
+ @Override
public void appendOmtpVoicemailSelectionClause(
Context context, StringBuilder where, List<String> selectionArgs) {}
@@ -67,4 +76,9 @@ public final class StubVoicemailClient implements VoicemailClient {
public Intent getSetPinIntent(Context context, PhoneAccountHandle phoneAccountHandle) {
return new Intent(TelephonyManager.ACTION_CONFIGURE_VOICEMAIL);
}
+
+ @Override
+ public boolean isActivated(Context context, PhoneAccountHandle phoneAccountHandle) {
+ return false;
+ }
}