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