1 /* 2 * Copyright (C) 2018 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 package com.android.internal.telephony; 17 18 19 import android.content.ContentUris; 20 import android.content.ContentValues; 21 import android.content.UriMatcher; 22 import android.database.Cursor; 23 import android.database.sqlite.SQLiteDatabase; 24 import android.database.sqlite.SQLiteOpenHelper; 25 import android.net.Uri; 26 import android.os.Bundle; 27 import android.os.UserHandle; 28 import android.provider.BaseColumns; 29 import android.provider.Telephony; 30 import android.telephony.SubscriptionManager; 31 import android.test.mock.MockContentProvider; 32 import android.util.Log; 33 34 import androidx.test.InstrumentationRegistry; 35 36 public class FakeTelephonyProvider extends MockContentProvider { 37 static final String TAG = "FakeTelephonyProvider"; 38 39 private InMemoryTelephonyProviderDbHelper mDbHelper = 40 new InMemoryTelephonyProviderDbHelper(); 41 42 /** 43 * An in memory DB. 44 */ 45 private class InMemoryTelephonyProviderDbHelper extends SQLiteOpenHelper { InMemoryTelephonyProviderDbHelper()46 InMemoryTelephonyProviderDbHelper() { 47 super(InstrumentationRegistry.getTargetContext(), 48 null, // db file name is null for in-memory db 49 null, // CursorFactory is null by default 50 1); // db version is no-op for tests 51 Log.d(TAG, "InMemoryTelephonyProviderDbHelper creating in-memory database"); 52 } 53 54 // This should always be consistent with TelephonyProvider#getStringForSimInfoTableCreation. getStringForSimInfoTableCreation(String tableName)55 private String getStringForSimInfoTableCreation(String tableName) { 56 return "CREATE TABLE " + tableName + "(" 57 + Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID 58 + " INTEGER PRIMARY KEY AUTOINCREMENT," 59 + Telephony.SimInfo.COLUMN_ICC_ID + " TEXT NOT NULL," 60 + Telephony.SimInfo.COLUMN_SIM_SLOT_INDEX 61 + " INTEGER DEFAULT " + Telephony.SimInfo.SIM_NOT_INSERTED + "," 62 + Telephony.SimInfo.COLUMN_DISPLAY_NAME + " TEXT," 63 + Telephony.SimInfo.COLUMN_CARRIER_NAME + " TEXT," 64 + Telephony.SimInfo.COLUMN_NAME_SOURCE 65 + " INTEGER DEFAULT " + Telephony.SimInfo.NAME_SOURCE_CARRIER_ID + "," 66 + Telephony.SimInfo.COLUMN_COLOR + " INTEGER DEFAULT " 67 + Telephony.SimInfo.COLOR_DEFAULT + "," 68 + Telephony.SimInfo.COLUMN_NUMBER + " TEXT," 69 + Telephony.SimInfo.COLUMN_DISPLAY_NUMBER_FORMAT 70 + " INTEGER NOT NULL DEFAULT " 71 + Telephony.SimInfo.DISPLAY_NUMBER_DEFAULT + "," 72 + Telephony.SimInfo.COLUMN_DATA_ROAMING 73 + " INTEGER DEFAULT " + Telephony.SimInfo.DATA_ROAMING_DISABLE + "," 74 + Telephony.SimInfo.COLUMN_MCC + " INTEGER DEFAULT 0," 75 + Telephony.SimInfo.COLUMN_MNC + " INTEGER DEFAULT 0," 76 + Telephony.SimInfo.COLUMN_MCC_STRING + " TEXT," 77 + Telephony.SimInfo.COLUMN_MNC_STRING + " TEXT," 78 + Telephony.SimInfo.COLUMN_EHPLMNS + " TEXT," 79 + Telephony.SimInfo.COLUMN_HPLMNS + " TEXT," 80 + Telephony.SimInfo.COLUMN_SIM_PROVISIONING_STATUS 81 + " INTEGER DEFAULT " + Telephony.SimInfo.SIM_PROVISIONED + "," 82 + Telephony.SimInfo.COLUMN_IS_EMBEDDED + " INTEGER DEFAULT 0," 83 + Telephony.SimInfo.COLUMN_CARD_ID + " TEXT NOT NULL," 84 + Telephony.SimInfo.COLUMN_ACCESS_RULES + " BLOB," 85 + Telephony.SimInfo.COLUMN_IS_REMOVABLE + " INTEGER DEFAULT 0," 86 + Telephony.SimInfo.COLUMN_CB_EXTREME_THREAT_ALERT + " INTEGER DEFAULT 1," 87 + Telephony.SimInfo.COLUMN_CB_SEVERE_THREAT_ALERT + " INTEGER DEFAULT 1," 88 + Telephony.SimInfo.COLUMN_CB_AMBER_ALERT + " INTEGER DEFAULT 1," 89 + Telephony.SimInfo.COLUMN_CB_EMERGENCY_ALERT + " INTEGER DEFAULT 1," 90 + Telephony.SimInfo.COLUMN_CB_ALERT_SOUND_DURATION + " INTEGER DEFAULT 4," 91 + Telephony.SimInfo.COLUMN_CB_ALERT_REMINDER_INTERVAL + " INTEGER DEFAULT 0," 92 + Telephony.SimInfo.COLUMN_CB_ALERT_VIBRATE + " INTEGER DEFAULT 1," 93 + Telephony.SimInfo.COLUMN_CB_ALERT_SPEECH + " INTEGER DEFAULT 1," 94 + Telephony.SimInfo.COLUMN_CB_ETWS_TEST_ALERT + " INTEGER DEFAULT 0," 95 + Telephony.SimInfo.COLUMN_CB_CHANNEL_50_ALERT + " INTEGER DEFAULT 1," 96 + Telephony.SimInfo.COLUMN_CB_CMAS_TEST_ALERT + " INTEGER DEFAULT 0," 97 + Telephony.SimInfo.COLUMN_CB_OPT_OUT_DIALOG + " INTEGER DEFAULT 1," 98 + Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED + " INTEGER DEFAULT -1," 99 + Telephony.SimInfo.COLUMN_VT_IMS_ENABLED + " INTEGER DEFAULT -1," 100 + Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED + " INTEGER DEFAULT -1," 101 + Telephony.SimInfo.COLUMN_WFC_IMS_MODE + " INTEGER DEFAULT -1," 102 + Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE + " INTEGER DEFAULT -1," 103 + Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_ENABLED + " INTEGER DEFAULT -1," 104 + Telephony.SimInfo.COLUMN_IS_OPPORTUNISTIC + " INTEGER DEFAULT 0," 105 + Telephony.SimInfo.COLUMN_GROUP_UUID + " TEXT," 106 + Telephony.SimInfo.COLUMN_IS_METERED + " INTEGER DEFAULT 1," 107 + Telephony.SimInfo.COLUMN_ISO_COUNTRY_CODE + " TEXT," 108 + Telephony.SimInfo.COLUMN_CARRIER_ID + " INTEGER DEFAULT -1," 109 + Telephony.SimInfo.COLUMN_PROFILE_CLASS 110 + " INTEGER DEFAULT " + Telephony.SimInfo.PROFILE_CLASS_UNSET + "," 111 + Telephony.SimInfo.COLUMN_SUBSCRIPTION_TYPE + " INTEGER DEFAULT 0," 112 + Telephony.SimInfo.COLUMN_GROUP_OWNER + " TEXT," 113 + Telephony.SimInfo.COLUMN_DATA_ENABLED_OVERRIDE_RULES + " TEXT," 114 + Telephony.SimInfo.COLUMN_IMSI + " TEXT," 115 + Telephony.SimInfo.COLUMN_ACCESS_RULES_FROM_CARRIER_CONFIGS + " BLOB," 116 + Telephony.SimInfo.COLUMN_UICC_APPLICATIONS_ENABLED + " INTEGER DEFAULT 1," 117 + Telephony.SimInfo.COLUMN_ALLOWED_NETWORK_TYPES + " BIGINT DEFAULT -1," 118 + Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED + " INTEGER DEFAULT 0, " 119 + Telephony.SimInfo.COLUMN_RCS_CONFIG + " BLOB," 120 + Telephony.SimInfo.COLUMN_ALLOWED_NETWORK_TYPES_FOR_REASONS + " TEXT," 121 + Telephony.SimInfo.COLUMN_D2D_STATUS_SHARING + " INTEGER DEFAULT 0," 122 + Telephony.SimInfo.COLUMN_D2D_STATUS_SHARING_SELECTED_CONTACTS + "TEXT," 123 + Telephony.SimInfo.COLUMN_NR_ADVANCED_CALLING_ENABLED + " INTEGER DEFAULT -1," 124 + Telephony.SimInfo.COLUMN_PORT_INDEX + " INTEGER DEFAULT -1," 125 + Telephony.SimInfo.COLUMN_USAGE_SETTING + " INTEGER DEFAULT " 126 + SubscriptionManager.USAGE_SETTING_UNKNOWN 127 + "," + Telephony.SimInfo.COLUMN_TP_MESSAGE_REF 128 + " INTEGER DEFAULT -1," 129 + Telephony.SimInfo.COLUMN_USER_HANDLE + " INTEGER DEFAULT " 130 + UserHandle.USER_NULL + "," 131 + Telephony.SimInfo.COLUMN_SATELLITE_ENABLED + " INTEGER DEFAULT 0," 132 + Telephony.SimInfo.COLUMN_SATELLITE_ATTACH_ENABLED_FOR_CARRIER 133 + " INTEGER DEFAULT 1, " 134 + Telephony.SimInfo.COLUMN_IS_ONLY_NTN + " INTEGER DEFAULT 0," 135 + Telephony.SimInfo.COLUMN_SERVICE_CAPABILITIES + " INTEGER DEFAULT 7," 136 + Telephony.SimInfo.COLUMN_TRANSFER_STATUS + " INTEGER DEFAULT 0," 137 + Telephony.SimInfo.COLUMN_SATELLITE_ENTITLEMENT_STATUS + " INTEGER DEFAULT 0," 138 + Telephony.SimInfo.COLUMN_SATELLITE_ENTITLEMENT_PLMNS + " TEXT," 139 + Telephony.SimInfo.COLUMN_SATELLITE_ESOS_SUPPORTED + " INTEGER DEFAULT 0," 140 + Telephony.SimInfo.COLUMN_IS_SATELLITE_PROVISIONED_FOR_NON_IP_DATAGRAM 141 + " INTEGER DEFAULT 0" 142 + ");"; 143 } 144 145 @Override onCreate(SQLiteDatabase db)146 public void onCreate(SQLiteDatabase db) { 147 // TODO: set up other tables when needed. 148 // set up the siminfo table 149 Log.d(TAG, "InMemoryTelephonyProviderDbHelper onCreate creating the siminfo table"); 150 db.execSQL(getStringForSimInfoTableCreation("siminfo")); 151 } 152 153 @Override onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)154 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 155 Log.d(TAG, "InMemoryTelephonyProviderDbHelper onUpgrade doing nothing"); 156 return; 157 } 158 } 159 160 @Override insert(Uri uri, ContentValues values)161 public Uri insert(Uri uri, ContentValues values) { 162 Log.d(TAG, "insert. values=" + values); 163 SQLiteDatabase db = mDbHelper.getWritableDatabase(); 164 long id = db.insert("siminfo", null, values); 165 return ContentUris.withAppendedId(Telephony.SimInfo.CONTENT_URI, id); 166 } 167 168 @Override delete(Uri url, String where, String[] whereArgs)169 public synchronized int delete(Uri url, String where, String[] whereArgs) { 170 return mDbHelper.getWritableDatabase().delete("siminfo", where, whereArgs); 171 } 172 173 @Override query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)174 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 175 String sortOrder) { 176 return mDbHelper.getReadableDatabase().query("siminfo", projection, selection, 177 selectionArgs, null, null, sortOrder); 178 } 179 180 @Override call(String method, String request, Bundle args)181 public Bundle call(String method, String request, Bundle args) { 182 return null; 183 } 184 185 @Override update(Uri uri, ContentValues values, String where, String[] selectionArgs)186 public final int update(Uri uri, ContentValues values, String where, String[] selectionArgs) { 187 // handle URI with appended subId 188 final int urlSimInfoSubId = 0; 189 UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); 190 matcher.addURI("telephony", "siminfo/#", urlSimInfoSubId); 191 if (matcher.match(uri) == urlSimInfoSubId) { 192 where = BaseColumns._ID + "=" + uri.getLastPathSegment(); 193 } 194 195 int count = mDbHelper.getWritableDatabase().update("siminfo", values, where, 196 selectionArgs); 197 return count; 198 } 199 200 /** 201 * Release resources. Must be called each time this class is used. 202 */ close()203 public void close() { 204 mDbHelper.close(); 205 } 206 } 207