Tối ưu hóa sự phân tâm trong Cài đặt ô tô

Tối ưu hóa sự mất tập trung (DO) được cung cấp như một công cụ giúp giảm sự tương tác của người lái xe với ứng dụng Cài đặt khi ô tô đang di chuyển. Một số cài đặt có thể cần phải thay đổi trong khi lái xe để ứng dụng không bị chặn hoàn toàn. Tuy nhiên, theo mặc định, hầu hết các tùy chọn đều bị tắt, chỉ bật các tùy chọn chính và dễ cập nhật.

Ứng dụng đã bật khi lái xe

Hình 1. Ứng dụng được bật khi lái xe

Toàn bộ hoạt động cũng có thể bị chặn nếu chúng không được tối ưu hóa để phân tâm, như minh họa bên dưới. Phương pháp này hiện được sử dụng chủ yếu để tìm kiếm cài đặt.

Mọi hoạt động đều bị chặn

Hình 2. Tất cả hoạt động bị chặn

Các tùy chỉnh cơ bản về hiệu suất của DO có thể được thực hiện thông qua lớp phủ cấu hình. Nếu bạn yêu cầu tùy chỉnh chi tiết hơn, bạn có thể thực hiện các thay đổi bổ sung thông qua mã.

Tùy chỉnh cấp cao

Khi một tùy chọn bị tắt khi đang lái xe, việc nhấn vào nó sẽ hiển thị một thông báo chúc mừng cho biết rằng tùy chọn đó không khả dụng khi đang lái xe, miễn là tùy chọn đó có gắn bộ điều khiển tùy chọn. Thông báo sử dụng chuỗi restricted_while_driving , có thể được tùy chỉnh bằng lớp phủ (miễn là chuỗi nhỏ hơn giới hạn 60 ký tự).

Lớp phủ tùy chỉnh

Hình 3. Lớp phủ tùy chỉnh

Toàn bộ khung DO có thể bị vô hiệu hóa bằng cách sử dụng config_always_ignore_ux_restrictions . Đặt điều này thành true có nghĩa là người lái xe có thể tương tác với mọi khía cạnh của ứng dụng Cài đặt.

<bool name="config_always_ignore_ux_restrictions">true</bool>

Nếu cấu hình ở trên được đặt thành sai, ứng dụng Cài đặt sẽ quay lại config_ignore_ux_restrictions để xác định tùy chọn nào sẽ được bật khi lái xe. Các chuỗi được cung cấp ở đây phải trỏ đến các chuỗi được xác định trong preference_keys.xml.

Ví dụ

Để hiển thị cách bật cài đặt lồng nhau sâu trong khi lái xe, ví dụ này minh họa cách bật cài đặt đầu ra Chuyển văn bản thành giọng nói (TTS). Để tính năng này hoạt động, hãy thêm tất cả cài đặt trong hệ thống phân cấp vào config_ignore_ux_restrictions . Điều này bao gồm hệ thống, ngôn ngữ và phương thức nhập cũng như các tùy chọn TTS đối với cấu hình vì hệ thống phân cấp của chúng tôi là Hệ thống->Ngôn ngữ & Phương thức nhập->Đầu ra chuyển văn bản thành giọng nói. Tuy nhiên, các tùy chọn trong đoạn chuyển văn bản thành giọng nói vẫn bị tắt. Để kích hoạt chúng, chúng ta cần thêm các khóa cho các tùy chọn mà chúng ta muốn có thể truy cập được. Trong ví dụ này, chúng tôi muốn bật tùy chọn phát lại chứ không phải tùy chọn công cụ nên chúng tôi thêm pk_tts_playback_group vào config.

<string-array name="config_ignore_ux_restrictions">
    [...]
    <item>@string/pk_system_settings_entry</item>
    <item>@string/pk_languages_and_input_settings</item>
    <item>@string/pk_tts_settings_entry</item>
    <item>@string/pk_tts_playback_group</item>
</string-array>

Tùy chỉnh chi tiết

Có một số tùy chọn có thể yêu cầu nhiều hành vi tùy chỉnh hơn là chỉ bật/tắt tùy chọn dựa trên trạng thái lái xe. Ví dụ: Bluetooth và Wi-Fi đã được sửa đổi để hiển thị các thiết bị Bluetooth hoặc điểm truy cập Wi-Fi đã lưu khi lái xe.

Hiện tại không có giải pháp dựa trên cấu hình nào để thực hiện các loại điều chỉnh này. Thay vào đó, bạn có thể tạo một lớp tùy chỉnh mở rộng PreferenceController và ghi đè onApplyUxRestrictions() để thực hiện các thay đổi mong muốn.

Khi bộ điều khiển tùy chọn tùy chỉnh được tạo, bạn có thể phủ tệp XML có liên quan để thay thế bộ điều khiển tùy chọn mặc định bằng cách triển khai của riêng bạn.

Ví dụ

Trong CarSettings, một số tùy chọn có hành vi tùy chỉnh hơn này, có thể được dùng làm ví dụ cho các tùy chỉnh bổ sung. Ví dụ: trong danh sách điểm truy cập Wi-Fi , hành vi mong muốn là chỉ hiển thị các điểm truy cập đã lưu khi đang lái xe (và ẩn phần còn lại). Để đạt được điều này, hãy làm như sau:

mAccessPoints = CarUxRestrictionsHelper.isNoSetup(getUxRestrictions())
               ? getCarWifiManager().getSavedAccessPoints()
               : getCarWifiManager().getAllAccessPoints();

Vì các điểm truy cập xuất hiện ở đây đã bị hạn chế nên bạn không muốn áp dụng UxRestrictions bổ sung cho các tùy chọn này. Do đó, hãy ghi đè onApplyUxRestrictions và thực hiện thao tác không hoạt động có chủ ý:

@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
    // Since the list dynamically changes based on the UX restrictions, we
    // enable this fragment regardless of the restriction. Intentional no-op.
}

Một ví dụ khác được cung cấp trong các thiết bị kết nối Bluetooth . Để tiếp tục cho phép kết nối và ngắt kết nối các thiết bị Bluetooth nhưng muốn tắt khả năng truy cập cài đặt bổ sung cho các thiết bị này. Để đạt được điều này, chúng tôi lại ghi đè onApplyUxRestrictions nhưng lần này, nếu hạn chế NO_SETUP đang hoạt động, hãy ẩn hành động phụ trên tùy chọn.

@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
    super.onApplyUxRestrictions(uxRestrictions);
    if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) {
        updateActionVisibility(getPreference(), /* isActionVisible= */ false);
    }
}