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