Aggiungere le impostazioni dell'auto

La maggior parte delle pagine nelle Impostazioni auto è implementata come una serie di frammenti che estendono SettingsFragment, ciascuno con la propria attività definita in CarSettingActivities. Queste attività statiche sono estese da BaseCarSettingsActivity. Oltre a queste impostazioni, puoi inserire le preferenze di altre app di sistema in modo che vengano visualizzate in Impostazioni auto.

Aggiungere una nuova preferenza nelle Impostazioni dell'auto

Per aggiungere una nuova impostazione:

  1. Definisci un file XML:
    1. Assicurati che tutte le preferenze abbiano definito android:key. L'elenco delle chiavi viene gestito in preference_keys.xml. Le chiavi delle preferenze devono essere univoche.
    2. Ai fini dell'indicizzazione della ricerca, le schermate delle preferenze devono avere anche un valore android:key definito. L'elenco delle chiavi della schermata delle preferenze viene gestito in preference_screen_keys.xml. Anche le chiavi delle schermate di preferenze devono essere univoche.
    3. Se la preferenza mostra solo informazioni statiche (ad esempio, nessuna logica di business speciale), imposta il controller delle preferenze su com.android.car.settings.common.DefaultRestrictionsPreferenceController.
    4. Se la preferenza richiede la logica di business, imposta il controller di preferenze con un nuovo nome.
  2. (Se necessario) Crea il controller delle preferenze nel package appropriato, che estende PreferenceController. Se necessario, consulta la documentazione Javadoc.
  3. Crea un frammento con getPreferenceScreenResId che restituisce il file XML definito nel passaggio 1.
  4. Crea un'attività in CarSettingActivities che espanda BaseCarSettingsActivity e poi implementa getInitialFragment(), restituendo il frammento definito nel passaggio 3.
  5. Aggiorna AndroidManifest.xml in modo da includere l'attività definita nel passaggio 4.

Esempio

