15afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrishpackage org.robolectric.shadows;
2d0cb59970def5b7bbad64be64abec240522ae885Aaron Day
3851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.assertj.core.api.Assertions.assertThat;
4851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.junit.Assert.assertFalse;
5851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.junit.Assert.assertTrue;
6851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.mockito.Mockito.mock;
7851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.mockito.Mockito.verifyZeroInteractions;
8851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williams
95afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrishimport android.content.Context;
10499c2e9e487e04df893c95cf9b4ba57376652fdcChristian Williamsimport android.content.SharedPreferences;
11851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport java.util.ArrayList;
12851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport java.util.HashSet;
13851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport java.util.List;
14851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport java.util.Set;
15d0cb59970def5b7bbad64be64abec240522ae885Aaron Dayimport org.junit.Before;
16d0cb59970def5b7bbad64be64abec240522ae885Aaron Dayimport org.junit.Test;
17d0cb59970def5b7bbad64be64abec240522ae885Aaron Dayimport org.junit.runner.RunWith;
18ceb8863e0cd0706c72351f063bc7af3c7d76d120Jonathan Gerrishimport org.robolectric.RobolectricTestRunner;
19084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieuximport org.robolectric.RuntimeEnvironment;
20d0cb59970def5b7bbad64be64abec240522ae885Aaron Day
21ceb8863e0cd0706c72351f063bc7af3c7d76d120Jonathan Gerrish@RunWith(RobolectricTestRunner.class)
225afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrishpublic class ShadowSharedPreferencesTest {
235afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish  private final static String FILENAME = "filename";
2429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  private SharedPreferences.Editor editor;
255afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish  private SharedPreferences sharedPreferences;
2629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
275afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish  private final Set<String> stringSet = new HashSet<>();
2829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
295afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish  private Context context;
3029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
3129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  @Before
3229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  public void setUp() {
335afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    context = RuntimeEnvironment.application;
3429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
35084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    sharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
3679eb969db1908f751e56aa407399556b76719257Jonathan Gerrish    // Ensure no shared preferences have leaked from previous tests.
3779eb969db1908f751e56aa407399556b76719257Jonathan Gerrish    assertThat(sharedPreferences.getAll()).hasSize(0);
3879eb969db1908f751e56aa407399556b76719257Jonathan Gerrish
39cb9b3e632b9bbef591ac1069c18aa8a932e8b825Jonathan Gerrish    editor = sharedPreferences.edit();
4029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.putBoolean("boolean", true);
4129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.putFloat("float", 1.1f);
4229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.putInt("int", 2);
43879371277af60d57148eefb24fd046a6a30e4683christianw    editor.putLong("long", 3L);
4429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.putString("string", "foobar");
455afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish
465afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    stringSet.add( "string1" );
475afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    stringSet.add( "string2" );
485afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    stringSet.add( "string3" );
497ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic    editor.putStringSet("stringSet", stringSet);
5029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  }
5129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
5229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  @Test
5329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  public void commit_shouldStoreValues() throws Exception {
5429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.commit();
5529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
56084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    SharedPreferences anotherSharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
5729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertTrue(anotherSharedPreferences.getBoolean("boolean", false));
5829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getFloat("float", 666f)).isEqualTo(1.1f);
5929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getInt("int", 666)).isEqualTo(2);
60879371277af60d57148eefb24fd046a6a30e4683christianw    assertThat(anotherSharedPreferences.getLong("long", 666L)).isEqualTo(3L);
6129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getString("string", "wacka wa")).isEqualTo("foobar");
6229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getStringSet("stringSet", null)).isEqualTo(stringSet);
6329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  }
6429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
6529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  @Test
6662a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore  public void commit_shouldClearEditsThatNeedRemoveAndEditsThatNeedCommit() throws Exception {
6762a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore    editor.commit();
6862a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore    editor.remove("string").commit();
6962a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore
7062a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore    assertThat(sharedPreferences.getString("string", "no value for key")).isEqualTo("no value for key");
7162a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore
72084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    SharedPreferences anotherSharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
7362a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore    anotherSharedPreferences.edit().putString("string", "value for key").commit();
7462a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore
7562a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore    editor.commit();
7662a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore    assertThat(sharedPreferences.getString("string", "no value for key")).isEqualTo("value for key");
7762a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore  }
7862a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore
7962a74f3a9132f400f5c5bcef01f214da658199a2Christopher Amavisca and Ryan Spore  @Test
8029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  public void getAll_shouldReturnAllValues() throws Exception {
8129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.commit();
8279eb969db1908f751e56aa407399556b76719257Jonathan Gerrish    assertThat(sharedPreferences.getAll()).hasSize(6);
8379eb969db1908f751e56aa407399556b76719257Jonathan Gerrish    assertThat(sharedPreferences.getAll().get("int")).isEqualTo(2);
8429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  }
8529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
8629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  @Test
8729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  public void commit_shouldRemoveValuesThenSetValues() throws Exception {
885afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    editor.putString("deleteMe", "foo").commit();
8929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
90f3a67bea2e9e481c7344b416ec0e90ceb27ec005Christian Williams    editor.remove("deleteMe");
9129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
92f3a67bea2e9e481c7344b416ec0e90ceb27ec005Christian Williams    editor.putString("dontDeleteMe", "baz");
9329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.remove("dontDeleteMe");
9429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
9529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.commit();
9629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
97084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    SharedPreferences anotherSharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
985afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    assertThat(anotherSharedPreferences.getBoolean("boolean", false)).isTrue();
9929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getFloat("float", 666f)).isEqualTo(1.1f);
10029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getInt("int", 666)).isEqualTo(2);
101879371277af60d57148eefb24fd046a6a30e4683christianw    assertThat(anotherSharedPreferences.getLong("long", 666L)).isEqualTo(3L);
10229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getString("string", "wacka wa")).isEqualTo("foobar");
10329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
10429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getString("deleteMe", "awol")).isEqualTo("awol");
1055afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    assertThat(anotherSharedPreferences.getString("dontDeleteMe", "oops")).isEqualTo("oops");
10629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  }
10729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
10829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  @Test
10929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  public void commit_shouldClearThenSetValues() throws Exception {
1105afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    editor.putString("deleteMe", "foo");
11129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
112f3a67bea2e9e481c7344b416ec0e90ceb27ec005Christian Williams    editor.clear();
113f3a67bea2e9e481c7344b416ec0e90ceb27ec005Christian Williams    editor.putString("dontDeleteMe", "baz");
11429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
11529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.commit();
11629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
117084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    SharedPreferences anotherSharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
11829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertTrue(anotherSharedPreferences.getBoolean("boolean", false));
11929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getFloat("float", 666f)).isEqualTo(1.1f);
12029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getInt("int", 666)).isEqualTo(2);
121879371277af60d57148eefb24fd046a6a30e4683christianw    assertThat(anotherSharedPreferences.getLong("long", 666L)).isEqualTo(3L);
12229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getString("string", "wacka wa")).isEqualTo("foobar");
12329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
1245afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    // Android always calls clear before put on any open editor, so here "foo" is preserved rather than cleared.
1255afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    assertThat(anotherSharedPreferences.getString("deleteMe", "awol")).isEqualTo("foo");
12629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getString("dontDeleteMe", "oops")).isEqualTo("baz");
12729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  }
12829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
12929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  @Test
1307ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic  public void putString_shouldRemovePairIfValueIsNull() throws Exception {
1315afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    editor.putString("deleteMe", "foo");
1327ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic
1337ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic    editor.putString("deleteMe", null);
1347ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic    editor.commit();
1357ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic
1367ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic    assertThat(sharedPreferences.getString("deleteMe", null)).isNull();
1377ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic  }
1387ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic
1397ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic  @Test
1407ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic  public void putStringSet_shouldRemovePairIfValueIsNull() throws Exception {
1415afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    editor.putStringSet("deleteMe", new HashSet<String>());
1427ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic
1437ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic    editor.putStringSet("deleteMe", null);
1447ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic    editor.commit();
1457ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic
1467ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic    assertThat(sharedPreferences.getStringSet("deleteMe", null)).isNull();
1477ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic  }
1487ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic
1497ac33f6af5b82b0df8e3ebcca90459990f343920Chris Amavisca and Mladen Bajic  @Test
15029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  public void apply_shouldStoreValues() throws Exception {
15129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    editor.apply();
15229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
153084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    SharedPreferences anotherSharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
15429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getString("string", "wacka wa")).isEqualTo("foobar");
15529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  }
15629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
15729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  @Test
15829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  public void shouldReturnDefaultValues() throws Exception {
159084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    SharedPreferences anotherSharedPreferences = context.getSharedPreferences("bazBang", Context.MODE_PRIVATE);
16029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
16129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertFalse(anotherSharedPreferences.getBoolean("boolean", false));
16229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getFloat("float", 666f)).isEqualTo(666f);
16329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getInt("int", 666)).isEqualTo(666);
164879371277af60d57148eefb24fd046a6a30e4683christianw    assertThat(anotherSharedPreferences.getLong("long", 666L)).isEqualTo(666L);
16529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams    assertThat(anotherSharedPreferences.getString("string", "wacka wa")).isEqualTo("wacka wa");
16629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  }
16729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
16829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  @Test
16929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  public void shouldRemoveRegisteredListenersOnUnresgister() {
170084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    SharedPreferences anotherSharedPreferences = context.getSharedPreferences("bazBang", Context.MODE_PRIVATE);
1715afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish
1725afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    SharedPreferences.OnSharedPreferenceChangeListener mockListener = mock(SharedPreferences.OnSharedPreferenceChangeListener.class);
1735afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    anotherSharedPreferences.registerOnSharedPreferenceChangeListener(mockListener);
17429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
1755afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    anotherSharedPreferences.unregisterOnSharedPreferenceChangeListener(mockListener);
1765afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish
1775afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    anotherSharedPreferences.edit().putString("key", "value");
1785afb76fee52a40e7b7738d755045d519ab623a78Jonathan Gerrish    verifyZeroInteractions(mockListener);
17929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams  }
18029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams
18152d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner  @Test
18252d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner  public void shouldTriggerRegisteredListeners() {
183084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux    SharedPreferences anotherSharedPreferences = context.getSharedPreferences("bazBang", Context.MODE_PRIVATE);
18452d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner
18552d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner    final String testKey = "foo";
18652d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner
18738b2f8843fcf4c1144df788aa26375c1195b3e6cChristian Williams    final List<String> transcript = new ArrayList<>();
18852d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner
18952d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner    SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
19052d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner      @Override
19152d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner      public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
19252d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner        transcript.add(key + " called");
19352d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner      }
19452d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner    };
19552d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner    anotherSharedPreferences.registerOnSharedPreferenceChangeListener(listener);
19652d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner    anotherSharedPreferences.edit().putString(testKey, "bar").commit();
19752d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner
19838b2f8843fcf4c1144df788aa26375c1195b3e6cChristian Williams    assertThat(transcript).containsExactly(testKey+ " called");
19952d7ee7fbe259ac0d20d853302fcd0b5e34b9b26David Kirchner  }
200d0cb59970def5b7bbad64be64abec240522ae885Aaron Day}
201