تنظیمات ماشین را اضافه کنید

بیشتر صفحات در تنظیمات خودرو به صورت مجموعه‌ای از قطعات پیاده‌سازی می‌شوند که 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 به‌روزرسانی کنید تا فعالیت تعریف‌شده در مرحله ۴ را شامل شود.

مثال

مطالب زیر این فرآیند را نشان می دهد.

  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>