1a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor/* 2a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * Copyright (C) 2008 Esmertec AG. 3a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * Copyright (C) 2008 The Android Open Source Project 4a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * 5a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * Licensed under the Apache License, Version 2.0 (the "License"); 6a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * you may not use this file except in compliance with the License. 7a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * You may obtain a copy of the License at 8a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * 9a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * http://www.apache.org/licenses/LICENSE-2.0 10a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * 11a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * Unless required by applicable law or agreed to in writing, software 12a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * distributed under the License is distributed on an "AS IS" BASIS, 13a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * See the License for the specific language governing permissions and 15a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor * limitations under the License. 16a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor */ 17a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 18a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorpackage com.google.android.mms.util; 19a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 20a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.app.ActivityManager; 21a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.content.ContentResolver; 22a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.content.ContentValues; 23a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.content.Context; 24a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.database.Cursor; 25a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.database.sqlite.SQLiteException; 26a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.net.Uri; 27a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.util.Log; 28a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.widget.Toast; 29a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 30a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorpublic final class SqliteWrapper { 31a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor private static final String TAG = "SqliteWrapper"; 32a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor private static final String SQLITE_EXCEPTION_DETAIL_MESSAGE 33a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor = "unable to open database file"; 34a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 35a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor private SqliteWrapper() { 36a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor // Forbidden being instantiated. 37a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 38a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 39a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor // FIXME: It looks like outInfo.lowMemory does not work well as we expected. 40a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor // after run command: adb shell fillup -p 100, outInfo.lowMemory is still false. 41a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor private static boolean isLowMemory(Context context) { 42a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor if (null == context) { 43a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return false; 44a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 45a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 46a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor ActivityManager am = (ActivityManager) 47a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor context.getSystemService(Context.ACTIVITY_SERVICE); 48a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo(); 49a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor am.getMemoryInfo(outInfo); 50a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 51a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return outInfo.lowMemory; 52a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 53a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 54a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor // FIXME: need to optimize this method. 55a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor private static boolean isLowMemory(SQLiteException e) { 56a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return e.getMessage().equals(SQLITE_EXCEPTION_DETAIL_MESSAGE); 57a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 58a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 59a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor public static void checkSQLiteException(Context context, SQLiteException e) { 60a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor if (isLowMemory(e)) { 61a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor Toast.makeText(context, com.android.internal.R.string.low_memory, 62a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor Toast.LENGTH_SHORT).show(); 63a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } else { 64a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor throw e; 65a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 66a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 67a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 68a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor public static Cursor query(Context context, ContentResolver resolver, Uri uri, 69a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor String[] projection, String selection, String[] selectionArgs, String sortOrder) { 70a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor try { 71a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return resolver.query(uri, projection, selection, selectionArgs, sortOrder); 72a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } catch (SQLiteException e) { 73a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor Log.e(TAG, "Catch a SQLiteException when query: ", e); 74a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor checkSQLiteException(context, e); 75a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return null; 76a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 77a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 78a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 79a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor public static boolean requery(Context context, Cursor cursor) { 80a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor try { 81a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return cursor.requery(); 82a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } catch (SQLiteException e) { 83a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor Log.e(TAG, "Catch a SQLiteException when requery: ", e); 84a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor checkSQLiteException(context, e); 85a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return false; 86a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 87a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 88a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor public static int update(Context context, ContentResolver resolver, Uri uri, 89a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor ContentValues values, String where, String[] selectionArgs) { 90a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor try { 91a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return resolver.update(uri, values, where, selectionArgs); 92a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } catch (SQLiteException e) { 93a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor Log.e(TAG, "Catch a SQLiteException when update: ", e); 94a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor checkSQLiteException(context, e); 95a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return -1; 96a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 97a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 98a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 99a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor public static int delete(Context context, ContentResolver resolver, Uri uri, 100a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor String where, String[] selectionArgs) { 101a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor try { 102a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return resolver.delete(uri, where, selectionArgs); 103a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } catch (SQLiteException e) { 104a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor Log.e(TAG, "Catch a SQLiteException when delete: ", e); 105a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor checkSQLiteException(context, e); 106a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return -1; 107a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 108a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 109a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor 110a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor public static Uri insert(Context context, ContentResolver resolver, 111a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor Uri uri, ContentValues values) { 112a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor try { 113a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return resolver.insert(uri, values); 114a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } catch (SQLiteException e) { 115a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor Log.e(TAG, "Catch a SQLiteException when insert: ", e); 116a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor checkSQLiteException(context, e); 117a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor return null; 118a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 119a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor } 120a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylor} 121