Fix support for USER_ALL in FakeSettings

If a content observer was registered to a SettingsProxy using
UserHandle.USER_ALL, testing that was expecting to pass would fail.

This CL fixes that by matching every user to USER_ALL observers that
match the Uri.

Test: atest SystemUITests
Fixes: 194934707
Change-Id: I41a0eb50a2cd1700b03b372bfcc199bebd9aea35
This commit is contained in:
Fabian Kozynski
2021-07-29 10:44:20 -04:00
parent c7f30fcd0e
commit 59a168a9fa
2 changed files with 41 additions and 3 deletions

View File

@@ -31,6 +31,7 @@ public class FakeSettings implements SecureSettings, GlobalSettings, SystemSetti
private final Map<SettingsKey, String> mValues = new HashMap<>(); private final Map<SettingsKey, String> mValues = new HashMap<>();
private final Map<SettingsKey, List<ContentObserver>> mContentObservers = private final Map<SettingsKey, List<ContentObserver>> mContentObservers =
new HashMap<>(); new HashMap<>();
private final Map<String, List<ContentObserver>> mContentObserversAllUsers = new HashMap<>();
public static final Uri CONTENT_URI = Uri.parse("content://settings/fake"); public static final Uri CONTENT_URI = Uri.parse("content://settings/fake");
@@ -55,9 +56,15 @@ public class FakeSettings implements SecureSettings, GlobalSettings, SystemSetti
@Override @Override
public void registerContentObserverForUser(Uri uri, boolean notifyDescendents, public void registerContentObserverForUser(Uri uri, boolean notifyDescendents,
ContentObserver settingsObserver, int userHandle) { ContentObserver settingsObserver, int userHandle) {
SettingsKey key = new SettingsKey(userHandle, uri.toString()); List<ContentObserver> observers;
mContentObservers.putIfAbsent(key, new ArrayList<>()); if (userHandle == UserHandle.USER_ALL) {
List<ContentObserver> observers = mContentObservers.get(key); mContentObserversAllUsers.putIfAbsent(uri.toString(), new ArrayList<>());
observers = mContentObserversAllUsers.get(uri.toString());
} else {
SettingsKey key = new SettingsKey(userHandle, uri.toString());
mContentObservers.putIfAbsent(key, new ArrayList<>());
observers = mContentObservers.get(key);
}
observers.add(settingsObserver); observers.add(settingsObserver);
} }
@@ -67,6 +74,10 @@ public class FakeSettings implements SecureSettings, GlobalSettings, SystemSetti
List<ContentObserver> observers = mContentObservers.get(key); List<ContentObserver> observers = mContentObservers.get(key);
observers.remove(settingsObserver); observers.remove(settingsObserver);
} }
for (String key : mContentObserversAllUsers.keySet()) {
List<ContentObserver> observers = mContentObserversAllUsers.get(key);
observers.remove(settingsObserver);
}
} }
@Override @Override
@@ -114,6 +125,10 @@ public class FakeSettings implements SecureSettings, GlobalSettings, SystemSetti
for (ContentObserver observer : mContentObservers.getOrDefault(key, new ArrayList<>())) { for (ContentObserver observer : mContentObservers.getOrDefault(key, new ArrayList<>())) {
observer.dispatchChange(false, List.of(uri), userHandle); observer.dispatchChange(false, List.of(uri), userHandle);
} }
for (ContentObserver observer :
mContentObserversAllUsers.getOrDefault(uri.toString(), new ArrayList<>())) {
observer.dispatchChange(false, List.of(uri), userHandle);
}
return true; return true;
} }

View File

@@ -25,6 +25,7 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
@@ -88,6 +89,16 @@ public class FakeSettingsTest extends SysuiTestCase {
verify(mContentObserver).dispatchChange(anyBoolean(), any(Collection.class), anyInt()); verify(mContentObserver).dispatchChange(anyBoolean(), any(Collection.class), anyInt());
} }
@Test
public void testRegisterContentObserverAllUsers() {
mFakeSettings.registerContentObserverForUser(
mFakeSettings.getUriFor("cat"), false, mContentObserver, UserHandle.USER_ALL);
mFakeSettings.putString("cat", "hat");
verify(mContentObserver).dispatchChange(anyBoolean(), any(Collection.class), anyInt());
}
@Test @Test
public void testUnregisterContentObserver() { public void testUnregisterContentObserver() {
mFakeSettings.registerContentObserver("cat", mContentObserver); mFakeSettings.registerContentObserver("cat", mContentObserver);
@@ -98,4 +109,16 @@ public class FakeSettingsTest extends SysuiTestCase {
verify(mContentObserver, never()).dispatchChange( verify(mContentObserver, never()).dispatchChange(
anyBoolean(), any(Collection.class), anyInt()); anyBoolean(), any(Collection.class), anyInt());
} }
@Test
public void testUnregisterContentObserverAllUsers() {
mFakeSettings.registerContentObserverForUser(
mFakeSettings.getUriFor("cat"), false, mContentObserver, UserHandle.USER_ALL);
mFakeSettings.unregisterContentObserver(mContentObserver);
mFakeSettings.putString("cat", "hat");
verify(mContentObserver, never()).dispatchChange(
anyBoolean(), any(Collection.class), anyInt());
}
} }