Добавление настроек автомобиля

Большинство страниц в Car Settings реализованы в виде серии фрагментов, которые расширяют SettingsFragment , причем каждый из них имеет свою собственную активность, определенную в CarSettingActivities . Эти статические действия расширены из BaseCarSettingsActivity . В дополнение к этим настройкам вы можете ввести настройки из других системных приложений, чтобы они отображались в CarSettings.

Добавление нового предпочтения в настройках автомобиля

Чтобы добавить новую настройку:

  1. Определите файл XML:
    1. Убедитесь, что все настройки определили android:key . Список ключей хранится в preference_keys.xml . Ключи настроек должны быть уникальными.
    2. В целях индексации поиска экраны настроек также должны иметь определенный android:key . Список экранных клавиш предпочтений хранится в preference_screen_keys.xml . Клавиши экрана предпочтений также должны быть уникальными.
    3. Если параметр отображает только статическую информацию (например, без специальной бизнес-логики), установите контроллер предпочтения как com.android.car.settings.common.DefaultRestrictionsPreferenceController .
    4. Если предпочтение требует бизнес-логики, задайте для контроллера предпочтений новое имя контроллера предпочтений.
  2. ( При необходимости ) Создайте контроллер предпочтений в соответствующем пакете, который расширяет PreferenceController . При необходимости см. Javadoc.
  3. Создайте фрагмент с getPreferenceScreenResId возвращающим XML-файл, определенный на шаге 1.
  4. Создайте действие в CarSettingActivities , которое расширяет BaseCarSettingsActivity , а затем реализуйте getInitialFragment() , возвращая фрагмент, определенный на шаге 3.
  5. Обновите AndroidManifest.xml , включив в него действие, определенное на шаге 4.

Пример

Следующий материал иллюстрирует этот процесс.

  1. Определите файл XML с именем 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. Добавьте ключи предпочтений в 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. Добавьте ключ экрана предпочтений в файл preference_screen_keys.xml :
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    В качестве предпочтения первого примера используйте DefaultRestrictionsPreferenceController . Для второго предпочтения используйте настраиваемый контроллер предпочтений, который необходимо определить. В этом примере вы можете настроить этот параметр только для доступных пользователей-администраторов. Для этого определите следующий пользовательский контроллер:

    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. Чтобы создать фрагмент, переопределите getPreferenceScreenResId :
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Чтобы сохранить новый фрагмент, создайте активность в CarSettingActivities :
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Обновите файл манифеста новой активностью:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    Добавление предпочтения внешнего намерения в настройках автомобиля

    В качестве альтернативы введенным настройкам также можно вставить настройку непосредственно в настройки автомобиля, которая предназначена для другого приложения. Это можно сделать, просто добавив предпочтение на экран предпочтений с действием намерения, которое разрешается во внешнем приложении. Как и другие предпочтения в настройках автомобиля, эти предпочтения имеют те же атрибуты 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>
    

    Добавление внедренного предпочтения

    Внедренные настройки содержат намерения, ведущие к внешним или внутренним действиям. Например, элемент настройки Google на главной странице настроек является введенным параметром. Внедренные предпочтения особенно полезны, когда выполняется любое из следующих условий. Настройка:

    • Не реализовано напрямую в приложении CarSettings (например, внедрение настроек, реализованных OEM-производителями).
    • Должно появиться в приложении CarSettings.

    Чтобы настроить действие как вводимый параметр:

    1. Чтобы пометить действие как введенный параметр, добавьте к действию фильтр намерений.
    2. Сообщите приложению CarSettings, к какой категории оно относится. Категория — это константа, определенная в CategoryKey и используемая для указания того, на каком уровне CarSettings должен появиться введенный параметр. Мы предоставляем набор категорий внутри CategoryKey , но для OEM-производителей нет ограничений на определение своих собственных категорий.
    3. ( необязательно ) Добавить текст сводки при отображении параметра:
      <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>
      

    Чтобы введенный параметр отображался на определенной странице в приложении CarSettings, включите следующий пример кода в XML, изменив переменные, где это необходимо:

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