Il seguente materiale illustra questa procedura.

  1. Definisci un file XML denominato demo_fragment.xml:
    <PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:settings="http://schemas.android.com/apk/res-auto"
        android:title="@string/demo_label"
        android:key="@string/psk_demo">
        <Preference
            android:icon="@drawable/ic_settings_demo_preference_1"
            android:key="@string/pk_demo_preference_1"
            android:title="@string/demo_preference_1_title"
    settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
            <intent android:targetPackage="com.android.car.settings"
    android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting1Activity"/>
        </Preference>
        <Preference
            android:icon="@drawable/ic_settings_demo_preference_2"
            android:key="@string/pk_demo_preference_2"
            android:title="@string/demo_preference_2_title"
    settings:controller="com.android.car.settings.example.MyCustomRestrictionsPreferenceController">
            <intent android:targetPackage="com.android.car.settings"
    android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting2Activity"/>
        </Preference>
    </PreferenceScreen>
  2. Aggiungi le chiavi delle preferenze a preference_keys:
    <resources>
        [...]
        <string name="pk_demo_preference_1" translatable="false">demo_preference_1</string>
        <string name="pk_demo_preference_2" translatable="false">demo_preference_2</string>
    </resources>
  3. Aggiungi la chiave della schermata delle preferenze a preference_screen_keys.xml:
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>

    Per la prima preferenza di esempio, utilizza DefaultRestrictionsPreferenceController. Per la seconda preferenza, utilizza un controller delle preferenze personalizzato, che deve essere definito. Per questo esempio, puoi personalizzare questa preferenza solo per gli utenti amministratore disponibili. Per farlo, definisci il seguente controller personalizzato:

    public class MyCustomRestrictionsPreferenceController extends 
        PreferenceController<Preference> {
    
        private final UserManager mUserManager;
    
        public MyCustomRestrictionsPreferenceController(Context context, String 
            preferenceKey, FragmentController fragmentController, 
            CarUxRestrictions uxRestrictions) {
            super(context, preferenceKey, fragmentController, uxRestrictions);
            mUserManager = UserManager.get(context);
        }
    
        @Override
        protected Class<Preference> getPreferenceType() {
            return Preference.class;
        }
    
        @Override
        public int getAvailabilityStatus() {
            return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
        }
    }
  4. Per creare un frammento, sostituisci getPreferenceScreenResId:
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
  6. Per contenere il nuovo frammento, crea un'attività in CarSettingActivities:
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
  8. Aggiorna il file manifest con la nuova attività:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>

    Aggiungere una preferenza di intent esterno nelle Impostazioni dell'auto

    Come alternativa alle preferenze iniettate, è anche possibile inserire una preferenza direttamente nelle Impostazioni auto che indirizzi a un'altra app. Per farlo, è sufficiente aggiungere una preferenza a una schermata delle preferenze con un'azione di intent che risolve in un'app esterna. Come le altre preferenze nelle Impostazioni auto, queste preferenze hanno a disposizione gli stessi attributi XML.

    <Preference
        android:key="@string/pk_demo_preference"
        android:title="@string/demo_preference_title"
        android:summary="@string/demo_preference_summary"
    settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
            <intent android:action="android.intent.action.DEMO_ACTION"/>
    </Preference>

    Aggiungere una preferenza iniettata

    Le preferenze iniettate contengono intent che portano a attività esterne o interne. Ad esempio, l'elemento di impostazione Google nella home page delle impostazioni è una preferenza iniettata. Le preferenze iniettate sono particolarmente utili quando si verifica una delle seguenti condizioni. L'impostazione:

    • Non è implementata direttamente nell'app CarSettings (ad esempio, l'inserimento di un'impostazione implementata dagli OEM).
    • Dovrebbe essere visualizzato nell'app Impostazioni auto.

    Per configurare un'attività come impostazione iniettata:

    1. Per contrassegnare l'attività come impostazione iniettata, aggiungi un filtro per intent all'attività.
    2. Indica all'app CarSettings a quale categoria appartiene. La categoria è una costante, definita in CategoryKey, e viene utilizzata per indicare a quale livello di CarSettings deve essere visualizzata l'impostazione iniettata. Forniamo un insieme di categorie all'interno di CategoryKey, ma non ci sono limitazioni per la definizione da parte degli OEM delle proprie categorie.
    3. (Facoltativo) Aggiungi un testo di riepilogo quando viene visualizzata l'impostazione:
      <activity android:name="Settings$DemoSettingsActivity"
          <!-- Mark the activity as an injected setting -->
          <intent-filter>
              <action android:name="com.android.settings.action.EXTRA_SETTINGS"/>
          </intent-filter>
          <!-- Tell CarSettings app which category it belongs to -->
          <meta-data android:name="com.android.settings.category"
                     android:value="com.android.settings.category.demo_category"/>
          <!-- Tell CarSettings the what the preference title should be -->
          <meta-data android:name="com.android.settings.title"
                     android:value="@string/app_name" />
          <!-- Optional: specify the icon to show with the preference -->
          <meta-data android:name="com.android.settings.icon"
                     android:resource="@drawable/ic_demo"
                     android:value="true"/>
          <!-- Optional: Add a summary text when the string is displayed -->
          <meta-data android:name="com.android.settings.summary"
                     android:resource="@string/demo_summary"/>
      </activity>

    Per visualizzare l'impostazione iniettata in una pagina specifica dell'app CarSettings, includi il seguente codice di esempio nel file XML, modificando le variabili ove opportuno:

    <com.android.car.settings.common.LogicalPreferenceGroup
        <!-- Replace key string -->
        android:key="@string/pk_system_extra_settings"
        <!-- Indicates the preferences in the group should be injected in.
             ExtraSettingsPreferenceController contains the logic to pull in injected
             preferences. -->
    settings:controller="com.android.settings.common.ExtraSettingsPreferenceController">
        <!-- Tells the controller what activities should be pulled into this preference
             group. -->
        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
            <!-- Name and value should match the metadata in your activity -->
            <extra android:name="com.android.settings.category"
                   android:value="com.android.settings.category.demo_category"/>
        </intent>
    </com.android.car.settings.common.LogicalPreferenceGroup>