diff options
Diffstat (limited to 'java/com/android/voicemail')
116 files changed, 1634 insertions, 549 deletions
diff --git a/java/com/android/voicemail/impl/ActivationTask.java b/java/com/android/voicemail/impl/ActivationTask.java index b0ad3bafc..6e27b5015 100644 --- a/java/com/android/voicemail/impl/ActivationTask.java +++ b/java/com/android/voicemail/impl/ActivationTask.java @@ -19,11 +19,9 @@ package com.android.voicemail.impl; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; -import android.database.ContentObserver; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.provider.Settings; -import android.provider.Settings.Global; import android.support.annotation.Nullable; import android.support.annotation.WorkerThread; import android.telecom.PhoneAccountHandle; @@ -31,6 +29,7 @@ import android.telephony.ServiceState; import android.telephony.TelephonyManager; import com.android.dialer.logging.DialerImpression; import com.android.dialer.proguard.UsedByReflection; +import com.android.voicemail.VoicemailClient; import com.android.voicemail.impl.protocol.VisualVoicemailProtocol; import com.android.voicemail.impl.scheduling.BaseTask; import com.android.voicemail.impl.scheduling.RetryPolicy; @@ -42,8 +41,6 @@ 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; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -66,8 +63,6 @@ public class ActivationTask extends BaseTask { private static final String EXTRA_MESSAGE_DATA_BUNDLE = "extra_message_data_bundle"; - @Nullable private static DeviceProvisionedObserver sDeviceProvisionedObserver; - private final RetryPolicy mRetryPolicy; private Bundle mMessageData; @@ -97,7 +92,7 @@ public class ActivationTask extends BaseTask { // Activation might need information such as system language to be set, so wait until // the setup wizard is finished. The data bundle from the SMS will be re-requested upon // activation. - queueActivationAfterProvisioned(context, phoneAccountHandle); + DeviceProvisionedJobService.activateAfterProvisioned(context, phoneAccountHandle); return; } @@ -105,7 +100,7 @@ public class ActivationTask extends BaseTask { if (messageData != null) { intent.putExtra(EXTRA_MESSAGE_DATA_BUNDLE, messageData); } - context.startService(intent); + context.sendBroadcast(intent); } @Override @@ -136,6 +131,8 @@ public class ActivationTask extends BaseTask { return; } + PreOMigrationHandler.migrate(getContext(), phoneAccountHandle); + if (!VisualVoicemailSettingsUtil.isEnabled(getContext(), phoneAccountHandle)) { VvmLog.i(TAG, "VVM is disabled"); return; @@ -163,6 +160,7 @@ public class ActivationTask extends BaseTask { if (VvmAccountManager.isAccountActivated(getContext(), phoneAccountHandle)) { VvmLog.i(TAG, "Account is already activated"); + onSuccess(getContext(), phoneAccountHandle); return; } helper.handleEvent( @@ -222,7 +220,7 @@ public class ActivationTask extends BaseTask { + message.getReturnCode()); if (message.getProvisioningStatus().equals(OmtpConstants.SUBSCRIBER_READY)) { VvmLog.d(TAG, "subscriber ready, no activation required"); - updateSource(getContext(), phoneAccountHandle, status, message); + updateSource(getContext(), phoneAccountHandle, message); } else { if (helper.supportsProvisioning()) { VvmLog.i(TAG, "Subscriber not ready, start provisioning"); @@ -232,7 +230,7 @@ public class ActivationTask extends BaseTask { VvmLog.i(TAG, "Subscriber new but provisioning is not supported"); // Ignore the non-ready state and attempt to use the provided info as is. // This is probably caused by not completing the new user tutorial. - updateSource(getContext(), phoneAccountHandle, status, message); + updateSource(getContext(), phoneAccountHandle, message); } else { VvmLog.i(TAG, "Subscriber not ready but provisioning is not supported"); helper.handleEvent(status, OmtpEvents.CONFIG_SERVICE_NOT_AVAILABLE); @@ -242,25 +240,38 @@ public class ActivationTask extends BaseTask { getContext(), DialerImpression.Type.VVM_ACTIVATION_COMPLETED); } - public static void updateSource( - Context context, - PhoneAccountHandle phone, - VoicemailStatus.Editor status, - StatusMessage message) { + private static void updateSource( + Context context, PhoneAccountHandle phone, StatusMessage message) { if (OmtpConstants.SUCCESS.equals(message.getReturnCode())) { - OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(context, phone); - helper.handleEvent(status, OmtpEvents.CONFIG_REQUEST_STATUS_SUCCESS); - // Save the IMAP credentials in preferences so they are persistent and can be retrieved. VvmAccountManager.addAccount(context, phone, message); - - SyncTask.start(context, phone, OmtpVvmSyncService.SYNC_FULL_SYNC); + onSuccess(context, phone); } else { VvmLog.e(TAG, "Visual voicemail not available for subscriber."); } } + private static void onSuccess(Context context, PhoneAccountHandle phoneAccountHandle) { + OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(context, phoneAccountHandle); + helper.handleEvent( + VoicemailStatus.edit(context, phoneAccountHandle), + OmtpEvents.CONFIG_REQUEST_STATUS_SUCCESS); + clearLegacyVoicemailNotification(context, phoneAccountHandle); + SyncTask.start(context, phoneAccountHandle, OmtpVvmSyncService.SYNC_FULL_SYNC); + } + + /** Sends a broadcast to the dialer UI to clear legacy voicemail notifications if any. */ + private static void clearLegacyVoicemailNotification( + Context context, PhoneAccountHandle phoneAccountHandle) { + 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 zero will clear the notification. + intent.putExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, 0); + context.sendBroadcast(intent); + } + private static boolean hasSignal(Context context, PhoneAccountHandle phoneAccountHandle) { TelephonyManager telephonyManager = context @@ -268,45 +279,4 @@ public class ActivationTask extends BaseTask { .createForPhoneAccountHandle(phoneAccountHandle); return telephonyManager.getServiceState().getState() == ServiceState.STATE_IN_SERVICE; } - - private static void queueActivationAfterProvisioned( - Context context, PhoneAccountHandle phoneAccountHandle) { - if (sDeviceProvisionedObserver == null) { - sDeviceProvisionedObserver = new DeviceProvisionedObserver(context); - context - .getContentResolver() - .registerContentObserver( - Settings.Global.getUriFor(Global.DEVICE_PROVISIONED), - false, - sDeviceProvisionedObserver); - } - sDeviceProvisionedObserver.addPhoneAcountHandle(phoneAccountHandle); - } - - private static class DeviceProvisionedObserver extends ContentObserver { - - private final Context mContext; - private final Set<PhoneAccountHandle> mPhoneAccountHandles = new HashSet<>(); - - private DeviceProvisionedObserver(Context context) { - super(null); - mContext = context; - } - - public void addPhoneAcountHandle(PhoneAccountHandle phoneAccountHandle) { - mPhoneAccountHandles.add(phoneAccountHandle); - } - - @Override - public void onChange(boolean selfChange) { - if (isDeviceProvisioned(mContext)) { - VvmLog.i(TAG, "device provisioned, resuming activation"); - for (PhoneAccountHandle phoneAccountHandle : mPhoneAccountHandles) { - start(mContext, phoneAccountHandle, null); - } - mContext.getContentResolver().unregisterContentObserver(sDeviceProvisionedObserver); - sDeviceProvisionedObserver = null; - } - } - } } diff --git a/java/com/android/voicemail/impl/AndroidManifest.xml b/java/com/android/voicemail/impl/AndroidManifest.xml index 47a4b2dd3..3e512ba1e 100644 --- a/java/com/android/voicemail/impl/AndroidManifest.xml +++ b/java/com/android/voicemail/impl/AndroidManifest.xml @@ -31,7 +31,8 @@ <receiver android:name="com.android.voicemail.impl.sms.OmtpMessageReceiver" - android:exported="false"> + android:exported="false" + android:directBootAware="true"> <intent-filter> <action android:name="com.android.vociemailomtp.sms.sms_received"/> </intent-filter> @@ -40,7 +41,7 @@ <receiver android:name="com.android.voicemail.impl.VoicemailClientReceiver" android:exported="false"> <intent-filter> - <action android:name="com.android.voicemailomtp.VoicemailClient.ACTION_UPLOAD"/> + <action android:name="com.android.voicemail.VoicemailClient.ACTION_UPLOAD"/> </intent-filter> </receiver> @@ -76,8 +77,8 @@ </intent-filter> </receiver> - <service - android:name="com.android.voicemail.impl.scheduling.TaskSchedulerService" + <receiver + android:name="com.android.voicemail.impl.scheduling.TaskReceiver" android:exported="false"/> <service @@ -90,12 +91,20 @@ android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false"/> - <receiver android:name="com.android.voicemail.impl.OmtpReceiver" - android:exported="true"> + <service + android:name="com.android.voicemail.impl.DeviceProvisionedJobService" + android:permission="android.permission.BIND_JOB_SERVICE" + android:exported="false"/> + + <service + android:name="com.android.voicemail.impl.OmtpService" + android:permission="android.permission.BIND_VISUAL_VOICEMAIL_SERVICE" + android:exported="true" + android:directBootAware="true"> <intent-filter> - <action android:name="com.android.phone.vvm.ACTION_VISUAL_VOICEMAIL_SERVICE_EVENT" /> + <action android:name="android.telephony.VisualVoicemailService"/> </intent-filter> - </receiver> + </service> <activity android:name="com.android.voicemail.impl.settings.VoicemailChangePinActivity" @@ -109,14 +118,5 @@ <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/DeviceProvisionedJobService.java b/java/com/android/voicemail/impl/DeviceProvisionedJobService.java new file mode 100644 index 000000000..a0b999d23 --- /dev/null +++ b/java/com/android/voicemail/impl/DeviceProvisionedJobService.java @@ -0,0 +1,85 @@ +/* + * 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; + +import android.annotation.TargetApi; +import android.app.job.JobInfo; +import android.app.job.JobInfo.TriggerContentUri; +import android.app.job.JobParameters; +import android.app.job.JobScheduler; +import android.app.job.JobService; +import android.app.job.JobWorkItem; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.os.Build.VERSION_CODES; +import android.provider.Settings; +import android.provider.Settings.Global; +import android.telecom.PhoneAccountHandle; +import com.android.dialer.constants.ScheduledJobIds; + +/** + * JobService triggered when the setup wizard is completed, and rerun all {@link ActivationTask} + * scheduled during the setup. + */ +@TargetApi(VERSION_CODES.O) +public class DeviceProvisionedJobService extends JobService { + + private static final String EXTRA_PHONE_ACCOUNT_HANDLE = "EXTRA_PHONE_ACCOUNT_HANDLE"; + + /** Queue the phone account to be reactivated after the setup wizard has completed. */ + public static void activateAfterProvisioned( + Context context, PhoneAccountHandle phoneAccountHandle) { + JobInfo jobInfo = + new JobInfo.Builder( + ScheduledJobIds.VVM_DEVICE_PROVISIONED_JOB, + new ComponentName(context, DeviceProvisionedJobService.class)) + .addTriggerContentUri( + new TriggerContentUri(Global.getUriFor(Global.DEVICE_PROVISIONED), 0)) + // VVM activation must be run as soon as possible to avoid voicemail loss + .setTriggerContentMaxDelay(0) + .build(); + + Intent intent = new Intent(); + intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); + context.getSystemService(JobScheduler.class).enqueue(jobInfo, new JobWorkItem(intent)); + } + + @Override + public boolean onStartJob(JobParameters params) { + Assert.isTrue(isDeviceProvisioned()); + VvmLog.i("DeviceProvisionedJobService.onStartJob", "device provisioned"); + for (JobWorkItem item = params.dequeueWork(); item != null; item = params.dequeueWork()) { + PhoneAccountHandle phoneAccountHandle = + item.getIntent().getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE); + VvmLog.i( + "DeviceProvisionedJobService.onStartJob", + "restarting activation for " + phoneAccountHandle); + ActivationTask.start(this, phoneAccountHandle, null); + } + return false; // job not running in background + } + + @Override + public boolean onStopJob(JobParameters params) { + return true; // reschedule job + } + + private boolean isDeviceProvisioned() { + return Settings.Global.getInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) == 1; + } +} diff --git a/java/com/android/voicemail/impl/OmtpService.java b/java/com/android/voicemail/impl/OmtpService.java new file mode 100644 index 000000000..759be4fd1 --- /dev/null +++ b/java/com/android/voicemail/impl/OmtpService.java @@ -0,0 +1,159 @@ +/* + * 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; + +import android.annotation.TargetApi; +import android.content.Intent; +import android.os.Build.VERSION_CODES; +import android.os.UserManager; +import android.telecom.PhoneAccountHandle; +import android.telephony.VisualVoicemailService; +import android.telephony.VisualVoicemailSms; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; +import com.android.voicemail.VoicemailComponent; +import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil; +import com.android.voicemail.impl.sms.LegacyModeSmsHandler; +import com.android.voicemail.impl.sync.VvmAccountManager; + +/** Implements {@link VisualVoicemailService} to receive visual voicemail events */ +@TargetApi(VERSION_CODES.O) +public class OmtpService extends VisualVoicemailService { + + private static final String TAG = "VvmOmtpService"; + + public static final String ACTION_SMS_RECEIVED = "com.android.vociemailomtp.sms.sms_received"; + + public static final String EXTRA_VOICEMAIL_SMS = "extra_voicemail_sms"; + + @Override + public void onCellServiceConnected( + VisualVoicemailTask task, final PhoneAccountHandle phoneAccountHandle) { + VvmLog.i(TAG, "onCellServiceConnected"); + if (!isModuleEnabled()) { + VvmLog.e(TAG, "onCellServiceConnected received when module is disabled"); + task.finish(); + return; + } + + if (!isUserUnlocked()) { + VvmLog.i(TAG, "onCellServiceConnected: user locked"); + task.finish(); + return; + } + + if (!isServiceEnabled(phoneAccountHandle)) { + task.finish(); + return; + } + + Logger.get(this).logImpression(DialerImpression.Type.VVM_UNBUNDLED_EVENT_RECEIVED); + ActivationTask.start(OmtpService.this, phoneAccountHandle, null); + task.finish(); + } + + @Override + public void onSmsReceived(VisualVoicemailTask task, final VisualVoicemailSms sms) { + VvmLog.i(TAG, "onSmsReceived"); + if (!isModuleEnabled()) { + VvmLog.e(TAG, "onSmsReceived received when module is disabled"); + task.finish(); + return; + } + + if (!isUserUnlocked()) { + LegacyModeSmsHandler.handle(this, sms); + return; + } + + VvmPackageInstallHandler.scanNewPackages(this); + + if (!isServiceEnabled(sms.getPhoneAccountHandle())) { + task.finish(); + return; + } + + // isUserUnlocked() is not checked. OmtpMessageReceiver will handle the locked case. + + Logger.get(this).logImpression(DialerImpression.Type.VVM_UNBUNDLED_EVENT_RECEIVED); + Intent intent = new Intent(ACTION_SMS_RECEIVED); + intent.setPackage(getPackageName()); + intent.putExtra(EXTRA_VOICEMAIL_SMS, sms); + sendBroadcast(intent); + task.finish(); + } + + @Override + public void onSimRemoved( + final VisualVoicemailTask task, final PhoneAccountHandle phoneAccountHandle) { + VvmLog.i(TAG, "onSimRemoved"); + if (!isModuleEnabled()) { + VvmLog.e(TAG, "onSimRemoved called when module is disabled"); + task.finish(); + return; + } + + if (!isUserUnlocked()) { + VvmLog.i(TAG, "onSimRemoved: user locked"); + task.finish(); + return; + } + + Logger.get(this).logImpression(DialerImpression.Type.VVM_UNBUNDLED_EVENT_RECEIVED); + VvmAccountManager.removeAccount(this, phoneAccountHandle); + task.finish(); + } + + @Override + public void onStopped(VisualVoicemailTask task) { + VvmLog.i(TAG, "onStopped"); + if (!isModuleEnabled()) { + VvmLog.e(TAG, "onStopped called when module is disabled"); + task.finish(); + return; + } + if (!isUserUnlocked()) { + VvmLog.i(TAG, "onStopped: user locked"); + task.finish(); + return; + } + Logger.get(this).logImpression(DialerImpression.Type.VVM_UNBUNDLED_EVENT_RECEIVED); + } + + private boolean isModuleEnabled() { + return VoicemailComponent.get(this).getVoicemailClient().isVoicemailModuleEnabled(); + } + + private boolean isServiceEnabled(PhoneAccountHandle phoneAccountHandle) { + OmtpVvmCarrierConfigHelper config = new OmtpVvmCarrierConfigHelper(this, phoneAccountHandle); + if (!config.isValid()) { + VvmLog.i(TAG, "VVM not supported on " + phoneAccountHandle); + return false; + } + if (!VisualVoicemailSettingsUtil.isEnabled(this, phoneAccountHandle) + && !config.isLegacyModeEnabled()) { + VvmLog.i(TAG, "VVM is disabled"); + return false; + } + return true; + } + + private boolean isUserUnlocked() { + UserManager userManager = getSystemService(UserManager.class); + return userManager.isUserUnlocked(); + } +} diff --git a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java index 2f1df09dd..4a9e43370 100644 --- a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java +++ b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java @@ -26,7 +26,6 @@ import android.support.annotation.VisibleForTesting; import android.telecom.PhoneAccountHandle; import android.telephony.CarrierConfigManager; import android.telephony.TelephonyManager; -import android.telephony.VisualVoicemailService; import android.telephony.VisualVoicemailSmsFilterSettings; import android.text.TextUtils; import android.util.ArraySet; @@ -108,8 +107,7 @@ public class OmtpVvmCarrierConfigHelper { mCarrierConfig = getCarrierConfig(telephonyManager); mTelephonyConfig = - new TelephonyVvmConfigManager(context.getResources()) - .getConfig(telephonyManager.getSimOperator()); + new TelephonyVvmConfigManager(context).getConfig(telephonyManager.getSimOperator()); mVvmType = getVvmType(); mProtocol = VisualVoicemailProtocolFactory.create(mContext.getResources(), mVvmType); @@ -234,9 +232,7 @@ public class OmtpVvmCarrierConfigHelper { return (String) getValue(KEY_VVM_DESTINATION_NUMBER_STRING); } - /** - * @return Port to start a SSL IMAP connection directly. - */ + /** @return Port to start a SSL IMAP connection directly. */ public int getSslPort() { Assert.checkArgument(isValid()); return (int) getValue(KEY_VVM_SSL_PORT_NUMBER_INT, 0); @@ -328,7 +324,7 @@ public class OmtpVvmCarrierConfigHelper { public void activateSmsFilter() { Assert.checkArgument(isValid()); - VisualVoicemailService.setSmsFilterSettings( + TelephonyMangerCompat.setVisualVoicemailSmsFilterSettings( mContext, getPhoneAccountHandle(), new VisualVoicemailSmsFilterSettings.Builder().setClientPrefix(getClientPrefix()).build()); @@ -339,7 +335,8 @@ public class OmtpVvmCarrierConfigHelper { VvmLog.i(TAG, "startDeactivation"); if (!isLegacyModeEnabled()) { // SMS should still be filtered in legacy mode - VisualVoicemailService.setSmsFilterSettings(mContext, getPhoneAccountHandle(), null); + TelephonyMangerCompat.setVisualVoicemailSmsFilterSettings( + mContext, getPhoneAccountHandle(), null); VvmLog.i(TAG, "filter disabled"); } if (mProtocol != null) { diff --git a/java/com/android/voicemail/impl/PreOMigrationHandler.java b/java/com/android/voicemail/impl/PreOMigrationHandler.java new file mode 100644 index 000000000..6dc2dee90 --- /dev/null +++ b/java/com/android/voicemail/impl/PreOMigrationHandler.java @@ -0,0 +1,102 @@ +/* + * 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; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.WorkerThread; +import android.telecom.PhoneAccountHandle; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil; +import com.android.voicemail.impl.settings.VoicemailChangePinActivity; +import java.lang.reflect.Method; + +/** Handles migration of data from the visual voicemail client in telephony before O. */ +public final class PreOMigrationHandler { + + // Hidden system APIs to access pre O VVM data + // Bundle getVisualVoicemailSettings() + private static final String METHOD_GET_VISUAL_VOICEMAIL_SETTINGS = "getVisualVoicemailSettings"; + + /** + * Key in bundle returned by {@link #METHOD_GET_VISUAL_VOICEMAIL_SETTINGS}, indicating whether + * visual voicemail was enabled or disabled by the user. If the user never explicitly changed this + * setting, this key will not exist. + */ + private static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = + "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL"; + + /** + * Key in bundle returned by {@link #METHOD_GET_VISUAL_VOICEMAIL_SETTINGS}, indicating the + * voicemail access PIN scrambled during the auto provisioning process. The user is expected to + * reset their PIN if this value is not {@code null}. + */ + private static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = + "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING"; + + private static final String PRE_O_MIGRATION_FINISHED = "pre_o_migration_finished"; + + @WorkerThread + public static void migrate(Context context, PhoneAccountHandle phoneAccountHandle) { + Assert.isNotMainThread(); + VisualVoicemailPreferences preferences = + new VisualVoicemailPreferences(context, phoneAccountHandle); + if (preferences.getBoolean(PRE_O_MIGRATION_FINISHED, false)) { + VvmLog.i("PreOMigrationHandler", phoneAccountHandle + " already migrated"); + return; + } + VvmLog.i("PreOMigrationHandler", "migrating " + phoneAccountHandle); + migrateSettings(context, phoneAccountHandle); + + preferences.edit().putBoolean(PRE_O_MIGRATION_FINISHED, true).apply(); + } + + private static void migrateSettings(Context context, PhoneAccountHandle phoneAccountHandle) { + VvmLog.i("PreOMigrationHandler.migrateSettings", "migrating settings"); + TelephonyManager telephonyManager = + context + .getSystemService(TelephonyManager.class) + .createForPhoneAccountHandle(phoneAccountHandle); + if (telephonyManager == null) { + VvmLog.e("PreOMigrationHandler.migrateSettings", "invalid PhoneAccountHandle"); + return; + } + Bundle legacySettings; + try { + Method method = TelephonyManager.class.getMethod(METHOD_GET_VISUAL_VOICEMAIL_SETTINGS); + legacySettings = (Bundle) method.invoke(telephonyManager); + } catch (ReflectiveOperationException | ClassCastException e) { + VvmLog.i("PreOMigrationHandler.migrateSettings", "unable to retrieve settings from system"); + return; + } + + if (legacySettings.containsKey(EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL)) { + boolean enabled = legacySettings.getBoolean(EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL); + VvmLog.i("PreOMigrationHandler.migrateSettings", "setting VVM enabled to " + enabled); + VisualVoicemailSettingsUtil.setEnabled(context, phoneAccountHandle, enabled); + } + + if (legacySettings.containsKey(EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING)) { + String scrambledPin = legacySettings.getString(EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING); + if (!TextUtils.isEmpty(scrambledPin)) { + VvmLog.i("PreOMigrationHandler.migrateSettings", "migrating scrambled PIN"); + VoicemailChangePinActivity.setDefaultOldPIN(context, phoneAccountHandle, scrambledPin); + } + } + } +} diff --git a/java/com/android/voicemail/impl/StatusCheckTask.java b/java/com/android/voicemail/impl/StatusCheckTask.java index 7699e9848..e59eb3b37 100644 --- a/java/com/android/voicemail/impl/StatusCheckTask.java +++ b/java/com/android/voicemail/impl/StatusCheckTask.java @@ -51,7 +51,7 @@ public class StatusCheckTask extends BaseTask { public static void start(Context context, PhoneAccountHandle phoneAccountHandle) { Intent intent = BaseTask.createIntent(context, StatusCheckTask.class, phoneAccountHandle); - context.startService(intent); + context.sendBroadcast(intent); } @Override diff --git a/java/com/android/voicemail/impl/TelephonyMangerCompat.java b/java/com/android/voicemail/impl/TelephonyMangerCompat.java index 353cd69e3..404b4d6ca 100644 --- a/java/com/android/voicemail/impl/TelephonyMangerCompat.java +++ b/java/com/android/voicemail/impl/TelephonyMangerCompat.java @@ -16,24 +16,36 @@ package com.android.voicemail.impl; +import android.app.PendingIntent; +import android.content.Context; import android.telecom.PhoneAccountHandle; import android.telephony.TelephonyManager; +import android.telephony.VisualVoicemailService; +import android.telephony.VisualVoicemailSmsFilterSettings; +import com.android.dialer.common.LogUtil; import java.lang.reflect.Method; /** Handles {@link TelephonyManager} API changes in experimental SDK */ public class TelephonyMangerCompat { - - private static final String GET_VISUAL_VOICEMAIL_PACKGE_NAME = "getVisualVoicemailPackageName"; - - /** - * Changed from getVisualVoicemailPackageName(PhoneAccountHandle) to - * getVisualVoicemailPackageName() - */ - public static String getVisualVoicemailPackageName(TelephonyManager telephonyManager) { + /** Moved from VisualVoicemailService to TelephonyManager */ + public static String sendVisualVoicemailSms( + Context context, + PhoneAccountHandle phoneAccountHandle, + String number, + int port, + String text, + PendingIntent sentIntent) { try { - Method method = TelephonyManager.class.getMethod(GET_VISUAL_VOICEMAIL_PACKGE_NAME); + Method method = + TelephonyManager.class.getMethod( + "sendVisualVoicemailSms", String.class, int.class, String.class, PendingIntent.class); try { - return (String) method.invoke(telephonyManager); + LogUtil.i("TelephonyMangerCompat.sendVisualVoicemailSms", "using TelephonyManager"); + TelephonyManager telephonyManager = + context + .getSystemService(TelephonyManager.class) + .createForPhoneAccountHandle(phoneAccountHandle); + return (String) method.invoke(telephonyManager, number, port, text, sentIntent); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } @@ -42,15 +54,61 @@ public class TelephonyMangerCompat { } try { + LogUtil.i("TelephonyMangerCompat.sendVisualVoicemailSms", "using VisualVoicemailService"); + Method method = + VisualVoicemailService.class.getMethod( + "sendVisualVoicemailSms", + Context.class, + PhoneAccountHandle.class, + String.class, + short.class, + String.class, + PendingIntent.class); + return (String) + method.invoke(null, context, phoneAccountHandle, number, (short) port, text, sentIntent); + + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + /** Moved from VisualVoicemailService to TelephonyManager */ + public static String setVisualVoicemailSmsFilterSettings( + Context context, + PhoneAccountHandle phoneAccountHandle, + VisualVoicemailSmsFilterSettings settings) { + try { Method method = TelephonyManager.class.getMethod( - GET_VISUAL_VOICEMAIL_PACKGE_NAME, PhoneAccountHandle.class); + "setVisualVoicemailSmsFilterSettings", VisualVoicemailSmsFilterSettings.class); try { - return (String) method.invoke(telephonyManager, (Object) null); + LogUtil.i( + "TelephonyMangerCompat.setVisualVoicemailSmsFilterSettings", "using TelephonyManager"); + TelephonyManager telephonyManager = + context + .getSystemService(TelephonyManager.class) + .createForPhoneAccountHandle(phoneAccountHandle); + return (String) method.invoke(telephonyManager, settings); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } catch (NoSuchMethodException e) { + // Do nothing, try the next version. + } + + try { + LogUtil.i( + "TelephonyMangerCompat.setVisualVoicemailSmsFilterSettings", + "using VisualVoicemailService"); + Method method = + VisualVoicemailService.class.getMethod( + "setSmsFilterSettings", + Context.class, + PhoneAccountHandle.class, + VisualVoicemailSmsFilterSettings.class); + return (String) method.invoke(null, context, phoneAccountHandle, settings); + + } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } diff --git a/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java b/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java index 04012c9c2..b4def2fc3 100644 --- a/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java +++ b/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java @@ -16,11 +16,12 @@ package com.android.voicemail.impl; -import android.content.res.Resources; +import android.content.Context; import android.os.PersistableBundle; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.util.ArrayMap; +import com.android.dialer.common.ConfigProviderBindings; import com.android.voicemail.impl.utils.XmlUtils; import java.io.IOException; import java.util.ArrayList; @@ -38,22 +39,24 @@ public class TelephonyVvmConfigManager { private static final String TAG_PERSISTABLEMAP = "pbundle_as_map"; - static final String KEY_MCCMNC = "mccmnc"; + @VisibleForTesting static final String KEY_MCCMNC = "mccmnc"; + + private static final String KEY_FEATURE_FLAG_NAME = "feature_flag_name"; private static Map<String, PersistableBundle> sCachedConfigs; private final Map<String, PersistableBundle> mConfigs; - public TelephonyVvmConfigManager(Resources resources) { + public TelephonyVvmConfigManager(Context context) { if (sCachedConfigs == null) { - sCachedConfigs = loadConfigs(resources.getXml(R.xml.vvm_config)); + sCachedConfigs = loadConfigs(context, context.getResources().getXml(R.xml.vvm_config)); } mConfigs = sCachedConfigs; } @VisibleForTesting - TelephonyVvmConfigManager(XmlPullParser parser) { - mConfigs = loadConfigs(parser); + TelephonyVvmConfigManager(Context context, XmlPullParser parser) { + mConfigs = loadConfigs(context, parser); } @Nullable @@ -64,7 +67,7 @@ public class TelephonyVvmConfigManager { return mConfigs.get(mccMnc); } - private static Map<String, PersistableBundle> loadConfigs(XmlPullParser parser) { + private static Map<String, PersistableBundle> loadConfigs(Context context, XmlPullParser parser) { Map<String, PersistableBundle> configs = new ArrayMap<>(); try { ArrayList list = readBundleList(parser); @@ -73,6 +76,13 @@ public class TelephonyVvmConfigManager { throw new IllegalArgumentException("PersistableBundle expected, got " + object); } PersistableBundle bundle = (PersistableBundle) object; + + if (bundle.containsKey(KEY_FEATURE_FLAG_NAME) + && !ConfigProviderBindings.get(context) + .getBoolean(bundle.getString(KEY_FEATURE_FLAG_NAME), false)) { + continue; + } + String[] mccMncs = bundle.getStringArray(KEY_MCCMNC); if (mccMncs == null) { throw new IllegalArgumentException("MCCMNC is null"); diff --git a/java/com/android/voicemail/impl/VoicemailClientImpl.java b/java/com/android/voicemail/impl/VoicemailClientImpl.java index 7747b2486..83c0523bf 100644 --- a/java/com/android/voicemail/impl/VoicemailClientImpl.java +++ b/java/com/android/voicemail/impl/VoicemailClientImpl.java @@ -130,8 +130,8 @@ public class VoicemailClientImpl implements VoicemailClient { @Override public void appendOmtpVoicemailSelectionClause( Context context, StringBuilder where, List<String> selectionArgs) { - TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); - String omtpSource = TelephonyMangerCompat.getVisualVoicemailPackageName(telephonyManager); + String omtpSource = + context.getSystemService(TelephonyManager.class).getVisualVoicemailPackageName(); if (where.length() != 0) { where.append(" AND "); } @@ -162,8 +162,8 @@ public class VoicemailClientImpl implements VoicemailClient { @Override public void appendOmtpVoicemailStatusSelectionClause( Context context, StringBuilder where, List<String> selectionArgs) { - TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); - String omtpSource = TelephonyMangerCompat.getVisualVoicemailPackageName(telephonyManager); + String omtpSource = + context.getSystemService(TelephonyManager.class).getVisualVoicemailPackageName(); if (where.length() != 0) { where.append(" AND "); } diff --git a/java/com/android/voicemail/impl/VvmPackageInstallHandler.java b/java/com/android/voicemail/impl/VvmPackageInstallHandler.java new file mode 100644 index 000000000..8d1fb2289 --- /dev/null +++ b/java/com/android/voicemail/impl/VvmPackageInstallHandler.java @@ -0,0 +1,167 @@ +/* + * 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; + +import android.annotation.SuppressLint; +import android.annotation.TargetApi; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ChangedPackages; +import android.os.Build.VERSION_CODES; +import android.preference.PreferenceManager; +import android.provider.Settings.Global; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import android.util.ArraySet; +import com.android.dialer.common.PackageUtils; +import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil; +import java.util.Set; + +/** + * When a new package is installed, check if it matches any of the vvm carrier apps of the currently + * enabled dialer VVM sources. The dialer VVM client will be disabled upon carrier VVM app + * installation, unless it was explicitly enabled by the user. + * + * <p>The ACTION_PACKAGE_ADDED broadcast can no longer be received. (see + * https://developer.android.com/preview/features/background.html#broadcasts) New apps are scanned + * when a VVM SMS is received instead, as it can be a result of the carrier VVM app trying to run + * activation. + */ +@SuppressLint("AndroidApiChecker") // forEach +@TargetApi(VERSION_CODES.O) +public final class VvmPackageInstallHandler { + + private static final String LAST_BOOT_COUNT = + "com.android.voicemail.impl.VvmPackageInstallHandler.LAST_BOOT_COUNT"; + + private static final String CHANGED_PACKAGES_SEQUENCE_NUMBER = + "com.android.voicemail.impl.VvmPackageInstallHandler.CHANGED_PACKAGES_SEQUENCE_NUMBER"; + + private static final String INSTALLED_CARRIER_PACKAGES = + "com.android.voicemail.impl.VvmPackageInstallHandler.INSTALLED_CARRIER_PACKAGES"; + + /** + * Perform a scan of all changed apps since the last invocation to see if the carrier VVM app is + * installed. + */ + public static void scanNewPackages(Context context) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + int sequenceNumber = sharedPreferences.getInt(CHANGED_PACKAGES_SEQUENCE_NUMBER, 0); + int lastBootCount = sharedPreferences.getInt(LAST_BOOT_COUNT, 0); + int bootCount = Global.getInt(context.getContentResolver(), Global.BOOT_COUNT, 0); + if (lastBootCount != bootCount) { + VvmLog.i( + "VvmPackageInstallHandler.scanNewPackages", "reboot detected, resetting sequence number"); + sequenceNumber = 0; + sharedPreferences.edit().putInt(LAST_BOOT_COUNT, bootCount).apply(); + } + + ChangedPackages changedPackages = + context.getPackageManager().getChangedPackages(sequenceNumber); + if (changedPackages == null) { + VvmLog.i("VvmPackageInstallHandler.scanNewPackages", "no package has changed"); + return; + } + sharedPreferences + .edit() + .putInt(CHANGED_PACKAGES_SEQUENCE_NUMBER, changedPackages.getSequenceNumber()) + .apply(); + + Set<String> installedPackages = + sharedPreferences.getStringSet(INSTALLED_CARRIER_PACKAGES, new ArraySet<>()); + + Set<String> monitoredPackage = getMonitoredPackages(context); + installedPackages.removeIf((packageName) -> !monitoredPackage.contains(packageName)); + + for (String packageName : changedPackages.getPackageNames()) { + if (!monitoredPackage.contains(packageName)) { + continue; + } + if (PackageUtils.isPackageEnabled(packageName, context)) { + if (!installedPackages.contains(packageName)) { + VvmLog.i("VvmPackageInstallHandler.scanNewPackages", "new package found: " + packageName); + installedPackages.add(packageName); + handlePackageInstalled(context, packageName); + } + } else { + installedPackages.remove(packageName); + } + } + sharedPreferences.edit().putStringSet(INSTALLED_CARRIER_PACKAGES, installedPackages).apply(); + } + + private static Set<String> getMonitoredPackages(Context context) { + Set<String> result = new ArraySet<>(); + context + .getSystemService(TelecomManager.class) + .getCallCapablePhoneAccounts() + .forEach( + (phoneAccountHandle -> { + OmtpVvmCarrierConfigHelper carrierConfigHelper = + new OmtpVvmCarrierConfigHelper(context, phoneAccountHandle); + if (!carrierConfigHelper.isValid()) { + return; + } + if (carrierConfigHelper.getCarrierVvmPackageNames() == null) { + return; + } + result.addAll(carrierConfigHelper.getCarrierVvmPackageNames()); + })); + + return result; + }; + + /** + * Iterates through all phone account and disable VVM on a account if {@code packageName} is + * listed as a carrier VVM package. + */ + private static void handlePackageInstalled(Context context, String packageName) { + // 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()) { + OmtpVvmCarrierConfigHelper carrierConfigHelper = + new OmtpVvmCarrierConfigHelper(context, phoneAccount); + if (!carrierConfigHelper.isValid()) { + continue; + } + if (carrierConfigHelper.getCarrierVvmPackageNames() == null) { + continue; + } + if (!carrierConfigHelper.getCarrierVvmPackageNames().contains(packageName)) { + continue; + } + + VvmLog.i("VvmPackageInstallHandler.handlePackageInstalled", "Carrier app installed"); + if (VisualVoicemailSettingsUtil.isEnabledUserSet(context, phoneAccount)) { + // Skip the check if this voicemail source's setting is overridden by the user. + VvmLog.i( + "VvmPackageInstallHandler.handlePackageInstalled", + "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( + "VvmPackageInstallHandler.handlePackageInstalled", + "Carrier VVM package installed, disabling system VVM client"); + VisualVoicemailSettingsUtil.setEnabled(context, phoneAccount, false); + } + } +} diff --git a/java/com/android/voicemail/impl/imap/ImapHelper.java b/java/com/android/voicemail/impl/imap/ImapHelper.java index 6aa415811..f1bc8b221 100644 --- a/java/com/android/voicemail/impl/imap/ImapHelper.java +++ b/java/com/android/voicemail/impl/imap/ImapHelper.java @@ -19,7 +19,7 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkInfo; -import android.provider.VoicemailContract; +import android.support.annotation.Nullable; import android.telecom.PhoneAccountHandle; import android.util.Base64; import com.android.voicemail.impl.OmtpConstants; @@ -44,6 +44,7 @@ import com.android.voicemail.impl.mail.TempDirectory; import com.android.voicemail.impl.mail.internet.MimeMessage; import com.android.voicemail.impl.mail.store.ImapConnection; import com.android.voicemail.impl.mail.store.ImapFolder; +import com.android.voicemail.impl.mail.store.ImapFolder.Quota; import com.android.voicemail.impl.mail.store.ImapStore; import com.android.voicemail.impl.mail.store.imap.ImapConstants; import com.android.voicemail.impl.mail.store.imap.ImapResponse; @@ -73,11 +74,6 @@ public class ImapHelper implements Closeable { private final Editor mStatus; VisualVoicemailPreferences mPrefs; - private static final String PREF_KEY_QUOTA_OCCUPIED = "quota_occupied_"; - private static final String PREF_KEY_QUOTA_TOTAL = "quota_total_"; - - private int mQuotaOccupied; - private int mQuotaTotal; private final OmtpVvmCarrierConfigHelper mConfig; @@ -90,10 +86,7 @@ public class ImapHelper implements Closeable { } public ImapHelper( - Context context, - PhoneAccountHandle phoneAccount, - Network network, - Editor status) + Context context, PhoneAccountHandle phoneAccount, Network network, Editor status) throws InitializingException { this( context, @@ -139,10 +132,6 @@ public class ImapHelper implements Closeable { LogUtils.w(TAG, "Could not parse port number"); throw new InitializingException("cannot initialize ImapHelper:" + e.toString()); } - - mQuotaOccupied = - mPrefs.getInt(PREF_KEY_QUOTA_OCCUPIED, VoicemailContract.Status.QUOTA_UNAVAILABLE); - mQuotaTotal = mPrefs.getInt(PREF_KEY_QUOTA_TOTAL, VoicemailContract.Status.QUOTA_UNAVAILABLE); } @Override @@ -475,12 +464,22 @@ public class ImapHelper implements Closeable { } } - public int getOccuupiedQuota() { - return mQuotaOccupied; - } - - public int getTotalQuota() { - return mQuotaTotal; + @Nullable + public Quota getQuota() { + try { + mFolder = openImapFolder(ImapFolder.MODE_READ_ONLY); + if (mFolder == null) { + // This means we were unable to successfully open the folder. + LogUtils.e(TAG, "Unable to open folder"); + return null; + } + return mFolder.getQuota(); + } catch (MessagingException e) { + LogUtils.e(TAG, e, "Messaging Exception"); + return null; + } finally { + closeImapFolder(); + } } private void updateQuota(ImapFolder folder) throws MessagingException { @@ -489,21 +488,19 @@ public class ImapHelper implements Closeable { private void setQuota(ImapFolder.Quota quota) { if (quota == null) { + LogUtils.i(TAG, "quota was null"); return; } - if (quota.occupied == mQuotaOccupied && quota.total == mQuotaTotal) { - VvmLog.v(TAG, "Quota hasn't changed"); - return; - } - mQuotaOccupied = quota.occupied; - mQuotaTotal = quota.total; - VoicemailStatus.edit(mContext, mPhoneAccount).setQuota(mQuotaOccupied, mQuotaTotal).apply(); - mPrefs - .edit() - .putInt(PREF_KEY_QUOTA_OCCUPIED, mQuotaOccupied) - .putInt(PREF_KEY_QUOTA_TOTAL, mQuotaTotal) - .apply(); - VvmLog.v(TAG, "Quota changed to " + mQuotaOccupied + "/" + mQuotaTotal); + + LogUtils.i( + TAG, + "Updating Voicemail status table with" + + " quota occupied: " + + quota.occupied + + " new quota total:" + + quota.total); + VoicemailStatus.edit(mContext, mPhoneAccount).setQuota(quota.occupied, quota.total).apply(); + LogUtils.i(TAG, "Updated quota occupied and total"); } /** diff --git a/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java b/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java index c8a74c8d5..1cdbbfbca 100644 --- a/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java +++ b/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java @@ -17,10 +17,13 @@ package com.android.voicemail.impl.protocol; import android.annotation.TargetApi; +import android.content.Context; import android.net.Network; import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; import android.support.annotation.WorkerThread; import android.telecom.PhoneAccountHandle; import android.telephony.TelephonyManager; @@ -28,6 +31,7 @@ import android.text.Html; import android.text.Spanned; import android.text.style.URLSpan; import android.util.ArrayMap; +import com.android.dialer.common.ConfigProviderBindings; import com.android.voicemail.impl.ActivationTask; import com.android.voicemail.impl.Assert; import com.android.voicemail.impl.OmtpEvents; @@ -49,6 +53,8 @@ import java.net.CookieHandler; import java.net.CookieManager; import java.net.HttpURLConnection; import java.net.URL; +import java.util.ArrayList; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Random; @@ -57,6 +63,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.json.JSONArray; +import org.json.JSONException; /** * Class to subscribe to basic VVM3 visual voicemail, for example, Verizon. Subscription is required @@ -111,7 +119,15 @@ public class Vvm3Subscriber { private static final String SPG_LANGUAGE_PARAM = "SPG_LANGUAGE_PARAM"; private static final String SPG_LANGUAGE_EN = "ENGLISH"; - private static final String BASIC_SUBSCRIBE_LINK_TEXT = "Subscribe to Basic Visual Voice Mail"; + @VisibleForTesting + static final String VVM3_SUBSCRIBE_LINK_PATTERNS_JSON_ARRAY = + "vvm3_subscribe_link_pattern_json_array"; + + private static final String VVM3_SUBSCRIBE_LINK_DEFAULT_PATTERNS = + "[" + + "\"(?i)Subscribe to Basic Visual Voice Mail\"," + + "\"(?i)Subscribe to Basic Visual Voicemail\"" + + "]"; private static final int REQUEST_TIMEOUT_SECONDS = 30; @@ -125,7 +141,8 @@ public class Vvm3Subscriber { private RequestQueue mRequestQueue; - private static class ProvisioningException extends Exception { + @VisibleForTesting + static class ProvisioningException extends Exception { public ProvisioningException(String message) { super(message); @@ -188,7 +205,8 @@ public class Vvm3Subscriber { try { String gatewayUrl = getSelfProvisioningGateway(); String selfProvisionResponse = getSelfProvisionResponse(gatewayUrl); - String subscribeLink = findSubscribeLink(selfProvisionResponse); + String subscribeLink = + findSubscribeLink(getSubscribeLinkPatterns(mHelper.getContext()), selfProvisionResponse); clickSubscribeLink(subscribeLink); } catch (ProvisioningException e) { VvmLog.e(TAG, e.toString()); @@ -291,14 +309,40 @@ public class Vvm3Subscriber { } } - private String findSubscribeLink(String response) throws ProvisioningException { + @VisibleForTesting + static List<Pattern> getSubscribeLinkPatterns(Context context) { + String patternsJsonString = + ConfigProviderBindings.get(context) + .getString( + VVM3_SUBSCRIBE_LINK_PATTERNS_JSON_ARRAY, VVM3_SUBSCRIBE_LINK_DEFAULT_PATTERNS); + List<Pattern> patterns = new ArrayList<>(); + try { + JSONArray patternsArray = new JSONArray(patternsJsonString); + for (int i = 0; i < patternsArray.length(); i++) { + patterns.add(Pattern.compile(patternsArray.getString(i))); + } + } catch (JSONException e) { + throw new IllegalArgumentException("Unable to parse patterns" + e); + } + return patterns; + } + + @VisibleForTesting + static String findSubscribeLink(@NonNull List<Pattern> patterns, String response) + throws ProvisioningException { + if (patterns.isEmpty()) { + throw new IllegalArgumentException("empty patterns"); + } Spanned doc = Html.fromHtml(response, Html.FROM_HTML_MODE_LEGACY); URLSpan[] spans = doc.getSpans(0, doc.length(), URLSpan.class); StringBuilder fulltext = new StringBuilder(); + for (URLSpan span : spans) { String text = doc.subSequence(doc.getSpanStart(span), doc.getSpanEnd(span)).toString(); - if (BASIC_SUBSCRIBE_LINK_TEXT.equals(text)) { - return span.getURL(); + for (Pattern pattern : patterns) { + if (pattern.matcher(text).matches()) { + return span.getURL(); + } } fulltext.append(text); } 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 71263217f..a84553480 100644 --- a/java/com/android/voicemail/impl/res/values-af/strings.xml +++ b/java/com/android/voicemail/impl/res/values-af/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Stemboodskap (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Stemboodskap"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibreer"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibreer"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Klank"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 d350bbd94..2f0719a0b 100644 --- a/java/com/android/voicemail/impl/res/values-am/strings.xml +++ b/java/com/android/voicemail/impl/res/values-am/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"የድምፅ መልዕክት (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"የድምፅ መልዕክት"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"ንዘር"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"ንዘር"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ድምፅ"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 679dcce9c..f46ebe1be 100644 --- a/java/com/android/voicemail/impl/res/values-ar/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ar/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"البريد الصوتي (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"البريد الصوتي"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"اهتزاز"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"اهتزاز"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"صوت"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 87b4c0692..ebb85dce8 100644 --- a/java/com/android/voicemail/impl/res/values-az/strings.xml +++ b/java/com/android/voicemail/impl/res/values-az/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Səsli e-poçt (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Səsli e-poçt"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrasiya"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrasiya"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Səs"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 index 193913081..41294300b 100644 --- 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 @@ -18,9 +18,8 @@ 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> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 874b4791a..ffb7caba0 100644 --- a/java/com/android/voicemail/impl/res/values-be/strings.xml +++ b/java/com/android/voicemail/impl/res/values-be/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Галасавая пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Галасавая пошта"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Вібрацыя"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Вібрацыя"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Гук"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 f987015e9..d3a66a41c 100644 --- a/java/com/android/voicemail/impl/res/values-bg/strings.xml +++ b/java/com/android/voicemail/impl/res/values-bg/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Гласова поща (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Гласова поща"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Вибриране"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Вибриране"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Звук"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 699576d41..636f332cb 100644 --- a/java/com/android/voicemail/impl/res/values-bn/strings.xml +++ b/java/com/android/voicemail/impl/res/values-bn/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"ভয়েসমেল (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"ভয়েসমেল"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"কম্পন"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"কম্পন"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"শব্দ"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 2c8cc7682..09b9ab6d1 100644 --- a/java/com/android/voicemail/impl/res/values-bs/strings.xml +++ b/java/com/android/voicemail/impl/res/values-bs/strings.xml @@ -18,9 +18,8 @@ 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> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 b6525d02b..e6c3bc730 100644 --- a/java/com/android/voicemail/impl/res/values-ca/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ca/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Bústia de veu (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Bústia de veu"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibra"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibra"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"So"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 987f9de01..621c4a8b1 100644 --- a/java/com/android/voicemail/impl/res/values-cs/strings.xml +++ b/java/com/android/voicemail/impl/res/values-cs/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Hlasová schránka (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Hlasová schránka"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrace"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrace"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Zvuk"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 70ecb3699..e9f0404d2 100644 --- a/java/com/android/voicemail/impl/res/values-da/strings.xml +++ b/java/com/android/voicemail/impl/res/values-da/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Telefonsvarer (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Telefonsvarer"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrer"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrer"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Lyd"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 2746629e9..c4cc75b37 100644 --- a/java/com/android/voicemail/impl/res/values-de/strings.xml +++ b/java/com/android/voicemail/impl/res/values-de/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Mailbox (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Mailbox"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrieren"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrieren"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Ton"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 e9f9835c6..5456c4875 100644 --- a/java/com/android/voicemail/impl/res/values-el/strings.xml +++ b/java/com/android/voicemail/impl/res/values-el/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Αυτόματος τηλεφωνητής (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Αυτόματος τηλεφωνητής"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Δόνηση"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Δόνηση"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Ήχος"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 ec08faf22..dba1f1624 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Voicemail"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrate"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrate"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Sound"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 ec08faf22..dba1f1624 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Voicemail"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrate"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrate"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Sound"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 ec08faf22..dba1f1624 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Voicemail"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrate"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrate"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Sound"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 fcd9cc7c3..86cb7e934 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Buzón de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Buzón de voz"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrar"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrar"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Sonido"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 f20ebc5cf..29863d177 100644 --- a/java/com/android/voicemail/impl/res/values-es/strings.xml +++ b/java/com/android/voicemail/impl/res/values-es/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Buzón de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Buzón de voz"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibración"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrar"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Sonido"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 dc7f685ba..6fcf23392 100644 --- a/java/com/android/voicemail/impl/res/values-et/strings.xml +++ b/java/com/android/voicemail/impl/res/values-et/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Kõnepost (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Kõnepost"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibreerimine"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibreerimine"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Heli"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 8a3bd640a..293dd1c45 100644 --- a/java/com/android/voicemail/impl/res/values-eu/strings.xml +++ b/java/com/android/voicemail/impl/res/values-eu/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Erantzungailua (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Erantzungailua"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Dardara"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Dardara"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Soinua"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 0b5d51333..cc04d98f2 100644 --- a/java/com/android/voicemail/impl/res/values-fa/strings.xml +++ b/java/com/android/voicemail/impl/res/values-fa/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"پست صوتی (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"پست صوتی"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"لرزش"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"لرزش"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"صدا"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 c20d3e481..0e1cda523 100644 --- a/java/com/android/voicemail/impl/res/values-fi/strings.xml +++ b/java/com/android/voicemail/impl/res/values-fi/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Vastaaja (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Vastaaja"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Värinä"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Värinä"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Ääni"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 6bbd1341f..f570fa415 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Messagerie vocale (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Messagerie vocale"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibreur"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibreur"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Son"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 dc21c76d3..323decf84 100644 --- a/java/com/android/voicemail/impl/res/values-fr/strings.xml +++ b/java/com/android/voicemail/impl/res/values-fr/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Messagerie vocale (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Messagerie vocale"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibreur"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibreur"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Sonnerie"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 81f6e679a..b6ff512d2 100644 --- a/java/com/android/voicemail/impl/res/values-gl/strings.xml +++ b/java/com/android/voicemail/impl/res/values-gl/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Correo de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Correo de voz"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibración"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibración"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Son"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 3e8948d19..684bd40fc 100644 --- a/java/com/android/voicemail/impl/res/values-gu/strings.xml +++ b/java/com/android/voicemail/impl/res/values-gu/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"વૉઇસમેઇલ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"વૉઇસમેઇલ"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"વાઇબ્રેટ"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"વાઇબ્રેટ"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ધ્વનિ"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 8daa3e3d7..3cb394f46 100644 --- a/java/com/android/voicemail/impl/res/values-hi/strings.xml +++ b/java/com/android/voicemail/impl/res/values-hi/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"वॉइसमेल (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"वॉइसमेल"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"कंपन"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"कंपन"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ध्वनि"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 960909571..6eb0bbc40 100644 --- a/java/com/android/voicemail/impl/res/values-hr/strings.xml +++ b/java/com/android/voicemail/impl/res/values-hr/strings.xml @@ -18,9 +18,8 @@ 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">"Vibriranje"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibriranje"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Zvuk"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 ce18af799..b76412275 100644 --- a/java/com/android/voicemail/impl/res/values-hu/strings.xml +++ b/java/com/android/voicemail/impl/res/values-hu/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Hangposta (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Hangposta"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Rezgés"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Rezgés"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Hang"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 eaa987aa4..23544bad8 100644 --- a/java/com/android/voicemail/impl/res/values-hy/strings.xml +++ b/java/com/android/voicemail/impl/res/values-hy/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Ձայնային փոստ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Ձայնային փոստ"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Թրթռոց"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Թրթռոց"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Ձայն"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 6f7e6377e..76ad47944 100644 --- a/java/com/android/voicemail/impl/res/values-in/strings.xml +++ b/java/com/android/voicemail/impl/res/values-in/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Pesan Suara (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Pesan Suara"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Getar"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Getar"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Suara"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 5e00487af..26ee45a75 100644 --- a/java/com/android/voicemail/impl/res/values-is/strings.xml +++ b/java/com/android/voicemail/impl/res/values-is/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Talhólf (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Talhólf"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Titringur"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Titringur"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Hljóð"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 2c37ba281..3f28d4563 100644 --- a/java/com/android/voicemail/impl/res/values-it/strings.xml +++ b/java/com/android/voicemail/impl/res/values-it/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Segreteria (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Segreteria"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrazione"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrazione"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Suono"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 cdf58dd64..f808e9853 100644 --- a/java/com/android/voicemail/impl/res/values-iw/strings.xml +++ b/java/com/android/voicemail/impl/res/values-iw/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"דואר קולי (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"דואר קולי"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"רטט"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"רטט"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"צליל"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 e35359f01..75dcd5e08 100644 --- a/java/com/android/voicemail/impl/res/values-ja/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ja/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"ボイスメール(<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"ボイスメール"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"バイブレーション"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"バイブレーション"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"通知音"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 7eb792fd0..8c46747ff 100644 --- a/java/com/android/voicemail/impl/res/values-ka/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ka/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"ხმოვანი ფოსტა (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"ხმოვანი ფოსტა"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"ვიბრაცია"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"ვიბრაცია"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ხმა"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 a03171d01..1badcfd92 100644 --- a/java/com/android/voicemail/impl/res/values-kk/strings.xml +++ b/java/com/android/voicemail/impl/res/values-kk/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Дауыстық хабар (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Дауыстық хабар"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Діріл"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Діріл"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Дыбыс"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 3d55d00bb..35fdb490a 100644 --- a/java/com/android/voicemail/impl/res/values-km/strings.xml +++ b/java/com/android/voicemail/impl/res/values-km/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"សារជាសំឡេង (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"សារជាសំឡេង"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"ញ័រ"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"ញ័រ"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"សំឡេង"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 379e656ce..5ab3a2e75 100644 --- a/java/com/android/voicemail/impl/res/values-kn/strings.xml +++ b/java/com/android/voicemail/impl/res/values-kn/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"ಧ್ವನಿಮೇಲ್ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"ಧ್ವನಿಮೇಲ್"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"ವೈಬ್ರೇಟ್"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"ವೈಬ್ರೇಟ್"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ಶಬ್ದ"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 513a67546..98195e04f 100644 --- a/java/com/android/voicemail/impl/res/values-ko/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ko/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"음성사서함(<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"음성사서함"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"진동"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"진동"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"소리"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 12b7f18c5..5ba4ddeba 100644 --- a/java/com/android/voicemail/impl/res/values-ky/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ky/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Үн почтасы (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Үн почтасы"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Дирилдөө"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Дирилдөө"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Үн"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 f4f45e592..ef9cecc8d 100644 --- a/java/com/android/voicemail/impl/res/values-lo/strings.xml +++ b/java/com/android/voicemail/impl/res/values-lo/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"ຂໍ້ຄວາມສຽງ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"ຂໍ້ຄວາມສຽງ"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"ສັ່ນເຕືອນ"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"ສັ່ນເຕືອນ"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ສຽງ"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 59a15f452..31dba2e5f 100644 --- a/java/com/android/voicemail/impl/res/values-lt/strings.xml +++ b/java/com/android/voicemail/impl/res/values-lt/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Balso paštas (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Balso paštas"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibruoti"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibravimas"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Garsas"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 0b8b2f92a..d8230d9ec 100644 --- a/java/com/android/voicemail/impl/res/values-lv/strings.xml +++ b/java/com/android/voicemail/impl/res/values-lv/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Balss pasts (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Balss pasts"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrācija"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrācija"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Signāls"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 90c2f6cb2..375b79a7f 100644 --- a/java/com/android/voicemail/impl/res/values-mk/strings.xml +++ b/java/com/android/voicemail/impl/res/values-mk/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Говорна пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Говорна пошта"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Вибрации"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Вибрации"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Звук"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 d7fd31f1e..d21d8bed9 100644 --- a/java/com/android/voicemail/impl/res/values-ml/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ml/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"വോയ്സ്മെയിൽ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"വോയ്സ്മെയിൽ"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"വൈബ്രേറ്റുചെയ്യുക"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"വൈബ്രേറ്റുചെയ്യുക"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ശബ്ദം"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 5f726342f..56cffa9e0 100644 --- a/java/com/android/voicemail/impl/res/values-mn/strings.xml +++ b/java/com/android/voicemail/impl/res/values-mn/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Дуут шуудан (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Дуут шуудан"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Чичиргээ"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Чичиргээ"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Дуу"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 e8c546ce6..407909876 100644 --- a/java/com/android/voicemail/impl/res/values-mr/strings.xml +++ b/java/com/android/voicemail/impl/res/values-mr/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"व्हॉइसमेल (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"व्हॉइसमेल"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"कंपन करा"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"कंपन करा"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ध्वनी"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 4468d49d7..91fa3051e 100644 --- a/java/com/android/voicemail/impl/res/values-ms/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ms/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Mel suara (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Mel suara"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Bergetar"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Bergetar"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Bunyi"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 41e88351d..8144c1f49 100644 --- a/java/com/android/voicemail/impl/res/values-my/strings.xml +++ b/java/com/android/voicemail/impl/res/values-my/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"အသံမေးလ် (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"အသံမေးလ်"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"တုန်ခါမှု"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"တုန်ခါမှု"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"အသံ"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 afbdd3bb8..b13be25c4 100644 --- a/java/com/android/voicemail/impl/res/values-nb/strings.xml +++ b/java/com/android/voicemail/impl/res/values-nb/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Talepostkasse (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Talepost"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrering"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrering"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Lyd"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 a186535b5..360164eb5 100644 --- a/java/com/android/voicemail/impl/res/values-ne/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ne/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"भ्वाइस मेल (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"भ्वाइस मेल"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"कम्पन"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"कम्पन"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"आवाज"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 ed66ab303..88fc0f63f 100644 --- a/java/com/android/voicemail/impl/res/values-nl/strings.xml +++ b/java/com/android/voicemail/impl/res/values-nl/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Voicemail"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Trillen"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Trillen"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Geluid"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 afbdd3bb8..b13be25c4 100644 --- a/java/com/android/voicemail/impl/res/values-no/strings.xml +++ b/java/com/android/voicemail/impl/res/values-no/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Talepostkasse (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Talepost"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrering"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrering"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Lyd"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 ec68867c6..b7711b903 100644 --- a/java/com/android/voicemail/impl/res/values-pa/strings.xml +++ b/java/com/android/voicemail/impl/res/values-pa/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"ਵੌਇਸਮੇਲ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"ਵੌਇਸਮੇਲ"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"ਵਾਈਬ੍ਰੇਟ ਕਰੋ"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"ਵਾਈਬ੍ਰੇਟ ਕਰੋ"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ਧੁਨੀ"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 25b891475..d240f7dbc 100644 --- a/java/com/android/voicemail/impl/res/values-pl/strings.xml +++ b/java/com/android/voicemail/impl/res/values-pl/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Poczta głosowa (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Poczta głosowa"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Wibracje"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Wibracje"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Dźwięk"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 c93402e36..501924a35 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Correio de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Correio de voz"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibração"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibração"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Som"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 00ed0331b..d443329bb 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Correio de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Correio de voz"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrar"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrar"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Som"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 c93402e36..501924a35 100644 --- a/java/com/android/voicemail/impl/res/values-pt/strings.xml +++ b/java/com/android/voicemail/impl/res/values-pt/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Correio de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Correio de voz"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibração"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibração"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Som"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 9099065c1..44bfd0d81 100644 --- a/java/com/android/voicemail/impl/res/values-ro/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ro/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Mesagerie vocală (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Mesagerie vocală"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrații"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrații"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Sunet"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 322b41bfb..b0512f842 100644 --- a/java/com/android/voicemail/impl/res/values-ru/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ru/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Голосовая почта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Голосовая почта"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Вибросигнал"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Вибросигнал"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Звук"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 8ad6f87e6..ff16e6173 100644 --- a/java/com/android/voicemail/impl/res/values-si/strings.xml +++ b/java/com/android/voicemail/impl/res/values-si/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"හඬ තැපෑල (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"හඬ තැපෑල"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"කම්පනය"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"කම්පනය කරන්න"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"හඬ"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 80252d454..a824ca83f 100644 --- a/java/com/android/voicemail/impl/res/values-sk/strings.xml +++ b/java/com/android/voicemail/impl/res/values-sk/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Hlasová schránka <xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Hlasová schránka"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrovať"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrovať"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Zvuk"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 b634d156a..6ad9569e7 100644 --- a/java/com/android/voicemail/impl/res/values-sl/strings.xml +++ b/java/com/android/voicemail/impl/res/values-sl/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Sporočilo v odzivniku (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Sporočilo v odzivniku"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibriranje"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibriranje"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Zvok"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 59db0fd74..b9dfad9a4 100644 --- a/java/com/android/voicemail/impl/res/values-sq/strings.xml +++ b/java/com/android/voicemail/impl/res/values-sq/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Posta zanore (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Posta zanore"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Dridhje"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Dridhje"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Tingulli"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 d4998ed2e..3608263e2 100644 --- a/java/com/android/voicemail/impl/res/values-sr/strings.xml +++ b/java/com/android/voicemail/impl/res/values-sr/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Говорна пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Говорна пошта"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Вибрација"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Вибрација"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Звук"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 c69a2df5f..6818b3977 100644 --- a/java/com/android/voicemail/impl/res/values-sv/strings.xml +++ b/java/com/android/voicemail/impl/res/values-sv/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Röstbrevlåda (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Röstbrevlåda"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Vibrera"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Vibrera"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Ljud"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 d1cccc78c..b08db9a41 100644 --- a/java/com/android/voicemail/impl/res/values-sw/strings.xml +++ b/java/com/android/voicemail/impl/res/values-sw/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Ujumbe wa sauti (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Ujumbe wa sauti"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Mtetemo"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Tetema"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Mlio"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 0c3c454e1..f240cdd14 100644 --- a/java/com/android/voicemail/impl/res/values-ta/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ta/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"குரலஞ்சல் (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"குரலஞ்சல்"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"அதிர்வுறுதல்"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"அதிர்வுறு"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ஒலி"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 7a865f43f..038ed98f1 100644 --- a/java/com/android/voicemail/impl/res/values-te/strings.xml +++ b/java/com/android/voicemail/impl/res/values-te/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"వాయిస్ మెయిల్ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"వాయిస్ మెయిల్"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"వైబ్రేషన్"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"వైబ్రేషన్"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"ధ్వని"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 68b32fb45..d4f527020 100644 --- a/java/com/android/voicemail/impl/res/values-th/strings.xml +++ b/java/com/android/voicemail/impl/res/values-th/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"ข้อความเสียง (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"ข้อความเสียง"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"สั่น"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"สั่น"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"เสียง"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 c14919c03..184f27edb 100644 --- a/java/com/android/voicemail/impl/res/values-tl/strings.xml +++ b/java/com/android/voicemail/impl/res/values-tl/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Voicemail"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"I-vibrate"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"I-vibrate"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Tunog"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 e8f9336f3..2b36fba34 100644 --- a/java/com/android/voicemail/impl/res/values-tr/strings.xml +++ b/java/com/android/voicemail/impl/res/values-tr/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Sesli mesaj (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Sesli mesaj"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Titreşim"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Titreşim"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Ses"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 760177ca4..5e4ab77c0 100644 --- a/java/com/android/voicemail/impl/res/values-uk/strings.xml +++ b/java/com/android/voicemail/impl/res/values-uk/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Голосова пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Голосова пошта"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Вібросигнал"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Вібросигнал"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Звук"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 2105fae08..ae6e98def 100644 --- a/java/com/android/voicemail/impl/res/values-ur/strings.xml +++ b/java/com/android/voicemail/impl/res/values-ur/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"صوتی میل (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"صوتی میل"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"ارتعاش"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"ارتعاش"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"آواز"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 fad79164d..f458aee7b 100644 --- a/java/com/android/voicemail/impl/res/values-uz/strings.xml +++ b/java/com/android/voicemail/impl/res/values-uz/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Ovozli pochta (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Ovozli pochta"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Tebranish"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Tebranish"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Ovoz"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 1d029ea12..c0bfa8183 100644 --- a/java/com/android/voicemail/impl/res/values-vi/strings.xml +++ b/java/com/android/voicemail/impl/res/values-vi/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Thư thoại <xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Thư thoại"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Rung"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Rung"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Âm báo"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 d70f1fa51..66b058b1f 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"语音邮件(<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"语音邮件"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"振动"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"振动"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"提示音"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 4adc3fd97..d76068790 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"留言 (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"留言"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"震動"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"震動"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"音效"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 6ff084f60..2b4de45d9 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 @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"語音信箱 (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"語音信箱"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"震動"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"震動"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"音效"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> 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 5adf300e5..1debac61b 100644 --- a/java/com/android/voicemail/impl/res/values-zu/strings.xml +++ b/java/com/android/voicemail/impl/res/values-zu/strings.xml @@ -18,9 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="voicemail_settings_with_label" msgid="563926539137546586">"Ivoyisimeyili (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string> <string name="voicemail_settings_title" msgid="6685263321755930738">"Ivoyisimeyili"</string> - <string name="voicemail_notification_vibrate_when_title" msgid="1017489970564669402">"Dlidlizela"</string> - <string name="voicemail_notification_vibarte_when_dialog_title" msgid="913495075516305202">"Dlidlizela"</string> - <string name="voicemail_notification_ringtone_title" msgid="7516921280035140960">"Umsindo"</string> + <!-- no translation found for voicemail_notifications_preference_title (3490553930230492405) --> + <skip /> <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> diff --git a/java/com/android/voicemail/impl/res/values/strings.xml b/java/com/android/voicemail/impl/res/values/strings.xml index bb754d18b..375a1e9ba 100644 --- a/java/com/android/voicemail/impl/res/values/strings.xml +++ b/java/com/android/voicemail/impl/res/values/strings.xml @@ -23,19 +23,12 @@ <string name="voicemail_settings_title">Voicemail</string> <!-- DO NOT TRANSLATE. Internal key for a voicemail notification preference. --> - <string name="voicemail_notification_ringtone_key" translatable="false">voicemail_notification_ringtone_key</string> - <!-- DO NOT TRANSLATE. Internal key for a voicemail notification preference. --> - <string name="voicemail_notification_vibrate_key" translatable="false">voicemail_notification_vibrate_key</string> - - <!-- Title for the vibration settings for voicemail notifications [CHAR LIMIT=40] --> - <string name="voicemail_notification_vibrate_when_title">Vibrate</string> - <!-- Dialog title for the vibration settings for voice mail notifications [CHAR LIMIT=40]--> - <string name="voicemail_notification_vibarte_when_dialog_title">Vibrate</string> + <string name="voicemail_notifications_key" translatable="false">voicemail_notification_key</string> - <!-- Voicemail ringtone title. The user clicks on this preference to select - which sound to play when a voicemail notification is received. + <!-- Voicemail notifications title. The user clicks on this preference to select + which sound to play and whether to vibrate when a voicemail notification is received. [CHAR LIMIT=30] --> - <string name="voicemail_notification_ringtone_title">Sound</string> + <string name="voicemail_notifications_preference_title">Notifications</string> <string name="voicemail_advanced_settings_key" translatable="false">voicemail_advanced_settings_key</string> <!-- Title for advanced settings in the voicemail settings --> diff --git a/java/com/android/voicemail/impl/res/xml/voicemail_settings.xml b/java/com/android/voicemail/impl/res/xml/voicemail_settings.xml index 53fd57f7e..50510905c 100644 --- a/java/com/android/voicemail/impl/res/xml/voicemail_settings.xml +++ b/java/com/android/voicemail/impl/res/xml/voicemail_settings.xml @@ -17,16 +17,9 @@ <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/voicemail_settings_title"> - <com.android.voicemail.impl.settings.VoicemailRingtonePreference - android:key="@string/voicemail_notification_ringtone_key" - android:title="@string/voicemail_notification_ringtone_title" - android:persistent="false" - android:ringtoneType="notification" /> - - <CheckBoxPreference - android:key="@string/voicemail_notification_vibrate_key" - android:title="@string/voicemail_notification_vibrate_when_title" - android:persistent="true" /> + <Preference + android:key="@string/voicemail_notifications_key" + android:title="@string/voicemail_notifications_preference_title"/> <SwitchPreference android:key="@string/voicemail_visual_voicemail_key" diff --git a/java/com/android/voicemail/impl/res/xml/vvm_config.xml b/java/com/android/voicemail/impl/res/xml/vvm_config.xml index 230d40f90..daba3d511 100644 --- a/java/com/android/voicemail/impl/res/xml/vvm_config.xml +++ b/java/com/android/voicemail/impl/res/xml/vvm_config.xml @@ -23,6 +23,30 @@ </pbundle_as_map> <pbundle_as_map> + <!-- Orange Belgium --> + <string name="feature_flag_name">vvm_carrier_flag_20610</string> + <string-array name="mccmnc"> + <item value="20610"/> + </string-array> + + <int + name="vvm_port_number_int" + value="0"/> + <string name="vvm_destination_number_string">8082</string> + <string-array name="carrier_vvm_package_name_string_array"> + <item value="com.orange.vvm"/> + </string-array> + <string name="vvm_type_string">vvm_type_omtp</string> + <boolean + name="vvm_cellular_data_required_bool" + value="true"/> + <string-array name="vvm_disabled_capabilities_string_array"> + <!-- b/32365569 --> + <item value="STARTTLS"/> + </string-array> + </pbundle_as_map> + + <pbundle_as_map> <!-- Orange France --> <string-array name="mccmnc"> <item value="20801"/> @@ -47,6 +71,30 @@ </pbundle_as_map> <pbundle_as_map> + <!-- Orange Luxembourg --> + <string name="feature_flag_name">vvm_carrier_flag_20610</string> + <string-array name="mccmnc"> + <item value="27099"/> + </string-array> + + <int + name="vvm_port_number_int" + value="0"/> + <string name="vvm_destination_number_string">64085</string> + <string-array name="carrier_vvm_package_name_string_array"> + <item value="com.orange.vvm"/> + </string-array> + <string name="vvm_type_string">vvm_type_omtp</string> + <boolean + name="vvm_cellular_data_required_bool" + value="true"/> + <string-array name="vvm_disabled_capabilities_string_array"> + <!-- b/32365569 --> + <item value="STARTTLS"/> + </string-array> + </pbundle_as_map> + + <pbundle_as_map> <!-- T-Mobile USA--> <string-array name="mccmnc"> <item value="310160"/> @@ -86,6 +134,22 @@ </pbundle_as_map> <pbundle_as_map> + <!-- Telus Canada --> + <string name="feature_flag_name">vvm_carrier_flag_302220</string> + <string-array name="mccmnc"> + <item value="302220"/> + </string-array> + <int + name="vvm_port_number_int" + value="5499"/> + <string name="vvm_destination_number_string">7723</string> + <string name="vvm_type_string">vvm_type_omtp</string> + <boolean + name="vvm_cellular_data_required_bool" + value="true"/> + </pbundle_as_map> + + <pbundle_as_map> <!-- Verizon USA --> <string-array name="mccmnc"> <item value="310004"/> diff --git a/java/com/android/voicemail/impl/scheduling/BaseTask.java b/java/com/android/voicemail/impl/scheduling/BaseTask.java index 0144e346f..bbdca8c88 100644 --- a/java/com/android/voicemail/impl/scheduling/BaseTask.java +++ b/java/com/android/voicemail/impl/scheduling/BaseTask.java @@ -133,7 +133,7 @@ public abstract class BaseTask implements Task { } /** - * Creates an intent that can be used to start the {@link TaskSchedulerService}. Derived class + * Creates an intent that can be used to be broadcast to the {@link TaskReceiver}. Derived class * should build their intent upon this. */ public static Intent createIntent( diff --git a/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java b/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java index 76fba4fb0..342b56e8a 100644 --- a/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java +++ b/java/com/android/voicemail/impl/scheduling/MinimalIntervalPolicy.java @@ -51,7 +51,7 @@ public class MinimalIntervalPolicy implements Policy { 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); + mTask.getContext().sendBroadcast(intent); } } diff --git a/java/com/android/voicemail/impl/scheduling/RetryPolicy.java b/java/com/android/voicemail/impl/scheduling/RetryPolicy.java index b8703ea15..c408bdc4a 100644 --- a/java/com/android/voicemail/impl/scheduling/RetryPolicy.java +++ b/java/com/android/voicemail/impl/scheduling/RetryPolicy.java @@ -99,7 +99,7 @@ public class RetryPolicy implements Policy { Intent intent = mTask.createRestartIntent(); intent.putExtra(EXTRA_RETRY_COUNT, mRetryCount + 1); - mTask.getContext().startService(intent); + mTask.getContext().sendBroadcast(intent); } @Override diff --git a/java/com/android/voicemail/impl/scheduling/Task.java b/java/com/android/voicemail/impl/scheduling/Task.java index 447a9db7b..484a6262e 100644 --- a/java/com/android/voicemail/impl/scheduling/Task.java +++ b/java/com/android/voicemail/impl/scheduling/Task.java @@ -24,8 +24,8 @@ import android.telecom.PhoneAccountHandle; import java.util.Objects; /** - * 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 + * A task for {@link TaskExecutor} 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. * @@ -112,8 +112,8 @@ public interface Task { /** * @return number of milliSeconds the scheduler should wait before running this task. A value less - * than {@link TaskSchedulerService#READY_TOLERANCE_MILLISECONDS} will be considered ready. If - * no tasks are ready, the scheduler will sleep for this amount of time before doing another + * than {@link TaskExecutor#READY_TOLERANCE_MILLISECONDS} will be considered ready. If no + * tasks are ready, the scheduler will sleep for this amount of time before doing another * check (it will still wake if a new task is added). The first task in the queue that is * ready will be executed. */ diff --git a/java/com/android/voicemail/impl/scheduling/TaskExecutor.java b/java/com/android/voicemail/impl/scheduling/TaskExecutor.java new file mode 100644 index 000000000..e3b718e50 --- /dev/null +++ b/java/com/android/voicemail/impl/scheduling/TaskExecutor.java @@ -0,0 +1,462 @@ +/* + * 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.content.Context; +import android.content.Intent; +import android.os.Build.VERSION_CODES; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.support.annotation.MainThread; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +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.TaskQueue.NextTask; +import java.util.List; + +/** + * A singleton to queue and run {@link Task} with the {@link android.app.job.JobScheduler}. A task + * is queued by sending a broadcast to {@link TaskReceiver}. The intent should contain enough + * information in {@link Intent#getExtras()} to construct the task (see {@link + * Tasks#createIntent(Context, Class)}). + * + * <p>The executor will only exist when {@link TaskSchedulerJobService} is running. + * + * <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 + * #finishJobAsync()}. 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 executor will be started when {@link TaskSchedulerJobService} is running, and stopped when + * there are no more tasks in the queue or when the executor is put to sleep. + * + * <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> + */ +@TargetApi(VERSION_CODES.O) +final class TaskExecutor { + + /** + * An entity that holds execution resources for the {@link TaskExecutor} to run, usually a {@link + * android.app.job.JobService}. + */ + interface Job { + + /** + * Signals to Job to end and release its' resources. This is an asynchronous call and may not + * take effect immediately. + */ + @MainThread + void finishAsync(); + + /** Whether the call to {@link #finishAsync()} has actually taken effect. */ + @MainThread + boolean isFinished(); + } + + private static final String TAG = "VvmTaskExecutor"; + + private static final int READY_TOLERANCE_MILLISECONDS = 100; + + /** + * 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 the job and use {@link Handler#postDelayed(Runnable, long)} to + * wait for the next task. + * + * <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 = 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, + * especially the ones submitted in {@link Task#onCompleted()}. Wait for a while before stopping + * the service to make sure there are no pending messages. + */ + private static final int STOP_DELAY_MILLISECONDS = 5_000; + + /** Interval between polling of whether the job is finished. */ + private static final int TERMINATE_POLLING_INTERVAL_MILLISECONDS = 1_000; + + // The thread to run tasks on + private final WorkerThreadHandler workerThreadHandler; + + private static TaskExecutor instance; + + /** + * Used by tests to turn task handling into a single threaded process by calling {@link + * Handler#handleMessage(Message)} directly + */ + private MessageSender messageSender = new MessageSender(); + + private final MainThreadHandler mainThreadHandler; + + private final Context context; + + /** Main thread only, access through {@link #getTasks()} */ + private final TaskQueue tasks = new TaskQueue(); + + private boolean isWorkerThreadBusy = false; + + private boolean isTerminating = false; + + private Job job; + + private final Runnable stopServiceWithDelay = + new Runnable() { + @MainThread + @Override + public void run() { + VvmLog.i(TAG, "Stopping service"); + if (!isJobRunning() || isTerminating()) { + VvmLog.e(TAG, "Service already stopped"); + return; + } + scheduleJobAndTerminate(0, true); + } + }; + + /** + * Reschedule the {@link TaskSchedulerJobService} and terminate the executor when the {@link Job} + * is truly finished. If the job is still not finished, this runnable will requeue itself on the + * main thread. The requeue is only expected to happen a few times. + */ + private class JobFinishedPoller implements Runnable { + + private final long delayMillis; + private final boolean isNewJob; + private int invocationCounter = 0; + + JobFinishedPoller(long delayMillis, boolean isNewJob) { + this.delayMillis = delayMillis; + this.isNewJob = isNewJob; + } + + @Override + public void run() { + // The job should be finished relatively quickly. Assert to make sure this assumption is true. + Assert.isTrue(invocationCounter < 10); + invocationCounter++; + if (job.isFinished()) { + VvmLog.i("JobFinishedPoller.run", "Job finished"); + if (!getTasks().isEmpty()) { + TaskSchedulerJobService.scheduleJob( + context, serializePendingTasks(), delayMillis, isNewJob); + tasks.clear(); + } + terminate(); + return; + } + VvmLog.w("JobFinishedPoller.run", "Job still running"); + mainThreadHandler.postDelayed(this, TERMINATE_POLLING_INTERVAL_MILLISECONDS); + } + }; + + /** Should attempt to run the next task when a task has finished or been added. */ + private boolean taskAutoRunDisabledForTesting = false; + + /** Handles execution of the background task in teh worker thread. */ + @VisibleForTesting + final class WorkerThreadHandler extends Handler { + + public WorkerThreadHandler(Looper looper) { + super(looper); + } + @Override + @WorkerThread + public void handleMessage(Message msg) { + Assert.isNotMainThread(); + Task task = (Task) msg.obj; + try { + VvmLog.i(TAG, "executing task " + task); + task.onExecuteInBackgroundThread(); + } catch (Throwable throwable) { + VvmLog.e(TAG, "Exception while executing task " + task + ":", throwable); + } + + Message schedulerMessage = mainThreadHandler.obtainMessage(); + schedulerMessage.obj = task; + messageSender.send(schedulerMessage); + } + } + + /** Handles completion of the background task in the main thread. */ + @VisibleForTesting + final class MainThreadHandler extends Handler { + + public MainThreadHandler(Looper looper) { + super(looper); + } + + @Override + @MainThread + public void handleMessage(Message msg) { + Assert.isMainThread(); + Task task = (Task) msg.obj; + getTasks().remove(task); + task.onCompleted(); + isWorkerThreadBusy = false; + if (!isJobRunning() || isTerminating()) { + // TaskExecutor was terminated when the task is running in background, don't need to run the + // next task or terminate again + return; + } + maybeRunNextTask(); + } + } + + /** Starts a new TaskExecutor. May only be called by {@link TaskSchedulerJobService}. */ + @MainThread + static void createRunningInstance(Context context) { + Assert.isMainThread(); + Assert.isTrue(instance == null); + instance = new TaskExecutor(context); + } + + /** @return the currently running instance, or {@code null} if the executor is not running. */ + @MainThread + @Nullable + static TaskExecutor getRunningInstance() { + return instance; + } + + private TaskExecutor(Context context) { + this.context = context; + HandlerThread thread = new HandlerThread("VvmTaskExecutor"); + thread.start(); + + workerThreadHandler = new WorkerThreadHandler(thread.getLooper()); + mainThreadHandler = new MainThreadHandler(Looper.getMainLooper()); + } + + @VisibleForTesting + void terminate() { + VvmLog.i(TAG, "terminated"); + Assert.isMainThread(); + job = null; + workerThreadHandler.getLooper().quit(); + instance = null; + TaskReceiver.resendDeferredBroadcasts(context); + } + + @MainThread + void addTask(Task task) { + Assert.isMainThread(); + getTasks().add(task); + VvmLog.i(TAG, task + " added"); + mainThreadHandler.removeCallbacks(stopServiceWithDelay); + maybeRunNextTask(); + } + + @MainThread + @VisibleForTesting + TaskQueue getTasks() { + Assert.isMainThread(); + return tasks; + } + + @MainThread + private void maybeRunNextTask() { + Assert.isMainThread(); + + if (isWorkerThreadBusy) { + return; + } + if (taskAutoRunDisabledForTesting) { + // If taskAutoRunDisabledForTesting is true, runNextTask() must be explicitly called + // to run the next task. + return; + } + + runNextTask(); + } + + @VisibleForTesting + @MainThread + void runNextTask() { + Assert.isMainThread(); + if (getTasks().isEmpty()) { + prepareStop(); + return; + } + NextTask nextTask = getTasks().getNextTask(READY_TOLERANCE_MILLISECONDS); + + if (nextTask.task != null) { + nextTask.task.onBeforeExecute(); + Message message = workerThreadHandler.obtainMessage(); + message.obj = nextTask.task; + isWorkerThreadBusy = true; + messageSender.send(message); + return; + } + VvmLog.i(TAG, "minimal wait time:" + nextTask.minimalWaitTimeMillis); + if (!taskAutoRunDisabledForTesting && 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(nextTask.minimalWaitTimeMillis); + } + } + + @MainThread + private void sleep(long timeMillis) { + VvmLog.i(TAG, "sleep for " + timeMillis + " millis"); + if (timeMillis < SHORT_SLEEP_THRESHOLD_MILLISECONDS) { + mainThreadHandler.postDelayed( + new Runnable() { + @Override + public void run() { + maybeRunNextTask(); + } + }, + timeMillis); + return; + } + scheduleJobAndTerminate(timeMillis, false); + } + + private List<Bundle> serializePendingTasks() { + return getTasks().toBundles(); + } + + private void prepareStop() { + VvmLog.i( + TAG, + "no more tasks, stopping service if no task are added in " + + STOP_DELAY_MILLISECONDS + + " millis"); + mainThreadHandler.postDelayed(stopServiceWithDelay, STOP_DELAY_MILLISECONDS); + } + + @NeededForTesting + static class MessageSender { + + public void send(Message message) { + message.sendToTarget(); + } + } + + @NeededForTesting + void setTaskAutoRunDisabledForTest(boolean value) { + taskAutoRunDisabledForTesting = value; + } + + @NeededForTesting + void setMessageSenderForTest(MessageSender sender) { + messageSender = sender; + } + + /** + * 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"); + this.job = job; + tasks.fromBundles(context, 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() && !isTerminating()) { + scheduleJobAndTerminate(0, true); + } + } + + /** + * Send all pending tasks and schedule a new {@link TaskSchedulerJobService}. The current executor + * will start the termination process, but restarted when the scheduled job runs in the future. + * + * @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 + @VisibleForTesting + void scheduleJobAndTerminate(long delayMillis, boolean isNewJob) { + Assert.isMainThread(); + finishJobAsync(); + mainThreadHandler.post(new JobFinishedPoller(delayMillis, isNewJob)); + } + + /** + * Whether the TaskExecutor is still terminating. {@link TaskReceiver} should defer all new task + * until {@link #getRunningInstance()} returns {@code null} so a new job can be started. {@link + * #scheduleJobAndTerminate(long, boolean)} does not run immediately because the job can only be + * scheduled after the main thread has returned. The TaskExecutor will be in a intermediate state + * between scheduleJobAndTerminate() and terminate(). In this state, {@link #getRunningInstance()} + * returns non-null because it has not been fully stopped yet, but the TaskExecutor cannot do + * anything. A new job should not be scheduled either because the current job might still be + * running. + */ + @MainThread + public boolean isTerminating() { + return isTerminating; + } + + /** + * 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 finishJobAsync() { + Assert.isTrue(!isTerminating()); + Assert.isMainThread(); + VvmLog.i(TAG, "finishing Job"); + job.finishAsync(); + isTerminating = true; + mainThreadHandler.removeCallbacks(stopServiceWithDelay); + } + + private boolean isJobRunning() { + return job != null; + } +} diff --git a/java/com/android/voicemail/impl/scheduling/TaskReceiver.java b/java/com/android/voicemail/impl/scheduling/TaskReceiver.java new file mode 100644 index 000000000..e78dcf72c --- /dev/null +++ b/java/com/android/voicemail/impl/scheduling/TaskReceiver.java @@ -0,0 +1,81 @@ +/* + * 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.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Build.VERSION_CODES; +import android.os.Bundle; +import com.android.voicemail.impl.VvmLog; +import java.util.ArrayList; +import java.util.List; + +/** + * BroadcastReceiver to queue and run {@link Task} with the {@link android.app.job.JobScheduler}. A + * task is queued using a explicit broadcast to this receiver. The intent should contain enough + * information in {@link Intent#getExtras()} to construct the task (see {@link + * Tasks#createIntent(Context, Class)}). The task will be queued directly in {@link TaskExecutor} if + * it is already running, or in {@link TaskSchedulerJobService} if not. + */ +@TargetApi(VERSION_CODES.O) +public class TaskReceiver extends BroadcastReceiver { + + private static final String TAG = "VvmTaskReceiver"; + + private static final List<Intent> deferredBroadcasts = new ArrayList<>(); + + /** + * When {@link TaskExecutor#isTerminating()} is {@code true}, newly added tasks will be deferred + * to allow the TaskExecutor to terminate properly. After termination is completed this should be + * called to add the tasks again. + */ + public static void resendDeferredBroadcasts(Context context) { + for (Intent intent : deferredBroadcasts) { + context.sendBroadcast(intent); + } + deferredBroadcasts.clear(); + } + + @Override + public void onReceive(Context context, Intent intent) { + if (intent == null) { + VvmLog.w(TAG, "null intent received"); + return; + } + VvmLog.i(TAG, "task received"); + TaskExecutor taskExecutor = TaskExecutor.getRunningInstance(); + if (taskExecutor != null) { + VvmLog.i(TAG, "TaskExecutor already running"); + if (taskExecutor.isTerminating()) { + // The current taskExecutor and cannot do anything and a new job cannot be scheduled. Defer + // the task until a new job can be scheduled. + VvmLog.w(TAG, "TaskExecutor is terminating, bouncing task"); + deferredBroadcasts.add(intent); + return; + } + Task task = Tasks.createTask(context.getApplicationContext(), intent.getExtras()); + taskExecutor.addTask(task); + } else { + VvmLog.i(TAG, "scheduling new job"); + List<Bundle> taskList = new ArrayList<>(); + taskList.add(intent.getExtras()); + TaskSchedulerJobService.scheduleJob(context.getApplicationContext(), taskList, 0, true); + } + } +} diff --git a/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java b/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java index eab410eb0..107234edc 100644 --- a/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java +++ b/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java @@ -23,12 +23,11 @@ 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.content.SharedPreferences; import android.os.Build.VERSION_CODES; import android.os.Bundle; -import android.os.IBinder; import android.os.Parcelable; +import android.preference.PreferenceManager; import android.support.annotation.MainThread; import com.android.dialer.constants.ScheduledJobIds; import com.android.voicemail.impl.Assert; @@ -36,59 +35,59 @@ 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}. - */ +/** A {@link JobService} that will trigger the background execution of {@link TaskExecutor}. */ @TargetApi(VERSION_CODES.O) -public class TaskSchedulerJobService extends JobService implements TaskSchedulerService.Job { +public class TaskSchedulerJobService extends JobService implements TaskExecutor.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))); - } + private static final String EXTRA_JOB_ID = "extra_job_id"; - @Override - public void onServiceDisconnected(ComponentName unused) { - // local service, process should always be killed together. - Assert.fail(); - } - }; + private static final String EXPECTED_JOB_ID = + "com.android.voicemail.impl.scheduling.TaskSchedulerJobService.EXPECTED_JOB_ID"; + + private static final String NEXT_JOB_ID = + "com.android.voicemail.impl.scheduling.TaskSchedulerJobService.NEXT_JOB_ID"; + + private JobParameters jobParameters; @Override @MainThread public boolean onStartJob(JobParameters params) { + int jobId = params.getTransientExtras().getInt(EXTRA_JOB_ID); + int expectedJobId = + PreferenceManager.getDefaultSharedPreferences(this).getInt(EXPECTED_JOB_ID, 0); + if (jobId != expectedJobId) { + VvmLog.e( + TAG, "Job " + jobId + " is not the last scheduled job " + expectedJobId + ", ignoring"); + return false; // nothing more to do. Job not running in background. + } + VvmLog.i(TAG, "starting " + jobId); jobParameters = params; - bindService( - new Intent(this, TaskSchedulerService.class), mConnection, Context.BIND_AUTO_CREATE); + TaskExecutor.createRunningInstance(this); + TaskExecutor.getRunningInstance() + .onStartJob( + this, + getBundleList( + jobParameters.getTransientExtras().getParcelableArray(EXTRA_TASK_EXTRAS_ARRAY))); return true /* job still running in background */; } @Override @MainThread public boolean onStopJob(JobParameters params) { - scheduler.onStopJob(); + TaskExecutor.getRunningInstance().onStopJob(); jobParameters = null; - return false /* don't reschedule. TaskScheduler service will post a new job */; + return false /* don't reschedule. TaskExecutor 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. + * appended to the back of the queue and the job will be rescheduled. A job may only be scheduled + * when the {@link TaskExecutor} is not running ({@link TaskExecutor#getRunningInstance()} + * returning {@code null}) * * @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. @@ -117,6 +116,13 @@ public class TaskSchedulerJobService extends JobService implements TaskScheduler jobScheduler.cancel(ScheduledJobIds.VVM_TASK_SCHEDULER_JOB); } Bundle extras = new Bundle(); + int jobId = createJobId(context); + extras.putInt(EXTRA_JOB_ID, jobId); + PreferenceManager.getDefaultSharedPreferences(context) + .edit() + .putInt(EXPECTED_JOB_ID, jobId) + .apply(); + extras.putParcelableArray( EXTRA_TASK_EXTRAS_ARRAY, pendingTasks.toArray(new Bundle[pendingTasks.size()])); JobInfo.Builder builder = @@ -132,7 +138,7 @@ public class TaskSchedulerJobService extends JobService implements TaskScheduler VvmLog.i(TAG, "running job instantly."); } jobScheduler.schedule(builder.build()); - VvmLog.i(TAG, "job scheduled"); + VvmLog.i(TAG, "job " + jobId + " scheduled"); } /** @@ -141,11 +147,19 @@ public class TaskSchedulerJobService extends JobService implements TaskScheduler * the wakelock */ @Override - public void finish() { - VvmLog.i(TAG, "finishing job and unbinding TaskSchedulerService"); + public void finishAsync() { + VvmLog.i(TAG, "finishing job"); jobFinished(jobParameters, false); jobParameters = null; - unbindService(mConnection); + } + + @MainThread + @Override + public boolean isFinished() { + Assert.isMainThread(); + return getSystemService(JobScheduler.class) + .getPendingJob(ScheduledJobIds.VVM_TASK_SCHEDULER_JOB) + == null; } private static List<Bundle> getBundleList(Parcelable[] parcelables) { @@ -155,4 +169,11 @@ public class TaskSchedulerJobService extends JobService implements TaskScheduler } return result; } + + private static int createJobId(Context context) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + int jobId = sharedPreferences.getInt(NEXT_JOB_ID, 0); + sharedPreferences.edit().putInt(NEXT_JOB_ID, jobId + 1).apply(); + return jobId; + } } diff --git a/java/com/android/voicemail/impl/scheduling/Tasks.java b/java/com/android/voicemail/impl/scheduling/Tasks.java index 34debaf29..76da3d7f6 100644 --- a/java/com/android/voicemail/impl/scheduling/Tasks.java +++ b/java/com/android/voicemail/impl/scheduling/Tasks.java @@ -19,6 +19,7 @@ package com.android.voicemail.impl.scheduling; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.annotation.NonNull; import com.android.voicemail.impl.VvmLog; /** Common operations on {@link Task} */ @@ -32,6 +33,7 @@ final class Tasks { * 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} */ + @NonNull public static Task createTask(Context context, Bundle extras) { // The extra contains custom parcelables which cannot be unmarshalled by the framework class // loader. @@ -66,7 +68,8 @@ final class Tasks { * necessary information. */ public static Intent createIntent(Context context, Class<? extends Task> task) { - Intent intent = new Intent(context, TaskSchedulerService.class); + Intent intent = new Intent(context, TaskReceiver.class); + intent.setPackage(context.getPackageName()); intent.putExtra(EXTRA_CLASS_NAME, task.getName()); return intent; } diff --git a/java/com/android/voicemail/impl/settings/VoicemailSettingsFragment.java b/java/com/android/voicemail/impl/settings/VoicemailSettingsFragment.java index 423fd11b4..ac5f3cac9 100644 --- a/java/com/android/voicemail/impl/settings/VoicemailSettingsFragment.java +++ b/java/com/android/voicemail/impl/settings/VoicemailSettingsFragment.java @@ -17,7 +17,6 @@ import android.annotation.TargetApi; import android.content.Intent; import android.os.Build.VERSION_CODES; import android.os.Bundle; -import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; @@ -29,6 +28,8 @@ 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.notification.NotificationChannelManager; +import com.android.dialer.notification.NotificationChannelManager.Channel; import com.android.voicemail.VoicemailClient; import com.android.voicemail.VoicemailComponent; import com.android.voicemail.impl.OmtpVvmCarrierConfigHelper; @@ -43,7 +44,6 @@ import com.android.voicemail.impl.sync.VvmAccountManager; @TargetApi(VERSION_CODES.O) public class VoicemailSettingsFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener, - VoicemailRingtonePreference.VoicemailRingtoneNameChangeListener, VvmAccountManager.Listener { private static final String TAG = "VmSettingsActivity"; @@ -51,17 +51,12 @@ public class VoicemailSettingsFragment extends PreferenceFragment @Nullable private PhoneAccountHandle phoneAccountHandle; private OmtpVvmCarrierConfigHelper omtpVvmCarrierConfigHelper; - private VoicemailRingtonePreference voicemailRingtonePreference; - private CheckBoxPreference voicemailVibration; + private Preference voicemailNotificationPreference; private SwitchPreference voicemailVisualVoicemail; private SwitchPreference autoArchiveSwitchPreference; private Preference voicemailChangePinPreference; private PreferenceScreen advancedSettings; - // The ringtone name is retrieved with an async call. Cache the old name so there will be no jank - // during transition. - private CharSequence oldRingtoneName = ""; - @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -86,12 +81,12 @@ public class VoicemailSettingsFragment extends PreferenceFragment PreferenceScreen prefSet = getPreferenceScreen(); - voicemailRingtonePreference = - (VoicemailRingtonePreference) - findPreference(getString(R.string.voicemail_notification_ringtone_key)); - voicemailRingtonePreference.setVoicemailRingtoneNameChangeListener(this); - voicemailRingtonePreference.init(phoneAccountHandle, oldRingtoneName); - voicemailRingtonePreference.setOnPreferenceClickListener( + voicemailNotificationPreference = + findPreference(getString(R.string.voicemail_notifications_key)); + voicemailNotificationPreference.setIntent( + NotificationChannelManager.getInstance() + .getSettingsIntentForChannel(getContext(), Channel.VOICEMAIL, phoneAccountHandle)); + voicemailNotificationPreference.setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { @@ -102,24 +97,6 @@ public class VoicemailSettingsFragment extends PreferenceFragment } }); - voicemailVibration = - (CheckBoxPreference) findPreference(getString(R.string.voicemail_notification_vibrate_key)); - voicemailVibration.setOnPreferenceChangeListener(this); - voicemailVibration.setChecked( - getContext() - .getSystemService(TelephonyManager.class) - .isVoicemailVibrationEnabled(phoneAccountHandle)); - voicemailVibration.setOnPreferenceClickListener( - new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - Logger.get(getContext()) - .logImpression(DialerImpression.Type.VVM_CHANGE_VIBRATION_CLICKED); - // Let the preference handle the click. - return false; - } - }); - voicemailVisualVoicemail = (SwitchPreference) findPreference(getString(R.string.voicemail_visual_voicemail_key)); @@ -219,10 +196,6 @@ public class VoicemailSettingsFragment extends PreferenceFragment logArchiveToggle((boolean) objValue); VisualVoicemailSettingsUtil.setArchiveEnabled( getContext(), phoneAccountHandle, (boolean) objValue); - } else if (preference.getKey().equals(voicemailVibration.getKey())) { - getContext() - .getSystemService(TelephonyManager.class) - .setVoicemailVibrationEnabled(phoneAccountHandle, (boolean) objValue); } // Always let the preference setting proceed. @@ -255,11 +228,6 @@ public class VoicemailSettingsFragment extends PreferenceFragment } @Override - public void onVoicemailRingtoneNameChanged(CharSequence name) { - oldRingtoneName = name; - } - - @Override public void onActivationStateChanged(PhoneAccountHandle phoneAccountHandle, boolean isActivated) { if (this.phoneAccountHandle.equals(phoneAccountHandle)) { updateChangePin(); diff --git a/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java b/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java index 43e2b85bd..ef0bf10e9 100644 --- a/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java +++ b/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java @@ -28,7 +28,7 @@ import android.telecom.PhoneAccountHandle; import android.telephony.VisualVoicemailSms; import com.android.voicemail.impl.ActivationTask; import com.android.voicemail.impl.OmtpConstants; -import com.android.voicemail.impl.OmtpReceiver; +import com.android.voicemail.impl.OmtpService; import com.android.voicemail.impl.OmtpVvmCarrierConfigHelper; import com.android.voicemail.impl.Voicemail; import com.android.voicemail.impl.Voicemail.Builder; @@ -52,7 +52,7 @@ public class OmtpMessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { mContext = context; - VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpReceiver.EXTRA_VOICEMAIL_SMS); + VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpService.EXTRA_VOICEMAIL_SMS); PhoneAccountHandle phone = sms.getPhoneAccountHandle(); if (phone == null) { diff --git a/java/com/android/voicemail/impl/sms/OmtpMessageSender.java b/java/com/android/voicemail/impl/sms/OmtpMessageSender.java index 6c9333fb3..e9d145cde 100644 --- a/java/com/android/voicemail/impl/sms/OmtpMessageSender.java +++ b/java/com/android/voicemail/impl/sms/OmtpMessageSender.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 Google Inc. All Rights Reserved. + * Copyright (C) 2015 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. @@ -20,8 +20,8 @@ import android.content.Context; import android.support.annotation.Nullable; import android.telecom.PhoneAccountHandle; import android.telephony.SmsManager; -import android.telephony.VisualVoicemailService; import com.android.voicemail.impl.OmtpConstants; +import com.android.voicemail.impl.TelephonyMangerCompat; /** * Send client originated OMTP messages to the OMTP server. @@ -75,7 +75,7 @@ public abstract class OmtpMessageSender { public void requestVvmStatus(@Nullable PendingIntent sentIntent) {} protected void sendSms(String text, PendingIntent sentIntent) { - VisualVoicemailService.sendVisualVoicemailSms( + TelephonyMangerCompat.sendVisualVoicemailSms( mContext, mPhoneAccountHandle, mDestinationNumber, mApplicationPort, text, sentIntent); } diff --git a/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java b/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java index dd9204d3e..d178628c6 100644 --- a/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java +++ b/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java @@ -33,7 +33,7 @@ import android.telephony.SmsManager; import android.telephony.VisualVoicemailSms; import com.android.voicemail.impl.Assert; import com.android.voicemail.impl.OmtpConstants; -import com.android.voicemail.impl.OmtpReceiver; +import com.android.voicemail.impl.OmtpService; import com.android.voicemail.impl.OmtpVvmCarrierConfigHelper; import com.android.voicemail.impl.VvmLog; import com.android.voicemail.impl.protocol.VisualVoicemailProtocol; @@ -67,7 +67,7 @@ public class StatusSmsFetcher extends BroadcastReceiver implements Closeable { mContext = context; mPhoneAccountHandle = phoneAccountHandle; IntentFilter filter = new IntentFilter(ACTION_REQUEST_SENT_INTENT); - filter.addAction(OmtpReceiver.ACTION_SMS_RECEIVED); + filter.addAction(OmtpService.ACTION_SMS_RECEIVED); context.registerReceiver(this, filter); } @@ -110,7 +110,7 @@ public class StatusSmsFetcher extends BroadcastReceiver implements Closeable { return; } - VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpReceiver.EXTRA_VOICEMAIL_SMS); + VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpService.EXTRA_VOICEMAIL_SMS); if (!mPhoneAccountHandle.equals(sms.getPhoneAccountHandle())) { return; diff --git a/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java b/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java index af934dd3c..3443737cd 100644 --- a/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java +++ b/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java @@ -36,6 +36,7 @@ import com.android.voicemail.impl.VvmLog; import com.android.voicemail.impl.fetch.VoicemailFetchedCallback; import com.android.voicemail.impl.imap.ImapHelper; import com.android.voicemail.impl.imap.ImapHelper.InitializingException; +import com.android.voicemail.impl.mail.store.ImapFolder.Quota; import com.android.voicemail.impl.scheduling.BaseTask; import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil; import com.android.voicemail.impl.sync.VvmNetworkRequest.NetworkWrapper; @@ -152,21 +153,28 @@ public class OmtpVvmSyncService { */ private void autoDeleteAndArchiveVM( ImapHelper imapHelper, PhoneAccountHandle phoneAccountHandle) { - - if (isArchiveAllowedAndEnabled(mContext, phoneAccountHandle)) { - if ((float) imapHelper.getOccuupiedQuota() / (float) imapHelper.getTotalQuota() - > AUTO_DELETE_ARCHIVE_VM_THRESHOLD) { - deleteAndArchiveVM(imapHelper); - imapHelper.updateQuota(); - 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 { + if (!isArchiveAllowedAndEnabled(mContext, phoneAccountHandle)) { VvmLog.i(TAG, "autoDeleteAndArchiveVM is turned off"); LoggerUtils.logImpressionOnMainThread( mContext, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETE_TURNED_OFF); + return; + } + Quota quotaOnServer = imapHelper.getQuota(); + if (quotaOnServer == null) { + LoggerUtils.logImpressionOnMainThread( + mContext, DialerImpression.Type.VVM_ARCHIVE_AUTO_DELETE_FAILED_DUE_TO_FAILED_QUOTA_CHECK); + VvmLog.e(TAG, "autoDeleteAndArchiveVM failed - Can't retrieve Imap quota."); + return; + } + + if ((float) quotaOnServer.occupied / (float) quotaOnServer.total + > AUTO_DELETE_ARCHIVE_VM_THRESHOLD) { + deleteAndArchiveVM(imapHelper, quotaOnServer); + imapHelper.updateQuota(); + 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"); } } @@ -190,14 +198,15 @@ public class OmtpVvmSyncService { return true; } - private void deleteAndArchiveVM(ImapHelper imapHelper) { + private void deleteAndArchiveVM(ImapHelper imapHelper, Quota quotaOnServer) { // Archive column should only be used for 0 and above Assert.isTrue(BuildCompat.isAtLeastO()); + // The number of voicemails that exceed our threshold and should be deleted from the server int numVoicemails = - imapHelper.getOccuupiedQuota() - - (int) (AUTO_DELETE_ARCHIVE_VM_THRESHOLD * imapHelper.getTotalQuota()); + quotaOnServer.occupied - (int) (AUTO_DELETE_ARCHIVE_VM_THRESHOLD * quotaOnServer.total); List<Voicemail> oldestVoicemails = mQueryHelper.oldestVoicemailsOnServer(numVoicemails); + VvmLog.w(TAG, "number of voicemails to delete " + numVoicemails); if (!oldestVoicemails.isEmpty()) { mQueryHelper.markArchivedInDatabase(oldestVoicemails); imapHelper.markMessagesAsDeleted(oldestVoicemails); diff --git a/java/com/android/voicemail/impl/sync/SyncOneTask.java b/java/com/android/voicemail/impl/sync/SyncOneTask.java index 19419ec8a..cd2782abb 100644 --- a/java/com/android/voicemail/impl/sync/SyncOneTask.java +++ b/java/com/android/voicemail/impl/sync/SyncOneTask.java @@ -51,7 +51,7 @@ public class SyncOneTask extends BaseTask { intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, phone); intent.putExtra(EXTRA_SYNC_TYPE, OmtpVvmSyncService.SYNC_DOWNLOAD_ONE_TRANSCRIPTION); intent.putExtra(EXTRA_VOICEMAIL, voicemail); - context.startService(intent); + context.sendBroadcast(intent); } public SyncOneTask() { diff --git a/java/com/android/voicemail/impl/sync/SyncTask.java b/java/com/android/voicemail/impl/sync/SyncTask.java index 27f803401..0b3e090bf 100644 --- a/java/com/android/voicemail/impl/sync/SyncTask.java +++ b/java/com/android/voicemail/impl/sync/SyncTask.java @@ -48,7 +48,7 @@ public class SyncTask extends BaseTask { Intent intent = BaseTask.createIntent(context, SyncTask.class, phone); intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, phone); intent.putExtra(EXTRA_SYNC_TYPE, syncType); - context.startService(intent); + context.sendBroadcast(intent); } public SyncTask() { diff --git a/java/com/android/voicemail/impl/sync/UploadTask.java b/java/com/android/voicemail/impl/sync/UploadTask.java index 403074572..f2b2036b5 100644 --- a/java/com/android/voicemail/impl/sync/UploadTask.java +++ b/java/com/android/voicemail/impl/sync/UploadTask.java @@ -44,7 +44,7 @@ public class UploadTask extends BaseTask { public static void start(Context context, PhoneAccountHandle phoneAccountHandle) { Intent intent = BaseTask.createIntent(context, UploadTask.class, phoneAccountHandle); - context.startService(intent); + context.sendBroadcast(intent); } @Override diff --git a/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java b/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java index bfc2e5f20..9b295dbb7 100644 --- a/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java +++ b/java/com/android/voicemail/impl/sync/VoicemailsQueryHelper.java @@ -27,7 +27,6 @@ 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; @@ -54,12 +53,6 @@ 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; @@ -101,23 +94,14 @@ public class VoicemailsQueryHelper { /** * Utility method to make queries to the voicemail database. * + * <p>TODO(b/36588206) add PhoneAccountHandle filtering back + * * @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( - @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); + @NonNull PhoneAccountHandle unusedPhoneAccountHandle, String selection) { + Cursor cursor = mContentResolver.query(mSourceUri, PROJECTION, selection, null, null); if (cursor == null) { return null; } diff --git a/java/com/android/voicemail/permissions.xml b/java/com/android/voicemail/permissions.xml index adb4b6f54..bedf06898 100644 --- a/java/com/android/voicemail/permissions.xml +++ b/java/com/android/voicemail/permissions.xml @@ -3,7 +3,7 @@ <uses-sdk android:minSdkVersion="23" - android:targetSdkVersion="25"/> + android:targetSdkVersion="26"/> <!-- Applications using this module should merge these permissions using android_manifest_merge --> |