Ajouter des paramètres de véhicule

La plupart des pages des paramètres de la voiture sont implémentées sous la forme d'une série de fragments qui étendent SettingsFragment, chacun d'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 qu'elles apparaissent dans CarSettings.

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

Pour ajouter un 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 gérée dans preference_keys.xml. Les clés de préférences doivent être uniques.
    2. À des fins d'indexation de la recherche, les écrans de préférences doivent également comporter un android:key défini. La liste des clés de l'écran de préférences est gérée dans preference_screen_keys.xml. Les clés de l'écran des préférences doivent également être uniques.
    3. Si la préférence n'affiche que des informations statiques (par exemple, aucune logique métier spéciale), 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. Consultez la documentation 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(), en renvoyant le fragment défini à l'étape 3.
  5. Mettez à jour AndroidManifest.xml pour inclure l'activité définie à l'étape 4.

Exemple

Le document 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é de l'écran de préférences à 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. Dans cet exemple, vous pouvez personnaliser cette préférence pour les utilisateurs administrateur 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'intent externe dans les paramètres de la voiture

    Au lieu d'utiliser des préférences injectées, vous pouvez également insérer une préférence directement dans les paramètres de la voiture qui transfère des intents vers une autre application. Pour ce faire, il vous suffit d'ajouter une préférence à un écran de préférences avec une action d'intent qui se résout en une application externe. Comme les autres préférences des 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 intents menant à des activités externes ou internes. Par exemple, l'élément de paramètre Google sur la page d'accueil des paramètres est une préférence injectée. Les préférences injectées sont particulièrement utiles dans les cas suivants : Paramètre:

    • Ne sont pas implémentés directement dans l'application CarSettings (par exemple, en injectant un paramètre implémenté par les OEM).
    • Il devrait apparaître dans l'application CarSettings.

    Pour configurer une activité en tant que paramètre injecté:

    1. Pour marquer l'activité comme paramètre injecté, ajoutez un filtre d'intent à l'activité.
    2. Indiquez à l'application CarSettings à quelle catégorie elle appartient. La catégorie est une constante, définie dans CategoryKey, et permet d'indiquer à quel niveau de CarSettings le paramètre injecté doit apparaître. Nous fournissons un ensemble de catégories dans CategoryKey, mais les OEM peuvent définir leurs propres catégories sans aucune restriction.
    3. (Facultatif) Ajoutez un texte récapitulatif lorsque le paramètre s'affiche:
      <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é s'affiche sur une page spécifique de l'application CarSettings, incluez l'exemple de code suivant dans le fichier 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>