Ajouter les paramètres du véhicule

La plupart des pages des paramètres du véhicule sont implémentées sous la forme d'une série les 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 apparaissent dans Paramètres Voiture.

Ajouter une préférence dans les paramètres du véhicule

Pour ajouter un paramètre:

  1. Définissez un fichier XML: <ph type="x-smartling-placeholder">
      </ph>
    1. Assurez-vous que android:key est défini dans toutes les préférences. La liste des clés est conservée dans preference_keys.xml. Préférences doivent être uniques.
    2. Pour l'indexation de la recherche, les écrans de préférences doivent également avoir un android:key défini. Liste des touches de l'écran des préférences est géré dans preference_screen_keys.xml. Préférence les touches d'écran doivent également être uniques.
    3. Si la préférence n'affiche que 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 la préférence avec un nouveau nom.
  2. (Si nécessaire) Créez le contrôleur de préférences dans les , qui étend PreferenceController. Consultez la documentation Javadoc si nécessaire.
  3. Créez un fragment avec getPreferenceScreenResId renvoyant le XML défini à l'étape 1.
  4. Créer une activité dans CarSettingActivities qui s'étend BaseCarSettingsActivity Ensuite, implémentez getInitialFragment() en renvoyant le fragment. définis à 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 des 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. Pour cet exemple, vous pouvez personnaliser cette préférence pour les 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'intent externe dans les paramètres de la voiture

    À la place des préférences injectées, il est également possible insérez une préférence directement dans les paramètres de la voiture qui redirige les intents vers une autre application. Il suffit pour cela d'ajouter une préférence à un écran de préférences avec une action d'intent qui renvoie vers un l'application. 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 intents menant à des requêtes externes ou internes activités. Par exemple, l'élément de paramètre Google dans l'application Paramètres la page d'accueil est une préférence injectée. Les préférences injectées sont particulièrement utile dans les cas suivants : Le paramètre:

    • ne sont pas directement implémentés dans l'application CarSettings (par exemple, injectant un paramètre implémenté par les OEM).
    • Doit s'afficher dans l'application CarSettings.

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

    1. Pour marquer l'activité comme un paramètre injecté, ajoutez un filtre d'intent à l'activité.
    2. Indiquez à l'application CarSettings à quelle catégorie elle appartient. La catégorie est un constante, définie dans CategoryKey, et est utilisé pour indiquer à quel niveau des CarSettings le paramètre injecté doivent apparaître. Nous proposons un ensemble de catégories CategoryKey, mais il n'existe aucune restriction à définir par les OEM 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 du CarSettings, incluez l'exemple de code suivant dans le fichier XML, en modifiant 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>