• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.testutils.shadow;
18 
19 import android.content.ContentResolver;
20 import android.provider.Settings;
21 
22 import com.google.common.collect.HashBasedTable;
23 import com.google.common.collect.Table;
24 
25 import org.robolectric.annotation.Implementation;
26 import org.robolectric.annotation.Implements;
27 
28 import java.util.Map;
29 import java.util.WeakHashMap;
30 
31 @Implements(Settings.Secure.class)
32 public class ShadowSecureSettings {
33 
34     private static final Map<ContentResolver, Table<Integer, String, Object>> sUserDataMap =
35         new WeakHashMap<>();
36 
37     @Implementation
putStringForUser(ContentResolver resolver, String name, String value, String tag, boolean makeDefault, int userHandle, boolean overrideableByRestore)38     public static boolean putStringForUser(ContentResolver resolver, String name, String value,
39         String tag, boolean makeDefault, int userHandle, boolean overrideableByRestore) {
40         final Table<Integer, String, Object> userTable = getUserTable(resolver);
41         synchronized (userTable) {
42             if (value != null) {
43                 userTable.put(userHandle, name, value);
44             } else {
45                 userTable.remove(userHandle, name);
46             }
47             return true;
48         }
49     }
50 
51     @Implementation
getStringForUser(ContentResolver resolver, String name, int userHandle)52     public static String getStringForUser(ContentResolver resolver, String name, int userHandle) {
53         final Table<Integer, String, Object> userTable = getUserTable(resolver);
54         synchronized (userTable) {
55             return (String) userTable.get(userHandle, name);
56         }
57     }
58 
59     @Implementation
putIntForUser(ContentResolver resolver, String name, int value, int userHandle)60     public static boolean putIntForUser(ContentResolver resolver, String name, int value,
61         int userHandle) {
62         final Table<Integer, String, Object> userTable = getUserTable(resolver);
63         synchronized (userTable) {
64             userTable.put(userHandle, name, value);
65             return true;
66         }
67     }
68 
69     @Implementation
getIntForUser(ContentResolver resolver, String name, int def, int userHandle)70     public static int getIntForUser(ContentResolver resolver, String name, int def,
71         int userHandle) {
72         final Table<Integer, String, Object> userTable = getUserTable(resolver);
73         synchronized (userTable) {
74             final Object object = userTable.get(userHandle, name);
75             return object instanceof Integer ? (Integer) object : def;
76         }
77     }
78 
79     @Implementation
putLongForUser(ContentResolver resolver, String name, long value, int userHandle)80     public static boolean putLongForUser(ContentResolver resolver, String name, long value,
81         int userHandle) {
82         final Table<Integer, String, Object> userTable = getUserTable(resolver);
83         synchronized (userTable) {
84             userTable.put(userHandle, name, value);
85             return true;
86         }
87     }
88 
89     @Implementation
getLongForUser(ContentResolver resolver, String name, long def, int userHandle)90     public static long getLongForUser(ContentResolver resolver, String name, long def,
91         int userHandle) {
92         final Table<Integer, String, Object> userTable = getUserTable(resolver);
93         synchronized (userTable) {
94             final Object object = userTable.get(userHandle, name);
95             return object instanceof Long ? (Long) object : def;
96         }
97     }
98 
99     @Implementation
putFloatForUser( ContentResolver resolver, String name, float value, int userHandle)100     public static boolean putFloatForUser(
101             ContentResolver resolver, String name, float value, int userHandle) {
102         final Table<Integer, String, Object> userTable = getUserTable(resolver);
103         synchronized (userTable) {
104             userTable.put(userHandle, name, value);
105             return true;
106         }
107     }
108 
109     @Implementation
getFloatForUser( ContentResolver resolver, String name, float def, int userHandle)110     public static float getFloatForUser(
111             ContentResolver resolver, String name, float def, int userHandle) {
112         final Table<Integer, String, Object> userTable = getUserTable(resolver);
113         synchronized (userTable) {
114             final Object object = userTable.get(userHandle, name);
115             return object instanceof Float ? (Float) object : def;
116         }
117     }
118 
clear()119     public static void clear() {
120         synchronized (sUserDataMap) {
121             sUserDataMap.clear();
122         }
123     }
124 
getUserTable(ContentResolver contentResolver)125     private static Table<Integer, String, Object> getUserTable(ContentResolver contentResolver) {
126         synchronized (sUserDataMap) {
127             Table<Integer, String, Object> table = sUserDataMap.get(contentResolver);
128             if (table == null) {
129                 table = HashBasedTable.create();
130                 sUserDataMap.put(contentResolver, table);
131             }
132             return table;
133         }
134     }
135 }
136