From 96c99460b335c820f5c6e35707207da5f0169f6a Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Fri, 5 May 2017 14:27:13 -0700 Subject: [PATCH] Hide from the world that ssaid is in a dedicated table Test: manual bug:37793918 Change-Id: I7c7405c7bd192d528f1f87095a03a2d21953dbc8 --- .../providers/settings/SettingsProvider.java | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 4b304b2353b3e..14e2a85e65895 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -1142,28 +1142,55 @@ public class SettingsProvider extends ContentProvider { } finally { Binder.restoreCallingIdentity(token); } + + final SettingsState ssaidSettings = mSettingsRegistry.getSettingsLocked( + SETTINGS_TYPE_SSAID, owningUserId); + if (instantSsaid != null) { // Use the stored value if it is still valid. if (ssaid != null && instantSsaid.equals(ssaid.getValue())) { - return ssaid; + return mascaradeSsaidSetting(ssaidSettings, ssaid); } // The value has changed, update the stored value. - final SettingsState ssaidSettings = mSettingsRegistry.getSettingsLocked( - SETTINGS_TYPE_SSAID, owningUserId); final boolean success = ssaidSettings.insertSettingLocked(name, instantSsaid, null, true, callingPkg.packageName); if (!success) { throw new IllegalStateException("Failed to update instant app android id"); } - return mSettingsRegistry.getSettingLocked(SETTINGS_TYPE_SSAID, owningUserId, name); + Setting setting = mSettingsRegistry.getSettingLocked(SETTINGS_TYPE_SSAID, + owningUserId, name); + return mascaradeSsaidSetting(ssaidSettings, setting); } // Lazy initialize ssaid if not yet present in ssaid table. if (ssaid == null || ssaid.isNull() || ssaid.getValue() == null) { - return mSettingsRegistry.generateSsaidLocked(callingPkg, owningUserId); + Setting setting = mSettingsRegistry.generateSsaidLocked(callingPkg, owningUserId); + return mascaradeSsaidSetting(ssaidSettings, setting); } - return ssaid; + return mascaradeSsaidSetting(ssaidSettings, ssaid); + } + + private Setting mascaradeSsaidSetting(SettingsState settingsState, Setting ssaidSetting) { + // SSAID settings are located in a dedicated table for internal bookkeeping + // but for the world they reside in the secure table, so adjust the key here. + // We have a special name when looking it up but want the world to see it as + // "android_id". + if (ssaidSetting != null) { + return settingsState.new Setting(ssaidSetting) { + @Override + public int getKey() { + final int userId = getUserIdFromKey(super.getKey()); + return makeKey(SETTINGS_TYPE_SECURE, userId); + } + + @Override + public String getName() { + return Settings.Secure.ANDROID_ID; + } + }; + } + return null; } private boolean insertSecureSetting(String name, String value, String tag, @@ -1173,7 +1200,6 @@ public class SettingsProvider extends ContentProvider { + ", " + tag + ", " + makeDefault + ", " + requestingUserId + ", " + forceNotify + ")"); } - return mutateSecureSetting(name, value, tag, makeDefault, requestingUserId, MUTATION_OPERATION_INSERT, forceNotify, 0); } @@ -1879,6 +1905,7 @@ public class SettingsProvider extends ContentProvider { Bundle result = new Bundle(); result.putString(Settings.NameValueTable.VALUE, !setting.isNull() ? setting.getValue() : null); + mSettingsRegistry.mGenerationRegistry.addGenerationData(result, setting.getKey()); return result; }