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