1 package com.android.cellbroadcastreceiver;
2 
3 import android.content.ContentProvider;
4 import android.content.ContentValues;
5 import android.content.SharedPreferences;
6 import android.database.Cursor;
7 import android.database.sqlite.SQLiteDatabase;
8 import android.database.sqlite.SQLiteOpenHelper;
9 import android.database.sqlite.SQLiteQueryBuilder;
10 import android.net.Uri;
11 import android.os.Bundle;
12 import android.preference.PreferenceManager;
13 import android.provider.Telephony;
14 import android.provider.Telephony.CellBroadcasts;
15 import android.util.Log;
16 import java.util.Arrays;
17 import java.util.List;
18 
19 /**
20  * Very limited subset of function which is only used to surfaces data.
21  */
22 public class LegacyCellBroadcastContentProvider extends ContentProvider {
23     // shared preference under developer settings
24     private static final String ENABLE_ALERT_MASTER_PREF = "enable_alerts_master_toggle";
25     // shared preference for alert reminder interval
26     private static final String ALERT_REMINDER_INTERVAL_PREF = "alert_reminder_interval";
27 
28     private static final String TAG = LegacyCellBroadcastContentProvider.class.getSimpleName();
29     /** A list of preference supported by legacy app **/
30     private static final List<String> PREF_KEYS = Arrays.asList(
31             CellBroadcasts.Preference.ENABLE_CMAS_AMBER_PREF,
32             CellBroadcasts.Preference.ENABLE_AREA_UPDATE_INFO_PREF,
33             CellBroadcasts.Preference.ENABLE_TEST_ALERT_PREF,
34             CellBroadcasts.Preference.ENABLE_STATE_LOCAL_TEST_PREF,
35             CellBroadcasts.Preference.ENABLE_PUBLIC_SAFETY_PREF,
36             CellBroadcasts.Preference.ENABLE_CMAS_SEVERE_THREAT_PREF,
37             CellBroadcasts.Preference.ENABLE_CMAS_EXTREME_THREAT_PREF,
38             CellBroadcasts.Preference.ENABLE_CMAS_PRESIDENTIAL_PREF,
39             CellBroadcasts.Preference.ENABLE_EMERGENCY_PERF,
40             CellBroadcasts.Preference.ENABLE_ALERT_VIBRATION_PREF,
41             CellBroadcasts.Preference.ENABLE_CMAS_IN_SECOND_LANGUAGE_PREF,
42             ENABLE_ALERT_MASTER_PREF,
43             ALERT_REMINDER_INTERVAL_PREF
44     );
45 
46     /** The database for this content provider. */
47     private SQLiteOpenHelper mOpenHelper;
48 
49     @Override
onCreate()50     public boolean onCreate() {
51         Log.d(TAG, "onCreate");
52         mOpenHelper = new CellBroadcastDatabaseHelper(getContext(), true);
53         return true;
54     }
55 
56     @Override
query(Uri uri, String[] projectionIn, String selection, String[] selectionArgs, String sortOrder)57     public Cursor query(Uri uri, String[] projectionIn, String selection,
58             String[] selectionArgs, String sortOrder) {
59         Log.d(TAG, "query:"
60                 + " uri=" + uri
61                 + " values=" + Arrays.toString(projectionIn)
62                 + " selection=" + selection
63                 + " selectionArgs=" + Arrays.toString(selectionArgs));
64 
65         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
66         qb.setTables(CellBroadcastDatabaseHelper.TABLE_NAME);
67         SQLiteDatabase db = mOpenHelper.getReadableDatabase();
68         Cursor c = qb.query(db, projectionIn, selection, selectionArgs, null, null, sortOrder);
69         Log.d(TAG, "query from legacy cellbroadcast, returned " + c.getCount() + " messages");
70         return c;
71     }
72 
73     @Override
call(String method, String name, Bundle args)74     public Bundle call(String method, String name, Bundle args) {
75         Log.d(TAG, "call:"
76                 + " method=" + method
77                 + " name=" + name
78                 + " args=" + args);
79         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
80         if (Telephony.CellBroadcasts.CALL_METHOD_GET_PREFERENCE.equals(method)) {
81             if (PREF_KEYS.contains(name)) {
82                 // if preference value does not exists, return null.
83                 if (sp != null && sp.contains(name)) {
84                     Bundle result = new Bundle();
85                     if (ALERT_REMINDER_INTERVAL_PREF.equals(name)) {
86                         result.putString(name, sp.getString(name, "0"));
87                     } else {
88                         result.putBoolean(name, sp.getBoolean(name, true));
89                     }
90                     Log.d(TAG, "migrate sharedpreference: " + name + " val: " + result.get(name));
91                     return result;
92                 }
93             } else {
94                 Log.e(TAG, "unsupported preference name" + name);
95             }
96         } else {
97             Log.e(TAG, "unsuppprted call method: " + method);
98         }
99         return null;
100     }
101 
102     @Override
getType(Uri uri)103     public String getType(Uri uri) {
104         Log.d(TAG, "getType");
105         return null;
106     }
107 
108     @Override
insert(Uri uri, ContentValues values)109     public Uri insert(Uri uri, ContentValues values) {
110         throw new UnsupportedOperationException("insert not supported");
111     }
112 
113     @Override
delete(Uri uri, String selection, String[] selectionArgs)114     public int delete(Uri uri, String selection, String[] selectionArgs) {
115         throw new UnsupportedOperationException("delete not supported");
116     }
117 
118     @Override
update(Uri uri, ContentValues values, String selection, String[] selectionArgs)119     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
120         throw new UnsupportedOperationException("update not supported");
121     }
122 }