App ops: turn off content provider ops when running under test.
Change-Id: I3a5084d195de29122b2f5f2a13b5d4f92f22fa92
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index e9b800d..ff3e843 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -101,6 +101,7 @@
private String mWritePermission;
private PathPermission[] mPathPermissions;
private boolean mExported;
+ private boolean mNoPerms;
private Transport mTransport = new Transport();
@@ -523,10 +524,12 @@
/** @hide */
public final void setAppOps(int readOp, int writeOp) {
- mTransport.mAppOpsManager = (AppOpsManager)mContext.getSystemService(
- Context.APP_OPS_SERVICE);
- mTransport.mReadOp = readOp;
- mTransport.mWriteOp = writeOp;
+ if (!mNoPerms) {
+ mTransport.mAppOpsManager = (AppOpsManager)mContext.getSystemService(
+ Context.APP_OPS_SERVICE);
+ mTransport.mReadOp = readOp;
+ mTransport.mWriteOp = writeOp;
+ }
}
/** @hide */
@@ -1191,6 +1194,16 @@
setWritePermission(info.writePermission);
setPathPermissions(info.pathPermissions);
mExported = info.exported;
+ mNoPerms = false;
+ } else {
+ // We enter here because the content provider is being instantiated
+ // as a mock. We don't have any information about the provider (such
+ // as its required permissions), and also want to avoid doing app op
+ // checks since these aren't real calls coming in and we may not be
+ // able to get the app ops service at all (if the test is using something
+ // like the IsolatedProvider). So set this to true, to prevent us
+ // from enabling app ops on this object.
+ mNoPerms = true;
}
ContentProvider.this.onCreate();
}