diff options
author | Shubang <shubang@google.com> | 2018-03-27 17:55:30 -0700 |
---|---|---|
committer | Shubang <shubang@google.com> | 2018-04-10 15:39:37 -0700 |
commit | 2e7a0acd42976456a71eb35b9eb213769205abf4 (patch) | |
tree | 6cd889dfa7730841fcf4ea35e50a1bfa11d01114 /src/com/android | |
parent | 5f508d4e7bbb274f9928cc3d5a41c3fe354cc275 (diff) | |
download | TvProvider-2e7a0acd42976456a71eb35b9eb213769205abf4.tar.gz |
Improve TvProvider
1. moved DB operations in Broadcast Receivers into background. Avoid
blocking main thread.
2. removed redundant delete operations, which should be handled by
"ON DELETE CASCADE".
3. Improved PackageRemovedReceiverTest. All tables are covered.
4. Added tests for BootCompletedReceiver
Test: make TvProvider; push & install; runtest --path packages/providers/TvProvider/tests/
Change-Id: I0765c94f4c572ad45fe54e50bb52159ebf74a7ad
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/providers/tv/BootCompletedReceiver.java | 34 | ||||
-rw-r--r-- | src/com/android/providers/tv/PackageRemovedReceiver.java | 84 |
2 files changed, 79 insertions, 39 deletions
diff --git a/src/com/android/providers/tv/BootCompletedReceiver.java b/src/com/android/providers/tv/BootCompletedReceiver.java index c766b83..0f5bd01 100644 --- a/src/com/android/providers/tv/BootCompletedReceiver.java +++ b/src/com/android/providers/tv/BootCompletedReceiver.java @@ -26,12 +26,14 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.media.tv.TvContract; import android.net.Uri; +import android.os.AsyncTask; import android.util.Log; import com.android.providers.tv.TvProvider.DatabaseHelper; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Executor; /** * This will be launched when BOOT_COMPLETED intent is broadcast. @@ -43,22 +45,36 @@ public class BootCompletedReceiver extends BroadcastReceiver { private static final String[] PROJECTION = {TvContract.BaseTvColumns.COLUMN_PACKAGE_NAME}; private static final String WHERE = TvContract.BaseTvColumns.COLUMN_PACKAGE_NAME + "=?"; + private final Executor mExecutor; + + public BootCompletedReceiver() { + this(AsyncTask.SERIAL_EXECUTOR); + } + + public BootCompletedReceiver(Executor executor) { + super(); + mExecutor = executor; + } + @Override public void onReceive(Context context, Intent intent) { - // Delete the transient rows on boot. - TransientRowHelper.getInstance(context).ensureOldTransientRowsDeleted(); + final PendingResult pendingResult = goAsync(); + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + // Delete the transient rows on boot. + TransientRowHelper.getInstance(context).ensureOldTransientRowsDeleted(); - SQLiteDatabase db = DatabaseHelper.getInstance(context).getReadableDatabase(); - deleteRowsOfUninstalledPackages(context, db); + SQLiteDatabase db = DatabaseHelper.getInstance(context).getReadableDatabase(); + deleteRowsOfUninstalledPackages(context, db); + pendingResult.finish(); + return null; + } + }.executeOnExecutor(mExecutor); } private void deleteRowsOfUninstalledPackages(Context context, SQLiteDatabase db) { deleteRowsOfUninstalledPackagesInternal(context, db, TvContract.Channels.CONTENT_URI); - deleteRowsOfUninstalledPackagesInternal(context, db, TvContract.Programs.CONTENT_URI); - deleteRowsOfUninstalledPackagesInternal( - context, db, TvContract.PreviewPrograms.CONTENT_URI); - deleteRowsOfUninstalledPackagesInternal( - context, db, TvContract.WatchedPrograms.CONTENT_URI); deleteRowsOfUninstalledPackagesInternal( context, db, TvContract.RecordedPrograms.CONTENT_URI); deleteRowsOfUninstalledPackagesInternal( diff --git a/src/com/android/providers/tv/PackageRemovedReceiver.java b/src/com/android/providers/tv/PackageRemovedReceiver.java index 956eb04..351c1a0 100644 --- a/src/com/android/providers/tv/PackageRemovedReceiver.java +++ b/src/com/android/providers/tv/PackageRemovedReceiver.java @@ -24,11 +24,13 @@ import android.content.Context; import android.content.Intent; import android.content.OperationApplicationException; import android.media.tv.TvContract; +import android.os.AsyncTask; import android.os.RemoteException; import android.util.Log; import java.util.ArrayList; import java.util.Arrays; +import java.util.concurrent.Executor; /** * This will be launched when PACKAGE_FULLY_REMOVED intent is broadcast. @@ -37,44 +39,66 @@ public class PackageRemovedReceiver extends BroadcastReceiver { private static final boolean DEBUG = false; private static final String TAG = "PackageRemovedReceiver"; + private final Executor mExecutor; + + public PackageRemovedReceiver() { + this(AsyncTask.SERIAL_EXECUTOR); + } + + public PackageRemovedReceiver(Executor executor) { + super(); + mExecutor = executor; + } + @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_PACKAGE_FULLY_REMOVED.equals(intent.getAction()) && intent.getData() != null) { - String packageName = intent.getData().getSchemeSpecificPart(); - ArrayList<ContentProviderOperation> operations = new ArrayList<>(); - int uid = intent.getIntExtra(Intent.EXTRA_UID, 0); + final PendingResult pendingResult = goAsync(); + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + + String packageName = intent.getData().getSchemeSpecificPart(); + ArrayList<ContentProviderOperation> operations = new ArrayList<>(); + int uid = intent.getIntExtra(Intent.EXTRA_UID, 0); - String selection = TvContract.BaseTvColumns.COLUMN_PACKAGE_NAME + "=?"; - String[] selectionArgs = {packageName}; + String selection = TvContract.BaseTvColumns.COLUMN_PACKAGE_NAME + "=?"; + String[] selectionArgs = {packageName}; - operations.add(ContentProviderOperation.newDelete(TvContract.Channels.CONTENT_URI) - .withSelection(selection, selectionArgs).build()); - operations.add(ContentProviderOperation.newDelete(TvContract.Programs.CONTENT_URI) - .withSelection(selection, selectionArgs).build()); - operations.add(ContentProviderOperation - .newDelete(TvContract.WatchedPrograms.CONTENT_URI) - .withSelection(selection, selectionArgs).build()); - operations.add(ContentProviderOperation - .newDelete(TvContract.RecordedPrograms.CONTENT_URI) - .withSelection(selection, selectionArgs).build()); - operations.add(ContentProviderOperation - .newDelete(TvContract.WatchNextPrograms.CONTENT_URI) - .withSelection(selection, selectionArgs).build()); + operations.add( + ContentProviderOperation + .newDelete(TvContract.Channels.CONTENT_URI) + .withSelection(selection, selectionArgs) + .build()); + operations.add( + ContentProviderOperation + .newDelete(TvContract.RecordedPrograms.CONTENT_URI) + .withSelection(selection, selectionArgs) + .build()); + operations.add( + ContentProviderOperation + .newDelete(TvContract.WatchNextPrograms.CONTENT_URI) + .withSelection(selection, selectionArgs) + .build()); - ContentProviderResult[] results = null; - try { - ContentResolver cr = context.getContentResolver(); - results = cr.applyBatch(TvContract.AUTHORITY, operations); - } catch (RemoteException | OperationApplicationException e) { - Log.e(TAG, "error in applyBatch", e); - } + ContentProviderResult[] results = null; + try { + ContentResolver cr = context.getContentResolver(); + results = cr.applyBatch(TvContract.AUTHORITY, operations); + } catch (RemoteException | OperationApplicationException e) { + Log.e(TAG, "error in applyBatch", e); + } - if (DEBUG) { - Log.d(TAG, "onPackageFullyRemoved(packageName=" + packageName + ", uid=" + uid - + ")"); - Log.d(TAG, "results=" + Arrays.toString(results)); - } + if (DEBUG) { + Log.d(TAG, "onPackageFullyRemoved(packageName=" + packageName + + ", uid=" + uid + ")"); + Log.d(TAG, "results=" + Arrays.toString(results)); + } + pendingResult.finish(); + return null; + } + }.executeOnExecutor(mExecutor); } } }
\ No newline at end of file |