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