Skip to content

Commit 0dbc410

Browse files
Christopher TateAndroid (Google) Code Review
authored andcommitted
Merge "Fix Settings writes to a different user" into jb-mr1-dev
2 parents a96fa35 + 78d2a66 commit 0dbc410

File tree

4 files changed

+153
-88
lines changed

4 files changed

+153
-88
lines changed

core/java/android/provider/Settings.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -754,22 +754,29 @@ public boolean putString(ContentResolver cr, String name, String value) {
754754
}
755755

756756
public String getStringForUser(ContentResolver cr, String name, final int userHandle) {
757-
long newValuesVersion = SystemProperties.getLong(mVersionSystemProperty, 0);
757+
final boolean isSelf = (userHandle == UserHandle.myUserId());
758+
if (isSelf) {
759+
long newValuesVersion = SystemProperties.getLong(mVersionSystemProperty, 0);
758760

759-
synchronized (this) {
760-
if (mValuesVersion != newValuesVersion) {
761-
if (LOCAL_LOGV || false) {
762-
Log.v(TAG, "invalidate [" + mUri.getLastPathSegment() + "]: current " +
763-
newValuesVersion + " != cached " + mValuesVersion);
764-
}
761+
// Our own user's settings data uses a client-side cache
762+
synchronized (this) {
763+
if (mValuesVersion != newValuesVersion) {
764+
if (LOCAL_LOGV || false) {
765+
Log.v(TAG, "invalidate [" + mUri.getLastPathSegment() + "]: current "
766+
+ newValuesVersion + " != cached " + mValuesVersion);
767+
}
765768

766-
mValues.clear();
767-
mValuesVersion = newValuesVersion;
768-
}
769+
mValues.clear();
770+
mValuesVersion = newValuesVersion;
771+
}
769772

770-
if (mValues.containsKey(name)) {
771-
return mValues.get(name); // Could be null, that's OK -- negative caching
773+
if (mValues.containsKey(name)) {
774+
return mValues.get(name); // Could be null, that's OK -- negative caching
775+
}
772776
}
777+
} else {
778+
if (LOCAL_LOGV) Log.v(TAG, "get setting for user " + userHandle
779+
+ " by user " + UserHandle.myUserId() + " so skipping cache");
773780
}
774781

775782
IContentProvider cp = lazyGetProvider(cr);
@@ -788,8 +795,15 @@ public String getStringForUser(ContentResolver cr, String name, final int userHa
788795
Bundle b = cp.call(mCallGetCommand, name, args);
789796
if (b != null) {
790797
String value = b.getPairValue();
791-
synchronized (this) {
792-
mValues.put(name, value);
798+
// Don't update our cache for reads of other users' data
799+
if (isSelf) {
800+
synchronized (this) {
801+
mValues.put(name, value);
802+
}
803+
} else {
804+
if (LOCAL_LOGV) Log.i(TAG, "call-query of user " + userHandle
805+
+ " by " + UserHandle.myUserId()
806+
+ " so not updating cache");
793807
}
794808
return value;
795809
}

core/tests/coretests/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@
6969
<uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
7070
<uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH.ALL_SERVICES" />
7171

72+
<uses-permission android:name="android.permission.MANAGE_USERS" />
73+
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
74+
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
75+
7276
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
7377
<uses-permission android:name="android.permission.INTERNET" />
7478
<uses-permission android:name="android.permission.READ_CONTACTS" />

core/tests/coretests/src/android/provider/SettingsProviderTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@
1919
import android.content.ContentResolver;
2020
import android.content.ContentUris;
2121
import android.content.ContentValues;
22+
import android.content.Context;
2223
import android.content.Intent;
2324
import android.content.pm.PackageManager;
2425
import android.content.pm.ResolveInfo;
26+
import android.content.pm.UserInfo;
2527
import android.database.Cursor;
2628
import android.net.Uri;
29+
import android.os.UserHandle;
30+
import android.os.UserManager;
2731
import android.provider.Settings;
2832
import android.test.AndroidTestCase;
2933
import android.test.suitebuilder.annotation.MediumTest;
@@ -197,6 +201,53 @@ public void testParseProviderList() {
197201
Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
198202
}
199203

204+
private boolean findUser(UserManager um, int userHandle) {
205+
for (UserInfo user : um.getUsers()) {
206+
if (user.id == userHandle) {
207+
return true;
208+
}
209+
}
210+
return false;
211+
}
212+
213+
@MediumTest
214+
public void testPerUserSettings() {
215+
UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
216+
ContentResolver r = getContext().getContentResolver();
217+
218+
// Make sure there's an owner
219+
assertTrue(findUser(um, UserHandle.USER_OWNER));
220+
221+
// create a new user to use for testing
222+
UserInfo user = um.createUser("TestUser1", UserInfo.FLAG_GUEST);
223+
assertTrue(user != null);
224+
225+
try {
226+
// Write some settings for that user as well as the current user
227+
final String TEST_KEY = "test_setting";
228+
final int SELF_VALUE = 40;
229+
final int OTHER_VALUE = 27;
230+
231+
Settings.System.putInt(r, TEST_KEY, SELF_VALUE);
232+
Settings.System.putIntForUser(r, TEST_KEY, OTHER_VALUE, user.id);
233+
234+
// Verify that they read back as intended
235+
int myValue = Settings.System.getInt(r, TEST_KEY, 0);
236+
int otherValue = Settings.System.getIntForUser(r, TEST_KEY, 0, user.id);
237+
assertTrue("Running as user " + UserHandle.myUserId()
238+
+ " and reading/writing as user " + user.id
239+
+ ", expected to read " + SELF_VALUE + " but got " + myValue,
240+
myValue == SELF_VALUE);
241+
assertTrue("Running as user " + UserHandle.myUserId()
242+
+ " and reading/writing as user " + user.id
243+
+ ", expected to read " + OTHER_VALUE + " but got " + otherValue,
244+
otherValue == OTHER_VALUE);
245+
} finally {
246+
// Tidy up
247+
um.removeUser(user.id);
248+
}
249+
}
250+
200251
@SmallTest
201252
public void testSettings() {
202253
assertCanBeHandled(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));

0 commit comments

Comments
 (0)