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