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 }