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 17package com.android.cellbroadcastreceiver; 18 19import android.content.Context; 20import android.content.res.Resources; 21import android.database.Cursor; 22import android.database.MatrixCursor; 23import android.provider.SearchIndexableResource; 24import android.provider.SearchIndexablesProvider; 25import android.provider.Settings; 26import android.telephony.SubscriptionManager; 27import android.telephony.TelephonyManager; 28 29import static android.provider.SearchIndexablesContract.COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE; 30import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_RANK; 31import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_RESID; 32import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_CLASS_NAME; 33import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_ICON_RESID; 34import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_ACTION; 35import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_TARGET_PACKAGE; 36import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_TARGET_CLASS; 37 38import static android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS; 39import static android.provider.SearchIndexablesContract.INDEXABLES_XML_RES_COLUMNS; 40import static android.provider.SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS; 41 42public 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 51 public boolean onCreate() { 52 return true; 53 } 54 55 @Override 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 74 public Cursor queryRawData(String[] projection) { 75 MatrixCursor cursor = new MatrixCursor(INDEXABLES_RAW_COLUMNS); 76 return cursor; 77 } 78 79 @Override 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_ENABLE_ALERT_SPEECH; 103 cursor.addRow(ref); 104 105 // Remove ETWS preference category. 106 ref = new Object[1]; 107 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 108 CellBroadcastSettings.KEY_CATEGORY_ETWS_SETTINGS; 109 cursor.addRow(ref); 110 } 111 112 if (!res.getBoolean(R.bool.show_cmas_settings)) { 113 // Remove CMAS preference items in emergency alert category. 114 ref = new Object[1]; 115 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 116 CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS; 117 cursor.addRow(ref); 118 119 ref = new Object[1]; 120 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 121 CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_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_AMBER_ALERTS; 127 cursor.addRow(ref); 128 } 129 130 TelephonyManager tm = (TelephonyManager) getContext().getSystemService( 131 Context.TELEPHONY_SERVICE); 132 133 int subId = SubscriptionManager.getDefaultSmsSubscriptionId(); 134 if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { 135 subId = SubscriptionManager.getDefaultSubscriptionId(); 136 } 137 138 boolean enableChannel50Support = res.getBoolean(R.bool.show_brazil_settings) || 139 "br".equals(tm.getSimCountryIso(subId)); 140 141 if (!enableChannel50Support) { 142 ref = new Object[1]; 143 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 144 CellBroadcastSettings.KEY_CATEGORY_BRAZIL_SETTINGS; 145 cursor.addRow(ref); 146 } 147 148 if (!enableDevSettings) { 149 ref = new Object[1]; 150 ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = 151 CellBroadcastSettings.KEY_CATEGORY_DEV_SETTINGS; 152 cursor.addRow(ref); 153 } 154 155 return cursor; 156 } 157} 158