• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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