/* * Copyright (C) 2008 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.phone; import android.app.ActionBar; import android.app.Activity; import android.app.ActivityOptions; import android.app.AlertDialog; import android.app.Dialog; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.PersistableBundle; import android.os.UserHandle; import android.os.UserManager; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; import android.provider.Settings; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; import android.telephony.CarrierConfigManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import android.view.MenuItem; import android.widget.Toast; import com.android.ims.ImsConfig; import com.android.ims.ImsManager; import com.android.internal.telephony.CallForwardInfo; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.phone.common.util.SettingsUtil; import com.android.phone.settings.AccountSelectionPreference; import com.android.phone.settings.PhoneAccountSettingsFragment; import com.android.phone.settings.VoicemailSettingsActivity; import com.android.phone.settings.fdn.FdnSetting; import com.android.services.telephony.sip.SipUtil; import java.lang.String; import java.util.ArrayList; import java.util.List; /** * Top level "Call settings" UI; see res/xml/call_feature_setting.xml * * This preference screen is the root of the "Call settings" hierarchy available from the Phone * app; the settings here let you control various features related to phone calls (including * voicemail settings, the "Respond via SMS" feature, and others.) It's used only on * voice-capable phone devices. * * Note that this activity is part of the package com.android.phone, even * though you reach it from the "Phone" app (i.e. DialtactsActivity) which * is from the package com.android.contacts. * * For the "Mobile network settings" screen under the main Settings app, * See {@link MobileNetworkSettings}. * * @see com.android.phone.MobileNetworkSettings */ public class CallFeaturesSetting extends PreferenceActivity implements Preference.OnPreferenceChangeListener { private static final String LOG_TAG = "CallFeaturesSetting"; private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2); // String keys for preference lookup // TODO: Naming these "BUTTON_*" is confusing since they're not actually buttons(!) // TODO: Consider moving these strings to strings.xml, so that they are not duplicated here and // in the layout files. These strings need to be treated carefully; if the setting is // persistent, they are used as the key to store shared preferences and the name should not be // changed unless the settings are also migrated. private static final String VOICEMAIL_SETTING_SCREEN_PREF_KEY = "button_voicemail_category_key"; private static final String BUTTON_FDN_KEY = "button_fdn_key"; private static final String BUTTON_RETRY_KEY = "button_auto_retry_key"; private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key"; private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key"; private static final String PHONE_ACCOUNT_SETTINGS_KEY = "phone_account_settings_preference_screen"; private static final String ENABLE_VIDEO_CALLING_KEY = "button_enable_video_calling"; private Phone mPhone; private SubscriptionInfoHelper mSubscriptionInfoHelper; private TelecomManager mTelecomManager; private CheckBoxPreference mButtonAutoRetry; private PreferenceScreen mVoicemailSettingsScreen; private CheckBoxPreference mEnableVideoCalling; /* * Click Listeners, handle click based on objects attached to UI. */ // Click listener for all toggle events @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference == mButtonAutoRetry) { android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(), android.provider.Settings.Global.CALL_AUTO_RETRY, mButtonAutoRetry.isChecked() ? 1 : 0); return true; } return false; } /** * Implemented to support onPreferenceChangeListener to look for preference * changes. * * @param preference is the preference to be changed * @param objValue should be the value of the selection, NOT its localized * display value. */ @Override public boolean onPreferenceChange(Preference preference, Object objValue) { if (DBG) log("onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\""); if (preference == mEnableVideoCalling) { if (ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())) { PhoneGlobals.getInstance().phoneMgr.enableVideoCalling((boolean) objValue); } else { AlertDialog.Builder builder = new AlertDialog.Builder(this); DialogInterface.OnClickListener networkSettingsClickListener = new Dialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startActivity(new Intent(mPhone.getContext(), com.android.phone.MobileNetworkSettings.class)); } }; builder.setMessage(getResources().getString( R.string.enable_video_calling_dialog_msg)) .setNeutralButton(getResources().getString( R.string.enable_video_calling_dialog_settings), networkSettingsClickListener) .setPositiveButton(android.R.string.ok, null) .show(); return false; } } // Always let the preference setting proceed. return true; } @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); if (DBG) log("onCreate: Intent is " + getIntent()); // Make sure we are running as an admin user. if (!UserManager.get(this).isAdminUser()) { Toast.makeText(this, R.string.call_settings_admin_user_only, Toast.LENGTH_SHORT).show(); finish(); return; } mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent()); mSubscriptionInfoHelper.setActionBarTitle( getActionBar(), getResources(), R.string.call_settings_with_label); mPhone = mSubscriptionInfoHelper.getPhone(); mTelecomManager = TelecomManager.from(this); } @Override protected void onResume() { super.onResume(); PreferenceScreen preferenceScreen = getPreferenceScreen(); if (preferenceScreen != null) { preferenceScreen.removeAll(); } addPreferencesFromResource(R.xml.call_feature_setting); TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Preference phoneAccountSettingsPreference = findPreference(PHONE_ACCOUNT_SETTINGS_KEY); if (telephonyManager.isMultiSimEnabled() || !SipUtil.isVoipSupported(mPhone.getContext())) { getPreferenceScreen().removePreference(phoneAccountSettingsPreference); } PreferenceScreen prefSet = getPreferenceScreen(); mVoicemailSettingsScreen = (PreferenceScreen) findPreference(VOICEMAIL_SETTING_SCREEN_PREF_KEY); mVoicemailSettingsScreen.setIntent(mSubscriptionInfoHelper.getIntent( VoicemailSettingsActivity.class)); mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY); mEnableVideoCalling = (CheckBoxPreference) findPreference(ENABLE_VIDEO_CALLING_KEY); PersistableBundle carrierConfig = PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId()); if (carrierConfig.getBoolean(CarrierConfigManager.KEY_AUTO_RETRY_ENABLED_BOOL)) { mButtonAutoRetry.setOnPreferenceChangeListener(this); int autoretry = Settings.Global.getInt( getContentResolver(), Settings.Global.CALL_AUTO_RETRY, 0); mButtonAutoRetry.setChecked(autoretry != 0); } else { prefSet.removePreference(mButtonAutoRetry); mButtonAutoRetry = null; } Preference cdmaOptions = prefSet.findPreference(BUTTON_CDMA_OPTIONS); Preference gsmOptions = prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS); if (carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) { cdmaOptions.setIntent(mSubscriptionInfoHelper.getIntent(CdmaCallOptions.class)); gsmOptions.setIntent(mSubscriptionInfoHelper.getIntent(GsmUmtsCallOptions.class)); } else { prefSet.removePreference(cdmaOptions); prefSet.removePreference(gsmOptions); int phoneType = mPhone.getPhoneType(); Preference fdnButton = prefSet.findPreference(BUTTON_FDN_KEY); if (carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)) { prefSet.removePreference(fdnButton); } else { if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { prefSet.removePreference(fdnButton); if (!carrierConfig.getBoolean( CarrierConfigManager.KEY_VOICE_PRIVACY_DISABLE_UI_BOOL)) { addPreferencesFromResource(R.xml.cdma_call_privacy); } } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) { fdnButton.setIntent(mSubscriptionInfoHelper.getIntent(FdnSetting.class)); if (carrierConfig.getBoolean( CarrierConfigManager.KEY_ADDITIONAL_CALL_SETTING_BOOL)) { addPreferencesFromResource(R.xml.gsm_umts_call_options); GsmUmtsCallOptions.init(prefSet, mSubscriptionInfoHelper); } } else { throw new IllegalStateException("Unexpected phone type: " + phoneType); } } } if (ImsManager.isVtEnabledByPlatform(mPhone.getContext())) { boolean currentValue = ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext()) ? PhoneGlobals.getInstance().phoneMgr.isVideoCallingEnabled( getOpPackageName()) : false; mEnableVideoCalling.setChecked(currentValue); mEnableVideoCalling.setOnPreferenceChangeListener(this); } else { prefSet.removePreference(mEnableVideoCalling); } if (ImsManager.isVolteEnabledByPlatform(this) && !carrierConfig.getBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL)) { TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /* tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); */ } Preference wifiCallingSettings = findPreference( getResources().getString(R.string.wifi_calling_settings_key)); final PhoneAccountHandle simCallManager = mTelecomManager.getSimCallManager(); if (simCallManager != null) { Intent intent = PhoneAccountSettingsFragment.buildPhoneAccountConfigureIntent( this, simCallManager); if (intent != null) { PackageManager pm = mPhone.getContext().getPackageManager(); List resolutions = pm.queryIntentActivities(intent, 0); if (!resolutions.isEmpty()) { wifiCallingSettings.setTitle(resolutions.get(0).loadLabel(pm)); wifiCallingSettings.setSummary(null); wifiCallingSettings.setIntent(intent); } else { prefSet.removePreference(wifiCallingSettings); } } else { prefSet.removePreference(wifiCallingSettings); } } else if (!ImsManager.isWfcEnabledByPlatform(mPhone.getContext())) { prefSet.removePreference(wifiCallingSettings); } else { int resId = com.android.internal.R.string.wifi_calling_off_summary; if (ImsManager.isWfcEnabledByUser(mPhone.getContext())) { int wfcMode = ImsManager.getWfcMode(mPhone.getContext()); switch (wfcMode) { case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY: resId = com.android.internal.R.string.wfc_mode_wifi_only_summary; break; case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED: resId = com.android.internal.R.string.wfc_mode_cellular_preferred_summary; break; case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED: resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary; break; default: if (DBG) log("Unexpected WFC mode value: " + wfcMode); } } wifiCallingSettings.setSummary(resId); } } @Override protected void onNewIntent(Intent newIntent) { setIntent(newIntent); mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent()); mSubscriptionInfoHelper.setActionBarTitle( getActionBar(), getResources(), R.string.call_settings_with_label); mPhone = mSubscriptionInfoHelper.getPhone(); } private static void log(String msg) { Log.d(LOG_TAG, msg); } @Override public boolean onOptionsItemSelected(MenuItem item) { final int itemId = item.getItemId(); if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled() onBackPressed(); return true; } return super.onOptionsItemSelected(item); } /** * Finish current Activity and go up to the top level Settings ({@link CallFeaturesSetting}). * This is useful for implementing "HomeAsUp" capability for second-level Settings. */ public static void goUpToTopLevelSetting( Activity activity, SubscriptionInfoHelper subscriptionInfoHelper) { Intent intent = subscriptionInfoHelper.getIntent(CallFeaturesSetting.class); intent.setAction(Intent.ACTION_MAIN); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); activity.startActivity(intent); activity.finish(); } }