افزودن تنظیمات خودرو

اکثر صفحه‌های «تنظیمات خودرو» به‌صورت مجموعه‌ای از تکه‌هایی پیاده‌سازی شده‌اند که SettingsFragment را گسترش می‌دهند، و هریک از آن‌ها فعالیت خود را در CarSettingActivities تعریف کرده‌اند. این فعالیت‌های ایستا از BaseCarSettingsActivity گسترش یافته‌اند. علاوه‌بر این تنظیمات، می‌توانید اولویت‌هایی را از برنامه‌های سیستم دیگر تزریق کنید تا در «تنظیمات خودرو» نشان داده شوند.

افزودن اولویت جدید در «تنظیمات خودرو»

برای افزودن تنظیم جدید:

  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 تعریف‌شده در «مرحله ۱» را برمی‌گرداند.
  4. فعالیتی در CarSettingActivities ایجاد کنید که BaseCarSettingsActivity را گسترش دهد و سپس getInitialFragment() را پیاده‌سازی کنید و قطعه تعریف‌شده در «مرحله ۳» را برگردانید.
  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 پیاده‌سازی نشده است (مثلاً تزریق تنظیم پیاده‌سازی‌شده توسط سازندگان اصلی محصول).
    • باید در برنامه «تنظیمات خودرو» نشان داده شود.

    برای پیکربندی فعالیت به‌عنوان تنظیم تزریقی:

    1. برای علامت‌گذاری فعالیت به‌عنوان تنظیم تزریق‌شده، فیلتر هدف به فعالیت اضافه کنید.
    2. به برنامه CarSettings بگویید که به کدام دسته تعلق دارد. دسته یک ثابت است که در CategoryKey تعریف شده است و برای نشان دادن اینکه تنظیم تزریق‌شده باید در کدام سطح از «تنظیمات خودرو» نشان داده شود استفاده می‌شود. مجموعه‌ای از دسته‌ها را در CategoryKey ارائه می‌دهیم، اما هیچ محدودیتی برای تعریف دسته‌های خود ازسوی سازندگان تجهیزات اصلی وجود ندارد.
    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 نشان داده شود، کد نمونه زیر را در «زبان نشانه‌گذاری توسعه‌پذیر» بگنجانید و متغیرها را درصورت لزوم اصلاح کنید:

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