자동차 설정 추가

자동차 설정의 대부분 페이지는 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. 1단계에서 정의한 XML 파일을 반환하는 getPreferenceScreenResId를 사용하여 프래그먼트를 만듭니다.
  4. CarSettingActivities에서 BaseCarSettingsActivity를 확장하는 활동을 만든 다음 getInitialFragment()를 구현하여 3단계에서 정의한 프래그먼트를 반환합니다.
  5. 4단계에 정의된 활동을 포함하도록 AndroidManifest.xml을 업데이트합니다.

다음은 이 과정을 설명합니다.

  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를 사용합니다. 두 번째 환경설정에서는 정의해야 하는 맞춤 환경설정 컨트롤러를 사용합니다. 예를 들어, 사용 가능한 관리자에게 이 환경설정을 맞춤설정할 수 있습니다. 이를 위해 다음 맞춤 컨트롤러를 정의합니다.

    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>