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