1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 package com.android.phone;
19 
20 import android.os.Bundle;
21 import android.preference.CheckBoxPreference;
22 import android.preference.ListPreference;
23 import android.preference.Preference;
24 import android.preference.PreferenceScreen;
25 import android.preference.PreferenceActivity;
26 import com.android.internal.telephony.Phone;
27 import com.android.internal.telephony.RILConstants;
28 
29 import android.os.AsyncResult;
30 import android.os.Handler;
31 import android.os.Message;
32 import android.util.Log;
33 
34 
35 /**
36  * List of Phone-specific settings screens.
37  */
38 public class CellBroadcastSms extends PreferenceActivity
39         implements Preference.OnPreferenceChangeListener{
40     // debug data
41     private static final String LOG_TAG = "CellBroadcastSms";
42     private static final boolean DBG = false;
43 
44     //String keys for preference lookup
45     private static final String BUTTON_ENABLE_DISABLE_BC_SMS_KEY =
46         "button_enable_disable_cell_bc_sms";
47     private static final String LIST_LANGUAGE_KEY =
48         "list_language";
49     private static final String BUTTON_EMERGENCY_BROADCAST_KEY =
50         "button_emergency_broadcast";
51     private static final String BUTTON_ADMINISTRATIVE_KEY =
52         "button_administrative";
53     private static final String BUTTON_MAINTENANCE_KEY =
54         "button_maintenance";
55     private static final String BUTTON_LOCAL_WEATHER_KEY =
56         "button_local_weather";
57     private static final String BUTTON_ATR_KEY =
58         "button_atr";
59     private static final String BUTTON_LAFS_KEY =
60         "button_lafs";
61     private static final String BUTTON_RESTAURANTS_KEY =
62         "button_restaurants";
63     private static final String BUTTON_LODGINGS_KEY =
64         "button_lodgings";
65     private static final String BUTTON_RETAIL_DIRECTORY_KEY =
66         "button_retail_directory";
67     private static final String BUTTON_ADVERTISEMENTS_KEY =
68         "button_advertisements";
69     private static final String BUTTON_STOCK_QUOTES_KEY =
70         "button_stock_quotes";
71     private static final String BUTTON_EO_KEY =
72         "button_eo";
73     private static final String BUTTON_MHH_KEY =
74         "button_mhh";
75     private static final String BUTTON_TECHNOLOGY_NEWS_KEY =
76         "button_technology_news";
77     private static final String BUTTON_MULTI_CATEGORY_KEY =
78         "button_multi_category";
79 
80     private static final String BUTTON_LOCAL_GENERAL_NEWS_KEY =
81         "button_local_general_news";
82     private static final String BUTTON_REGIONAL_GENERAL_NEWS_KEY =
83         "button_regional_general_news";
84     private static final String BUTTON_NATIONAL_GENERAL_NEWS_KEY =
85         "button_national_general_news";
86     private static final String BUTTON_INTERNATIONAL_GENERAL_NEWS_KEY =
87         "button_international_general_news";
88 
89     private static final String BUTTON_LOCAL_BF_NEWS_KEY =
90         "button_local_bf_news";
91     private static final String BUTTON_REGIONAL_BF_NEWS_KEY =
92         "button_regional_bf_news";
93     private static final String BUTTON_NATIONAL_BF_NEWS_KEY =
94         "button_national_bf_news";
95     private static final String BUTTON_INTERNATIONAL_BF_NEWS_KEY =
96         "button_international_bf_news";
97 
98     private static final String BUTTON_LOCAL_SPORTS_NEWS_KEY =
99         "button_local_sports_news";
100     private static final String BUTTON_REGIONAL_SPORTS_NEWS_KEY =
101         "button_regional_sports_news";
102     private static final String BUTTON_NATIONAL_SPORTS_NEWS_KEY =
103         "button_national_sports_news";
104     private static final String BUTTON_INTERNATIONAL_SPORTS_NEWS_KEY =
105         "button_international_sports_news";
106 
107     private static final String BUTTON_LOCAL_ENTERTAINMENT_NEWS_KEY =
108         "button_local_entertainment_news";
109     private static final String BUTTON_REGIONAL_ENTERTAINMENT_NEWS_KEY =
110         "button_regional_entertainment_news";
111     private static final String BUTTON_NATIONAL_ENTERTAINMENT_NEWS_KEY =
112         "button_national_entertainment_news";
113     private static final String BUTTON_INTERNATIONAL_ENTERTAINMENT_NEWS_KEY =
114         "button_international_entertainment_news";
115 
116     //Class constants
117     //These values are related to the C structs. See the comments in  method
118     //setCbSmsConfig for more information.
119     private static final int NO_OF_SERVICE_CATEGORIES = 31;
120     private static final int NO_OF_INTS_STRUCT_1 = 3;
121     private static final int MAX_LENGTH_RESULT = NO_OF_SERVICE_CATEGORIES * NO_OF_INTS_STRUCT_1 + 1;
122     //Handler keys
123     private static final int MESSAGE_ACTIVATE_CB_SMS = 1;
124     private static final int MESSAGE_GET_CB_SMS_CONFIG = 2;
125     private static final int MESSAGE_SET_CB_SMS_CONFIG = 3;
126 
127     //UI objects
128     private CheckBoxPreference mButtonBcSms;
129 
130     private ListPreference mListLanguage;
131 
132     private CheckBoxPreference mButtonEmergencyBroadcast;
133     private CheckBoxPreference mButtonAdministrative;
134     private CheckBoxPreference mButtonMaintenance;
135     private CheckBoxPreference mButtonLocalWeather;
136     private CheckBoxPreference mButtonAtr;
137     private CheckBoxPreference mButtonLafs;
138     private CheckBoxPreference mButtonRestaurants;
139     private CheckBoxPreference mButtonLodgings;
140     private CheckBoxPreference mButtonRetailDirectory;
141     private CheckBoxPreference mButtonAdvertisements;
142     private CheckBoxPreference mButtonStockQuotes;
143     private CheckBoxPreference mButtonEo;
144     private CheckBoxPreference mButtonMhh;
145     private CheckBoxPreference mButtonTechnologyNews;
146     private CheckBoxPreference mButtonMultiCategory;
147 
148     private CheckBoxPreference mButtonLocal1;
149     private CheckBoxPreference mButtonRegional1;
150     private CheckBoxPreference mButtonNational1;
151     private CheckBoxPreference mButtonInternational1;
152 
153     private CheckBoxPreference mButtonLocal2;
154     private CheckBoxPreference mButtonRegional2;
155     private CheckBoxPreference mButtonNational2;
156     private CheckBoxPreference mButtonInternational2;
157 
158     private CheckBoxPreference mButtonLocal3;
159     private CheckBoxPreference mButtonRegional3;
160     private CheckBoxPreference mButtonNational3;
161     private CheckBoxPreference mButtonInternational3;
162 
163     private CheckBoxPreference mButtonLocal4;
164     private CheckBoxPreference mButtonRegional4;
165     private CheckBoxPreference mButtonNational4;
166     private CheckBoxPreference mButtonInternational4;
167 
168 
169     //Member variables
170     private Phone mPhone;
171     private MyHandler mHandler;
172 
173     /**
174      * Invoked on each preference click in this hierarchy, overrides
175      * PreferenceActivity's implementation.  Used to make sure we track the
176      * preference click events.
177      */
178     @Override
onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)179     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
180             Preference preference) {
181         if (preference == mButtonBcSms) {
182             if (DBG) Log.d(LOG_TAG, "onPreferenceTreeClick: preference == mButtonBcSms.");
183             if(mButtonBcSms.isChecked()) {
184                 mPhone.activateCellBroadcastSms(RILConstants.CDMA_CELL_BROADCAST_SMS_ENABLED,
185                         Message.obtain(mHandler, MESSAGE_ACTIVATE_CB_SMS));
186                 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
187                         android.provider.Settings.Global.CDMA_CELL_BROADCAST_SMS,
188                         RILConstants.CDMA_CELL_BROADCAST_SMS_ENABLED);
189                 enableDisableAllCbConfigButtons(true);
190             } else {
191                 mPhone.activateCellBroadcastSms(RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED,
192                         Message.obtain(mHandler, MESSAGE_ACTIVATE_CB_SMS));
193                 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
194                         android.provider.Settings.Global.CDMA_CELL_BROADCAST_SMS,
195                         RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
196                 enableDisableAllCbConfigButtons(false);
197             }
198         } else if (preference == mListLanguage) {
199             //Do nothing here, because this click will be handled in onPreferenceChange
200         } else if (preference == mButtonEmergencyBroadcast) {
201             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
202                     mButtonEmergencyBroadcast.isChecked(), 1);
203             CellBroadcastSmsConfig.setCbSmsBSelectedValue(
204                     mButtonEmergencyBroadcast.isChecked(), 1);
205         } else if (preference == mButtonAdministrative) {
206             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
207                     mButtonAdministrative.isChecked(), 2);
208             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonAdministrative.isChecked(), 2);
209         } else if (preference == mButtonMaintenance) {
210             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
211                     mButtonMaintenance.isChecked(), 3);
212             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonMaintenance.isChecked(), 3);
213         } else if (preference == mButtonLocalWeather) {
214             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
215                     mButtonLocalWeather.isChecked(), 20);
216             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocalWeather.isChecked(), 20);
217         } else if (preference == mButtonAtr) {
218             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonAtr.isChecked(), 21);
219             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonAtr.isChecked(), 21);
220         } else if (preference == mButtonLafs) {
221             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLafs.isChecked(), 22);
222             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLafs.isChecked(), 22);
223         } else if (preference == mButtonRestaurants) {
224             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
225                     mButtonRestaurants.isChecked(), 23);
226             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRestaurants.isChecked(), 23);
227         } else if (preference == mButtonLodgings) {
228             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLodgings.isChecked(), 24);
229             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLodgings.isChecked(), 24);
230         } else if (preference == mButtonRetailDirectory) {
231             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
232                     mButtonRetailDirectory.isChecked(), 25);
233             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRetailDirectory.isChecked(), 25);
234         } else if (preference == mButtonAdvertisements) {
235             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
236                     mButtonAdvertisements.isChecked(), 26);
237             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonAdvertisements.isChecked(), 26);
238         } else if (preference == mButtonStockQuotes) {
239             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
240                     mButtonStockQuotes.isChecked(), 27);
241             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonStockQuotes.isChecked(), 27);
242         } else if (preference == mButtonEo) {
243             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonEo.isChecked(), 28);
244             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonEo.isChecked(), 28);
245         } else if (preference == mButtonMhh) {
246             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonMhh.isChecked(), 29);
247             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonMhh.isChecked(), 29);
248         } else if (preference == mButtonTechnologyNews) {
249             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
250                     mButtonTechnologyNews.isChecked(), 30);
251             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonTechnologyNews.isChecked(), 30);
252         } else if (preference == mButtonMultiCategory) {
253             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
254                     mButtonMultiCategory.isChecked(), 31);
255             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonMultiCategory.isChecked(), 31);
256         } else if (preference == mButtonLocal1) {
257             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal1.isChecked(), 4);
258             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal1.isChecked(), 4);
259         } else if (preference == mButtonRegional1) {
260             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
261                     mButtonRegional1.isChecked(), 5);
262             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional1.isChecked(), 5);
263         } else if (preference == mButtonNational1) {
264             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
265                     mButtonNational1.isChecked(), 6);
266             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational1.isChecked(), 6);
267         } else if (preference == mButtonInternational1) {
268             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
269                     mButtonInternational1.isChecked(), 7);
270             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational1.isChecked(), 7);
271         } else if (preference == mButtonLocal2) {
272             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal2.isChecked(), 8);
273             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal2.isChecked(), 8);
274         } else if (preference == mButtonRegional2) {
275             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
276                     mButtonRegional2.isChecked(), 9);
277             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional2.isChecked(), 9);
278         } else if (preference == mButtonNational2) {
279             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
280                     mButtonNational2.isChecked(), 10);
281             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational2.isChecked(), 10);
282         } else if (preference == mButtonInternational2) {
283             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
284                     mButtonInternational2.isChecked(), 11);
285             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational2.isChecked(), 11);
286         } else if (preference == mButtonLocal3) {
287             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal3.isChecked(), 12);
288             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal3.isChecked(), 12);
289         } else if (preference == mButtonRegional3) {
290             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
291                     mButtonRegional3.isChecked(), 13);
292             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional3.isChecked(), 13);
293         } else if (preference == mButtonNational3) {
294             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
295                     mButtonNational3.isChecked(), 14);
296             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational3.isChecked(), 14);
297         } else if (preference == mButtonInternational3) {
298             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
299                     mButtonInternational3.isChecked(), 15);
300             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational3.isChecked(), 15);
301         } else if (preference == mButtonLocal4) {
302             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal4.isChecked(), 16);
303             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal4.isChecked(), 16);
304         } else if (preference == mButtonRegional4) {
305             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
306                     mButtonRegional4.isChecked(), 17);
307             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional4.isChecked(), 17);
308         } else if (preference == mButtonNational4) {
309             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
310                     mButtonNational4.isChecked(), 18);
311             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational4.isChecked(), 18);
312         } else if (preference == mButtonInternational4) {
313             CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
314                     mButtonInternational4.isChecked(), 19);
315             CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational4.isChecked(), 19);
316         } else {
317             preferenceScreen.setEnabled(false);
318             return false;
319         }
320 
321         return true;
322     }
323 
onPreferenceChange(Preference preference, Object objValue)324     public boolean onPreferenceChange(Preference preference, Object objValue) {
325         if (preference == mListLanguage) {
326             // set the new language to the array which will be transmitted later
327             CellBroadcastSmsConfig.setConfigDataCompleteLanguage(
328                     mListLanguage.findIndexOfValue((String) objValue) + 1);
329         }
330 
331         // always let the preference setting proceed.
332         return true;
333     }
334 
onCreate(Bundle icicle)335     public void onCreate(Bundle icicle) {
336         super.onCreate(icicle);
337 
338         addPreferencesFromResource(R.xml.cell_broadcast_sms);
339 
340         mPhone = PhoneGlobals.getPhone();
341         mHandler = new MyHandler();
342 
343         PreferenceScreen prefSet = getPreferenceScreen();
344 
345         mButtonBcSms = (CheckBoxPreference) prefSet.findPreference(
346                 BUTTON_ENABLE_DISABLE_BC_SMS_KEY);
347         mListLanguage = (ListPreference) prefSet.findPreference(
348                 LIST_LANGUAGE_KEY);
349         // set the listener for the language list preference
350         mListLanguage.setOnPreferenceChangeListener(this);
351         mButtonEmergencyBroadcast = (CheckBoxPreference) prefSet.findPreference(
352                 BUTTON_EMERGENCY_BROADCAST_KEY);
353         mButtonAdministrative = (CheckBoxPreference) prefSet.findPreference(
354                 BUTTON_ADMINISTRATIVE_KEY);
355         mButtonMaintenance = (CheckBoxPreference) prefSet.findPreference(
356                 BUTTON_MAINTENANCE_KEY);
357         mButtonLocalWeather = (CheckBoxPreference) prefSet.findPreference(
358                 BUTTON_LOCAL_WEATHER_KEY);
359         mButtonAtr = (CheckBoxPreference) prefSet.findPreference(
360                 BUTTON_ATR_KEY);
361         mButtonLafs = (CheckBoxPreference) prefSet.findPreference(
362                 BUTTON_LAFS_KEY);
363         mButtonRestaurants = (CheckBoxPreference) prefSet.findPreference(
364                 BUTTON_RESTAURANTS_KEY);
365         mButtonLodgings = (CheckBoxPreference) prefSet.findPreference(
366                 BUTTON_LODGINGS_KEY);
367         mButtonRetailDirectory = (CheckBoxPreference) prefSet.findPreference(
368                 BUTTON_RETAIL_DIRECTORY_KEY);
369         mButtonAdvertisements = (CheckBoxPreference) prefSet.findPreference(
370                 BUTTON_ADVERTISEMENTS_KEY);
371         mButtonStockQuotes = (CheckBoxPreference) prefSet.findPreference(
372                 BUTTON_STOCK_QUOTES_KEY);
373         mButtonEo = (CheckBoxPreference) prefSet.findPreference(
374                 BUTTON_EO_KEY);
375         mButtonMhh = (CheckBoxPreference) prefSet.findPreference(
376                 BUTTON_MHH_KEY);
377         mButtonTechnologyNews = (CheckBoxPreference) prefSet.findPreference(
378                 BUTTON_TECHNOLOGY_NEWS_KEY);
379         mButtonMultiCategory = (CheckBoxPreference) prefSet.findPreference(
380                 BUTTON_MULTI_CATEGORY_KEY);
381 
382         mButtonLocal1 = (CheckBoxPreference) prefSet.findPreference(
383                 BUTTON_LOCAL_GENERAL_NEWS_KEY);
384         mButtonRegional1 = (CheckBoxPreference) prefSet.findPreference(
385                 BUTTON_REGIONAL_GENERAL_NEWS_KEY);
386         mButtonNational1 = (CheckBoxPreference) prefSet.findPreference(
387                 BUTTON_NATIONAL_GENERAL_NEWS_KEY);
388         mButtonInternational1 = (CheckBoxPreference) prefSet.findPreference(
389                 BUTTON_INTERNATIONAL_GENERAL_NEWS_KEY);
390 
391         mButtonLocal2 = (CheckBoxPreference) prefSet.findPreference(
392                 BUTTON_LOCAL_BF_NEWS_KEY);
393         mButtonRegional2 = (CheckBoxPreference) prefSet.findPreference(
394                 BUTTON_REGIONAL_BF_NEWS_KEY);
395         mButtonNational2 = (CheckBoxPreference) prefSet.findPreference(
396                 BUTTON_NATIONAL_BF_NEWS_KEY);
397         mButtonInternational2 = (CheckBoxPreference) prefSet.findPreference(
398                 BUTTON_INTERNATIONAL_BF_NEWS_KEY);
399 
400         mButtonLocal3 = (CheckBoxPreference) prefSet.findPreference(
401                 BUTTON_LOCAL_SPORTS_NEWS_KEY);
402         mButtonRegional3 = (CheckBoxPreference) prefSet.findPreference(
403                 BUTTON_REGIONAL_SPORTS_NEWS_KEY);
404         mButtonNational3 = (CheckBoxPreference) prefSet.findPreference(
405                 BUTTON_NATIONAL_SPORTS_NEWS_KEY);
406         mButtonInternational3 = (CheckBoxPreference) prefSet.findPreference(
407                 BUTTON_INTERNATIONAL_SPORTS_NEWS_KEY);
408 
409         mButtonLocal4 = (CheckBoxPreference) prefSet.findPreference(
410                 BUTTON_LOCAL_ENTERTAINMENT_NEWS_KEY);
411         mButtonRegional4 = (CheckBoxPreference) prefSet.findPreference(
412                 BUTTON_REGIONAL_ENTERTAINMENT_NEWS_KEY);
413         mButtonNational4 = (CheckBoxPreference) prefSet.findPreference(
414                 BUTTON_NATIONAL_ENTERTAINMENT_NEWS_KEY);
415         mButtonInternational4 = (CheckBoxPreference) prefSet.findPreference(
416                 BUTTON_INTERNATIONAL_ENTERTAINMENT_NEWS_KEY);
417     }
418 
419     @Override
onResume()420     protected void onResume() {
421         super.onResume();
422 
423         getPreferenceScreen().setEnabled(true);
424 
425         int settingCbSms = android.provider.Settings.Global.getInt(
426                 mPhone.getContext().getContentResolver(),
427                 android.provider.Settings.Global.CDMA_CELL_BROADCAST_SMS,
428                 RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
429         mButtonBcSms.setChecked(settingCbSms == RILConstants.CDMA_CELL_BROADCAST_SMS_ENABLED);
430 
431         if(mButtonBcSms.isChecked()) {
432             enableDisableAllCbConfigButtons(true);
433         } else {
434             enableDisableAllCbConfigButtons(false);
435         }
436 
437         mPhone.getCellBroadcastSmsConfig(Message.obtain(mHandler, MESSAGE_GET_CB_SMS_CONFIG));
438     }
439 
440     @Override
onPause()441     protected void onPause() {
442         super.onPause();
443 
444             CellBroadcastSmsConfig.setCbSmsNoOfStructs(NO_OF_SERVICE_CATEGORIES);
445 
446             mPhone.setCellBroadcastSmsConfig(CellBroadcastSmsConfig.getCbSmsAllValues(),
447                     Message.obtain(mHandler, MESSAGE_SET_CB_SMS_CONFIG));
448         }
449 
enableDisableAllCbConfigButtons(boolean enable)450     private void enableDisableAllCbConfigButtons(boolean enable) {
451         mButtonEmergencyBroadcast.setEnabled(enable);
452         mListLanguage.setEnabled(enable);
453         mButtonAdministrative.setEnabled(enable);
454         mButtonMaintenance.setEnabled(enable);
455         mButtonLocalWeather.setEnabled(enable);
456         mButtonAtr.setEnabled(enable);
457         mButtonLafs.setEnabled(enable);
458         mButtonRestaurants.setEnabled(enable);
459         mButtonLodgings.setEnabled(enable);
460         mButtonRetailDirectory.setEnabled(enable);
461         mButtonAdvertisements.setEnabled(enable);
462         mButtonStockQuotes.setEnabled(enable);
463         mButtonEo.setEnabled(enable);
464         mButtonMhh.setEnabled(enable);
465         mButtonTechnologyNews.setEnabled(enable);
466         mButtonMultiCategory.setEnabled(enable);
467 
468         mButtonLocal1.setEnabled(enable);
469         mButtonRegional1.setEnabled(enable);
470         mButtonNational1.setEnabled(enable);
471         mButtonInternational1.setEnabled(enable);
472 
473         mButtonLocal2.setEnabled(enable);
474         mButtonRegional2.setEnabled(enable);
475         mButtonNational2.setEnabled(enable);
476         mButtonInternational2.setEnabled(enable);
477 
478         mButtonLocal3.setEnabled(enable);
479         mButtonRegional3.setEnabled(enable);
480         mButtonNational3.setEnabled(enable);
481         mButtonInternational3.setEnabled(enable);
482 
483         mButtonLocal4.setEnabled(enable);
484         mButtonRegional4.setEnabled(enable);
485         mButtonNational4.setEnabled(enable);
486         mButtonInternational4.setEnabled(enable);
487     }
488 
setAllCbConfigButtons(int[] configArray)489     private void setAllCbConfigButtons(int[] configArray) {
490         //These buttons are in a well defined sequence. If you want to change it,
491         //be sure to map the buttons to their corresponding slot in the configArray !
492         mButtonEmergencyBroadcast.setChecked(configArray[1] != 0);
493         //subtract 1, because the values are handled in an array which starts with 0 and not with 1
494         mListLanguage.setValueIndex(CellBroadcastSmsConfig.getConfigDataLanguage() - 1);
495         mButtonAdministrative.setChecked(configArray[2] != 0);
496         mButtonMaintenance.setChecked(configArray[3] != 0);
497         mButtonLocalWeather.setChecked(configArray[20] != 0);
498         mButtonAtr.setChecked(configArray[21] != 0);
499         mButtonLafs.setChecked(configArray[22] != 0);
500         mButtonRestaurants.setChecked(configArray[23] != 0);
501         mButtonLodgings.setChecked(configArray[24] != 0);
502         mButtonRetailDirectory.setChecked(configArray[25] != 0);
503         mButtonAdvertisements.setChecked(configArray[26] != 0);
504         mButtonStockQuotes.setChecked(configArray[27] != 0);
505         mButtonEo.setChecked(configArray[28] != 0);
506         mButtonMhh.setChecked(configArray[29] != 0);
507         mButtonTechnologyNews.setChecked(configArray[30] != 0);
508         mButtonMultiCategory.setChecked(configArray[31] != 0);
509 
510         mButtonLocal1.setChecked(configArray[4] != 0);
511         mButtonRegional1.setChecked(configArray[5] != 0);
512         mButtonNational1.setChecked(configArray[6] != 0);
513         mButtonInternational1.setChecked(configArray[7] != 0);
514 
515         mButtonLocal2.setChecked(configArray[8] != 0);
516         mButtonRegional2.setChecked(configArray[9] != 0);
517         mButtonNational2.setChecked(configArray[10] != 0);
518         mButtonInternational2.setChecked(configArray[11] != 0);
519 
520         mButtonLocal3.setChecked(configArray[12] != 0);
521         mButtonRegional3.setChecked(configArray[13] != 0);
522         mButtonNational3.setChecked(configArray[14] != 0);
523         mButtonInternational3.setChecked(configArray[15] != 0);
524 
525         mButtonLocal4.setChecked(configArray[16] != 0);
526         mButtonRegional4.setChecked(configArray[17] != 0);
527         mButtonNational4.setChecked(configArray[18] != 0);
528         mButtonInternational4.setChecked(configArray[19] != 0);
529     }
530 
531     private class MyHandler extends Handler {
532 
533         @Override
handleMessage(Message msg)534         public void handleMessage(Message msg) {
535             switch (msg.what) {
536             case MESSAGE_ACTIVATE_CB_SMS:
537                 //Only a log message here, because the received response is always null
538                 if (DBG) Log.d(LOG_TAG, "Cell Broadcast SMS enabled/disabled.");
539                 break;
540             case MESSAGE_GET_CB_SMS_CONFIG:
541                 int result[] = (int[])((AsyncResult)msg.obj).result;
542 
543                 // check if the actual service categoties table size on the NV is '0'
544                 if (result[0] == 0) {
545                     result[0] = NO_OF_SERVICE_CATEGORIES;
546 
547                     mButtonBcSms.setChecked(false);
548                     mPhone.activateCellBroadcastSms(RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED,
549                             Message.obtain(mHandler, MESSAGE_ACTIVATE_CB_SMS));
550                     android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
551                             android.provider.Settings.Global.CDMA_CELL_BROADCAST_SMS,
552                             RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
553                     enableDisableAllCbConfigButtons(false);
554                 }
555 
556                 CellBroadcastSmsConfig.setCbSmsConfig(result);
557                 setAllCbConfigButtons(CellBroadcastSmsConfig.getCbSmsBselectedValues());
558 
559                 break;
560             case MESSAGE_SET_CB_SMS_CONFIG:
561                 //Only a log message here, because the received response is always null
562                 if (DBG) Log.d(LOG_TAG, "Set Cell Broadcast SMS values.");
563                 break;
564             default:
565                 Log.e(LOG_TAG, "Error! Unhandled message in CellBroadcastSms.java. Message: "
566                         + msg.what);
567             break;
568             }
569         }
570     }
571 
572     private static final class CellBroadcastSmsConfig {
573 
574         //The values in this array are stored in a particular order. This order
575         //is calculated in the setCbSmsConfig method of this class.
576         //For more information see comments below...
577         //NO_OF_SERVICE_CATEGORIES +1 is used, because we will leave the first array entry 0
578         private static int mBSelected[] = new int[NO_OF_SERVICE_CATEGORIES + 1];
579         private static int mConfigDataComplete[] = new int[MAX_LENGTH_RESULT];
580 
setCbSmsConfig(int[] configData)581         private static void setCbSmsConfig(int[] configData) {
582             if(configData == null) {
583                 Log.e(LOG_TAG, "Error! No cell broadcast service categories returned.");
584                 return;
585             }
586 
587             if(configData[0] > MAX_LENGTH_RESULT) {
588                 Log.e(LOG_TAG, "Error! Wrong number of service categories returned from RIL");
589                 return;
590             }
591 
592             //The required config values for broadcast SMS are stored in a C struct:
593             //
594             //  typedef struct {
595             //      int size;
596             //      RIL_CDMA_BcServiceInfo *entries;
597             //  } RIL_CDMA_BcSMSConfig;
598             //
599             //  typedef struct {
600             //      int uServiceCategory;
601             //      int uLanguage;
602             //      unsigned char bSelected;
603             //  } RIL_CDMA_BcServiceInfo;
604             //
605             // This means, that we have to ignore the first value and check every
606             // 3rd value starting with the 2nd of all. This value indicates, where we
607             // will store the appropriate bSelected value, which is 2 values behind it.
608             for(int i = 1; i < configData.length; i += NO_OF_INTS_STRUCT_1) {
609                 mBSelected[configData[i]] = configData[i +2];
610             }
611 
612             //Store all values in an extra array
613             mConfigDataComplete = configData;
614         }
615 
setCbSmsBSelectedValue(boolean value, int pos)616         private static void setCbSmsBSelectedValue(boolean value, int pos) {
617             if(pos < mBSelected.length) {
618                 mBSelected[pos] = (value == true ? 1 : 0);
619             } else {
620                 Log.e(LOG_TAG,"Error! Invalid value position.");
621             }
622         }
623 
getCbSmsBselectedValues()624         private static int[] getCbSmsBselectedValues() {
625             return(mBSelected);
626         }
627 
628         // TODO: Change the return value to a RIL_BroadcastSMSConfig
getCbSmsAllValues()629         private static int[] getCbSmsAllValues() {
630             return(mConfigDataComplete);
631         }
632 
setCbSmsNoOfStructs(int value)633         private static void setCbSmsNoOfStructs(int value) {
634             //Sets the size parameter, which contains the number of structs
635             //that will be transmitted
636             mConfigDataComplete[0] = value;
637         }
638 
setConfigDataCompleteBSelected(boolean value, int serviceCategory)639         private static void setConfigDataCompleteBSelected(boolean value, int serviceCategory) {
640             //Sets the bSelected value for a specific serviceCategory
641             for(int i = 1; i < mConfigDataComplete.length; i += NO_OF_INTS_STRUCT_1) {
642                 if(mConfigDataComplete[i] == serviceCategory) {
643                     mConfigDataComplete[i + 2] = value == true ? 1 : 0;
644                     break;
645                 }
646             }
647         }
648 
setConfigDataCompleteLanguage(int language)649         private static void setConfigDataCompleteLanguage(int language) {
650             //It is only possible to set the same language for all entries
651             for(int i = 2; i < mConfigDataComplete.length; i += NO_OF_INTS_STRUCT_1) {
652                 mConfigDataComplete[i] = language;
653             }
654         }
655 
getConfigDataLanguage()656         private static int getConfigDataLanguage() {
657             int language = mConfigDataComplete[2];
658             //2 is the language value of the first entry
659             //It is only possible to set the same language for all entries
660             if (language < 1 || language > 7) {
661                 Log.e(LOG_TAG, "Error! Wrong language returned from RIL...defaulting to 1, english");
662                 return 1;
663             }
664             else {
665                 return language;
666             }
667         }
668     }
669 }
670