1 /* 2 * Copyright (C) 2014 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 package com.android.cellbroadcastreceiver; 18 19 import android.content.Context; 20 import android.content.res.Resources; 21 import android.database.Cursor; 22 import android.database.MatrixCursor; 23 import android.provider.SearchIndexableResource; 24 import android.provider.SearchIndexablesProvider; 25 import android.provider.Settings; 26 import android.telephony.SubscriptionManager; 27 import android.telephony.TelephonyManager; 28 29 import static android.provider.SearchIndexablesContract.COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE; 30 import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_RANK; 31 import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_RESID; 32 import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_CLASS_NAME; 33 import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_ICON_RESID; 34 import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_ACTION; 35 import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_TARGET_PACKAGE; 36 import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_TARGET_CLASS; 37 38 import static android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS; 39 import static android.provider.SearchIndexablesContract.INDEXABLES_XML_RES_COLUMNS; 40 import static android.provider.SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS; 41 42 public class CellBroadcastSearchIndexableProvider extends SearchIndexablesProvider { 43 private static final String TAG = "CellBroadcastSearchIndexableProvider"; 44 45 private static SearchIndexableResource[] INDEXABLE_RES = new SearchIndexableResource[] { 46 new SearchIndexableResource(1, R.xml.preferences, 47 CellBroadcastSettings.class.getName(), 48 R.mipmap.ic_launcher_cell_broadcast), 49 }; 50 @Override onCreate()51 public boolean onCreate() { 52 return true; 53 } 54 55 @Override queryXmlResources(String[] projection)56 public Cursor queryXmlResources(String[] projection) { 57 MatrixCursor cursor = new MatrixCursor(INDEXABLES_XML_RES_COLUMNS); 58 final int count = INDEXABLE_RES.length; 59 for (int n = 0; n < count; n++) { 60 Object[] ref = new Object[7]; 61 ref[COLUMN_INDEX_XML_RES_RANK] = INDEXABLE_RES[n].rank; 62 ref[COLUMN_INDEX_XML_RES_RESID] = INDEXABLE_RES[n].xmlResId; 63 ref[COLUMN_INDEX_XML_RES_CLASS_NAME] = null; 64 ref[COLUMN_INDEX_XML_RES_ICON_RESID] = INDEXABLE_RES[n].iconResId; 65 ref[COLUMN_INDEX_XML_RES_INTENT_ACTION] = "android.intent.action.MAIN"; 66 ref[COLUMN_INDEX_XML_RES_INTENT_TARGET_PACKAGE] = "com.android.cellbroadcastreceiver"; 67 ref[COLUMN_INDEX_XML_RES_INTENT_TARGET_CLASS] = INDEXABLE_RES[n].className; 68 cursor.addRow(ref); 69 } 70 return cursor; 71 } 72 73 @Override queryRawData(String[] projection)74 public Cursor queryRawData(String[] projection) { 75 MatrixCursor cursor = new MatrixCursor(INDEXABLES_RAW_COLUMNS); 76 return cursor; 77 } 78 79 @Override queryNonIndexableKeys(String[] projection)80 public Cursor queryNonIndexableKeys(String[] projection) { 81 MatrixCursor cursor = new MatrixCursor(NON_INDEXABLES_KEYS_COLUMNS); 82 83 // Show extra settings when developer options is enabled in settings. 84 boolean enableDevSettings = Settings.Global.getInt(getContext().getContentResolver(), 85 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; 86 87 Resources res = getContext().getResources(); 88 boolean showEtwsSettings = res.getBoolean(R.bool.show_etws_settings); 89 90 Object[] ref; 91 92 // Show alert settings and ETWS categories for ETWS builds and developer mode. 93 if (!enableDevSettings && !showEtwsSettings) { 94 // Remove general emergency alert preference items (not shown for CMAS builds). 95 ref = new Object[1]; 96 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 97 CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS; 98 cursor.addRow(ref); 99 100 ref = new Object[1]; 101 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 102 CellBroadcastSettings.KEY_ALERT_SOUND_DURATION; 103 cursor.addRow(ref); 104 105 ref = new Object[1]; 106 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 107 CellBroadcastSettings.KEY_ENABLE_ALERT_SPEECH; 108 cursor.addRow(ref); 109 110 // Remove ETWS preference category. 111 ref = new Object[1]; 112 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 113 CellBroadcastSettings.KEY_CATEGORY_ETWS_SETTINGS; 114 cursor.addRow(ref); 115 } 116 117 if (!res.getBoolean(R.bool.show_cmas_settings)) { 118 // Remove CMAS preference items in emergency alert category. 119 ref = new Object[1]; 120 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 121 CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS; 122 cursor.addRow(ref); 123 124 ref = new Object[1]; 125 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 126 CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS; 127 cursor.addRow(ref); 128 129 ref = new Object[1]; 130 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 131 CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS; 132 cursor.addRow(ref); 133 } 134 135 TelephonyManager tm = (TelephonyManager) getContext().getSystemService( 136 Context.TELEPHONY_SERVICE); 137 138 int subId = SubscriptionManager.getDefaultSmsSubscriptionId(); 139 if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { 140 subId = SubscriptionManager.getDefaultSubscriptionId(); 141 } 142 143 boolean enableChannel50Support = res.getBoolean(R.bool.show_brazil_settings) || 144 "br".equals(tm.getSimCountryIso(subId)); 145 146 if (!enableChannel50Support) { 147 ref = new Object[1]; 148 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 149 CellBroadcastSettings.KEY_CATEGORY_BRAZIL_SETTINGS; 150 cursor.addRow(ref); 151 } 152 153 if (!enableDevSettings) { 154 ref = new Object[1]; 155 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 156 CellBroadcastSettings.KEY_CATEGORY_DEV_SETTINGS; 157 cursor.addRow(ref); 158 } 159 160 return cursor; 161 } 162 } 163