車の設定の追加

CarSettings のほとんどのページは、SettingsFragment を拡張する一連のフラグメントとして実装され、各フラグメントには CarSettingActivities で定義された独自のアクティビティがあります。これらの静的アクティビティは、BaseCarSettingsActivity から拡張されます。こうした設定に加えて、他のシステムアプリから設定を追加し、CarSettings に表示することもできます。

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 でフラグメントを作成し、ステップ 1 で定義した XML ファイルを返すように指定します。
  4. BaseCarSettingsActivity を拡張するアクティビティを CarSettingActivities で作成してから、getInitialFragment() を実装してステップ 3 で定義されたフラグメントが返されるようにします。
  5. AndroidManifest.xml を更新して、ステップ 4 で定義されたアクティビティを含めます。

以下の資料では、このプロセスを示しています。

  1. demo_fragment.xml という名前の 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 を使用します。2 番目の設定には、カスタム設定コントローラを使用します。このコントローラは定義する必要があります。この例では、利用可能な管理ユーザーのみにこの設定をカスタマイズできます。これを行うには、以下のようにカスタム コントローラを定義します。

    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>

    CarSettings 内に外部インテントの設定を追加する

    挿入設定の代替として、別のアプリにインテントを送信する設定を CarSettings に挿入することもできます。この場合は、外部アプリに解決されるインテント アクションとともに設定画面に設定を追加するだけです。CarSettings の他の設定と同様に、これらの設定にも同じ 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>