Adición de ajustes de coche

La mayoría de las páginas de Car Settings se implementan como una serie de fragmentos que amplían SettingsFragment , y cada uno de ellos tiene su propia actividad definida en CarSettingActivities . Estas actividades estáticas se extienden desde BaseCarSettingsActivity . Además de estas configuraciones, puede inyectar preferencias de otras aplicaciones del sistema para que aparezcan en CarSettings.

Agregar una nueva preferencia en la configuración del automóvil

Para agregar una nueva configuración:

  1. Defina un archivo XML:
    1. Asegúrese de que todas las preferencias hayan definido android:key . La lista de claves se mantiene en preference_keys.xml . Las claves de preferencias deben ser únicas.
    2. Para fines de indexación de búsqueda, las pantallas de preferencias también deben tener una android:key definida. La lista de teclas de pantalla de preferencia se mantiene en preference_screen_keys.xml . Las teclas de pantalla de preferencias también deben ser únicas.
    3. Si la preferencia muestra solo información estática (por ejemplo, sin una lógica comercial especial), establezca el controlador de preferencias como com.android.car.settings.common.DefaultRestrictionsPreferenceController .
    4. Si la preferencia requiere lógica comercial, configure el controlador de preferencia con un nuevo nombre de controlador de preferencia.
  2. ( Si es necesario ) Cree el controlador de preferencias en el paquete adecuado, que amplía PreferenceController . Consulte el Javadoc si es necesario.
  3. Cree un fragmento con getPreferenceScreenResId devuelva el archivo XML definido en el Paso 1.
  4. Cree una actividad en CarSettingActivities que amplíe BaseCarSettingsActivity y luego implemente getInitialFragment() , devolviendo el fragmento definido en el Paso 3.
  5. Actualice AndroidManifest.xml para incluir la actividad definida en el Paso 4.

Ejemplo

El siguiente material ilustra este proceso.

  1. Defina un archivo XML llamado 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. Agregue las claves de preference_keys a las claves_preferencias:
    <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. Agregue la tecla de pantalla de preferencias a preference_screen_keys.xml :
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    Para la primera preferencia de ejemplo, use DefaultRestrictionsPreferenceController . Para la segunda preferencia, use un controlador de preferencia personalizado, que debe definirse. Para este ejemplo, puede personalizar esta preferencia solo para los usuarios administradores disponibles. Para hacerlo, defina el siguiente controlador personalizado:

    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. Para crear un fragmento, getPreferenceScreenResId :
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Para contener el nuevo fragmento, cree una actividad en CarSettingActivities :
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Actualice el archivo de manifiesto con la nueva actividad:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    Agregar una preferencia de intención externa dentro de la configuración del automóvil

    Como alternativa a las preferencias inyectadas, también es posible insertar una preferencia directamente en la configuración del automóvil que se intente en otra aplicación. Esto se puede hacer simplemente agregando una preferencia a una pantalla de preferencias con una acción de intención que se resuelva en una aplicación externa. Al igual que otras preferencias en la configuración del automóvil, estas preferencias tienen los mismos atributos XML disponibles.

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

    Adición de una preferencia inyectada

    Las preferencias inyectadas contienen intenciones que conducen a actividades externas o internas. Como ejemplo, el elemento de configuración de Google en la página de inicio de Configuración es una preferencia inyectada. Las preferencias inyectadas son particularmente útiles cuando cualquiera de los siguientes es cierto. El ajuste:

    • No se implementa directamente en la aplicación CarSettings (como inyectar una configuración implementada por los OEM).
    • Debería aparecer en la aplicación CarSettings.

    Para configurar una Actividad como una configuración inyectada:

    1. Para marcar la actividad como una configuración inyectada, agregue un filtro de intenciones a la actividad.
    2. Dile a la aplicación CarSettings a qué categoría pertenece. La categoría es una constante, definida en CategoryKey , y se utiliza para indicar en qué nivel de CarSettings debe aparecer la configuración inyectada. Proporcionamos un conjunto de categorías dentro de CategoryKey , pero no hay restricciones para que los OEM definan sus propias categorías.
    3. ( opcional ) Agregue texto de resumen cuando se muestre la configuración:
      <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>
      

    Para que la configuración inyectada aparezca en una página específica en la aplicación CarSettings, incluya el siguiente código de muestra en el XML, modificando las variables según corresponda:

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