diff options
Diffstat (limited to 'java')
13 files changed, 499 insertions, 14 deletions
diff --git a/java/com/android/voicemail/AndroidManifest.xml b/java/com/android/voicemail/AndroidManifest.xml index aedfd6fbf..35beaf359 100644 --- a/java/com/android/voicemail/AndroidManifest.xml +++ b/java/com/android/voicemail/AndroidManifest.xml @@ -14,7 +14,7 @@ ~ limitations under the License --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.voicemailomtp"> + package="com.android.voicemail"> <uses-sdk android:minSdkVersion="23" @@ -32,5 +32,14 @@ <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> - <application/> + <application> + <receiver + android:name=".VoicemailSecretCodeReceiver" + android:exported="true"> + <intent-filter> + <action android:name="android.provider.Telephony.SECRET_CODE" /> + <data android:scheme="android_secret_code" /> + </intent-filter> + </receiver> + </application> </manifest> diff --git a/java/com/android/voicemail/VoicemailClient.java b/java/com/android/voicemail/VoicemailClient.java index 97b824b27..847919a30 100644 --- a/java/com/android/voicemail/VoicemailClient.java +++ b/java/com/android/voicemail/VoicemailClient.java @@ -18,7 +18,10 @@ package com.android.voicemail; import android.content.Context; import android.content.Intent; +import android.os.PersistableBundle; import android.provider.VoicemailContract.Voicemails; +import android.support.annotation.MainThread; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.telecom.PhoneAccountHandle; import android.telephony.TelephonyManager; @@ -52,6 +55,12 @@ public interface VoicemailClient { "com.android.voicemail.VoicemailClient.ACTION_SHOW_LEGACY_VOICEMAIL"; /** + * Secret code to launch the voicemail config activity intended for OEMs and Carriers. {@code + * *#*#VVMCONFIG#*#*} + */ + String VOICEMAIL_SECRET_CODE = "886266344"; + + /** * Whether the visual voicemail service is enabled for the {@code phoneAccountHandle}. "Enable" * means the user "wants" to have this service on, and does not mean the service is actually * functional(For example, the service is blocked on the carrier side. The service will be @@ -122,4 +131,15 @@ public interface VoicemailClient { * provisioning. Being "activated" means all setup are completed, and VVM is expected to work. */ boolean isActivated(Context context, PhoneAccountHandle phoneAccountHandle); + + /** + * Called when {@link #VOICEMAIL_SECRET_CODE} is dialed. {@code context} will be a broadcast + * receiver context. + */ + @MainThread + void showConfigUi(@NonNull Context context); + + @NonNull + PersistableBundle getConfig( + @NonNull Context context, @Nullable PhoneAccountHandle phoneAccountHandle); } diff --git a/java/com/android/voicemail/VoicemailSecretCodeReceiver.java b/java/com/android/voicemail/VoicemailSecretCodeReceiver.java new file mode 100644 index 000000000..6d142410c --- /dev/null +++ b/java/com/android/voicemail/VoicemailSecretCodeReceiver.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.voicemail; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import com.android.dialer.common.LogUtil; + +/** Receives android.provider.Telephony.SECRET_CODE */ +public class VoicemailSecretCodeReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + String host = intent.getData().getHost(); + if (!VoicemailClient.VOICEMAIL_SECRET_CODE.equals(host)) { + return; + } + LogUtil.i("VoicemailSecretCodeReceiver.onReceive", "secret code received"); + VoicemailComponent.get(context).getVoicemailClient().showConfigUi(context); + } +} diff --git a/java/com/android/voicemail/impl/AndroidManifest.xml b/java/com/android/voicemail/impl/AndroidManifest.xml index 6a7e689d2..3c7df66fa 100644 --- a/java/com/android/voicemail/impl/AndroidManifest.xml +++ b/java/com/android/voicemail/impl/AndroidManifest.xml @@ -15,7 +15,7 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.voicemailomtp"> + package="com.android.voicemail.impl"> <application android:supportsRtl="true"> diff --git a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java index 4a9e43370..700e1cbca 100644 --- a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java +++ b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java @@ -15,9 +15,11 @@ */ package com.android.voicemail.impl; +import android.annotation.TargetApi; import android.app.PendingIntent; import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.PersistableBundle; import android.support.annotation.NonNull; @@ -30,6 +32,7 @@ import android.telephony.VisualVoicemailSmsFilterSettings; import android.text.TextUtils; import android.util.ArraySet; import com.android.dialer.common.Assert; +import com.android.voicemail.impl.configui.ConfigOverrideFragment; import com.android.voicemail.impl.protocol.VisualVoicemailProtocol; import com.android.voicemail.impl.protocol.VisualVoicemailProtocolFactory; import com.android.voicemail.impl.sms.StatusMessage; @@ -48,27 +51,28 @@ import java.util.Set; * * <p>The current hidden configs are: {@link #getSslPort()} {@link #getDisabledCapabilities()} */ +@TargetApi(VERSION_CODES.O) public class OmtpVvmCarrierConfigHelper { private static final String TAG = "OmtpVvmCarrierCfgHlpr"; - static final String KEY_VVM_TYPE_STRING = CarrierConfigManager.KEY_VVM_TYPE_STRING; - static final String KEY_VVM_DESTINATION_NUMBER_STRING = + public static final String KEY_VVM_TYPE_STRING = CarrierConfigManager.KEY_VVM_TYPE_STRING; + public static final String KEY_VVM_DESTINATION_NUMBER_STRING = CarrierConfigManager.KEY_VVM_DESTINATION_NUMBER_STRING; - static final String KEY_VVM_PORT_NUMBER_INT = CarrierConfigManager.KEY_VVM_PORT_NUMBER_INT; - static final String KEY_CARRIER_VVM_PACKAGE_NAME_STRING = + public static final String KEY_VVM_PORT_NUMBER_INT = CarrierConfigManager.KEY_VVM_PORT_NUMBER_INT; + public static final String KEY_CARRIER_VVM_PACKAGE_NAME_STRING = CarrierConfigManager.KEY_CARRIER_VVM_PACKAGE_NAME_STRING; - static final String KEY_CARRIER_VVM_PACKAGE_NAME_STRING_ARRAY = + public static final String KEY_CARRIER_VVM_PACKAGE_NAME_STRING_ARRAY = "carrier_vvm_package_name_string_array"; - static final String KEY_VVM_PREFETCH_BOOL = CarrierConfigManager.KEY_VVM_PREFETCH_BOOL; - static final String KEY_VVM_CELLULAR_DATA_REQUIRED_BOOL = + public static final String KEY_VVM_PREFETCH_BOOL = CarrierConfigManager.KEY_VVM_PREFETCH_BOOL; + public static final String KEY_VVM_CELLULAR_DATA_REQUIRED_BOOL = CarrierConfigManager.KEY_VVM_CELLULAR_DATA_REQUIRED_BOOL; /** @see #getSslPort() */ - static final String KEY_VVM_SSL_PORT_NUMBER_INT = "vvm_ssl_port_number_int"; + public static final String KEY_VVM_SSL_PORT_NUMBER_INT = "vvm_ssl_port_number_int"; /** @see #isLegacyModeEnabled() */ - static final String KEY_VVM_LEGACY_MODE_ENABLED_BOOL = "vvm_legacy_mode_enabled_bool"; + public static final String KEY_VVM_LEGACY_MODE_ENABLED_BOOL = "vvm_legacy_mode_enabled_bool"; /** * Ban a capability reported by the server from being used. The array of string should be a subset @@ -76,10 +80,10 @@ public class OmtpVvmCarrierConfigHelper { * * @see #getDisabledCapabilities() */ - static final String KEY_VVM_DISABLED_CAPABILITIES_STRING_ARRAY = + public static final String KEY_VVM_DISABLED_CAPABILITIES_STRING_ARRAY = "vvm_disabled_capabilities_string_array"; - static final String KEY_VVM_CLIENT_PREFIX_STRING = "vvm_client_prefix_string"; + public static final String KEY_VVM_CLIENT_PREFIX_STRING = "vvm_client_prefix_string"; private final Context mContext; private final PersistableBundle mCarrierConfig; @@ -87,6 +91,8 @@ public class OmtpVvmCarrierConfigHelper { private final VisualVoicemailProtocol mProtocol; private final PersistableBundle mTelephonyConfig; + @Nullable private final PersistableBundle mOverrideConfig; + private PhoneAccountHandle mPhoneAccountHandle; public OmtpVvmCarrierConfigHelper(Context context, @Nullable PhoneAccountHandle handle) { @@ -100,6 +106,7 @@ public class OmtpVvmCarrierConfigHelper { VvmLog.e(TAG, "PhoneAccountHandle is invalid"); mCarrierConfig = null; mTelephonyConfig = null; + mOverrideConfig = null; mVvmType = null; mProtocol = null; return; @@ -111,6 +118,13 @@ public class OmtpVvmCarrierConfigHelper { mVvmType = getVvmType(); mProtocol = VisualVoicemailProtocolFactory.create(mContext.getResources(), mVvmType); + + if (ConfigOverrideFragment.isOverridden(context)) { + mOverrideConfig = ConfigOverrideFragment.getConfig(context); + VvmLog.w(TAG, "Config override is activated: " + mOverrideConfig); + } else { + mOverrideConfig = null; + } } @VisibleForTesting @@ -119,10 +133,23 @@ public class OmtpVvmCarrierConfigHelper { mContext = context; mCarrierConfig = carrierConfig; mTelephonyConfig = telephonyConfig; + mOverrideConfig = null; mVvmType = getVvmType(); mProtocol = VisualVoicemailProtocolFactory.create(mContext.getResources(), mVvmType); } + public PersistableBundle getConfig() { + PersistableBundle result = new PersistableBundle(); + if (mTelephonyConfig != null) { + result.putAll(mTelephonyConfig); + } + if (mCarrierConfig != null) { + result.putAll(mCarrierConfig); + } + + return result; + } + public Context getContext() { return mContext; } @@ -426,6 +453,13 @@ public class OmtpVvmCarrierConfigHelper { @Nullable private Object getValue(String key, Object defaultValue) { Object result; + if (mOverrideConfig != null) { + result = mOverrideConfig.get(key); + if (result != null) { + return result; + } + } + if (mCarrierConfig != null) { result = mCarrierConfig.get(key); if (result != null) { diff --git a/java/com/android/voicemail/impl/VoicemailClientImpl.java b/java/com/android/voicemail/impl/VoicemailClientImpl.java index 83ce6c588..96cd5344f 100644 --- a/java/com/android/voicemail/impl/VoicemailClientImpl.java +++ b/java/com/android/voicemail/impl/VoicemailClientImpl.java @@ -17,8 +17,10 @@ import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.os.Build.VERSION_CODES; +import android.os.PersistableBundle; import android.provider.VoicemailContract.Status; import android.provider.VoicemailContract.Voicemails; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.os.BuildCompat; import android.telecom.PhoneAccountHandle; @@ -28,6 +30,7 @@ import com.android.dialer.common.LogUtil; import com.android.dialer.configprovider.ConfigProviderBindings; import com.android.voicemail.VisualVoicemailTypeExtensions; import com.android.voicemail.VoicemailClient; +import com.android.voicemail.impl.configui.VoicemailSecretCodeActivity; import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil; import com.android.voicemail.impl.settings.VoicemailChangePinActivity; import com.android.voicemail.impl.settings.VoicemailSettingsFragment; @@ -126,6 +129,18 @@ public class VoicemailClientImpl implements VoicemailClient { return VvmAccountManager.isAccountActivated(context, phoneAccountHandle); } + @Override + public void showConfigUi(@NonNull Context context) { + Intent intent = new Intent(context, VoicemailSecretCodeActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + + @Override + public PersistableBundle getConfig(Context context, PhoneAccountHandle phoneAccountHandle) { + return new OmtpVvmCarrierConfigHelper(context, phoneAccountHandle).getConfig(); + } + @TargetApi(VERSION_CODES.O) @Override public void appendOmtpVoicemailSelectionClause( diff --git a/java/com/android/voicemail/impl/configui/AndroidManifest.xml b/java/com/android/voicemail/impl/configui/AndroidManifest.xml new file mode 100644 index 000000000..95796f978 --- /dev/null +++ b/java/com/android/voicemail/impl/configui/AndroidManifest.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2017 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.voicemail.impl.configui"> + + <application> + <activity android:name="com.android.voicemail.impl.configui.VoicemailSecretCodeActivity" + android:exported="false"> + </activity> + </application> +</manifest> diff --git a/java/com/android/voicemail/impl/configui/ConfigOverrideFragment.java b/java/com/android/voicemail/impl/configui/ConfigOverrideFragment.java new file mode 100644 index 000000000..18b2b9274 --- /dev/null +++ b/java/com/android/voicemail/impl/configui/ConfigOverrideFragment.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.voicemail.impl.configui; + +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.PersistableBundle; +import android.preference.EditTextPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; +import android.preference.PreferenceScreen; +import android.preference.SwitchPreference; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import android.text.TextUtils; +import com.android.dialer.common.Assert; +import com.android.dialer.common.concurrent.ThreadUtil; +import com.android.voicemail.VoicemailComponent; + +/** + * Fragment to edit the override values for the {@link import + * com.android.voicemail.impl.OmtpVvmCarrierConfigHelper} + */ +public class ConfigOverrideFragment extends PreferenceFragment + implements OnPreferenceChangeListener { + + /** + * Any preference with key that starts with this prefix will be written to the dialer carrier + * config. + */ + @VisibleForTesting static final String CONFIG_OVERRIDE_KEY_PREFIX = "vvm_config_override_key_"; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + PreferenceManager.setDefaultValues(getActivity(), R.xml.vvm_config_override, false); + addPreferencesFromResource(R.xml.vvm_config_override); + + // add listener so the value of a EditTextPreference will be updated to the summary. + for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) { + Preference preference = getPreferenceScreen().getPreference(i); + preference.setOnPreferenceChangeListener(this); + updatePreference(preference); + } + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + Assert.isMainThread(); + ThreadUtil.postOnUiThread(() -> updatePreference(preference)); + return true; + } + + private void updatePreference(Preference preference) { + if (preference instanceof EditTextPreference) { + EditTextPreference editTextPreference = (EditTextPreference) preference; + editTextPreference.setSummary(editTextPreference.getText()); + } + } + + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + if (TextUtils.equals( + preference.getKey(), getString(R.string.vvm_config_override_load_current_key))) { + loadCurrentConfig(); + } + return super.onPreferenceTreeClick(preferenceScreen, preference); + } + + /** + * Loads the config for the currently carrier into the override values, from the dialer or the + * carrier config app. This is a "reset" button to load the defaults. + */ + private void loadCurrentConfig() { + Context context = getActivity(); + PhoneAccountHandle phoneAccountHandle = + context + .getSystemService(TelecomManager.class) + .getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_VOICEMAIL); + + PersistableBundle config = + VoicemailComponent.get(context).getVoicemailClient().getConfig(context, phoneAccountHandle); + + for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) { + Preference preference = getPreferenceScreen().getPreference(i); + String key = preference.getKey(); + if (!key.startsWith(CONFIG_OVERRIDE_KEY_PREFIX)) { + continue; + } + + String configKey = key.substring(CONFIG_OVERRIDE_KEY_PREFIX.length()); + + if (configKey.endsWith("bool")) { + ((SwitchPreference) preference).setChecked(config.getBoolean(configKey)); + } else if (configKey.endsWith("int")) { + ((EditTextPreference) preference).setText(String.valueOf(config.getInt(configKey))); + } else if (configKey.endsWith("string")) { + ((EditTextPreference) preference).setText(config.getString(configKey)); + } else if (configKey.endsWith("string_array")) { + ((EditTextPreference) preference).setText(toCsv(config.getStringArray(configKey))); + } else { + throw Assert.createAssertionFailException("unknown type for key " + configKey); + } + updatePreference(preference); + } + } + + public static boolean isOverridden(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.vvm_config_override_enabled_key), false); + } + + public static PersistableBundle getConfig(Context context) { + Assert.checkState(isOverridden(context)); + PersistableBundle result = new PersistableBundle(); + + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + for (String key : preferences.getAll().keySet()) { + if (!key.startsWith(CONFIG_OVERRIDE_KEY_PREFIX)) { + continue; + } + String configKey = key.substring(CONFIG_OVERRIDE_KEY_PREFIX.length()); + if (configKey.endsWith("bool")) { + result.putBoolean(configKey, preferences.getBoolean(key, false)); + } else if (configKey.endsWith("int")) { + result.putInt(configKey, Integer.valueOf(preferences.getString(key, null))); + } else if (configKey.endsWith("string")) { + result.putString(configKey, preferences.getString(key, null)); + } else if (configKey.endsWith("string_array")) { + result.putStringArray(configKey, fromCsv(preferences.getString(key, null))); + } else { + throw Assert.createAssertionFailException("unknown type for key " + configKey); + } + } + return result; + } + + private static String toCsv(String[] array) { + if (array == null) { + return ""; + } + StringBuilder result = new StringBuilder(); + for (String element : array) { + if (result.length() != 0) { + result.append(","); + } + result.append(element); + } + return result.toString(); + }; + + private static String[] fromCsv(String csv) { + return csv.split(","); + } +} diff --git a/java/com/android/voicemail/impl/configui/VoicemailSecretCodeActivity.java b/java/com/android/voicemail/impl/configui/VoicemailSecretCodeActivity.java new file mode 100644 index 000000000..beeb9564d --- /dev/null +++ b/java/com/android/voicemail/impl/configui/VoicemailSecretCodeActivity.java @@ -0,0 +1,58 @@ +/* + * 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.configui; + +import android.content.Intent; +import android.preference.PreferenceActivity; +import android.provider.VoicemailContract; +import java.util.List; + +/** Activity launched by simulator->voicemail, provides debug features. */ +@SuppressWarnings("FragmentInjection") // not exported +public class VoicemailSecretCodeActivity extends PreferenceActivity { + + private Header syncHeader; + + @Override + public void onBuildHeaders(List<Header> target) { + super.onBuildHeaders(target); + syncHeader = new Header(); + syncHeader.title = "Sync"; + target.add(syncHeader); + + Header configOverride = new Header(); + configOverride.fragment = ConfigOverrideFragment.class.getName(); + configOverride.title = "VVM config override"; + target.add(configOverride); + } + + @Override + public void onHeaderClick(Header header, int position) { + if (header == syncHeader) { + Intent intent = new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL); + intent.setPackage(getPackageName()); + sendBroadcast(intent); + return; + } + super.onHeaderClick(header, position); + } + + @Override + protected boolean isValidFragment(String fragmentName) { + return true; + } +} diff --git a/java/com/android/voicemail/impl/configui/res/values/strings.xml b/java/com/android/voicemail/impl/configui/res/values/strings.xml new file mode 100644 index 000000000..fea76be02 --- /dev/null +++ b/java/com/android/voicemail/impl/configui/res/values/strings.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2017 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="vvm_config_override_load_current_key" translatable="false">vvm_config_override_load_current</string> + <string name="vvm_config_override_enabled_key" translatable="false">vvm_config_override_enabled</string> + +</resources> diff --git a/java/com/android/voicemail/impl/configui/res/xml/vvm_config_override.xml b/java/com/android/voicemail/impl/configui/res/xml/vvm_config_override.xml new file mode 100644 index 000000000..c4a23c789 --- /dev/null +++ b/java/com/android/voicemail/impl/configui/res/xml/vvm_config_override.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2017 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> + + <Preference + android:key="@string/vvm_config_override_load_current_key" + android:title="Load current"/> + + <SwitchPreference + android:key="@string/vvm_config_override_enabled_key" + android:title="Override enabled" + android:defaultValue="false"/> + + <!-- Keys should be a key in CarrierConfigManager prefixed with "vvm_config_override_key_" --> + <EditTextPreference + android:key="vvm_config_override_key_vvm_type_string" + android:title="type" + android:defaultValue="vvm_type_omtp" + /> + + <EditTextPreference + android:key="vvm_config_override_key_vvm_destination_number_string" + android:title="destination number" + /> + + <EditTextPreference + android:key="vvm_config_override_key_vvm_port_number_int" + android:title="destination port" + /> + <EditTextPreference + android:key="vvm_config_override_key_carrier_vvm_package_name_string_array" + android:title="vvm package name (CSV)" + /> + + <SwitchPreference + android:key="vvm_config_override_key_vvm_prefetch_bool" + android:title="prefetch" + android:defaultValue="true"/> + + <SwitchPreference + android:key="vvm_config_override_key_vvm_cellular_data_required_bool" + android:title="cellular data required" + android:defaultValue="false"/> + <EditTextPreference + android:key="vvm_config_override_key_vvm_ssl_port_number_int" + android:title="SSL port" + /> + + <SwitchPreference + android:key="vvm_config_override_key_vvm_legacy_mode_enabled_bool" + android:title="legacy mode" + android:defaultValue="false"/> + + <EditTextPreference + android:key="vvm_config_override_key_vvm_disabled_capabilities_string_array" + android:title="disabled capabilities (CSV)" + /> + + <EditTextPreference + android:key="vvm_config_override_key_vvm_client_prefix_string" + android:title="client prefix" + /> +</PreferenceScreen>
\ No newline at end of file diff --git a/java/com/android/voicemail/impl/res/values/strings.xml b/java/com/android/voicemail/impl/res/values/strings.xml index 375a1e9ba..a846541ea 100644 --- a/java/com/android/voicemail/impl/res/values/strings.xml +++ b/java/com/android/voicemail/impl/res/values/strings.xml @@ -107,4 +107,8 @@ <string name="change_pin_succeeded">Voicemail PIN updated</string> <!-- The error message to show if the server reported an error while attempting to change the voicemail PIN --> <string name="change_pin_system_error">Unable to set PIN</string> + + <string name="vvm_config_override_load_current_key" translatable="false">vvm_config_override_load_current</string> + <string name="vvm_config_override_enabled_key" translatable="false">vvm_config_override_enabled</string> + </resources> diff --git a/java/com/android/voicemail/stub/StubVoicemailClient.java b/java/com/android/voicemail/stub/StubVoicemailClient.java index e2b470799..9a89e30c0 100644 --- a/java/com/android/voicemail/stub/StubVoicemailClient.java +++ b/java/com/android/voicemail/stub/StubVoicemailClient.java @@ -18,6 +18,9 @@ package com.android.voicemail.stub; import android.content.Context; import android.content.Intent; +import android.os.PersistableBundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.telecom.PhoneAccountHandle; import android.telephony.TelephonyManager; import com.android.voicemail.VoicemailClient; @@ -81,4 +84,13 @@ public final class StubVoicemailClient implements VoicemailClient { public boolean isActivated(Context context, PhoneAccountHandle phoneAccountHandle) { return false; } + + @Override + public void showConfigUi(@NonNull Context context) {} + + @Override + public PersistableBundle getConfig( + @NonNull Context context, @Nullable PhoneAccountHandle phoneAccountHandle) { + return new PersistableBundle(); + } } |