Merge "Notify settings URI change without a lock held" into mnc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
ac8c98614c
@ -42,6 +42,9 @@ import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.DropBoxManager;
|
||||
import android.os.Environment;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.os.Process;
|
||||
import android.os.SystemProperties;
|
||||
@ -204,9 +207,6 @@ public class SettingsProvider extends ContentProvider {
|
||||
// We have to call in the user manager with no lock held,
|
||||
private volatile UserManager mUserManager;
|
||||
|
||||
// We have to call in the app ops manager with no lock held,
|
||||
private volatile AppOpsManager mAppOpsManager;
|
||||
|
||||
// We have to call in the package manager with no lock held,
|
||||
private volatile PackageManager mPackageManager;
|
||||
|
||||
@ -214,7 +214,6 @@ public class SettingsProvider extends ContentProvider {
|
||||
public boolean onCreate() {
|
||||
synchronized (mLock) {
|
||||
mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
|
||||
mAppOpsManager = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
|
||||
mPackageManager = getContext().getPackageManager();
|
||||
mSettingsRegistry = new SettingsRegistry();
|
||||
}
|
||||
@ -532,7 +531,7 @@ public class SettingsProvider extends ContentProvider {
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
|
||||
private static final String toDumpString(String s) {
|
||||
private static String toDumpString(String s) {
|
||||
if (s != null) {
|
||||
return s;
|
||||
}
|
||||
@ -1158,18 +1157,6 @@ public class SettingsProvider extends ContentProvider {
|
||||
getCallingPackage());
|
||||
}
|
||||
|
||||
private void sendNotify(Uri uri, int userId) {
|
||||
final long identity = Binder.clearCallingIdentity();
|
||||
try {
|
||||
getContext().getContentResolver().notifyChange(uri, null, true, userId);
|
||||
if (DEBUG) {
|
||||
Slog.v(LOG_TAG, "Notifying for " + userId + ": " + uri);
|
||||
}
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(identity);
|
||||
}
|
||||
}
|
||||
|
||||
private static void warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk(
|
||||
int targetSdkVersion, String name) {
|
||||
// If the app targets Lollipop MR1 or older SDK we warn, otherwise crash.
|
||||
@ -1390,8 +1377,11 @@ public class SettingsProvider extends ContentProvider {
|
||||
|
||||
private final BackupManager mBackupManager;
|
||||
|
||||
private final Handler mHandler;
|
||||
|
||||
public SettingsRegistry() {
|
||||
mBackupManager = new BackupManager(getContext());
|
||||
mHandler = new MyHandler(getContext().getMainLooper());
|
||||
migrateAllLegacySettingsIfNeeded();
|
||||
}
|
||||
|
||||
@ -1733,7 +1723,7 @@ public class SettingsProvider extends ContentProvider {
|
||||
|
||||
// Inform the backup manager about a data change
|
||||
if (backedUpDataChanged) {
|
||||
mBackupManager.dataChanged();
|
||||
mHandler.obtainMessage(MyHandler.MSG_NOTIFY_DATA_CHANGED).sendToTarget();
|
||||
}
|
||||
|
||||
// Now send the notification through the content framework.
|
||||
@ -1741,7 +1731,9 @@ public class SettingsProvider extends ContentProvider {
|
||||
final int userId = getUserIdFromKey(key);
|
||||
Uri uri = getNotificationUriFor(key, name);
|
||||
|
||||
sendNotify(uri, userId);
|
||||
mHandler.obtainMessage(MyHandler.MSG_NOTIFY_URI_CHANGED,
|
||||
userId, 0, uri).sendToTarget();
|
||||
|
||||
if (isSecureSettingsKey(key)) {
|
||||
maybeNotifyProfiles(userId, uri, name, sSecureCloneToManagedSettings);
|
||||
} else if (isSystemSettingsKey(key)) {
|
||||
@ -1758,7 +1750,8 @@ public class SettingsProvider extends ContentProvider {
|
||||
UserInfo profile = profiles.get(i);
|
||||
// the notification for userId has already been sent.
|
||||
if (profile.id != userId) {
|
||||
sendNotify(uri, profile.id);
|
||||
mHandler.obtainMessage(MyHandler.MSG_NOTIFY_URI_CHANGED,
|
||||
profile.id, 0, uri).sendToTarget();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1834,6 +1827,33 @@ public class SettingsProvider extends ContentProvider {
|
||||
}
|
||||
}
|
||||
|
||||
private final class MyHandler extends Handler {
|
||||
private static final int MSG_NOTIFY_URI_CHANGED = 1;
|
||||
private static final int MSG_NOTIFY_DATA_CHANGED = 2;
|
||||
|
||||
public MyHandler(Looper looper) {
|
||||
super(looper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case MSG_NOTIFY_URI_CHANGED: {
|
||||
final int userId = msg.arg1;
|
||||
Uri uri = (Uri) msg.obj;
|
||||
getContext().getContentResolver().notifyChange(uri, null, true, userId);
|
||||
if (DEBUG) {
|
||||
Slog.v(LOG_TAG, "Notifying for " + userId + ": " + uri);
|
||||
}
|
||||
} break;
|
||||
|
||||
case MSG_NOTIFY_DATA_CHANGED: {
|
||||
mBackupManager.dataChanged();
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final class UpgradeController {
|
||||
private static final int SETTINGS_VERSION = 122;
|
||||
|
||||
@ -1963,9 +1983,11 @@ public class SettingsProvider extends ContentProvider {
|
||||
currentVersion = 120;
|
||||
}
|
||||
|
||||
// Before 121, we used a different string encoding logic. We just bump the version
|
||||
// here; SettingsState knows how to handle pre-version 120 files.
|
||||
currentVersion = 121;
|
||||
if (currentVersion == 120) {
|
||||
// Before 121, we used a different string encoding logic. We just bump the
|
||||
// version here; SettingsState knows how to handle pre-version 120 files.
|
||||
currentVersion = 121;
|
||||
}
|
||||
|
||||
if (currentVersion == 121) {
|
||||
// Version 122: allow OEMs to set a default payment component in resources.
|
||||
|
Reference in New Issue
Block a user