Ajouter des paramètres de voiture

La plupart des pages de Car Settings sont implémentées sous la forme d'une série de fragments qui étendent SettingsFragment , chacun d'entre eux ayant sa propre activité définie dans CarSettingActivities . Ces activités statiques sont étendues à partir de BaseCarSettingsActivity . En plus de ces paramètres, vous pouvez injecter des préférences d'autres applications système pour apparaître dans CarSettings.

Ajouter une nouvelle préférence dans les paramètres de la voiture

Pour ajouter un nouveau paramètre :

  1. Définissez un fichier XML :
    1. Assurez-vous que toutes les préférences ont défini android:key . La liste des clés est conservée dans preference_keys.xml . Les clés de préférences doivent être uniques.
    2. À des fins d'indexation de recherche, les écrans de préférences doivent également avoir un android:key défini. La liste des touches de l'écran de préférence est conservée dans preference_screen_keys.xml . Les touches de l’écran de préférence doivent également être uniques.
    3. Si la préférence affiche uniquement des informations statiques (par exemple, aucune logique métier particulière), définissez le contrôleur de préférences sur com.android.car.settings.common.DefaultRestrictionsPreferenceController .
    4. Si la préférence nécessite une logique métier, définissez le contrôleur de préférences avec un nouveau nom de contrôleur de préférences.
  2. ( Si nécessaire ) Créez le contrôleur de préférences dans le package approprié, qui étend PreferenceController . Voir le Javadoc si nécessaire.
  3. Créez un fragment avec getPreferenceScreenResId renvoyant le fichier XML défini à l'étape 1.
  4. Créez une activité dans CarSettingActivities qui étend BaseCarSettingsActivity , puis implémentez getInitialFragment() , renvoyant le fragment défini à l'étape 3.
  5. Mettez à jour AndroidManifest.xml pour inclure l'activité définie à l'étape 4.

Exemple

Le matériel suivant illustre ce processus.

  1. Définissez un fichier XML nommé 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. Ajoutez les clés de préférence à 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. Ajoutez la clé d'écran de préférence à preference_screen_keys.xml :
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    Pour le premier exemple de préférence, utilisez DefaultRestrictionsPreferenceController . Pour la deuxième préférence, utilisez un contrôleur de préférences personnalisé, qui doit être défini. Pour cet exemple, vous pouvez personnaliser cette préférence pour les utilisateurs administrateurs disponibles uniquement . Pour ce faire, définissez le contrôleur personnalisé suivant :

    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. Pour créer un fragment, remplacez getPreferenceScreenResId :
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Pour contenir le nouveau fragment, créez une activité dans CarSettingActivities :
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Mettez à jour le fichier manifeste avec la nouvelle activité :
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    Ajouter une préférence d'intention externe dans les paramètres de la voiture

    Comme alternative aux préférences injectées, il est également possible d'insérer une préférence directement dans les paramètres de la voiture qui sera ensuite transférée dans une autre application. Cela peut être fait en ajoutant simplement une préférence à un écran de préférences avec une action intentionnelle qui se résout en une application externe. Comme les autres préférences dans les paramètres de la voiture, ces préférences disposent des mêmes attributs 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>
    

    Ajouter une préférence injectée

    Les préférences injectées contiennent des intentions menant à des activités externes ou internes. À titre d'exemple, l'élément de paramètre Google sur la page d'accueil Paramètres est une préférence injectée. Les préférences injectées sont particulièrement utiles lorsque l’une des conditions suivantes est vraie. Le réglage:

    • N'est pas directement implémenté dans l'application CarSettings (comme l'injection d'un paramètre implémenté par les OEM).
    • Doit apparaître dans l’application CarSettings.

    Pour configurer une activité comme paramètre injecté :

    1. Pour marquer l'activité comme paramètre injecté, ajoutez un filtre d'intention à l'activité.
    2. Indiquez à l'application CarSettings à quelle catégorie elle appartient. La catégorie est une constante, définie dans CategoryKey , et est utilisée pour indiquer à quel niveau de CarSettings le paramètre injecté doit apparaître. Nous fournissons un ensemble de catégories à l'intérieur CategoryKey , mais il n'y a aucune restriction pour que les OEM définissent leurs propres catégories.
    3. ( facultatif ) Ajoutez un texte récapitulatif lorsque le paramètre est affiché :
      <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>
      

    Pour que le paramètre injecté apparaisse sur une page spécifique de l'application CarSettings, incluez l'exemple de code suivant dans le XML, en modifiant les variables le cas échéant :

    <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>