From 9a4c5be23ec5bb03661fc6f1cfb37ff1c723658c Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 7 Nov 2018 13:15:46 -0800 Subject: Moving some utility classes to icon lib Change-Id: I0cc19ea02fb0732e9e1778a18c0d2c229232d179 --- iconloaderlib/build.gradle | 5 + .../android/launcher3/icons/BitmapRenderer.java | 50 +++++++++ .../com/android/launcher3/util/ComponentKey.java | 59 ++++++++++ .../launcher3/util/NoLocaleSQLiteHelper.java | 58 ++++++++++ .../src/com/android/launcher3/util/Provider.java | 33 ++++++ .../android/launcher3/util/SQLiteCacheHelper.java | 125 +++++++++++++++++++++ 6 files changed, 330 insertions(+) create mode 100644 iconloaderlib/src/com/android/launcher3/icons/BitmapRenderer.java create mode 100644 iconloaderlib/src/com/android/launcher3/util/ComponentKey.java create mode 100644 iconloaderlib/src/com/android/launcher3/util/NoLocaleSQLiteHelper.java create mode 100644 iconloaderlib/src/com/android/launcher3/util/Provider.java create mode 100644 iconloaderlib/src/com/android/launcher3/util/SQLiteCacheHelper.java (limited to 'iconloaderlib') diff --git a/iconloaderlib/build.gradle b/iconloaderlib/build.gradle index d08029386..a6433ad1a 100644 --- a/iconloaderlib/build.gradle +++ b/iconloaderlib/build.gradle @@ -37,6 +37,11 @@ android { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } diff --git a/iconloaderlib/src/com/android/launcher3/icons/BitmapRenderer.java b/iconloaderlib/src/com/android/launcher3/icons/BitmapRenderer.java new file mode 100644 index 000000000..a66b929ef --- /dev/null +++ b/iconloaderlib/src/com/android/launcher3/icons/BitmapRenderer.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.icons; + +import android.annotation.TargetApi; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Picture; +import android.os.Build; + +/** + * Interface representing a bitmap draw operation. + */ +public interface BitmapRenderer { + + boolean USE_HARDWARE_BITMAP = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P; + + static Bitmap createSoftwareBitmap(int width, int height, BitmapRenderer renderer) { + Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + renderer.draw(new Canvas(result)); + return result; + } + + @TargetApi(Build.VERSION_CODES.P) + static Bitmap createHardwareBitmap(int width, int height, BitmapRenderer renderer) { + if (!USE_HARDWARE_BITMAP) { + return createSoftwareBitmap(width, height, renderer); + } + + Picture picture = new Picture(); + renderer.draw(picture.beginRecording(width, height)); + picture.endRecording(); + return Bitmap.createBitmap(picture); + } + + void draw(Canvas out); +} diff --git a/iconloaderlib/src/com/android/launcher3/util/ComponentKey.java b/iconloaderlib/src/com/android/launcher3/util/ComponentKey.java new file mode 100644 index 000000000..34bed9427 --- /dev/null +++ b/iconloaderlib/src/com/android/launcher3/util/ComponentKey.java @@ -0,0 +1,59 @@ +package com.android.launcher3.util; + +/** + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import android.content.ComponentName; +import android.os.UserHandle; + +import java.util.Arrays; + +public class ComponentKey { + + public final ComponentName componentName; + public final UserHandle user; + + private final int mHashCode; + + public ComponentKey(ComponentName componentName, UserHandle user) { + if (componentName == null || user == null) { + throw new NullPointerException(); + } + this.componentName = componentName; + this.user = user; + mHashCode = Arrays.hashCode(new Object[] {componentName, user}); + + } + + @Override + public int hashCode() { + return mHashCode; + } + + @Override + public boolean equals(Object o) { + ComponentKey other = (ComponentKey) o; + return other.componentName.equals(componentName) && other.user.equals(user); + } + + /** + * Encodes a component key as a string of the form [flattenedComponentString#userId]. + */ + @Override + public String toString() { + return componentName.flattenToString() + "#" + user; + } +} \ No newline at end of file diff --git a/iconloaderlib/src/com/android/launcher3/util/NoLocaleSQLiteHelper.java b/iconloaderlib/src/com/android/launcher3/util/NoLocaleSQLiteHelper.java new file mode 100644 index 000000000..fe864a284 --- /dev/null +++ b/iconloaderlib/src/com/android/launcher3/util/NoLocaleSQLiteHelper.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.util; + +import static android.database.sqlite.SQLiteDatabase.NO_LOCALIZED_COLLATORS; + +import android.content.Context; +import android.content.ContextWrapper; +import android.database.DatabaseErrorHandler; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.database.sqlite.SQLiteDatabase.OpenParams; +import android.database.sqlite.SQLiteOpenHelper; +import android.os.Build; + +/** + * Extension of {@link SQLiteOpenHelper} which avoids creating default locale table by + * A context wrapper which creates databases without support for localized collators. + */ +public abstract class NoLocaleSQLiteHelper extends SQLiteOpenHelper { + + private static final boolean ATLEAST_P = + Build.VERSION.SDK_INT >= Build.VERSION_CODES.P; + + public NoLocaleSQLiteHelper(Context context, String name, int version) { + super(ATLEAST_P ? context : new NoLocalContext(context), name, null, version); + if (ATLEAST_P) { + setOpenParams(new OpenParams.Builder().addOpenFlags(NO_LOCALIZED_COLLATORS).build()); + } + } + + private static class NoLocalContext extends ContextWrapper { + public NoLocalContext(Context base) { + super(base); + } + + @Override + public SQLiteDatabase openOrCreateDatabase( + String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler) { + return super.openOrCreateDatabase( + name, mode | Context.MODE_NO_LOCALIZED_COLLATORS, factory, errorHandler); + } + } +} diff --git a/iconloaderlib/src/com/android/launcher3/util/Provider.java b/iconloaderlib/src/com/android/launcher3/util/Provider.java new file mode 100644 index 000000000..4a54c0f05 --- /dev/null +++ b/iconloaderlib/src/com/android/launcher3/util/Provider.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.util; + +/** + * Utility class to allow lazy initialization of objects. + */ +public interface Provider { + + /** + * Initializes and returns the object. This may contain expensive operations not suitable + * to UI thread. + */ + T get(); + + static Provider of (T value) { + return() -> value; + } +} diff --git a/iconloaderlib/src/com/android/launcher3/util/SQLiteCacheHelper.java b/iconloaderlib/src/com/android/launcher3/util/SQLiteCacheHelper.java new file mode 100644 index 000000000..49de4bd1b --- /dev/null +++ b/iconloaderlib/src/com/android/launcher3/util/SQLiteCacheHelper.java @@ -0,0 +1,125 @@ +package com.android.launcher3.util; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; +import android.database.sqlite.SQLiteFullException; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +/** + * An extension of {@link SQLiteOpenHelper} with utility methods for a single table cache DB. + * Any exception during write operations are ignored, and any version change causes a DB reset. + */ +public abstract class SQLiteCacheHelper { + private static final String TAG = "SQLiteCacheHelper"; + + private static final boolean IN_MEMORY_CACHE = false; + + private final String mTableName; + private final MySQLiteOpenHelper mOpenHelper; + + private boolean mIgnoreWrites; + + public SQLiteCacheHelper(Context context, String name, int version, String tableName) { + if (IN_MEMORY_CACHE) { + name = null; + } + mTableName = tableName; + mOpenHelper = new MySQLiteOpenHelper(context, name, version); + + mIgnoreWrites = false; + } + + /** + * @see SQLiteDatabase#delete(String, String, String[]) + */ + public void delete(String whereClause, String[] whereArgs) { + if (mIgnoreWrites) { + return; + } + try { + mOpenHelper.getWritableDatabase().delete(mTableName, whereClause, whereArgs); + } catch (SQLiteFullException e) { + onDiskFull(e); + } catch (SQLiteException e) { + Log.d(TAG, "Ignoring sqlite exception", e); + } + } + + /** + * @see SQLiteDatabase#insertWithOnConflict(String, String, ContentValues, int) + */ + public void insertOrReplace(ContentValues values) { + if (mIgnoreWrites) { + return; + } + try { + mOpenHelper.getWritableDatabase().insertWithOnConflict( + mTableName, null, values, SQLiteDatabase.CONFLICT_REPLACE); + } catch (SQLiteFullException e) { + onDiskFull(e); + } catch (SQLiteException e) { + Log.d(TAG, "Ignoring sqlite exception", e); + } + } + + private void onDiskFull(SQLiteFullException e) { + Log.e(TAG, "Disk full, all write operations will be ignored", e); + mIgnoreWrites = true; + } + + /** + * @see SQLiteDatabase#query(String, String[], String, String[], String, String, String) + */ + public Cursor query(String[] columns, String selection, String[] selectionArgs) { + return mOpenHelper.getReadableDatabase().query( + mTableName, columns, selection, selectionArgs, null, null, null); + } + + public void clear() { + mOpenHelper.clearDB(mOpenHelper.getWritableDatabase()); + } + + public void close() { + mOpenHelper.close(); + } + + protected abstract void onCreateTable(SQLiteDatabase db); + + /** + * A private inner class to prevent direct DB access. + */ + private class MySQLiteOpenHelper extends NoLocaleSQLiteHelper { + + public MySQLiteOpenHelper(Context context, String name, int version) { + super(context, name, version); + } + + @Override + public void onCreate(SQLiteDatabase db) { + onCreateTable(db); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if (oldVersion != newVersion) { + clearDB(db); + } + } + + @Override + public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if (oldVersion != newVersion) { + clearDB(db); + } + } + + private void clearDB(SQLiteDatabase db) { + db.execSQL("DROP TABLE IF EXISTS " + mTableName); + onCreate(db); + } + } +} -- cgit v1.2.3