Move the non-market install setting from Global to per-user Secure
Bug 13760585
Change-Id: I45b0fa87e72dc5c18d687261fb95cbea5d06163a
diff --git a/api/current.txt b/api/current.txt
index eda087d..25512ca 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -23625,7 +23625,7 @@
field public static final java.lang.String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
field public static final java.lang.String DEVICE_PROVISIONED = "device_provisioned";
field public static final java.lang.String HTTP_PROXY = "http_proxy";
- field public static final java.lang.String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
+ field public static final deprecated java.lang.String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
field public static final java.lang.String MODE_RINGER = "mode_ringer";
field public static final java.lang.String NETWORK_PREFERENCE = "network_preference";
field public static final java.lang.String RADIO_BLUETOOTH = "bluetooth";
@@ -23695,7 +23695,7 @@
field public static final java.lang.String ENABLED_INPUT_METHODS = "enabled_input_methods";
field public static final deprecated java.lang.String HTTP_PROXY = "http_proxy";
field public static final java.lang.String INPUT_METHOD_SELECTOR_VISIBILITY = "input_method_selector_visibility";
- field public static final deprecated java.lang.String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
+ field public static final java.lang.String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
field public static final java.lang.String LOCATION_MODE = "location_mode";
field public static final int LOCATION_MODE_BATTERY_SAVING = 2; // 0x2
field public static final int LOCATION_MODE_HIGH_ACCURACY = 3; // 0x3
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e896063..2d03e1d 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1088,6 +1088,9 @@
MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_PING_COUNT);
MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_PING_DELAY_MS);
MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS);
+
+ // At one time in System, then Global, but now back in Secure
+ MOVED_TO_SECURE.add(Secure.INSTALL_NON_MARKET_APPS);
}
private static final HashSet<String> MOVED_TO_GLOBAL;
@@ -1102,7 +1105,6 @@
MOVED_TO_SECURE_THEN_GLOBAL.add(Global.BLUETOOTH_ON);
MOVED_TO_SECURE_THEN_GLOBAL.add(Global.DATA_ROAMING);
MOVED_TO_SECURE_THEN_GLOBAL.add(Global.DEVICE_PROVISIONED);
- MOVED_TO_SECURE_THEN_GLOBAL.add(Global.INSTALL_NON_MARKET_APPS);
MOVED_TO_SECURE_THEN_GLOBAL.add(Global.USB_MASS_STORAGE_ENABLED);
MOVED_TO_SECURE_THEN_GLOBAL.add(Global.HTTP_PROXY);
@@ -2573,10 +2575,10 @@
public static final String HTTP_PROXY = Global.HTTP_PROXY;
/**
- * @deprecated Use {@link android.provider.Settings.Global#INSTALL_NON_MARKET_APPS} instead
+ * @deprecated Use {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS} instead
*/
@Deprecated
- public static final String INSTALL_NON_MARKET_APPS = Global.INSTALL_NON_MARKET_APPS;
+ public static final String INSTALL_NON_MARKET_APPS = Secure.INSTALL_NON_MARKET_APPS;
/**
* @deprecated Use {@link android.provider.Settings.Secure#LOCATION_PROVIDERS_ALLOWED}
@@ -2814,7 +2816,6 @@
MOVED_TO_GLOBAL.add(Settings.Global.DISPLAY_SIZE_FORCED);
MOVED_TO_GLOBAL.add(Settings.Global.DOWNLOAD_MAX_BYTES_OVER_MOBILE);
MOVED_TO_GLOBAL.add(Settings.Global.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE);
- MOVED_TO_GLOBAL.add(Settings.Global.INSTALL_NON_MARKET_APPS);
MOVED_TO_GLOBAL.add(Settings.Global.MOBILE_DATA);
MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_BUCKET_DURATION);
MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_DELETE_AGE);
@@ -3404,10 +3405,13 @@
public static final String HTTP_PROXY = Global.HTTP_PROXY;
/**
- * @deprecated Use {@link android.provider.Settings.Global#INSTALL_NON_MARKET_APPS} instead
+ * Whether applications can be installed for this user via the system's
+ * {@link Intent#ACTION_INSTALL_PACKAGE} mechanism.
+ *
+ * <p>1 = permit app installation via the system package installer intent
+ * <p>0 = do not allow use of the package installer
*/
- @Deprecated
- public static final String INSTALL_NON_MARKET_APPS = Global.INSTALL_NON_MARKET_APPS;
+ public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
/**
* Comma-separated list of location providers that activities may access. Do not rely on
@@ -5066,13 +5070,10 @@
"download_manager_recommended_max_bytes_over_mobile";
/**
- * Whether the package installer should allow installation of apps downloaded from
- * sources other than Google Play.
- *
- * 1 = allow installing from other sources
- * 0 = only allow installing from Google Play
+ * @deprecated Use {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS} instead
*/
- public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
+ @Deprecated
+ public static final String INSTALL_NON_MARKET_APPS = Secure.INSTALL_NON_MARKET_APPS;
/**
* Whether mobile data connections are allowed by the user. See
@@ -6238,6 +6239,13 @@
CALL_METHOD_GET_GLOBAL,
CALL_METHOD_PUT_GLOBAL);
+ // Certain settings have been moved from global to the per-user secure namespace
+ private static final HashSet<String> MOVED_TO_SECURE;
+ static {
+ MOVED_TO_SECURE = new HashSet<String>(1);
+ MOVED_TO_SECURE.add(Settings.Global.INSTALL_NON_MARKET_APPS);
+ }
+
/**
* Look up a name in the database.
* @param resolver to access the database with
@@ -6251,6 +6259,11 @@
/** @hide */
public static String getStringForUser(ContentResolver resolver, String name,
int userHandle) {
+ if (MOVED_TO_SECURE.contains(name)) {
+ Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Global"
+ + " to android.provider.Settings.Secure, returning read-only value.");
+ return Secure.getStringForUser(resolver, name, userHandle);
+ }
return sNameValueCache.getStringForUser(resolver, name, userHandle);
}
@@ -6273,6 +6286,12 @@
Log.v(TAG, "Global.putString(name=" + name + ", value=" + value
+ " for " + userHandle);
}
+ // Global and Secure have the same access policy so we can forward writes
+ if (MOVED_TO_SECURE.contains(name)) {
+ Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Global"
+ + " to android.provider.Settings.Secure, value is unchanged.");
+ return Secure.putStringForUser(resolver, name, value, userHandle);
+ }
return sNameValueCache.putStringForUser(resolver, name, value, userHandle);
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 909c32e..286921e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -70,7 +70,7 @@
// database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
// is properly propagated through your change. Not doing so will result in a loss of user
// settings.
- private static final int DATABASE_VERSION = 102;
+ private static final int DATABASE_VERSION = 103;
private Context mContext;
private int mUserHandle;
@@ -1632,6 +1632,34 @@
upgradeVersion = 102;
}
+ if (upgradeVersion == 102) {
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ // The INSTALL_NON_MARKET_APPS setting is becoming per-user rather
+ // than device-global.
+ if (mUserHandle == UserHandle.USER_OWNER) {
+ // In the owner user, the global table exists so we can migrate the
+ // entry from there to the secure table, preserving its value.
+ String[] globalToSecure = {
+ Settings.Secure.INSTALL_NON_MARKET_APPS
+ };
+ moveSettingsToNewTable(db, TABLE_GLOBAL, TABLE_SECURE, globalToSecure, true);
+ } else {
+ // Secondary users' dbs don't have the global table, so institute the
+ // default.
+ stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
+ + " VALUES(?,?);");
+ loadBooleanSetting(stmt, Settings.Secure.INSTALL_NON_MARKET_APPS,
+ R.bool.def_install_non_market_apps);
+ }
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null) stmt.close();
+ }
+ upgradeVersion = 103;
+ }
// *** Remember to update DATABASE_VERSION above!
if (upgradeVersion != currentVersion) {
@@ -2191,6 +2219,9 @@
loadStringSetting(stmt, Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
R.string.def_immersive_mode_confirmations);
+ loadBooleanSetting(stmt, Settings.Secure.INSTALL_NON_MARKET_APPS,
+ R.bool.def_install_non_market_apps);
+
} finally {
if (stmt != null) stmt.close();
}
@@ -2289,9 +2320,6 @@
loadBooleanSetting(stmt, Settings.Global.NETSTATS_ENABLED,
R.bool.def_netstats_enabled);
- loadBooleanSetting(stmt, Settings.Global.INSTALL_NON_MARKET_APPS,
- R.bool.def_install_non_market_apps);
-
loadBooleanSetting(stmt, Settings.Global.USB_MASS_STORAGE_ENABLED,
R.bool.def_usb_mass_storage_enabled);