1 package com.android.phone; 2 3 import android.app.ActionBar; 4 import android.app.Dialog; 5 import android.os.Bundle; 6 import android.os.PersistableBundle; 7 import android.preference.Preference; 8 import android.preference.PreferenceScreen; 9 import android.telephony.CarrierConfigManager; 10 import android.util.Log; 11 import android.view.MenuItem; 12 13 import com.android.internal.telephony.Phone; 14 import com.android.phone.settings.SuppServicesUiUtil; 15 16 import java.util.ArrayList; 17 18 public class GsmUmtsAdditionalCallOptions extends TimeConsumingPreferenceActivity { 19 private static final String LOG_TAG = "GsmUmtsAdditionalCallOptions"; 20 private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2); 21 22 public static final String BUTTON_CLIR_KEY = "button_clir_key"; 23 public static final String BUTTON_CW_KEY = "button_cw_key"; 24 25 private static final int CW_WARNING_DIALOG = 201; 26 private static final int CALLER_ID_WARNING_DIALOG = 202; 27 28 private CLIRListPreference mCLIRButton; 29 private CallWaitingSwitchPreference mCWButton; 30 31 private final ArrayList<Preference> mPreferences = new ArrayList<Preference>(); 32 private int mInitIndex = 0; 33 private Phone mPhone; 34 private SubscriptionInfoHelper mSubscriptionInfoHelper; 35 36 private boolean mShowCLIRButton = true; 37 private boolean mShowCWButton = true; 38 private boolean mCLIROverUtPrecautions = false; 39 private boolean mCWOverUtPrecautions = false; 40 41 @Override onCreate(Bundle icicle)42 protected void onCreate(Bundle icicle) { 43 super.onCreate(icicle); 44 45 addPreferencesFromResource(R.xml.gsm_umts_additional_options); 46 47 mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent()); 48 mSubscriptionInfoHelper.setActionBarTitle( 49 getActionBar(), getResources(), R.string.additional_gsm_call_settings_with_label); 50 mPhone = mSubscriptionInfoHelper.getPhone(); 51 52 PreferenceScreen prefSet = getPreferenceScreen(); 53 mCLIRButton = (CLIRListPreference) prefSet.findPreference(BUTTON_CLIR_KEY); 54 mCWButton = (CallWaitingSwitchPreference) prefSet.findPreference(BUTTON_CW_KEY); 55 56 PersistableBundle b = null; 57 if (mSubscriptionInfoHelper.hasSubId()) { 58 b = PhoneGlobals.getInstance().getCarrierConfigForSubId( 59 mSubscriptionInfoHelper.getSubId()); 60 } else { 61 b = PhoneGlobals.getInstance().getCarrierConfig(); 62 } 63 64 if (b != null) { 65 mShowCLIRButton = b.getBoolean( 66 CarrierConfigManager.KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL); 67 mShowCWButton = b.getBoolean( 68 CarrierConfigManager.KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL); 69 mCLIROverUtPrecautions = mShowCLIRButton && b.getBoolean( 70 CarrierConfigManager.KEY_CALLER_ID_OVER_UT_WARNING_BOOL); 71 mCWOverUtPrecautions = mShowCWButton && b.getBoolean( 72 CarrierConfigManager.KEY_CALL_WAITING_OVER_UT_WARNING_BOOL); 73 if (DBG) { 74 Log.d(LOG_TAG, "mCLIROverUtPrecautions:" + mCLIROverUtPrecautions 75 + ",mCWOverUtPrecautions:" + mCWOverUtPrecautions); 76 } 77 } 78 79 boolean isSsOverUtPrecautions = SuppServicesUiUtil.isSsOverUtPrecautions(this, mPhone); 80 81 if (mCLIRButton != null) { 82 if (mShowCLIRButton) { 83 if (mCLIROverUtPrecautions && isSsOverUtPrecautions) { 84 mCLIRButton.setEnabled(false); 85 } else { 86 mPreferences.add(mCLIRButton); 87 } 88 } else { 89 prefSet.removePreference(mCLIRButton); 90 } 91 } 92 93 if (mCWButton != null) { 94 if (mShowCWButton) { 95 if (mCWOverUtPrecautions && isSsOverUtPrecautions) { 96 mCWButton.setEnabled(false); 97 } else { 98 mPreferences.add(mCWButton); 99 } 100 } else { 101 prefSet.removePreference(mCWButton); 102 } 103 } 104 105 if (mPreferences.size() != 0) { 106 if (icicle == null) { 107 if (DBG) Log.d(LOG_TAG, "start to init "); 108 doPreferenceInit(mInitIndex); 109 } else { 110 if (DBG) Log.d(LOG_TAG, "restore stored states"); 111 mInitIndex = mPreferences.size(); 112 if (mShowCWButton && mCWButton != null && mCWButton.isEnabled()) { 113 mCWButton.init(this, true, mPhone); 114 } 115 if (mShowCLIRButton && mCLIRButton != null && mCLIRButton.isEnabled()) { 116 mCLIRButton.init(this, true, mPhone); 117 int[] clirArray = icicle.getIntArray(mCLIRButton.getKey()); 118 if (clirArray != null) { 119 if (DBG) { 120 Log.d(LOG_TAG, "onCreate: clirArray[0]=" 121 + clirArray[0] + ", clirArray[1]=" + clirArray[1]); 122 } 123 mCLIRButton.handleGetCLIRResult(clirArray); 124 } else { 125 mCLIRButton.init(this, false, mPhone); 126 } 127 } 128 } 129 } 130 131 ActionBar actionBar = getActionBar(); 132 if (actionBar != null) { 133 // android.R.id.home will be triggered in onOptionsItemSelected() 134 actionBar.setDisplayHomeAsUpEnabled(true); 135 } 136 } 137 138 @Override onResume()139 public void onResume() { 140 super.onResume(); 141 int indexOfStartInit = mPreferences.size(); 142 boolean isPrecaution = SuppServicesUiUtil.isSsOverUtPrecautions(this, mPhone); 143 dismissWarningDialog(); 144 145 if (mShowCLIRButton && mCLIROverUtPrecautions && mCLIRButton != null) { 146 if (isPrecaution) { 147 showWarningDialog(CW_WARNING_DIALOG); 148 if (mCLIRButton.isEnabled()) { 149 if (mPreferences.contains(mCLIRButton)) { 150 mPreferences.remove(mCLIRButton); 151 } 152 mCLIRButton.setEnabled(false); 153 } 154 } else { 155 if (!mPreferences.contains(mCLIRButton)) { 156 mCLIRButton.setEnabled(true); 157 mPreferences.add(mCLIRButton); 158 } 159 } 160 } 161 if (mShowCWButton && mCWOverUtPrecautions && mCWButton != null) { 162 if (isPrecaution) { 163 showWarningDialog(CALLER_ID_WARNING_DIALOG); 164 if (mCWButton.isEnabled()) { 165 if (mPreferences.contains(mCWButton)) { 166 mPreferences.remove(mCWButton); 167 } 168 mCWButton.setEnabled(false); 169 } 170 } else { 171 if (!mPreferences.contains(mCWButton)) { 172 mCWButton.setEnabled(true); 173 mPreferences.add(mCWButton); 174 } 175 } 176 } 177 178 if (indexOfStartInit < mPreferences.size()) { 179 mInitIndex = indexOfStartInit; 180 doPreferenceInit(indexOfStartInit); 181 } 182 } 183 184 @Override onSaveInstanceState(Bundle outState)185 protected void onSaveInstanceState(Bundle outState) { 186 super.onSaveInstanceState(outState); 187 188 if (mShowCLIRButton && mCLIRButton.clirArray != null) { 189 outState.putIntArray(mCLIRButton.getKey(), mCLIRButton.clirArray); 190 } 191 } 192 193 @Override onFinished(Preference preference, boolean reading)194 public void onFinished(Preference preference, boolean reading) { 195 if (mInitIndex < mPreferences.size()-1 && !isFinishing()) { 196 mInitIndex++; 197 doPreferenceInit(mInitIndex); 198 } 199 super.onFinished(preference, reading); 200 } 201 202 @Override onOptionsItemSelected(MenuItem item)203 public boolean onOptionsItemSelected(MenuItem item) { 204 final int itemId = item.getItemId(); 205 if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled() 206 CallFeaturesSetting.goUpToTopLevelSetting(this, mSubscriptionInfoHelper); 207 return true; 208 } 209 return super.onOptionsItemSelected(item); 210 } 211 doPreferenceInit(int index)212 private void doPreferenceInit(int index) { 213 if (mPreferences.size() > index) { 214 Preference pref = mPreferences.get(index); 215 if (pref instanceof CallWaitingSwitchPreference) { 216 ((CallWaitingSwitchPreference) pref).init(this, false, mPhone); 217 } else if (pref instanceof CLIRListPreference) { 218 ((CLIRListPreference) pref).init(this, false, mPhone); 219 } 220 } 221 } 222 223 @Override onCreateDialog(int id)224 protected Dialog onCreateDialog(int id) { 225 if (id == CW_WARNING_DIALOG) { 226 return SuppServicesUiUtil.showBlockingSuppServicesDialog(this, mPhone, BUTTON_CW_KEY); 227 } else if (id == CALLER_ID_WARNING_DIALOG) { 228 return SuppServicesUiUtil.showBlockingSuppServicesDialog(this, mPhone, BUTTON_CLIR_KEY); 229 } 230 return super.onCreateDialog(id); 231 } 232 showWarningDialog(int id)233 private void showWarningDialog(int id) { 234 showDialog(id); 235 } 236 dismissWarningDialog()237 private void dismissWarningDialog() { 238 dismissDialogSafely(CW_WARNING_DIALOG); 239 dismissDialogSafely(CALLER_ID_WARNING_DIALOG); 240 } 241 } 242