summaryrefslogtreecommitdiff
path: root/src/com/android
diff options
context:
space:
mode:
authorShubang <shubang@google.com>2018-03-27 17:55:30 -0700
committerShubang <shubang@google.com>2018-04-10 15:39:37 -0700
commit2e7a0acd42976456a71eb35b9eb213769205abf4 (patch)
tree6cd889dfa7730841fcf4ea35e50a1bfa11d01114 /src/com/android
parent5f508d4e7bbb274f9928cc3d5a41c3fe354cc275 (diff)
downloadTvProvider-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.java34
-rw-r--r--src/com/android/providers/tv/PackageRemovedReceiver.java84
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