• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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.slices;
18 
19 import android.content.ContentResolver;
20 import android.net.Uri;
21 import android.provider.SettingsSlicesContract;
22 import android.util.ArrayMap;
23 
24 import androidx.annotation.VisibleForTesting;
25 
26 import com.android.settings.contract.SettingsContractKt;
27 import com.android.settings.display.AlwaysOnDisplaySlice;
28 import com.android.settings.display.ScreenTimeoutPreferenceController;
29 import com.android.settings.flashlight.FlashlightSlice;
30 import com.android.settings.homepage.contextualcards.slices.BluetoothDevicesSlice;
31 import com.android.settings.homepage.contextualcards.slices.ContextualAdaptiveSleepSlice;
32 import com.android.settings.homepage.contextualcards.slices.DarkThemeSlice;
33 import com.android.settings.homepage.contextualcards.slices.FaceSetupSlice;
34 import com.android.settings.homepage.contextualcards.slices.LowStorageSlice;
35 import com.android.settings.location.LocationSlice;
36 import com.android.settings.media.MediaOutputIndicatorSlice;
37 import com.android.settings.media.RemoteMediaSlice;
38 import com.android.settings.network.ProviderModelSlice;
39 import com.android.settings.network.telephony.MobileDataSlice;
40 import com.android.settings.notification.zen.ZenModeButtonPreferenceController;
41 import com.android.settings.wifi.calling.WifiCallingSliceHelper;
42 import com.android.settings.wifi.slice.WifiSlice;
43 import com.android.settingslib.media.MediaOutputConstants;
44 
45 import java.util.Map;
46 
47 /**
48  * A registry of custom slice Uris.
49  */
50 public class CustomSliceRegistry {
51 
52     /**
53      * Uri for Contextual Adaptive Sleep Slice
54      */
55     public static final Uri CONTEXTUAL_ADAPTIVE_SLEEP_URI = new Uri.Builder()
56             .scheme(ContentResolver.SCHEME_CONTENT)
57             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
58             .appendPath(SettingsSlicesContract.PATH_SETTING_INTENT)
59             .appendPath(ScreenTimeoutPreferenceController.PREF_NAME)
60             .build();
61 
62     /**
63      * Backing Uri for the Bluetooth Slice.
64      */
65     public static final Uri BLUETOOTH_URI = new Uri.Builder()
66             .scheme(ContentResolver.SCHEME_CONTENT)
67             .authority(SettingsSlicesContract.AUTHORITY)
68             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
69             .appendPath(SettingsContractKt.KEY_BLUETOOTH)
70             .build();
71 
72     /**
73      * Backing Uri for Bluetooth devices Slice.
74      */
75     public static final Uri BLUETOOTH_DEVICES_SLICE_URI = new Uri.Builder()
76             .scheme(ContentResolver.SCHEME_CONTENT)
77             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
78             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
79             .appendPath("bluetooth_devices")
80             .build();
81 
82     /**
83      * Slice Uri for Enhanced 4G slice
84      */
85     public static final Uri ENHANCED_4G_SLICE_URI = new Uri.Builder()
86             .scheme(ContentResolver.SCHEME_CONTENT)
87             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
88             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
89             .appendPath("enhanced_4g_lte")
90             .build();
91     /**
92      * Slice Uri for Face Enrollment
93      */
94     public static final Uri FACE_ENROLL_SLICE_URI = new Uri.Builder()
95             .scheme(ContentResolver.SCHEME_CONTENT)
96             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
97             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
98             .appendPath("face_unlock_greeting_card")
99             .build();
100     /**
101      * Backing Uri for the Flashlight Slice.
102      */
103     public static final Uri FLASHLIGHT_SLICE_URI = new Uri.Builder()
104             .scheme(ContentResolver.SCHEME_CONTENT)
105             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
106             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
107             .appendPath("flashlight")
108             .build();
109     /**
110      * Backing Uri for the Location Slice.
111      */
112     public static final Uri LOCATION_SLICE_URI = new Uri.Builder()
113             .scheme(ContentResolver.SCHEME_CONTENT)
114             .authority(SettingsSlicesContract.AUTHORITY)
115             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
116             .appendPath(SettingsContractKt.KEY_LOCATION)
117             .build();
118     /**
119      * Backing Uri for Low storage Slice.
120      */
121     public static final Uri LOW_STORAGE_SLICE_URI = new Uri.Builder()
122             .scheme(ContentResolver.SCHEME_CONTENT)
123             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
124             .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT)
125             .appendPath("low_storage")
126             .build();
127     /**
128      * Backing Uri for NFC Slice
129      */
130     public static final Uri NFC_SLICE_URI = new Uri.Builder()
131             .scheme(ContentResolver.SCHEME_CONTENT)
132             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
133             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
134             .appendPath("toggle_nfc")
135             .build();
136 
137     /**
138      * Backing Uri for Mobile Data Slice.
139      */
140     public static final Uri MOBILE_DATA_SLICE_URI = new Uri.Builder()
141             .scheme(ContentResolver.SCHEME_CONTENT)
142             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
143             .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_ACTION)
144             .appendPath(SettingsContractKt.KEY_MOBILE_DATA)
145             .build();
146 
147     /**
148      * Full {@link Uri} for the Provider Model Slice.
149      */
150     public static final Uri PROVIDER_MODEL_SLICE_URI = new Uri.Builder()
151             .scheme(ContentResolver.SCHEME_CONTENT)
152             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
153             .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_ACTION)
154             .appendPath("provider_model")
155             .build();
156 
157     /**
158      * Full {@link Uri} for the Alarm volume Slice.
159      */
160     public static final Uri VOLUME_ALARM_URI = new Uri.Builder()
161             .scheme(ContentResolver.SCHEME_CONTENT)
162             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
163             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
164             .appendPath("alarm_volume")
165             .build();
166 
167     /**
168      * Full {@link Uri} for the Call Volume Slice.
169      */
170     public static final Uri VOLUME_CALL_URI = new Uri.Builder()
171             .scheme(ContentResolver.SCHEME_CONTENT)
172             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
173             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
174             .appendPath(SettingsContractKt.KEY_CALL_VOLUME)
175             .build();
176     /**
177      * Full {@link Uri} for the Media Volume Slice.
178      */
179     public static final Uri VOLUME_MEDIA_URI = new Uri.Builder()
180             .scheme(ContentResolver.SCHEME_CONTENT)
181             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
182             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
183             .appendPath(SettingsContractKt.KEY_MEDIA_VOLUME)
184             .build();
185 
186     /**
187      * Full {@link Uri} for the Separate Ring volume Slice.
188      */
189     public static final Uri VOLUME_SEPARATE_RING_URI = new Uri.Builder()
190             .scheme(ContentResolver.SCHEME_CONTENT)
191             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
192             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
193             .appendPath(SettingsContractKt.KEY_RING_VOLUME)
194             .build();
195 
196     /**
197      * Full {@link Uri} for the Notification volume Slice.
198      */
199     public static final Uri VOLUME_NOTIFICATION_URI = new Uri.Builder()
200             .scheme(ContentResolver.SCHEME_CONTENT)
201             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
202             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
203             .appendPath("notification_volume")
204             .build();
205 
206     /**
207      * Full {@link Uri} for the all volume Slices.
208      */
209     public static final Uri VOLUME_SLICES_URI = new Uri.Builder()
210             .scheme(ContentResolver.SCHEME_CONTENT)
211             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
212             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
213             .appendPath("volume_slices")
214             .build();
215 
216     /**
217      * Full {@link Uri} for the Wifi Calling Slice.
218      */
219     public static final Uri WIFI_CALLING_URI = new Uri.Builder()
220             .scheme(ContentResolver.SCHEME_CONTENT)
221             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
222             .appendPath(SettingsSlicesContract.PATH_SETTING_INTENT)
223             .appendPath(SettingsContractKt.KEY_WIFI_CALLING)
224             .build();
225     /**
226      * Full {@link Uri} for the Wifi Calling Preference Slice.
227      */
228     public static final Uri WIFI_CALLING_PREFERENCE_URI = new Uri.Builder()
229             .scheme(ContentResolver.SCHEME_CONTENT)
230             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
231             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
232             .appendPath(WifiCallingSliceHelper.PATH_WIFI_CALLING_PREFERENCE)
233             .build();
234     /**
235      * Backing Uri for the Wifi Slice.
236      */
237     public static final Uri WIFI_SLICE_URI = new Uri.Builder()
238             .scheme(ContentResolver.SCHEME_CONTENT)
239             .authority(SettingsSlicesContract.AUTHORITY)
240             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
241             .appendPath(SettingsContractKt.KEY_WIFI)
242             .build();
243 
244     /**
245      * Backing Uri for the Zen Mode Slice.
246      */
247     public static final Uri ZEN_MODE_SLICE_URI = new Uri.Builder()
248             .scheme(ContentResolver.SCHEME_CONTENT)
249             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
250             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
251             .appendPath(ZenModeButtonPreferenceController.KEY)
252             .build();
253 
254     /**
255      * Backing Uri for the Media output indicator Slice.
256      */
257     public static Uri MEDIA_OUTPUT_INDICATOR_SLICE_URI = new Uri.Builder()
258             .scheme(ContentResolver.SCHEME_CONTENT)
259             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
260             .appendPath(SettingsSlicesContract.PATH_SETTING_INTENT)
261             .appendPath("media_output_indicator")
262             .build();
263 
264     /**
265      * Backing Uri for the Dark theme Slice.
266      */
267     public static final Uri DARK_THEME_SLICE_URI = new Uri.Builder()
268             .scheme(ContentResolver.SCHEME_CONTENT)
269             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
270             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
271             .appendPath(SettingsContractKt.KEY_DARK_THEME)
272             .build();
273 
274     /**
275      * Backing Uri for the Remote Media Slice.
276      */
277     public static Uri REMOTE_MEDIA_SLICE_URI = new Uri.Builder()
278             .scheme(ContentResolver.SCHEME_CONTENT)
279             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
280             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
281             .appendPath(MediaOutputConstants.KEY_REMOTE_MEDIA)
282             .build();
283 
284     /**
285      * Backing Uri for the Always On Slice.
286      */
287     public static final Uri ALWAYS_ON_SLICE_URI = new Uri.Builder()
288             .scheme(ContentResolver.SCHEME_CONTENT)
289             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
290             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
291             .appendPath("always_on_display")
292             .build();
293 
294     @VisibleForTesting
295     static final Map<Uri, Class<? extends CustomSliceable>> sUriToSlice;
296 
297     static {
298         sUriToSlice = new ArrayMap<>();
sUriToSlice.put(FLASHLIGHT_SLICE_URI, FlashlightSlice.class)299         sUriToSlice.put(FLASHLIGHT_SLICE_URI, FlashlightSlice.class);
sUriToSlice.put(LOCATION_SLICE_URI, LocationSlice.class)300         sUriToSlice.put(LOCATION_SLICE_URI, LocationSlice.class);
sUriToSlice.put(MOBILE_DATA_SLICE_URI, MobileDataSlice.class)301         sUriToSlice.put(MOBILE_DATA_SLICE_URI, MobileDataSlice.class);
sUriToSlice.put(PROVIDER_MODEL_SLICE_URI, ProviderModelSlice.class)302         sUriToSlice.put(PROVIDER_MODEL_SLICE_URI, ProviderModelSlice.class);
sUriToSlice.put(WIFI_SLICE_URI, WifiSlice.class)303         sUriToSlice.put(WIFI_SLICE_URI, WifiSlice.class);
sUriToSlice.put(DARK_THEME_SLICE_URI, DarkThemeSlice.class)304         sUriToSlice.put(DARK_THEME_SLICE_URI, DarkThemeSlice.class);
sUriToSlice.put(ALWAYS_ON_SLICE_URI, AlwaysOnDisplaySlice.class)305         sUriToSlice.put(ALWAYS_ON_SLICE_URI, AlwaysOnDisplaySlice.class);
sUriToSlice.put(MEDIA_OUTPUT_INDICATOR_SLICE_URI, MediaOutputIndicatorSlice.class)306         sUriToSlice.put(MEDIA_OUTPUT_INDICATOR_SLICE_URI, MediaOutputIndicatorSlice.class);
sUriToSlice.put(REMOTE_MEDIA_SLICE_URI, RemoteMediaSlice.class)307         sUriToSlice.put(REMOTE_MEDIA_SLICE_URI, RemoteMediaSlice.class);
308 
309         // Slices for contextual card.
sUriToSlice.put(FACE_ENROLL_SLICE_URI, FaceSetupSlice.class)310         sUriToSlice.put(FACE_ENROLL_SLICE_URI, FaceSetupSlice.class);
sUriToSlice.put(CONTEXTUAL_ADAPTIVE_SLEEP_URI, ContextualAdaptiveSleepSlice.class)311         sUriToSlice.put(CONTEXTUAL_ADAPTIVE_SLEEP_URI, ContextualAdaptiveSleepSlice.class);
sUriToSlice.put(LOW_STORAGE_SLICE_URI, LowStorageSlice.class)312         sUriToSlice.put(LOW_STORAGE_SLICE_URI, LowStorageSlice.class);
sUriToSlice.put(BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class)313         sUriToSlice.put(BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class);
314     }
315 
getSliceClassByUri(Uri uri)316     public static Class<? extends CustomSliceable> getSliceClassByUri(Uri uri) {
317         return sUriToSlice.get(removeParameterFromUri(uri));
318     }
319 
removeParameterFromUri(Uri uri)320     public static Uri removeParameterFromUri(Uri uri) {
321         return uri != null ? uri.buildUpon().clearQuery().build() : null;
322     }
323 
324     /**
325      * Returns {@code true} if {@param uri} is a valid Slice Uri handled by
326      * {@link CustomSliceRegistry}.
327      */
isValidUri(Uri uri)328     public static boolean isValidUri(Uri uri) {
329         return sUriToSlice.containsKey(removeParameterFromUri(uri));
330     }
331 
332     /**
333      * Returns {@code true} if {@param action} is a valid intent action handled by
334      * {@link CustomSliceRegistry}.
335      */
isValidAction(String action)336     public static boolean isValidAction(String action) {
337         return isValidUri(Uri.parse(action));
338     }
339 }
340