1 /* 2 * Copyright (C) 2020 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.car.settings.common; 18 19 import android.annotation.Nullable; 20 import android.content.Intent; 21 import android.net.Uri; 22 import android.os.Bundle; 23 import android.os.UserHandle; 24 import android.provider.Settings; 25 import android.text.TextUtils; 26 27 import androidx.fragment.app.Fragment; 28 29 import com.android.car.settings.R; 30 import com.android.car.settings.accessibility.AccessibilitySettingsFragment; 31 import com.android.car.settings.accessibility.CaptionsSettingsFragment; 32 import com.android.car.settings.accounts.ChooseAccountFragment; 33 import com.android.car.settings.applications.ApplicationDetailsFragment; 34 import com.android.car.settings.applications.ApplicationsSettingsFragment; 35 import com.android.car.settings.applications.AppsFragment; 36 import com.android.car.settings.applications.assist.AssistantAndVoiceFragment; 37 import com.android.car.settings.applications.defaultapps.DefaultAutofillPickerFragment; 38 import com.android.car.settings.applications.specialaccess.ModifySystemSettingsFragment; 39 import com.android.car.settings.applications.specialaccess.NotificationAccessFragment; 40 import com.android.car.settings.applications.specialaccess.PremiumSmsAccessFragment; 41 import com.android.car.settings.applications.specialaccess.SpecialAccessSettingsFragment; 42 import com.android.car.settings.applications.specialaccess.UsageAccessFragment; 43 import com.android.car.settings.applications.specialaccess.WifiControlFragment; 44 import com.android.car.settings.bluetooth.BluetoothSettingsFragment; 45 import com.android.car.settings.datetime.DatetimeSettingsFragment; 46 import com.android.car.settings.display.DisplaySettingsFragment; 47 import com.android.car.settings.inputmethod.KeyboardFragment; 48 import com.android.car.settings.language.LanguagePickerFragment; 49 import com.android.car.settings.language.LanguagesAndInputFragment; 50 import com.android.car.settings.location.LocationSettingsFragment; 51 import com.android.car.settings.network.MobileNetworkFragment; 52 import com.android.car.settings.network.MobileNetworkListFragment; 53 import com.android.car.settings.network.NetworkAndInternetFragment; 54 import com.android.car.settings.notifications.NotificationsFragment; 55 import com.android.car.settings.privacy.PrivacySettingsFragment; 56 import com.android.car.settings.privacy.VehicleDataFragment; 57 import com.android.car.settings.profiles.ProfileDetailsFragment; 58 import com.android.car.settings.security.SecuritySettingsFragment; 59 import com.android.car.settings.sound.RingtonePickerFragment; 60 import com.android.car.settings.sound.SoundSettingsFragment; 61 import com.android.car.settings.storage.StorageSettingsFragment; 62 import com.android.car.settings.system.AboutSettingsFragment; 63 import com.android.car.settings.system.LegalInformationFragment; 64 import com.android.car.settings.system.ResetOptionsFragment; 65 import com.android.car.settings.system.SystemSettingsFragment; 66 import com.android.car.settings.tts.TextToSpeechOutputFragment; 67 import com.android.car.settings.units.UnitsSettingsFragment; 68 import com.android.car.settings.wifi.AddWifiFragment; 69 import com.android.car.settings.wifi.WifiSettingsFragment; 70 import com.android.car.settings.wifi.WifiTetherFragment; 71 import com.android.car.settings.wifi.preferences.WifiPreferencesFragment; 72 73 /** 74 * Top level settings class, containing static instances of CarSettings activities. 75 */ 76 public class CarSettingActivities { 77 78 private static final Logger LOG = new Logger(CarSettingActivities.class); 79 80 /** 81 * Homepage Activity. 82 */ 83 public static class HomepageActivity extends BaseCarSettingsActivity { 84 @Nullable 85 @Override getInitialFragment()86 protected Fragment getInitialFragment() { 87 try { 88 return getSupportFragmentManager().getFragmentFactory().instantiate( 89 getClassLoader(), getString(R.string.config_homepage_fragment_class)); 90 } catch (Fragment.InstantiationException e) { 91 LOG.e("Unable to instantiate homepage fragment", e); 92 return null; 93 } 94 } 95 96 @Override shouldFocusContentOnLaunch()97 protected boolean shouldFocusContentOnLaunch() { 98 // Focus should stay with the top-level menu for the HomepageActivity. 99 return false; 100 } 101 } 102 103 // Homepage sub-sections 104 105 /** 106 * Display Settings Activity. 107 */ 108 public static class DisplaySettingsActivity extends BaseCarSettingsActivity { 109 @Nullable 110 @Override getInitialFragment()111 protected Fragment getInitialFragment() { 112 return new DisplaySettingsFragment(); 113 } 114 } 115 116 /** 117 * Sound Settings Activity. 118 */ 119 public static class SoundSettingsActivity extends BaseCarSettingsActivity { 120 @Nullable 121 @Override getInitialFragment()122 protected Fragment getInitialFragment() { 123 return new SoundSettingsFragment(); 124 } 125 } 126 127 /** 128 * Ringtone Picker Activity. 129 */ 130 public static class RingtonePickerActivity extends BaseCarSettingsActivity { 131 @Nullable 132 @Override getInitialFragment()133 protected Fragment getInitialFragment() { 134 Bundle args = getIntent().getExtras().deepCopy(); 135 Fragment fragment = new RingtonePickerFragment(); 136 fragment.setArguments(args); 137 return fragment; 138 } 139 } 140 141 /** 142 * Network and Internet Activity. 143 */ 144 public static class NetworkAndInternetActivity extends BaseCarSettingsActivity { 145 @Nullable 146 @Override getInitialFragment()147 protected Fragment getInitialFragment() { 148 return new NetworkAndInternetFragment(); 149 } 150 } 151 152 /** 153 * Bluetooth Settings Activity. 154 */ 155 public static class BluetoothSettingsActivity extends BaseCarSettingsActivity { 156 @Nullable 157 @Override getInitialFragment()158 protected Fragment getInitialFragment() { 159 return new BluetoothSettingsFragment(); 160 } 161 } 162 163 /** 164 * Units Settings Activity. 165 */ 166 public static class UnitsSettingsActivity extends BaseCarSettingsActivity { 167 @Nullable 168 @Override getInitialFragment()169 protected Fragment getInitialFragment() { 170 return new UnitsSettingsFragment(); 171 } 172 } 173 174 /** 175 * Location Settings Activity. 176 */ 177 public static class LocationSettingsActivity extends BaseCarSettingsActivity { 178 @Nullable 179 @Override getInitialFragment()180 protected Fragment getInitialFragment() { 181 return new LocationSettingsFragment(); 182 } 183 } 184 185 /** 186 * Apps Activity. 187 */ 188 public static class AppsActivity extends BaseCarSettingsActivity { 189 @Nullable 190 @Override getInitialFragment()191 protected Fragment getInitialFragment() { 192 return new AppsFragment(); 193 } 194 } 195 196 /** 197 * Notifications Activity. 198 */ 199 public static class NotificationsActivity extends BaseCarSettingsActivity { 200 @Nullable 201 @Override getInitialFragment()202 protected Fragment getInitialFragment() { 203 return new NotificationsFragment(); 204 } 205 } 206 207 /** 208 * Datetime Settings Activity. 209 */ 210 public static class DatetimeSettingsActivity extends BaseCarSettingsActivity { 211 @Nullable 212 @Override getInitialFragment()213 protected Fragment getInitialFragment() { 214 return new DatetimeSettingsFragment(); 215 } 216 } 217 218 /** 219 * Profile Details Activity. 220 */ 221 public static class ProfileDetailsActivity extends BaseCarSettingsActivity { 222 @Nullable 223 @Override getInitialFragment()224 protected Fragment getInitialFragment() { 225 return ProfileDetailsFragment.newInstance(UserHandle.myUserId()); 226 } 227 } 228 229 /** 230 * Privacy Settings Activity. 231 */ 232 public static class PrivacySettingsActivity extends BaseCarSettingsActivity { 233 @Nullable 234 @Override getInitialFragment()235 protected Fragment getInitialFragment() { 236 return new PrivacySettingsFragment(); 237 } 238 } 239 240 /** 241 * Vehicle Data Activity. 242 */ 243 public static class VehicleDataActivity extends BaseCarSettingsActivity { 244 @Nullable 245 @Override getInitialFragment()246 protected Fragment getInitialFragment() { 247 return new VehicleDataFragment(); 248 } 249 } 250 251 /** 252 * Storage Settings Activity. 253 */ 254 public static class StorageSettingsActivity extends BaseCarSettingsActivity { 255 @Nullable 256 @Override getInitialFragment()257 protected Fragment getInitialFragment() { 258 return new StorageSettingsFragment(); 259 } 260 } 261 262 /** 263 * Security Settings Activity. 264 */ 265 public static class SecuritySettingsActivity extends BaseCarSettingsActivity { 266 @Nullable 267 @Override getInitialFragment()268 protected Fragment getInitialFragment() { 269 return new SecuritySettingsFragment(); 270 } 271 } 272 273 /** 274 * Assistant & voice Settings Activity. 275 */ 276 public static class AssistantAndVoiceSettingsActivity extends BaseCarSettingsActivity { 277 @Nullable 278 @Override getInitialFragment()279 protected Fragment getInitialFragment() { 280 return new AssistantAndVoiceFragment(); 281 } 282 } 283 284 /** 285 * System Settings Activity. 286 */ 287 public static class SystemSettingsActivity extends BaseCarSettingsActivity { 288 @Nullable 289 @Override getInitialFragment()290 protected Fragment getInitialFragment() { 291 return new SystemSettingsFragment(); 292 } 293 } 294 295 // Network & internet sub-sections 296 297 /** 298 * Wifi Settings Activity. 299 */ 300 public static class WifiSettingsActivity extends BaseCarSettingsActivity { 301 @Nullable 302 @Override getInitialFragment()303 protected Fragment getInitialFragment() { 304 return new WifiSettingsFragment(); 305 } 306 } 307 308 /** 309 * Wifi Hotspot and Tethering Activity. 310 */ 311 public static class WifiTetherActivity extends BaseCarSettingsActivity { 312 @Nullable 313 @Override getInitialFragment()314 protected Fragment getInitialFragment() { 315 return new WifiTetherFragment(); 316 } 317 } 318 319 /** 320 * Mobile Network Activity. 321 */ 322 public static class MobileNetworkActivity extends BaseCarSettingsActivity { 323 @Nullable 324 @Override getInitialFragment()325 protected Fragment getInitialFragment() { 326 return MobileNetworkFragment.newInstance( 327 getIntent().getIntExtra("network_sub_id", Integer.MIN_VALUE)); 328 } 329 } 330 331 /** 332 * Mobile Network List Activity. 333 */ 334 public static class MobileNetworkListActivity extends BaseCarSettingsActivity { 335 @Nullable 336 @Override getInitialFragment()337 protected Fragment getInitialFragment() { 338 return new MobileNetworkListFragment(); 339 } 340 } 341 342 // Apps & Notifications sub-sections 343 344 /** 345 * Application Settings Activity. 346 */ 347 public static class ApplicationsSettingsActivity extends BaseCarSettingsActivity { 348 @Nullable 349 @Override getInitialFragment()350 protected Fragment getInitialFragment() { 351 return new ApplicationsSettingsFragment(); 352 } 353 } 354 355 /** 356 * Application Special Access Settings Activity. 357 */ 358 public static class SpecialAccessSettingsActivity extends BaseCarSettingsActivity { 359 @Nullable 360 @Override getInitialFragment()361 protected Fragment getInitialFragment() { 362 return new SpecialAccessSettingsFragment(); 363 } 364 } 365 366 // System sub-sections 367 368 /** 369 * Languages and Input Activity. 370 */ 371 public static class LanguagesAndInputActivity extends BaseCarSettingsActivity { 372 @Nullable 373 @Override getInitialFragment()374 protected Fragment getInitialFragment() { 375 return new LanguagesAndInputFragment(); 376 } 377 } 378 379 /** 380 * About Settings Activity. 381 */ 382 public static class AboutSettingsActivity extends BaseCarSettingsActivity { 383 @Nullable 384 @Override getInitialFragment()385 protected Fragment getInitialFragment() { 386 return new AboutSettingsFragment(); 387 } 388 } 389 390 /** 391 * Legal Information Activity. 392 */ 393 public static class LegalInformationActivity extends BaseCarSettingsActivity { 394 @Nullable 395 @Override getInitialFragment()396 protected Fragment getInitialFragment() { 397 return new LegalInformationFragment(); 398 } 399 } 400 401 /** 402 * Reset Options Activity. 403 */ 404 public static class ResetOptionsActivity extends BaseCarSettingsActivity { 405 @Nullable 406 @Override getInitialFragment()407 protected Fragment getInitialFragment() { 408 return new ResetOptionsFragment(); 409 } 410 } 411 412 // Wi-fi sub-sections 413 414 /** 415 * Add Wifi Network Activity. 416 */ 417 public static class AddWifiActivity extends BaseCarSettingsActivity { 418 @Nullable 419 @Override getInitialFragment()420 protected Fragment getInitialFragment() { 421 return new AddWifiFragment(); 422 } 423 } 424 425 /** 426 * Wifi Preferences Activity. 427 */ 428 public static class WifiPreferencesActivity extends BaseCarSettingsActivity { 429 @Nullable 430 @Override getInitialFragment()431 protected Fragment getInitialFragment() { 432 return new WifiPreferencesFragment(); 433 } 434 } 435 436 // App Info sub-sections 437 438 /** 439 * Application Details Activity. 440 * Intent required to include package string as Settings.EXTRA_APP_PACKAGE extra. 441 */ 442 public static class ApplicationsDetailsActivity extends BaseCarSettingsActivity { 443 @Nullable 444 @Override getInitialFragment()445 protected Fragment getInitialFragment() { 446 Intent intent = getIntent(); 447 String pkg = intent.getStringExtra(Settings.EXTRA_APP_PACKAGE); 448 if (TextUtils.isEmpty(pkg)) { 449 LOG.w("No package provided for application detailed intent"); 450 Uri uri = intent.getData(); 451 if (uri == null) { 452 LOG.w("No uri provided for application detailed intent"); 453 return null; 454 } 455 pkg = uri.getSchemeSpecificPart(); 456 } 457 return ApplicationDetailsFragment.getInstance(pkg); 458 } 459 } 460 461 // Special app access sub-section 462 463 /** 464 * App Modify System Settings Access Activity. 465 */ 466 public static class ModifySystemSettingsActivity extends BaseCarSettingsActivity { 467 @Nullable 468 @Override getInitialFragment()469 protected Fragment getInitialFragment() { 470 return new ModifySystemSettingsFragment(); 471 } 472 } 473 474 /** 475 * App Notification Access Activity. 476 */ 477 public static class NotificationAccessActivity extends BaseCarSettingsActivity { 478 @Nullable 479 @Override getInitialFragment()480 protected Fragment getInitialFragment() { 481 return new NotificationAccessFragment(); 482 } 483 } 484 485 /** 486 * App Premium SMS Access Activity. 487 */ 488 public static class PremiumSmsAccessActivity extends BaseCarSettingsActivity { 489 @Nullable 490 @Override getInitialFragment()491 protected Fragment getInitialFragment() { 492 return new PremiumSmsAccessFragment(); 493 } 494 } 495 496 /** 497 * App Usage Access Activity. 498 */ 499 public static class UsageAccessActivity extends BaseCarSettingsActivity { 500 @Nullable 501 @Override getInitialFragment()502 protected Fragment getInitialFragment() { 503 return new UsageAccessFragment(); 504 } 505 } 506 507 /** 508 * App Wifi Control Access Activity. 509 */ 510 public static class WifiControlActivity extends BaseCarSettingsActivity { 511 @Nullable 512 @Override getInitialFragment()513 protected Fragment getInitialFragment() { 514 return new WifiControlFragment(); 515 } 516 } 517 518 // Account sub-section 519 520 /** 521 * Choose Account Activity. 522 */ 523 public static class ChooseAccountActivity extends BaseCarSettingsActivity { 524 @Nullable 525 @Override getInitialFragment()526 protected Fragment getInitialFragment() { 527 return new ChooseAccountFragment(); 528 } 529 } 530 531 // Languages & input sub-section 532 533 /** 534 * Language Picker Activity. 535 */ 536 public static class LanguagePickerActivity extends BaseCarSettingsActivity { 537 @Nullable 538 @Override getInitialFragment()539 protected Fragment getInitialFragment() { 540 return new LanguagePickerFragment(); 541 } 542 } 543 544 /** 545 * Default Autofill Picker Activity. 546 */ 547 public static class DefaultAutofillPickerActivity extends BaseCarSettingsActivity { 548 @Nullable 549 @Override getInitialFragment()550 protected Fragment getInitialFragment() { 551 return new DefaultAutofillPickerFragment(); 552 } 553 } 554 555 /** 556 * Keyboard Activity. 557 */ 558 public static class KeyboardActivity extends BaseCarSettingsActivity { 559 @Nullable 560 @Override getInitialFragment()561 protected Fragment getInitialFragment() { 562 return new KeyboardFragment(); 563 } 564 } 565 566 /** 567 * Text to Speech Output Activity. 568 */ 569 public static class TextToSpeechOutputActivity extends BaseCarSettingsActivity { 570 @Nullable 571 @Override getInitialFragment()572 protected Fragment getInitialFragment() { 573 return new TextToSpeechOutputFragment(); 574 } 575 } 576 577 /** 578 * Accessibility Activity. 579 */ 580 public static class AccessibilityActivity extends BaseCarSettingsActivity { 581 @Nullable 582 @Override getInitialFragment()583 protected Fragment getInitialFragment() { 584 return new AccessibilitySettingsFragment(); 585 } 586 } 587 588 /** 589 * Captions Activity. 590 */ 591 public static class CaptionsActivity extends BaseCarSettingsActivity { 592 @Nullable 593 @Override getInitialFragment()594 protected Fragment getInitialFragment() { 595 return new CaptionsSettingsFragment(); 596 } 597 } 598 599 } 600