summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2024-01-17 22:14:17 -0800
committerXin Li <delphij@google.com>2024-01-17 22:14:17 -0800
commit8ddbc3b0da368eb758e8ccf3f4bc054622dbca4b (patch)
tree3b4c2a16a9fefc1b978f85b4fb4a477b3ac1bc11
parent805f986195d2a9400f0495b1726a94c95c91a190 (diff)
parent33d59e3de8dcdb590b3ecc67bbf1b34cfd7ca2ab (diff)
downloadLauncher-8ddbc3b0da368eb758e8ccf3f4bc054622dbca4b.tar.gz
Merge Android 24Q1 Release (ab/11220357)
Bug: 319669529 Merged-In: I77f37e802656b4c73bbd7b04ae3ade4e404a2d3c Change-Id: I54f67d5b746ed8735ed4079de794a04d9e306c39
-rw-r--r--OWNERS5
-rwxr-xr-x[-rw-r--r--]PREUPLOAD.cfg4
-rw-r--r--app/Android.bp (renamed from Android.bp)42
-rw-r--r--app/AndroidManifest.xml (renamed from AndroidManifest.xml)65
-rw-r--r--app/OWNERS14
-rw-r--r--app/car_launcher_flags.aconfig8
-rw-r--r--app/res/animator/recents_clear_all.xml (renamed from res/animator/recents_clear_all.xml)0
-rw-r--r--app/res/color/dialer_icon_tint_state_list.xml (renamed from res/color/dialer_icon_tint_state_list.xml)0
-rw-r--r--app/res/drawable-night/ic_launcher_home.xml (renamed from res/drawable-night/ic_launcher_home.xml)0
-rw-r--r--app/res/drawable/car_button_background.xml (renamed from res/drawable/car_button_background.xml)0
-rw-r--r--app/res/drawable/control_bar_contact_image_background.xml (renamed from res/drawable/control_bar_contact_image_background.xml)0
-rw-r--r--app/res/drawable/control_bar_image_background.xml (renamed from res/drawable/control_bar_image_background.xml)0
-rw-r--r--app/res/drawable/default_audio_background.xml (renamed from res/drawable/default_audio_background.xml)0
-rw-r--r--app/res/drawable/dialer_button_active_state_circle.xml (renamed from res/drawable/dialer_button_active_state_circle.xml)0
-rw-r--r--app/res/drawable/ic_apps_black.xml (renamed from res/drawable/ic_apps_black.xml)0
-rw-r--r--app/res/drawable/ic_arrow_back_black.xml (renamed from res/drawable/ic_arrow_back_black.xml)0
-rw-r--r--app/res/drawable/ic_call_end.xml (renamed from res/drawable/ic_call_end.xml)0
-rw-r--r--app/res/drawable/ic_call_end_button.xml (renamed from res/drawable/ic_call_end_button.xml)0
-rw-r--r--app/res/drawable/ic_clear_black.xml (renamed from res/drawable/ic_clear_black.xml)0
-rw-r--r--app/res/drawable/ic_dialpad.xml (renamed from res/drawable/ic_dialpad.xml)0
-rw-r--r--app/res/drawable/ic_launcher_home.xml (renamed from res/drawable/ic_launcher_home.xml)0
-rw-r--r--app/res/drawable/ic_media.xml25
-rw-r--r--app/res/drawable/ic_mic_on.xml (renamed from res/drawable/ic_mic_on.xml)0
-rw-r--r--app/res/drawable/ic_mute_activatable.xml (renamed from res/drawable/ic_mute_activatable.xml)0
-rw-r--r--app/res/drawable/ic_navigation.xml23
-rw-r--r--app/res/drawable/ic_partly_cloudy.png (renamed from res/drawable/ic_partly_cloudy.png)bin13332 -> 13332 bytes
-rw-r--r--app/res/drawable/ic_recent_dismiss.xml (renamed from res/drawable/ic_recent_dismiss.xml)0
-rw-r--r--app/res/drawable/ic_search_black.xml (renamed from res/drawable/ic_search_black.xml)0
-rw-r--r--app/res/drawable/ic_temperature.xml25
-rw-r--r--app/res/drawable/recent_clear_all_button_background.xml (renamed from res/drawable/recent_clear_all_button_background.xml)0
-rw-r--r--app/res/drawable/recent_dismiss_button_background.xml (renamed from res/drawable/recent_dismiss_button_background.xml)0
-rw-r--r--app/res/layout-land/car_launcher.xml (renamed from res/layout-land/car_launcher.xml)5
-rw-r--r--app/res/layout/button_trio.xml (renamed from res/layout/button_trio.xml)0
-rw-r--r--app/res/layout/calm_mode_activity.xml22
-rw-r--r--app/res/layout/calm_mode_date_and_temperature.xml57
-rw-r--r--app/res/layout/calm_mode_fragment.xml117
-rw-r--r--app/res/layout/car_launcher.xml (renamed from res/layout/car_launcher.xml)1
-rw-r--r--app/res/layout/car_launcher_multiwindow.xml (renamed from res/layout/car_launcher_multiwindow.xml)0
-rw-r--r--app/res/layout/card_content_descriptive_text_only.xml (renamed from res/layout/card_content_descriptive_text_only.xml)0
-rw-r--r--app/res/layout/card_content_descriptive_text_with_controls.xml (renamed from res/layout/card_content_descriptive_text_with_controls.xml)0
-rw-r--r--app/res/layout/card_content_media.xml (renamed from res/layout/card_content_media.xml)0
-rw-r--r--app/res/layout/card_content_text_block.xml (renamed from res/layout/card_content_text_block.xml)0
-rw-r--r--app/res/layout/card_fragment.xml (renamed from res/layout/card_fragment.xml)0
-rw-r--r--app/res/layout/control_bar_container.xml (renamed from res/layout/control_bar_container.xml)0
-rw-r--r--app/res/layout/descriptive_text.xml (renamed from res/layout/descriptive_text.xml)0
-rw-r--r--app/res/layout/optional_seek_bar_with_times.xml (renamed from res/layout/optional_seek_bar_with_times.xml)0
-rw-r--r--app/res/layout/recent_clear_all_view.xml (renamed from res/layout/recent_clear_all_view.xml)0
-rw-r--r--app/res/layout/recent_task_view.xml (renamed from res/layout/recent_task_view.xml)0
-rw-r--r--app/res/layout/recent_task_view_first.xml (renamed from res/layout/recent_task_view_first.xml)0
-rw-r--r--app/res/layout/recent_task_view_inner.xml (renamed from res/layout/recent_task_view_inner.xml)0
-rw-r--r--app/res/layout/recents_activity.xml (renamed from res/layout/recents_activity.xml)0
-rw-r--r--app/res/layout/tap_for_more_text.xml (renamed from res/layout/tap_for_more_text.xml)0
-rw-r--r--app/res/layout/text_block.xml (renamed from res/layout/text_block.xml)0
-rw-r--r--app/res/values-af/strings.xml38
-rw-r--r--app/res/values-am/strings.xml38
-rw-r--r--app/res/values-ar/strings.xml38
-rw-r--r--app/res/values-as/strings.xml38
-rw-r--r--app/res/values-az/strings.xml38
-rw-r--r--app/res/values-b+sr+Latn/strings.xml38
-rw-r--r--app/res/values-be/strings.xml38
-rw-r--r--app/res/values-bg/strings.xml38
-rw-r--r--app/res/values-bn/strings.xml38
-rw-r--r--app/res/values-bs/strings.xml38
-rw-r--r--app/res/values-ca/strings.xml38
-rw-r--r--app/res/values-cs/strings.xml38
-rw-r--r--app/res/values-da/strings.xml38
-rw-r--r--app/res/values-de/strings.xml38
-rw-r--r--app/res/values-el/strings.xml38
-rw-r--r--app/res/values-en-rAU/strings.xml38
-rw-r--r--app/res/values-en-rCA/strings.xml55
-rw-r--r--app/res/values-en-rGB/strings.xml38
-rw-r--r--app/res/values-en-rIN/strings.xml38
-rw-r--r--app/res/values-en-rXC/strings.xml38
-rw-r--r--app/res/values-es-rUS/strings.xml38
-rw-r--r--app/res/values-es/strings.xml38
-rw-r--r--app/res/values-et/strings.xml38
-rw-r--r--app/res/values-eu/strings.xml38
-rw-r--r--app/res/values-fa/strings.xml38
-rw-r--r--app/res/values-fi/strings.xml38
-rw-r--r--app/res/values-fr-rCA/strings.xml39
-rw-r--r--app/res/values-fr/strings.xml38
-rw-r--r--app/res/values-gl/strings.xml38
-rw-r--r--app/res/values-gu/strings.xml38
-rw-r--r--app/res/values-hi/strings.xml38
-rw-r--r--app/res/values-hr/strings.xml38
-rw-r--r--app/res/values-hu/strings.xml38
-rw-r--r--app/res/values-hy/strings.xml38
-rw-r--r--app/res/values-in/strings.xml38
-rw-r--r--app/res/values-is/strings.xml38
-rw-r--r--app/res/values-it/strings.xml38
-rw-r--r--app/res/values-iw/strings.xml38
-rw-r--r--app/res/values-ja/strings.xml38
-rw-r--r--app/res/values-ka/strings.xml38
-rw-r--r--app/res/values-kk/strings.xml38
-rw-r--r--app/res/values-km/strings.xml38
-rw-r--r--app/res/values-kn/strings.xml38
-rw-r--r--app/res/values-ko/strings.xml38
-rw-r--r--app/res/values-ky/strings.xml38
-rw-r--r--app/res/values-land/dimens.xml (renamed from res/values-land/dimens.xml)0
-rw-r--r--app/res/values-lo/strings.xml38
-rw-r--r--app/res/values-lt/strings.xml38
-rw-r--r--app/res/values-lv/strings.xml38
-rw-r--r--app/res/values-mk/strings.xml38
-rw-r--r--app/res/values-ml/strings.xml38
-rw-r--r--app/res/values-mn/strings.xml38
-rw-r--r--app/res/values-mr/strings.xml38
-rw-r--r--app/res/values-ms/strings.xml38
-rw-r--r--app/res/values-my/strings.xml38
-rw-r--r--app/res/values-nb/strings.xml38
-rw-r--r--app/res/values-ne/strings.xml38
-rw-r--r--app/res/values-nl/strings.xml38
-rw-r--r--app/res/values-or/strings.xml38
-rw-r--r--app/res/values-pa/strings.xml38
-rw-r--r--app/res/values-pl/strings.xml38
-rw-r--r--app/res/values-pt-rPT/strings.xml38
-rw-r--r--app/res/values-pt/strings.xml38
-rw-r--r--app/res/values-ro/strings.xml38
-rw-r--r--app/res/values-ru/strings.xml38
-rw-r--r--app/res/values-si/strings.xml38
-rw-r--r--app/res/values-sk/strings.xml38
-rw-r--r--app/res/values-sl/strings.xml38
-rw-r--r--app/res/values-sq/strings.xml38
-rw-r--r--app/res/values-sr/strings.xml38
-rw-r--r--app/res/values-sv/strings.xml38
-rw-r--r--app/res/values-sw/strings.xml38
-rw-r--r--app/res/values-ta/strings.xml38
-rw-r--r--app/res/values-te/strings.xml38
-rw-r--r--app/res/values-th/strings.xml38
-rw-r--r--app/res/values-tl/strings.xml38
-rw-r--r--app/res/values-tr/strings.xml38
-rw-r--r--app/res/values-uk/strings.xml38
-rw-r--r--app/res/values-ur/strings.xml38
-rw-r--r--app/res/values-uz/strings.xml38
-rw-r--r--app/res/values-vi/strings.xml39
-rw-r--r--app/res/values-zh-rCN/strings.xml38
-rw-r--r--app/res/values-zh-rHK/strings.xml38
-rw-r--r--app/res/values-zh-rTW/strings.xml38
-rw-r--r--app/res/values-zu/strings.xml38
-rw-r--r--app/res/values/arrays.xml25
-rw-r--r--app/res/values/attrs.xml (renamed from res/values/attrs.xml)0
-rw-r--r--app/res/values/bools.xml26
-rw-r--r--app/res/values/colors.xml (renamed from res/values/colors.xml)9
-rw-r--r--app/res/values/config.xml (renamed from res/values/config.xml)35
-rw-r--r--app/res/values/dimens.xml (renamed from res/values/dimens.xml)59
-rw-r--r--app/res/values/integers.xml23
-rw-r--r--app/res/values/overlayable.xml (renamed from res/values/overlayable.xml)147
-rw-r--r--app/res/values/strings.xml59
-rw-r--r--app/res/values/styles.xml (renamed from res/values/styles.xml)66
-rw-r--r--app/res/values/themes.xml30
-rw-r--r--app/src/com/android/car/carlauncher/CarFullscreenTaskMonitorListener.java (renamed from src/com/android/car/carlauncher/CarFullscreenTaskMonitorListener.java)0
-rw-r--r--app/src/com/android/car/carlauncher/CarLauncher.java (renamed from src/com/android/car/carlauncher/CarLauncher.java)164
-rw-r--r--app/src/com/android/car/carlauncher/CarLauncherUtils.java (renamed from src/com/android/car/carlauncher/CarLauncherUtils.java)18
-rw-r--r--app/src/com/android/car/carlauncher/CarLauncherViewModel.java214
-rw-r--r--app/src/com/android/car/carlauncher/CarTaskView.java (renamed from src/com/android/car/carlauncher/CarTaskView.java)1
-rw-r--r--app/src/com/android/car/carlauncher/CarTaskViewCallbacks.java (renamed from src/com/android/car/carlauncher/CarTaskViewCallbacks.java)0
-rw-r--r--app/src/com/android/car/carlauncher/ControlBarActivity.java (renamed from src/com/android/car/carlauncher/ControlBarActivity.java)0
-rw-r--r--app/src/com/android/car/carlauncher/ControlledCarTaskView.java (renamed from src/com/android/car/carlauncher/ControlledCarTaskView.java)0
-rw-r--r--app/src/com/android/car/carlauncher/ControlledCarTaskViewCallbacks.java (renamed from src/com/android/car/carlauncher/ControlledCarTaskViewCallbacks.java)0
-rw-r--r--app/src/com/android/car/carlauncher/ControlledCarTaskViewConfig.java (renamed from src/com/android/car/carlauncher/ControlledCarTaskViewConfig.java)0
-rw-r--r--app/src/com/android/car/carlauncher/LaunchRootCarTaskView.java (renamed from src/com/android/car/carlauncher/LaunchRootCarTaskView.java)18
-rw-r--r--app/src/com/android/car/carlauncher/LaunchRootCarTaskViewCallbacks.java (renamed from src/com/android/car/carlauncher/LaunchRootCarTaskViewCallbacks.java)0
-rw-r--r--app/src/com/android/car/carlauncher/RunnerWithBackoff.java (renamed from src/com/android/car/carlauncher/RunnerWithBackoff.java)0
-rw-r--r--app/src/com/android/car/carlauncher/SemiControlledCarTaskView.java (renamed from src/com/android/car/carlauncher/SemiControlledCarTaskView.java)0
-rw-r--r--app/src/com/android/car/carlauncher/SemiControlledCarTaskViewCallbacks.java (renamed from src/com/android/car/carlauncher/SemiControlledCarTaskViewCallbacks.java)0
-rw-r--r--app/src/com/android/car/carlauncher/TaskViewInputInterceptor.java (renamed from src/com/android/car/carlauncher/TaskViewInputInterceptor.java)0
-rw-r--r--app/src/com/android/car/carlauncher/TaskViewManager.java (renamed from src/com/android/car/carlauncher/TaskViewManager.java)28
-rw-r--r--app/src/com/android/car/carlauncher/calmmode/CalmModeActivity.java33
-rw-r--r--app/src/com/android/car/carlauncher/calmmode/CalmModeFragment.java227
-rw-r--r--app/src/com/android/car/carlauncher/calmmode/CalmModeQCProvider.java121
-rw-r--r--app/src/com/android/car/carlauncher/calmmode/NavigationStateData.java186
-rw-r--r--app/src/com/android/car/carlauncher/calmmode/NavigationStateViewModel.java133
-rw-r--r--app/src/com/android/car/carlauncher/calmmode/TemperatureData.java169
-rw-r--r--app/src/com/android/car/carlauncher/calmmode/TemperatureViewModel.java173
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/CardPresenter.java (renamed from src/com/android/car/carlauncher/homescreen/CardPresenter.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/HomeCardFragment.java (renamed from src/com/android/car/carlauncher/homescreen/HomeCardFragment.java)18
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/HomeCardInterface.java (renamed from src/com/android/car/carlauncher/homescreen/HomeCardInterface.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/HomeCardModule.java (renamed from src/com/android/car/carlauncher/homescreen/HomeCardModule.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardModule.java (renamed from src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardModule.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java (renamed from src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java (renamed from src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/assistive/FakeWeatherModel.java (renamed from src/com/android/car/carlauncher/homescreen/assistive/FakeWeatherModel.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java (renamed from src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/audio/AudioCardModule.java (renamed from src/com/android/car/carlauncher/homescreen/audio/AudioCardModule.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java (renamed from src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java)12
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/audio/AudioModel.java (renamed from src/com/android/car/carlauncher/homescreen/audio/AudioModel.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java (renamed from src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/audio/InCallModel.java (renamed from src/com/android/car/carlauncher/homescreen/audio/InCallModel.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/audio/InCallServiceManagerProvider.java (renamed from src/com/android/car/carlauncher/homescreen/audio/InCallServiceManagerProvider.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java (renamed from src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java)15
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImpl.java (renamed from src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImpl.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/ui/CardContent.java (renamed from src/com/android/car/carlauncher/homescreen/ui/CardContent.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/ui/CardHeader.java (renamed from src/com/android/car/carlauncher/homescreen/ui/CardHeader.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextView.java (renamed from src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextView.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextWithControlsView.java (renamed from src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextWithControlsView.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/ui/SeekBarViewModel.java (renamed from src/com/android/car/carlauncher/homescreen/ui/SeekBarViewModel.java)0
-rw-r--r--app/src/com/android/car/carlauncher/homescreen/ui/TextBlockView.java (renamed from src/com/android/car/carlauncher/homescreen/ui/TextBlockView.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/CarQuickStepService.java (renamed from src/com/android/car/carlauncher/recents/CarQuickStepService.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/CarRecentsActivity.java (renamed from src/com/android/car/carlauncher/recents/CarRecentsActivity.java)7
-rw-r--r--app/src/com/android/car/carlauncher/recents/NonDODisabledTaskProvider.java (renamed from src/com/android/car/carlauncher/recents/NonDODisabledTaskProvider.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/RecentTasksProvider.java (renamed from src/com/android/car/carlauncher/recents/RecentTasksProvider.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/RecentTasksProviderInterface.java (renamed from src/com/android/car/carlauncher/recents/RecentTasksProviderInterface.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/RecentTasksViewModel.java (renamed from src/com/android/car/carlauncher/recents/RecentTasksViewModel.java)10
-rw-r--r--app/src/com/android/car/carlauncher/recents/RecentsStatsLogHelper.java203
-rw-r--r--app/src/com/android/car/carlauncher/recents/RecentsUtils.java (renamed from src/com/android/car/carlauncher/recents/RecentsUtils.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/view/BaseTaskViewHolder.java (renamed from src/com/android/car/carlauncher/recents/view/BaseTaskViewHolder.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/view/ClearAllViewHolder.java (renamed from src/com/android/car/carlauncher/recents/view/ClearAllViewHolder.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/view/DismissTaskClickListener.java (renamed from src/com/android/car/carlauncher/recents/view/DismissTaskClickListener.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/view/RecentTasksAdapter.java (renamed from src/com/android/car/carlauncher/recents/view/RecentTasksAdapter.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/view/RecentsRecyclerView.java (renamed from src/com/android/car/carlauncher/recents/view/RecentsRecyclerView.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/view/TaskClickListener.java (renamed from src/com/android/car/carlauncher/recents/view/TaskClickListener.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/view/TaskTouchHelperCallback.java (renamed from src/com/android/car/carlauncher/recents/view/TaskTouchHelperCallback.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/view/TaskTouchListener.java (renamed from src/com/android/car/carlauncher/recents/view/TaskTouchListener.java)0
-rw-r--r--app/src/com/android/car/carlauncher/recents/view/TaskViewHolder.java (renamed from src/com/android/car/carlauncher/recents/view/TaskViewHolder.java)0
-rw-r--r--app/src/com/android/car/carlauncher/taskstack/TaskStackChangeListeners.java (renamed from src/com/android/car/carlauncher/taskstack/TaskStackChangeListeners.java)0
-rw-r--r--app/tests/Android.bp (renamed from tests/Android.bp)2
-rw-r--r--app/tests/AndroidManifest.xml (renamed from tests/AndroidManifest.xml)24
-rw-r--r--app/tests/AndroidTest.xml (renamed from tests/AndroidTest.xml)0
-rw-r--r--app/tests/res/values-af/strings.xml21
-rw-r--r--app/tests/res/values-am/strings.xml21
-rw-r--r--app/tests/res/values-ar/strings.xml21
-rw-r--r--app/tests/res/values-as/strings.xml21
-rw-r--r--app/tests/res/values-az/strings.xml21
-rw-r--r--app/tests/res/values-b+sr+Latn/strings.xml21
-rw-r--r--app/tests/res/values-be/strings.xml21
-rw-r--r--app/tests/res/values-bg/strings.xml21
-rw-r--r--app/tests/res/values-bn/strings.xml21
-rw-r--r--app/tests/res/values-bs/strings.xml21
-rw-r--r--app/tests/res/values-ca/strings.xml21
-rw-r--r--app/tests/res/values-cs/strings.xml21
-rw-r--r--app/tests/res/values-da/strings.xml21
-rw-r--r--app/tests/res/values-de/strings.xml21
-rw-r--r--app/tests/res/values-el/strings.xml21
-rw-r--r--app/tests/res/values-en-rAU/strings.xml21
-rw-r--r--app/tests/res/values-en-rGB/strings.xml21
-rw-r--r--app/tests/res/values-en-rIN/strings.xml21
-rw-r--r--app/tests/res/values-en-rXC/strings.xml21
-rw-r--r--app/tests/res/values-es-rUS/strings.xml21
-rw-r--r--app/tests/res/values-es/strings.xml21
-rw-r--r--app/tests/res/values-et/strings.xml21
-rw-r--r--app/tests/res/values-eu/strings.xml21
-rw-r--r--app/tests/res/values-fa/strings.xml21
-rw-r--r--app/tests/res/values-fi/strings.xml21
-rw-r--r--app/tests/res/values-fr-rCA/strings.xml21
-rw-r--r--app/tests/res/values-fr/strings.xml21
-rw-r--r--app/tests/res/values-gl/strings.xml21
-rw-r--r--app/tests/res/values-gu/strings.xml21
-rw-r--r--app/tests/res/values-hi/strings.xml21
-rw-r--r--app/tests/res/values-hr/strings.xml21
-rw-r--r--app/tests/res/values-hu/strings.xml21
-rw-r--r--app/tests/res/values-hy/strings.xml21
-rw-r--r--app/tests/res/values-in/strings.xml21
-rw-r--r--app/tests/res/values-is/strings.xml21
-rw-r--r--app/tests/res/values-it/strings.xml21
-rw-r--r--app/tests/res/values-iw/strings.xml21
-rw-r--r--app/tests/res/values-ja/strings.xml21
-rw-r--r--app/tests/res/values-ka/strings.xml21
-rw-r--r--app/tests/res/values-kk/strings.xml21
-rw-r--r--app/tests/res/values-km/strings.xml21
-rw-r--r--app/tests/res/values-kn/strings.xml21
-rw-r--r--app/tests/res/values-ko/strings.xml21
-rw-r--r--app/tests/res/values-ky/strings.xml21
-rw-r--r--app/tests/res/values-lo/strings.xml21
-rw-r--r--app/tests/res/values-lt/strings.xml21
-rw-r--r--app/tests/res/values-lv/strings.xml21
-rw-r--r--app/tests/res/values-mk/strings.xml21
-rw-r--r--app/tests/res/values-ml/strings.xml21
-rw-r--r--app/tests/res/values-mn/strings.xml21
-rw-r--r--app/tests/res/values-mr/strings.xml21
-rw-r--r--app/tests/res/values-ms/strings.xml21
-rw-r--r--app/tests/res/values-my/strings.xml21
-rw-r--r--app/tests/res/values-nb/strings.xml21
-rw-r--r--app/tests/res/values-ne/strings.xml21
-rw-r--r--app/tests/res/values-nl/strings.xml21
-rw-r--r--app/tests/res/values-or/strings.xml21
-rw-r--r--app/tests/res/values-pa/strings.xml21
-rw-r--r--app/tests/res/values-pl/strings.xml21
-rw-r--r--app/tests/res/values-pt-rPT/strings.xml21
-rw-r--r--app/tests/res/values-pt/strings.xml21
-rw-r--r--app/tests/res/values-ro/strings.xml21
-rw-r--r--app/tests/res/values-ru/strings.xml21
-rw-r--r--app/tests/res/values-si/strings.xml21
-rw-r--r--app/tests/res/values-sk/strings.xml21
-rw-r--r--app/tests/res/values-sl/strings.xml21
-rw-r--r--app/tests/res/values-sq/strings.xml21
-rw-r--r--app/tests/res/values-sr/strings.xml21
-rw-r--r--app/tests/res/values-sv/strings.xml21
-rw-r--r--app/tests/res/values-sw/strings.xml21
-rw-r--r--app/tests/res/values-ta/strings.xml21
-rw-r--r--app/tests/res/values-te/strings.xml21
-rw-r--r--app/tests/res/values-th/strings.xml21
-rw-r--r--app/tests/res/values-tl/strings.xml21
-rw-r--r--app/tests/res/values-tr/strings.xml21
-rw-r--r--app/tests/res/values-uk/strings.xml21
-rw-r--r--app/tests/res/values-ur/strings.xml21
-rw-r--r--app/tests/res/values-uz/strings.xml21
-rw-r--r--app/tests/res/values-vi/strings.xml21
-rw-r--r--app/tests/res/values-zh-rCN/strings.xml21
-rw-r--r--app/tests/res/values-zh-rHK/strings.xml21
-rw-r--r--app/tests/res/values-zh-rTW/strings.xml21
-rw-r--r--app/tests/res/values-zu/strings.xml21
-rw-r--r--app/tests/res/values/strings.xml20
-rw-r--r--app/tests/src/com/android/car/carlauncher/CarLauncherTest.java287
-rw-r--r--app/tests/src/com/android/car/carlauncher/CarLauncherViewModelFactoryTest.java83
-rw-r--r--app/tests/src/com/android/car/carlauncher/CarLauncherViewModelTest.java113
-rw-r--r--app/tests/src/com/android/car/carlauncher/TaskViewInputInterceptorTest.java (renamed from tests/src/com/android/car/carlauncher/TaskViewInputInterceptorTest.java)4
-rw-r--r--app/tests/src/com/android/car/carlauncher/TaskViewManagerTest.java (renamed from tests/src/com/android/car/carlauncher/TaskViewManagerTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/calmmode/CalmModeFragmentTest.java103
-rw-r--r--app/tests/src/com/android/car/carlauncher/calmmode/CalmModeQCProviderTest.java97
-rw-r--r--app/tests/src/com/android/car/carlauncher/calmmode/NavigationStateDataTest.java124
-rw-r--r--app/tests/src/com/android/car/carlauncher/calmmode/NavigationStateViewModelTest.java195
-rw-r--r--app/tests/src/com/android/car/carlauncher/calmmode/TemperatureDataTest.java323
-rw-r--r--app/tests/src/com/android/car/carlauncher/calmmode/TemperatureViewModelTest.java219
-rw-r--r--app/tests/src/com/android/car/carlauncher/homescreen/HomeCardFragmentTest.java (renamed from tests/src/com/android/car/carlauncher/homescreen/HomeCardFragmentTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java (renamed from tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModelTest.java (renamed from tests/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModelTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/homescreen/audio/AudioFragmentTest.java (renamed from tests/src/com/android/car/carlauncher/homescreen/audio/AudioFragmentTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java (renamed from tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/homescreen/audio/InCallModelTest.java (renamed from tests/src/com/android/car/carlauncher/homescreen/audio/InCallModelTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/homescreen/audio/MediaViewModelTest.java (renamed from tests/src/com/android/car/carlauncher/homescreen/audio/MediaViewModelTest.java)26
-rw-r--r--app/tests/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImplTest.java (renamed from tests/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImplTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/recents/NonDODisabledTaskProviderTest.java (renamed from tests/src/com/android/car/carlauncher/recents/NonDODisabledTaskProviderTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/recents/RecentTasksProviderTest.java (renamed from tests/src/com/android/car/carlauncher/recents/RecentTasksProviderTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/recents/RecentsUtilsTest.java (renamed from tests/src/com/android/car/carlauncher/recents/RecentsUtilsTest.java)0
-rw-r--r--app/tests/src/com/android/car/carlauncher/recents/view/RecentsRecyclerViewTest.java (renamed from tests/src/com/android/car/carlauncher/recents/view/RecentsRecyclerViewTest.java)0
-rw-r--r--build.gradle67
-rw-r--r--docklib-util/Android.bp37
-rw-r--r--docklib-util/AndroidManifest.xml19
-rw-r--r--docklib-util/OWNERS8
-rw-r--r--docklib-util/README8
-rw-r--r--docklib-util/res/drawable/ic_dock_pin.xml26
-rw-r--r--docklib-util/res/drawable/ic_dock_unpin.xml10
-rw-r--r--docklib-util/res/values/config.xml22
-rw-r--r--docklib-util/res/values/strings.xml22
-rw-r--r--docklib-util/src/com/android/car/dockutil/events/DockEvent.java56
-rw-r--r--docklib-util/src/com/android/car/dockutil/events/DockEventSenderHelper.java112
-rw-r--r--docklib-util/src/com/android/car/dockutil/events/DockPermission.java36
-rw-r--r--docklib-util/src/com/android/car/dockutil/shortcuts/PinShortcutItem.kt47
-rw-r--r--docklib-util/tests/Android.bp63
-rw-r--r--docklib-util/tests/AndroidManifest.xml29
-rw-r--r--docklib-util/tests/src/com/android/car/dockutil/events/DockEventSenderHelperTest.java152
-rw-r--r--docklib-util/tests/src/com/android/car/dockutil/events/DockEventTest.java36
-rw-r--r--docklib-util/tests/src/com/android/car/dockutil/shortcuts/PinShortcutItemTest.kt43
-rw-r--r--docklib/Android.bp44
-rw-r--r--docklib/AndroidManifest.xml35
-rw-r--r--docklib/OWNERS9
-rw-r--r--docklib/README12
-rw-r--r--docklib/res/layout/dock_app_item_view.xml24
-rw-r--r--docklib/res/layout/dock_view.xml26
-rw-r--r--docklib/res/values-en-rXC/strings.xml24
-rw-r--r--docklib/res/values/colors.xml19
-rw-r--r--docklib/res/values/config.xml42
-rw-r--r--docklib/res/values/dimens.xml28
-rw-r--r--docklib/res/values/strings.xml27
-rw-r--r--docklib/res/values/styles.xml37
-rw-r--r--docklib/src/com/android/car/docklib/DockHelper.kt72
-rw-r--r--docklib/src/com/android/car/docklib/DockInterface.kt30
-rw-r--r--docklib/src/com/android/car/docklib/DockViewController.kt122
-rw-r--r--docklib/src/com/android/car/docklib/DockViewModel.kt103
-rw-r--r--docklib/src/com/android/car/docklib/data/DockAppItem.kt57
-rw-r--r--docklib/src/com/android/car/docklib/events/DockEventsReceiver.java101
-rw-r--r--docklib/src/com/android/car/docklib/task/DockTaskStackChangeListener.java50
-rw-r--r--docklib/src/com/android/car/docklib/view/DockAdapter.kt150
-rw-r--r--docklib/src/com/android/car/docklib/view/DockDragListener.kt313
-rw-r--r--docklib/src/com/android/car/docklib/view/DockItemLongClickListener.kt72
-rw-r--r--docklib/src/com/android/car/docklib/view/DockItemViewHolder.kt161
-rw-r--r--docklib/src/com/android/car/docklib/view/DockView.kt50
-rw-r--r--docklib/tests/Android.bp67
-rw-r--r--docklib/tests/AndroidManifest.xml38
-rw-r--r--docklib/tests/src/com/android/car/docklib/DockHelperTest.kt176
-rw-r--r--docklib/tests/src/com/android/car/docklib/DockViewModelTest.kt218
-rw-r--r--docklib/tests/src/com/android/car/docklib/TestUtils.kt22
-rw-r--r--docklib/tests/src/com/android/car/docklib/data/DockAppItemTest.kt82
-rw-r--r--docklib/tests/src/com/android/car/docklib/events/DockEventsReceiverTest.java102
-rw-r--r--docklib/tests/src/com/android/car/docklib/view/DockAdapterTest.kt122
-rw-r--r--docklib/tests/src/com/android/car/docklib/view/DockDragListenerTest.kt477
-rw-r--r--docklib/tests/src/com/android/car/docklib/view/DockItemLongClickListenerTest.kt89
-rw-r--r--gradle.properties24
-rw-r--r--gradle/wrapper/gradle-wrapper.jarbin0 -> 59536 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.properties6
-rwxr-xr-xgradlew234
-rw-r--r--gradlew.bat89
-rw-r--r--libs/OWNERS6
-rw-r--r--libs/appgrid/Android.bp83
-rw-r--r--libs/appgrid/OWNERS9
-rw-r--r--libs/appgrid/app/build.gradle66
-rw-r--r--libs/appgrid/app/src/main/AndroidManifest.xml57
-rw-r--r--libs/appgrid/app/src/main/res/drawable/ic_launcher.pngbin0 -> 3570 bytes
-rw-r--r--libs/appgrid/app/src/main/res/values/strings.xml19
-rw-r--r--libs/appgrid/keys/Android.bp8
-rw-r--r--libs/appgrid/keys/com_android_car_launcher_test.jksbin0 -> 2593 bytes
-rw-r--r--libs/appgrid/keys/com_android_car_launcher_test.pk8bin0 -> 1216 bytes
-rw-r--r--libs/appgrid/keys/com_android_car_launcher_test.x509.pem21
-rw-r--r--libs/appgrid/lib/AndroidManifest.xml71
-rw-r--r--libs/appgrid/lib/build.gradle110
-rw-r--r--libs/appgrid/lib/hidden_apis_disabled/src/com/android/car/carlauncher/hidden/HiddenApiAccess.java57
-rw-r--r--libs/appgrid/lib/hidden_apis_enabled/src/com/android/car/carlauncher/hidden/HiddenApiAccess.java55
-rw-r--r--libs/appgrid/lib/res/drawable/app_item_highlight.xml (renamed from res/drawable/app_item_highlight.xml)0
-rw-r--r--libs/appgrid/lib/res/drawable/banner_warning_image.xml10
-rw-r--r--libs/appgrid/lib/res/drawable/ic_app_info.xml (renamed from res/drawable/ic_app_info.xml)0
-rw-r--r--libs/appgrid/lib/res/drawable/ic_force_stop_caution_icon.xml (renamed from res/drawable/ic_force_stop_caution_icon.xml)0
-rw-r--r--libs/appgrid/lib/res/drawable/page_indicator_bar.xml (renamed from res/drawable/page_indicator_bar.xml)0
-rw-r--r--libs/appgrid/lib/res/layout/app_grid_activity.xml (renamed from res/layout/app_grid_activity.xml)9
-rw-r--r--libs/appgrid/lib/res/layout/app_item.xml (renamed from res/layout/app_item.xml)0
-rw-r--r--libs/appgrid/lib/res/layout/banner.xml62
-rw-r--r--libs/appgrid/lib/res/layout/recent_apps_row.xml (renamed from res/layout/recent_apps_row.xml)0
-rw-r--r--libs/appgrid/lib/res/values-af/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-am/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ar/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-as/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-az/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-b+sr+Latn/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-be/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-bg/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-bn/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-bs/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ca/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-cs/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-da/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-de/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-el/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-en-rAU/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-en-rGB/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-en-rIN/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-en-rXC/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-es-rUS/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-es/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-et/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-eu/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-fa/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-fi/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-fr-rCA/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-fr/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-gl/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-gu/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-hi/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-hr/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-hu/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-hy/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-in/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-is/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-it/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-iw/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ja/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ka/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-kk/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-km/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-kn/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ko/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ky/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-lo/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-lt/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-lv/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-mk/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ml/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-mn/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-mr/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ms/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-my/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-nb/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ne/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-nl/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-or/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-pa/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-pl/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-pt-rPT/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-pt/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ro/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ru/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-si/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-sk/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-sl/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-sq/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-sr/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-sv/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-sw/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ta/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-te/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-th/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-tl/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-tr/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-uk/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-ur/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-uz/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-vi/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-w930dp/integers.xml (renamed from res/values-w930dp/integers.xml)0
-rw-r--r--libs/appgrid/lib/res/values-zh-rCN/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-zh-rHK/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-zh-rTW/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values-zu/strings.xml37
-rw-r--r--libs/appgrid/lib/res/values/attrs.xml23
-rw-r--r--libs/appgrid/lib/res/values/bools.xml (renamed from res/values/bools.xml)8
-rw-r--r--libs/appgrid/lib/res/values/colors.xml28
-rw-r--r--libs/appgrid/lib/res/values/config.xml42
-rw-r--r--libs/appgrid/lib/res/values/dimens.xml71
-rw-r--r--libs/appgrid/lib/res/values/integers.xml (renamed from res/values/integers.xml)9
-rw-r--r--libs/appgrid/lib/res/values/overlayable.xml143
-rw-r--r--libs/appgrid/lib/res/values/strings.xml (renamed from res/values/strings.xml)68
-rw-r--r--libs/appgrid/lib/res/values/styles.xml44
-rw-r--r--libs/appgrid/lib/res/values/themes.xml (renamed from res/values/themes.xml)22
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/AppGridActivity.java (renamed from src/com/android/car/carlauncher/AppGridActivity.java)127
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/AppGridConstants.java (renamed from src/com/android/car/carlauncher/AppGridConstants.java)2
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/AppGridPageSnapper.java (renamed from src/com/android/car/carlauncher/AppGridPageSnapper.java)4
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/AppGridRecyclerView.java (renamed from src/com/android/car/carlauncher/AppGridRecyclerView.java)2
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/AppItem.java (renamed from src/com/android/car/carlauncher/AppItem.java)7
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/AppItemDragShadowBuilder.java (renamed from src/com/android/car/carlauncher/AppItemDragShadowBuilder.java)0
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/AppLauncherUtils.java (renamed from src/com/android/car/carlauncher/AppLauncherUtils.java)503
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/AppMetaData.java (renamed from src/com/android/car/carlauncher/AppMetaData.java)14
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/Banner.java124
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/LauncherItem.java (renamed from src/com/android/car/carlauncher/LauncherItem.java)4
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/LauncherItemDiffCallback.java (renamed from src/com/android/car/carlauncher/LauncherItemDiffCallback.java)2
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/LauncherItemMessageHelper.java (renamed from src/com/android/car/carlauncher/LauncherItemHelper.java)46
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/LauncherViewModel.java100
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/LauncherViewModelFactory.java (renamed from src/com/android/car/carlauncher/LauncherViewModelFactory.java)10
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/PageIndicator.java (renamed from src/com/android/car/carlauncher/PageIndicator.java)2
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/RecentAppsRowViewHolder.java (renamed from src/com/android/car/carlauncher/RecentAppsRowViewHolder.java)2
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/ResetLauncherActivity.java (renamed from src/com/android/car/carlauncher/ResetLauncherActivity.java)3
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/apporder/AppOrderController.java264
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/datastore/DataSourceController.java28
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/datastore/ProtoDataSource.java152
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/datastore/launcheritem/LauncherItemListSource.java51
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/pagination/PageIndexingHelper.java (renamed from src/com/android/car/carlauncher/pagination/PageIndexingHelper.java)0
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/pagination/PageMeasurementHelper.java (renamed from src/com/android/car/carlauncher/pagination/PageMeasurementHelper.java)0
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/pagination/PaginationController.java (renamed from src/com/android/car/carlauncher/pagination/PaginationController.java)19
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/proto/launcher_item.proto (renamed from src/com/android/car/carlauncher/proto/launcher_item.proto)0
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppGridAdapter.java (renamed from src/com/android/car/carlauncher/recyclerview/AppGridAdapter.java)16
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppGridItemAnimator.java (renamed from src/com/android/car/carlauncher/recyclerview/AppGridItemAnimator.java)0
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppGridLayoutManager.java (renamed from src/com/android/car/carlauncher/recyclerview/AppGridLayoutManager.java)0
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppItemViewHolder.java (renamed from src/com/android/car/carlauncher/recyclerview/AppItemViewHolder.java)44
-rw-r--r--libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/PageMarginDecoration.java (renamed from src/com/android/car/carlauncher/recyclerview/PageMarginDecoration.java)0
-rw-r--r--libs/appgrid/lib/tests/Android.bp78
-rw-r--r--libs/appgrid/lib/tests/AndroidManifest.xml39
-rw-r--r--libs/appgrid/lib/tests/res/values-af/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-am/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ar/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-as/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-az/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-b+sr+Latn/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-be/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-bg/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-bn/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-bs/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ca/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-cs/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-da/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-de/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-el/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-en-rAU/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-en-rGB/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-en-rIN/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-en-rXC/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-es-rUS/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-es/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-et/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-eu/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-fa/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-fi/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-fr-rCA/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-fr/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-gl/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-gu/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-hi/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-hr/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-hu/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-hy/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-in/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-is/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-it/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-iw/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ja/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ka/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-kk/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-km/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-kn/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ko/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ky/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-lo/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-lt/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-lv/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-mk/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ml/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-mn/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-mr/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ms/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-my/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-nb/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ne/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-nl/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-or/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-pa/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-pl/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-pt-rPT/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-pt/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ro/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ru/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-si/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-sk/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-sl/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-sq/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-sr/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-sv/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-sw/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ta/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-te/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-th/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-tl/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-tr/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-uk/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-ur/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-uz/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-vi/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-zh-rCN/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-zh-rHK/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-zh-rTW/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values-zu/strings.xml21
-rw-r--r--libs/appgrid/lib/tests/res/values/strings.xml20
-rw-r--r--libs/appgrid/lib/tests/res/xml/automotive_app_desc.xml (renamed from tests/res/xml/automotive_app_desc.xml)0
-rw-r--r--libs/appgrid/lib/tests/res/xml/empty_test_activity.xml (renamed from tests/res/xml/empty_test_activity.xml)0
-rw-r--r--libs/appgrid/lib/tests/res/xml/test_list_item.xml (renamed from tests/res/xml/test_list_item.xml)0
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridActivityTest.java191
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridAdapterTest.java (renamed from tests/src/com/android/car/carlauncher/AppGridAdapterTest.java)2
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridPageSnapperTest.java (renamed from tests/src/com/android/car/carlauncher/AppGridPageSnapperTest.java)3
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppItemViewHolderTest.java97
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppLauncherUtilsTest.java (renamed from tests/src/com/android/car/carlauncher/AppLauncherUtilsTest.java)453
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/InstantTaskExecutorRule.java (renamed from tests/src/com/android/car/carlauncher/InstantTaskExecutorRule.java)2
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/LauncherViewModelTest.java159
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/PageIndexingHelperTest.java (renamed from tests/src/com/android/car/carlauncher/PageIndexingHelperTest.java)6
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/TestActivity.java (renamed from tests/src/com/android/car/carlauncher/TestActivity.java)0
-rw-r--r--libs/appgrid/lib/tests/src/com/android/car/carlauncher/apporder/AppOrderControllerTest.java174
-rw-r--r--libs/car-apps-common/build.gradle17
-rw-r--r--libs/car-media-common/build.gradle17
-rw-r--r--libs/car-ui-lib/build.gradle17
-rw-r--r--res/values-af/strings.xml49
-rw-r--r--res/values-am/strings.xml49
-rw-r--r--res/values-ar/strings.xml49
-rw-r--r--res/values-as/strings.xml49
-rw-r--r--res/values-az/strings.xml49
-rw-r--r--res/values-b+sr+Latn/strings.xml49
-rw-r--r--res/values-be/strings.xml49
-rw-r--r--res/values-bg/strings.xml49
-rw-r--r--res/values-bn/strings.xml49
-rw-r--r--res/values-bs/strings.xml49
-rw-r--r--res/values-ca/strings.xml49
-rw-r--r--res/values-cs/strings.xml49
-rw-r--r--res/values-da/strings.xml49
-rw-r--r--res/values-de/strings.xml49
-rw-r--r--res/values-el/strings.xml49
-rw-r--r--res/values-en-rAU/strings.xml49
-rw-r--r--res/values-en-rCA/strings.xml55
-rw-r--r--res/values-en-rGB/strings.xml49
-rw-r--r--res/values-en-rIN/strings.xml49
-rw-r--r--res/values-en-rXC/strings.xml49
-rw-r--r--res/values-es-rUS/strings.xml49
-rw-r--r--res/values-es/strings.xml49
-rw-r--r--res/values-et/strings.xml49
-rw-r--r--res/values-eu/strings.xml49
-rw-r--r--res/values-fa/strings.xml49
-rw-r--r--res/values-fi/strings.xml49
-rw-r--r--res/values-fr-rCA/strings.xml49
-rw-r--r--res/values-fr/strings.xml49
-rw-r--r--res/values-gl/strings.xml49
-rw-r--r--res/values-gu/strings.xml49
-rw-r--r--res/values-hi/strings.xml49
-rw-r--r--res/values-hr/strings.xml49
-rw-r--r--res/values-hu/strings.xml49
-rw-r--r--res/values-hy/strings.xml49
-rw-r--r--res/values-in/strings.xml49
-rw-r--r--res/values-is/strings.xml49
-rw-r--r--res/values-it/strings.xml49
-rw-r--r--res/values-iw/strings.xml49
-rw-r--r--res/values-ja/strings.xml49
-rw-r--r--res/values-ka/strings.xml49
-rw-r--r--res/values-kk/strings.xml49
-rw-r--r--res/values-km/strings.xml49
-rw-r--r--res/values-kn/strings.xml49
-rw-r--r--res/values-ko/strings.xml49
-rw-r--r--res/values-ky/strings.xml49
-rw-r--r--res/values-lo/strings.xml49
-rw-r--r--res/values-lt/strings.xml49
-rw-r--r--res/values-lv/strings.xml49
-rw-r--r--res/values-mk/strings.xml49
-rw-r--r--res/values-ml/strings.xml49
-rw-r--r--res/values-mn/strings.xml49
-rw-r--r--res/values-mr/strings.xml49
-rw-r--r--res/values-ms/strings.xml49
-rw-r--r--res/values-my/strings.xml49
-rw-r--r--res/values-nb/strings.xml49
-rw-r--r--res/values-ne/strings.xml49
-rw-r--r--res/values-nl/strings.xml49
-rw-r--r--res/values-or/strings.xml49
-rw-r--r--res/values-pa/strings.xml49
-rw-r--r--res/values-pl/strings.xml49
-rw-r--r--res/values-pt-rPT/strings.xml49
-rw-r--r--res/values-pt/strings.xml49
-rw-r--r--res/values-ro/strings.xml49
-rw-r--r--res/values-ru/strings.xml49
-rw-r--r--res/values-si/strings.xml49
-rw-r--r--res/values-sk/strings.xml49
-rw-r--r--res/values-sl/strings.xml49
-rw-r--r--res/values-sq/strings.xml49
-rw-r--r--res/values-sr/strings.xml49
-rw-r--r--res/values-sv/strings.xml49
-rw-r--r--res/values-sw/strings.xml49
-rw-r--r--res/values-ta/strings.xml49
-rw-r--r--res/values-te/strings.xml49
-rw-r--r--res/values-th/strings.xml49
-rw-r--r--res/values-tl/strings.xml49
-rw-r--r--res/values-tr/strings.xml49
-rw-r--r--res/values-uk/strings.xml49
-rw-r--r--res/values-ur/strings.xml49
-rw-r--r--res/values-uz/strings.xml49
-rw-r--r--res/values-vi/strings.xml49
-rw-r--r--res/values-zh-rCN/strings.xml49
-rw-r--r--res/values-zh-rHK/strings.xml49
-rw-r--r--res/values-zh-rTW/strings.xml49
-rw-r--r--res/values-zu/strings.xml49
-rw-r--r--settings.gradle36
-rw-r--r--src/com/android/car/carlauncher/LauncherViewModel.java347
-rw-r--r--tests/src/com/android/car/carlauncher/AppGridActivityTest.java87
-rw-r--r--tests/src/com/android/car/carlauncher/CarLauncherTest.java102
-rw-r--r--tests/src/com/android/car/carlauncher/LauncherViewModelTest.java338
-rwxr-xr-xtools/generate-overlayable.sh36
721 files changed, 21269 insertions, 5878 deletions
diff --git a/OWNERS b/OWNERS
index 61cc4634..d363985a 100644
--- a/OWNERS
+++ b/OWNERS
@@ -7,7 +7,4 @@ priyanksingh@google.com
# Secondary
nehah@google.com
babakbo@google.com
-igorr@google.com
-
-# Recents
-per-file src/com/android/car/carlauncher/recents/* = jainams@google.com
+igorr@google.com \ No newline at end of file
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index 7a9b8ca7..e9cd7f8c 100644..100755
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -1,8 +1,8 @@
[Hook Scripts]
checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
ktlint_hook = ${REPO_ROOT}/prebuilts/ktlint/ktlint.py -f ${PREUPLOAD_FILES}
-overlayable_resource_hook = ${REPO_ROOT}/packages/apps/Car/systemlibs/tools/rro/verify-overlayable.py -r res -e res/values/overlayable.xml -o res/values/overlayable.xml
-
+app_overlayable_resource_hook = ${REPO_ROOT}/packages/apps/Car/systemlibs/tools/rro/verify-overlayable.py -r app/res -e app/res/values/overlayable.xml -o app/res/values/overlayable.xml
+appgrid_lib_overlayable_resource_hook = ${REPO_ROOT}/packages/apps/Car/systemlibs/tools/rro/verify-overlayable.py -r libs/appgrid/lib/res -e libs/appgrid/lib/res/values/overlayable.xml -o libs/appgrid/lib/res/values/overlayable.xml
[Builtin Hooks]
commit_msg_changeid_field = true
commit_msg_test_field = true
diff --git a/Android.bp b/app/Android.bp
index a14e9e3c..ef51aa77 100644
--- a/Android.bp
+++ b/app/Android.bp
@@ -17,36 +17,41 @@ package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
-java_library_static {
- name: "launcher_item",
- host_supported: true,
- proto: {
- type: "lite",
- },
- sdk_version: "module_current",
- min_sdk_version: "31",
- srcs: ["src/com/android/car/carlauncher/proto/launcher_item.proto"]
+genrule {
+ name: "statslog-carlauncher-java-gen",
+ tools: ["stats-log-api-gen"],
+ cmd: "$(location stats-log-api-gen) --java $(out) --module carlauncher"
+ + " --javaPackage com.android.car.carlauncher --javaClass CarLauncherStatsLog",
+ out: ["com/android/car/carlauncher/CarLauncherStatsLog.java"],
}
+carlauncher_srcs = [
+ "src/**/*.java",
+ ":statslog-carlauncher-java-gen",
+]
+
android_library {
name: "CarLauncher-core",
platform_apis: true,
- srcs: ["src/**/*.java"],
+ srcs: carlauncher_srcs,
resource_dirs: ["res"],
static_libs: [
+ "car_launcher_flags_java_lib",
"androidx-constraintlayout_constraintlayout-solver",
"androidx-constraintlayout_constraintlayout",
"androidx.lifecycle_lifecycle-extensions",
"car-media-common",
+ "car-qc-lib",
"car-telephony-common",
"car-ui-lib",
"com.google.android.material_material",
"WindowManager-Shell",
- "launcher_item",
- "SystemUISharedLib"
+ "CarAppGrid-lib",
+ "SystemUISharedLib",
+ "android.car.cluster.navigation",
],
libs: ["android.car"],
@@ -59,6 +64,8 @@ android_app {
resource_dirs: [],
+ srcs: carlauncher_srcs,
+
platform_apis: true,
required: ["allowed_privapp_com.android.car.carlauncher"],
@@ -85,3 +92,14 @@ android_app {
enabled: false,
},
}
+
+aconfig_declarations {
+ name: "car_launcher_flags",
+ package: "com.android.car.carlauncher",
+ srcs: ["car_launcher_flags.aconfig"],
+}
+
+java_aconfig_library {
+ name: "car_launcher_flags_java_lib",
+ aconfig_declarations: "car_launcher_flags",
+}
diff --git a/AndroidManifest.xml b/app/AndroidManifest.xml
index 836a6639..0acb74bb 100644
--- a/AndroidManifest.xml
+++ b/app/AndroidManifest.xml
@@ -69,6 +69,13 @@
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
<!-- Permission to create RemoteCarTaskView -->
<uses-permission android:name="android.car.permission.MANAGE_CAR_SYSTEM_UI"/>
+ <!-- Permission to read outside temperature sensor -->
+ <uses-permission android:name="android.car.permission.CAR_EXTERIOR_ENVIRONMENT"/>
+ <!-- Permission to read hvac properties -->
+ <uses-permission android:name="android.car.permission.CONTROL_CAR_CLIMATE"/>
+ <!-- Permission to read navigation state -->
+ <uses-permission android:name="android.car.permission.CAR_MONITOR_CLUSTER_NAVIGATION_STATE"/>
+
<!-- To connect to media browser services in other apps, media browser clients
that target Android 11 need to add the following in their manifest -->
<queries>
@@ -77,15 +84,10 @@
</intent>
</queries>
- <!-- The app needs to be directBootAware so that it can reflect the correct call state
- when the system boots up. -->
- <!-- Consider "defaultToDeviceProtectedStorage" which prevents app crash before boot
- complete if access storage, but be careful with any user sensitive data when using. -->
<application
android:icon="@drawable/ic_launcher_home"
android:label="@string/app_title"
android:theme="@style/Theme.Launcher"
- android:directBootAware="true"
android:supportsRtl="true">
<activity
android:name=".CarLauncher"
@@ -104,22 +106,6 @@
<category android:name="android.intent.category.LAUNCHER_APP"/>
</intent-filter>
</activity>
- <activity android:name="com.android.car.carlauncher.ResetLauncherActivity"
- android:theme="@style/ActionDialogTheme"
- android:excludeFromRecents="true"
- android:exported="true"
- android:launchMode="singleInstance">
- <intent-filter>
- <action android:name="com.android.settings.action.EXTRA_SETTINGS"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- <meta-data
- android:name="com.android.settings.title"
- android:resource="@string/reset_appgrid_title"/>
- <meta-data
- android:name="com.android.settings.category"
- android:value="com.android.settings.category.ia.apps"/>
- </activity>
<activity
android:name=".ControlBarActivity"
android:launchMode="singleInstance"
@@ -134,18 +120,6 @@
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
- <activity
- android:name=".AppGridActivity"
- android:launchMode="singleInstance"
- android:exported="true"
- android:theme="@style/Theme.Launcher.AppGridActivity"
- android:excludeFromRecents="true">
- <meta-data android:name="distractionOptimized" android:value="true"/>
- <intent-filter>
- <action android:name="com.android.car.carlauncher.ACTION_APP_GRID"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
<service
android:name=".recents.CarQuickStepService"
android:permission="android.permission.STATUS_BAR_SERVICE"
@@ -169,9 +143,34 @@
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
+ <activity android:name="com.android.car.carlauncher.calmmode.CalmModeActivity"
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:launchMode="singleInstance"
+ android:theme="@style/Theme.CalmMode">
+ <intent-filter>
+ <action android:name="com.android.settings.action.EXTRA_SETTINGS"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ <meta-data android:name="distractionOptimized" android:value="true"/>
+ <meta-data
+ android:name="com.android.settings.title"
+ android:resource="@string/calm_mode_title"/>
+ <meta-data
+ android:name="com.android.settings.category"
+ android:value="com.android.settings.category.ia.display"/>
+ </activity>
+ <provider android:name=".calmmode.CalmModeQCProvider"
+ android:authorities="com.android.car.carlauncher.calmmode"
+ android:grantUriPermissions="true"
+ android:exported="true">
+ </provider>
+ <!-- The service needs to be directBootAware so that it can reflect the correct call state
+ when the system boots up. -->
<service android:name=".homescreen.audio.telecom.InCallServiceImpl"
+ android:directBootAware="true"
android:permission="android.permission.BIND_INCALL_SERVICE"
android:exported="true">
<!-- The home app does not display the in-call UI. This is handled by the
diff --git a/app/OWNERS b/app/OWNERS
new file mode 100644
index 00000000..2008cc23
--- /dev/null
+++ b/app/OWNERS
@@ -0,0 +1,14 @@
+# Default code reviewers picked from top 3 or more developers.
+# Please update this list if you find better candidates.
+
+alexstetson@google.com
+danzz@google.com
+nehah@google.com
+babakbo@google.com
+arnaudberry@google.com
+igorr@google.com
+stenning@google.com
+ycheo@google.com # for TaskView only
+
+# Recents
+per-file src/com/android/car/carlauncher/recents/* = jainams@google.com
diff --git a/app/car_launcher_flags.aconfig b/app/car_launcher_flags.aconfig
new file mode 100644
index 00000000..27d01b93
--- /dev/null
+++ b/app/car_launcher_flags.aconfig
@@ -0,0 +1,8 @@
+package: "com.android.car.carlauncher"
+
+flag {
+ name: "calm_mode"
+ namespace: "car_sys_exp"
+ description: "This flag controls Calm mode"
+ bug: "295396130"
+}
diff --git a/res/animator/recents_clear_all.xml b/app/res/animator/recents_clear_all.xml
index 2625baf0..2625baf0 100644
--- a/res/animator/recents_clear_all.xml
+++ b/app/res/animator/recents_clear_all.xml
diff --git a/res/color/dialer_icon_tint_state_list.xml b/app/res/color/dialer_icon_tint_state_list.xml
index a72ac130..a72ac130 100644
--- a/res/color/dialer_icon_tint_state_list.xml
+++ b/app/res/color/dialer_icon_tint_state_list.xml
diff --git a/res/drawable-night/ic_launcher_home.xml b/app/res/drawable-night/ic_launcher_home.xml
index 72e70be9..72e70be9 100644
--- a/res/drawable-night/ic_launcher_home.xml
+++ b/app/res/drawable-night/ic_launcher_home.xml
diff --git a/res/drawable/car_button_background.xml b/app/res/drawable/car_button_background.xml
index 1f89f2e6..1f89f2e6 100644
--- a/res/drawable/car_button_background.xml
+++ b/app/res/drawable/car_button_background.xml
diff --git a/res/drawable/control_bar_contact_image_background.xml b/app/res/drawable/control_bar_contact_image_background.xml
index af879786..af879786 100644
--- a/res/drawable/control_bar_contact_image_background.xml
+++ b/app/res/drawable/control_bar_contact_image_background.xml
diff --git a/res/drawable/control_bar_image_background.xml b/app/res/drawable/control_bar_image_background.xml
index af879786..af879786 100644
--- a/res/drawable/control_bar_image_background.xml
+++ b/app/res/drawable/control_bar_image_background.xml
diff --git a/res/drawable/default_audio_background.xml b/app/res/drawable/default_audio_background.xml
index 8c92f16f..8c92f16f 100644
--- a/res/drawable/default_audio_background.xml
+++ b/app/res/drawable/default_audio_background.xml
diff --git a/res/drawable/dialer_button_active_state_circle.xml b/app/res/drawable/dialer_button_active_state_circle.xml
index f2448354..f2448354 100644
--- a/res/drawable/dialer_button_active_state_circle.xml
+++ b/app/res/drawable/dialer_button_active_state_circle.xml
diff --git a/res/drawable/ic_apps_black.xml b/app/res/drawable/ic_apps_black.xml
index 885cd0ae..885cd0ae 100644
--- a/res/drawable/ic_apps_black.xml
+++ b/app/res/drawable/ic_apps_black.xml
diff --git a/res/drawable/ic_arrow_back_black.xml b/app/res/drawable/ic_arrow_back_black.xml
index e7c36711..e7c36711 100644
--- a/res/drawable/ic_arrow_back_black.xml
+++ b/app/res/drawable/ic_arrow_back_black.xml
diff --git a/res/drawable/ic_call_end.xml b/app/res/drawable/ic_call_end.xml
index b8cbbace..b8cbbace 100644
--- a/res/drawable/ic_call_end.xml
+++ b/app/res/drawable/ic_call_end.xml
diff --git a/res/drawable/ic_call_end_button.xml b/app/res/drawable/ic_call_end_button.xml
index 087192d1..087192d1 100644
--- a/res/drawable/ic_call_end_button.xml
+++ b/app/res/drawable/ic_call_end_button.xml
diff --git a/res/drawable/ic_clear_black.xml b/app/res/drawable/ic_clear_black.xml
index 9a18a44e..9a18a44e 100644
--- a/res/drawable/ic_clear_black.xml
+++ b/app/res/drawable/ic_clear_black.xml
diff --git a/res/drawable/ic_dialpad.xml b/app/res/drawable/ic_dialpad.xml
index 638b37b2..638b37b2 100644
--- a/res/drawable/ic_dialpad.xml
+++ b/app/res/drawable/ic_dialpad.xml
diff --git a/res/drawable/ic_launcher_home.xml b/app/res/drawable/ic_launcher_home.xml
index 72e70be9..72e70be9 100644
--- a/res/drawable/ic_launcher_home.xml
+++ b/app/res/drawable/ic_launcher_home.xml
diff --git a/app/res/drawable/ic_media.xml b/app/res/drawable/ic_media.xml
new file mode 100644
index 00000000..2a69a649
--- /dev/null
+++ b/app/res/drawable/ic_media.xml
@@ -0,0 +1,25 @@
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960">
+ <path
+ android:pathData="M400,840q-66,0 -113,-47t-47,-113q0,-66 47,-113t113,-47q23,0 42.5,5.5T480,542v-422h240v160L560,280v400q0,66 -47,113t-113,47Z"
+ android:fillColor="#FFF"/>
+</vector>
diff --git a/res/drawable/ic_mic_on.xml b/app/res/drawable/ic_mic_on.xml
index 79647865..79647865 100644
--- a/res/drawable/ic_mic_on.xml
+++ b/app/res/drawable/ic_mic_on.xml
diff --git a/res/drawable/ic_mute_activatable.xml b/app/res/drawable/ic_mute_activatable.xml
index 0be6f78a..0be6f78a 100644
--- a/res/drawable/ic_mute_activatable.xml
+++ b/app/res/drawable/ic_mute_activatable.xml
diff --git a/app/res/drawable/ic_navigation.xml b/app/res/drawable/ic_navigation.xml
new file mode 100644
index 00000000..fbab83c9
--- /dev/null
+++ b/app/res/drawable/ic_navigation.xml
@@ -0,0 +1,23 @@
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960">
+ <path android:fillColor="#FFF" android:pathData="M480,472q42,0 71,-29t29,-71q0,-42 -29,-71t-71,-29q-42,0 -71,29t-29,71q0,42 29,71t71,29ZM334,604q35,42 71,93t65,124q2,4 5,11.5t5,7.5q2,0 5,-7.5t5,-11.5q29,-73 65.5,-124t70.5,-93q45,-56 74.5,-105T730,370q0,-104 -73,-177t-177,-73q-104,0 -177,73t-72,177q0,80 29,129t74,105ZM480,880q-21,0 -30,-12.5T433,836q-33,-82 -75,-135.5t-79.5,-101Q241,552 215.5,500T190,370q0,-121 84.5,-205.5T480,80q121,0 205.5,84.5T770,370q0,78 -25.5,130t-63,99.5Q644,647 602,700.5T527,836q-8,19 -17,31.5T480,880ZM480,370Z"/>
+</vector>
diff --git a/res/drawable/ic_partly_cloudy.png b/app/res/drawable/ic_partly_cloudy.png
index 7a5be64d..7a5be64d 100644
--- a/res/drawable/ic_partly_cloudy.png
+++ b/app/res/drawable/ic_partly_cloudy.png
Binary files differ
diff --git a/res/drawable/ic_recent_dismiss.xml b/app/res/drawable/ic_recent_dismiss.xml
index 59e498ad..59e498ad 100644
--- a/res/drawable/ic_recent_dismiss.xml
+++ b/app/res/drawable/ic_recent_dismiss.xml
diff --git a/res/drawable/ic_search_black.xml b/app/res/drawable/ic_search_black.xml
index 4c72d024..4c72d024 100644
--- a/res/drawable/ic_search_black.xml
+++ b/app/res/drawable/ic_search_black.xml
diff --git a/app/res/drawable/ic_temperature.xml b/app/res/drawable/ic_temperature.xml
new file mode 100644
index 00000000..bde014bd
--- /dev/null
+++ b/app/res/drawable/ic_temperature.xml
@@ -0,0 +1,25 @@
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960">
+ <path
+ android:pathData="M480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880Z"
+ android:fillColor="#FFF"/>
+</vector>
diff --git a/res/drawable/recent_clear_all_button_background.xml b/app/res/drawable/recent_clear_all_button_background.xml
index 8126097f..8126097f 100644
--- a/res/drawable/recent_clear_all_button_background.xml
+++ b/app/res/drawable/recent_clear_all_button_background.xml
diff --git a/res/drawable/recent_dismiss_button_background.xml b/app/res/drawable/recent_dismiss_button_background.xml
index f7bc1561..f7bc1561 100644
--- a/res/drawable/recent_dismiss_button_background.xml
+++ b/app/res/drawable/recent_dismiss_button_background.xml
diff --git a/res/layout-land/car_launcher.xml b/app/res/layout-land/car_launcher.xml
index b6a15891..25031309 100644
--- a/res/layout-land/car_launcher.xml
+++ b/app/res/layout-land/car_launcher.xml
@@ -21,6 +21,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr"
+ android:background="@android:color/black"
tools:context=".CarLauncher">
<com.android.car.ui.FocusParkingView
@@ -31,6 +32,7 @@
android:id="@+id/top_card"
android:layout_width="0dp"
android:layout_height="0dp"
+ android:layout_marginStart="@dimen/main_screen_widget_margin"
android:layout_marginBottom="@dimen/main_screen_widget_margin"
android:layoutDirection="locale"
app:layout_constraintLeft_toLeftOf="parent"
@@ -42,6 +44,7 @@
android:id="@+id/bottom_card"
android:layout_width="0dp"
android:layout_height="0dp"
+ android:layout_marginStart="@dimen/main_screen_widget_margin"
android:layoutDirection="locale"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/vertical_barrier"
@@ -60,7 +63,7 @@
style="@style/CardViewStyle"
android:layout_width="0dp"
android:layout_height="0dp"
- android:layout_marginLeft="@dimen/main_screen_widget_margin"
+ android:layout_marginHorizontal="@dimen/main_screen_widget_margin"
android:layoutDirection="locale"
app:layout_constraintLeft_toRightOf="@+id/vertical_barrier"
app:layout_constraintRight_toRightOf="parent"
diff --git a/res/layout/button_trio.xml b/app/res/layout/button_trio.xml
index b61acd7c..b61acd7c 100644
--- a/res/layout/button_trio.xml
+++ b/app/res/layout/button_trio.xml
diff --git a/app/res/layout/calm_mode_activity.xml b/app/res/layout/calm_mode_activity.xml
new file mode 100644
index 00000000..60f4a925
--- /dev/null
+++ b/app/res/layout/calm_mode_activity.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<androidx.fragment.app.FragmentContainerView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/fragment_container_view"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:name="com.android.car.carlauncher.calmmode.CalmModeFragment" />
diff --git a/app/res/layout/calm_mode_date_and_temperature.xml b/app/res/layout/calm_mode_date_and_temperature.xml
new file mode 100644
index 00000000..66afd0a8
--- /dev/null
+++ b/app/res/layout/calm_mode_date_and_temperature.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content">
+ <TextClock
+ android:id="@+id/date"
+ style="@style/CalmMode.Text.Date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:layout_marginTop="@dimen/calm_mode_padding"
+ android:layout_marginEnd="@dimen/calm_mode_padding"
+ app:layout_constraintEnd_toStartOf="@id/temperature_icon"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <androidx.constraintlayout.widget.Group
+ android:id="@+id/temperature_group"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ app:constraint_referenced_ids="temperature_icon,temperature"/>
+
+ <ImageView
+ android:id="@+id/temperature_icon"
+ style="@style/CalmMode.Icon.Temperature"
+ android:layout_marginEnd="@dimen/calm_mode_padding"
+ android:src="@drawable/ic_temperature"
+ app:layout_constraintEnd_toStartOf="@id/temperature"
+ app:layout_constraintTop_toTopOf="@id/temperature"
+ app:layout_constraintBottom_toBottomOf="@id/temperature" />
+
+ <TextView
+ android:id="@+id/temperature"
+ style="@style/CalmMode.Text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/calm_mode_padding"
+ android:layout_marginEnd="@dimen/calm_mode_padding"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/res/layout/calm_mode_fragment.xml b/app/res/layout/calm_mode_fragment.xml
new file mode 100644
index 00000000..bdb80953
--- /dev/null
+++ b/app/res/layout/calm_mode_fragment.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/calm_mode_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ImageView
+ style="@style/CalmMode.BackgroundImage"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <com.android.car.ui.FocusParkingView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <androidx.constraintlayout.widget.Group
+ android:id="@+id/media_group"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ app:constraint_referenced_ids="media_icon,media_title" />
+
+ <ImageView
+ android:id="@+id/media_icon"
+ style="@style/CalmMode.Icon"
+ android:scaleType="fitCenter"
+ android:src="@drawable/ic_media"
+ android:layout_marginTop="@dimen/calm_mode_padding"
+ android:layout_marginStart="@dimen/calm_mode_padding"
+ app:layout_constraintBottom_toTopOf="@id/barrier"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <TextView
+ android:id="@+id/media_title"
+ style="@style/CalmMode.Text.MediaTitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/calm_mode_padding"
+ android:layout_marginStart="@dimen/calm_mode_icon_margin"
+ app:layout_constraintBottom_toTopOf="@id/barrier"
+ app:layout_constraintStart_toEndOf="@id/media_icon"
+ app:layout_constraintTop_toTopOf="parent"/>
+
+ <androidx.constraintlayout.widget.Group
+ android:id="@+id/nav_group"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ app:constraint_referenced_ids="nav_state_icon,nav_state" />
+
+ <ImageView
+ android:id="@+id/nav_state_icon"
+ style="@style/CalmMode.Icon"
+ android:layout_marginEnd="@dimen/calm_mode_icon_margin"
+ android:src="@drawable/ic_navigation"
+ android:layout_marginTop="@dimen/calm_mode_padding"
+ app:layout_constraintBottom_toTopOf="@id/barrier"
+ app:layout_constraintEnd_toStartOf="@id/nav_state"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <TextView
+ android:id="@+id/nav_state"
+ style="@style/CalmMode.Text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/calm_mode_padding"
+ android:layout_marginStart="@dimen/calm_mode_icon_margin"
+ app:layout_constraintBottom_toTopOf="@id/barrier"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
+
+ <include
+ android:id="@+id/date_and_temperature_container"
+ layout="@layout/calm_mode_date_and_temperature"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <androidx.constraintlayout.widget.Barrier
+ android:id="@+id/barrier"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:barrierAllowsGoneWidgets="true"
+ app:barrierDirection="bottom"
+ app:constraint_referenced_ids="media_icon, media_title, nav_icon, nav_state, date_and_temperature_container" />
+
+ <TextClock
+ android:id="@+id/clock"
+ style="@style/CalmMode.Text.Clock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/barrier"/>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/car_launcher.xml b/app/res/layout/car_launcher.xml
index e45dc69e..e45a9bf8 100644
--- a/res/layout/car_launcher.xml
+++ b/app/res/layout/car_launcher.xml
@@ -21,6 +21,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr"
+ android:background="@android:color/black"
tools:context=".CarLauncher">
<com.android.car.ui.FocusParkingView
diff --git a/res/layout/car_launcher_multiwindow.xml b/app/res/layout/car_launcher_multiwindow.xml
index 6061dbf5..6061dbf5 100644
--- a/res/layout/car_launcher_multiwindow.xml
+++ b/app/res/layout/car_launcher_multiwindow.xml
diff --git a/res/layout/card_content_descriptive_text_only.xml b/app/res/layout/card_content_descriptive_text_only.xml
index 8dd3fa9c..8dd3fa9c 100644
--- a/res/layout/card_content_descriptive_text_only.xml
+++ b/app/res/layout/card_content_descriptive_text_only.xml
diff --git a/res/layout/card_content_descriptive_text_with_controls.xml b/app/res/layout/card_content_descriptive_text_with_controls.xml
index 505f8f06..505f8f06 100644
--- a/res/layout/card_content_descriptive_text_with_controls.xml
+++ b/app/res/layout/card_content_descriptive_text_with_controls.xml
diff --git a/res/layout/card_content_media.xml b/app/res/layout/card_content_media.xml
index 08a291db..08a291db 100644
--- a/res/layout/card_content_media.xml
+++ b/app/res/layout/card_content_media.xml
diff --git a/res/layout/card_content_text_block.xml b/app/res/layout/card_content_text_block.xml
index bc181a92..bc181a92 100644
--- a/res/layout/card_content_text_block.xml
+++ b/app/res/layout/card_content_text_block.xml
diff --git a/res/layout/card_fragment.xml b/app/res/layout/card_fragment.xml
index 953a139a..953a139a 100644
--- a/res/layout/card_fragment.xml
+++ b/app/res/layout/card_fragment.xml
diff --git a/res/layout/control_bar_container.xml b/app/res/layout/control_bar_container.xml
index 4c3d9553..4c3d9553 100644
--- a/res/layout/control_bar_container.xml
+++ b/app/res/layout/control_bar_container.xml
diff --git a/res/layout/descriptive_text.xml b/app/res/layout/descriptive_text.xml
index f1aa5b0a..f1aa5b0a 100644
--- a/res/layout/descriptive_text.xml
+++ b/app/res/layout/descriptive_text.xml
diff --git a/res/layout/optional_seek_bar_with_times.xml b/app/res/layout/optional_seek_bar_with_times.xml
index 8661ddc2..8661ddc2 100644
--- a/res/layout/optional_seek_bar_with_times.xml
+++ b/app/res/layout/optional_seek_bar_with_times.xml
diff --git a/res/layout/recent_clear_all_view.xml b/app/res/layout/recent_clear_all_view.xml
index 87220afc..87220afc 100644
--- a/res/layout/recent_clear_all_view.xml
+++ b/app/res/layout/recent_clear_all_view.xml
diff --git a/res/layout/recent_task_view.xml b/app/res/layout/recent_task_view.xml
index e6a41b26..e6a41b26 100644
--- a/res/layout/recent_task_view.xml
+++ b/app/res/layout/recent_task_view.xml
diff --git a/res/layout/recent_task_view_first.xml b/app/res/layout/recent_task_view_first.xml
index a01c8f66..a01c8f66 100644
--- a/res/layout/recent_task_view_first.xml
+++ b/app/res/layout/recent_task_view_first.xml
diff --git a/res/layout/recent_task_view_inner.xml b/app/res/layout/recent_task_view_inner.xml
index ab7314a3..ab7314a3 100644
--- a/res/layout/recent_task_view_inner.xml
+++ b/app/res/layout/recent_task_view_inner.xml
diff --git a/res/layout/recents_activity.xml b/app/res/layout/recents_activity.xml
index aecdd047..aecdd047 100644
--- a/res/layout/recents_activity.xml
+++ b/app/res/layout/recents_activity.xml
diff --git a/res/layout/tap_for_more_text.xml b/app/res/layout/tap_for_more_text.xml
index e02ef817..e02ef817 100644
--- a/res/layout/tap_for_more_text.xml
+++ b/app/res/layout/tap_for_more_text.xml
diff --git a/res/layout/text_block.xml b/app/res/layout/text_block.xml
index b4bf141b..b4bf141b 100644
--- a/res/layout/text_block.xml
+++ b/app/res/layout/text_block.xml
diff --git a/app/res/values-af/strings.xml b/app/res/values-af/strings.xml
new file mode 100644
index 00000000..026c73cd
--- /dev/null
+++ b/app/res/values-af/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Motorlanseerder"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Tik op kaart vir meer inligting"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Tik op kaart om te begin"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Oproep aan die gang"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Bel tans …"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Begin Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Kan nie Android Auto begin nie. Geen aktiwiteit gevind nie."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# toestel}other{# toestelle}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Weer"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° meestal sonnig"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Bergaansig • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Geen onlangse items nie"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Vee alles uit"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"App is nie beskikbaar nie"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Kalmmodus"</string>
+</resources>
diff --git a/app/res/values-am/strings.xml b/app/res/values-am/strings.xml
new file mode 100644
index 00000000..6b1b6c18
--- /dev/null
+++ b/app/res/values-am/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"የመኪና ማስጀመሪያ"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"ለተጨማሪ መረጃ ካርድን መታ ያድርጉ"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"ለማስጀመር ካርድን መታ ያድርጉ"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"እየተካሄደ ያለ ጥሪ"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"በመደወል ላይ…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto አስጀምር"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto ማስጀመር አልተቻለም። ምንም እንቅስቃሴ አልተገኘም።"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# መሣሪያ}one{# መሣሪያ}other{# መሣሪያዎች}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"የአየር ሁኔታ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° በአብዛኛው ፀሐያማ"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"የተራራ ዕይታ • ከ፦ --° ዝ፦ --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"ምንም የቅርብ ጊዜ ንጥሎች የሉም"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"ሁሉንም አጽዳ"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"መተግበሪያ አይገኝም"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"የእርጋታ ሁነታ"</string>
+</resources>
diff --git a/app/res/values-ar/strings.xml b/app/res/values-ar/strings.xml
new file mode 100644
index 00000000..345de0d7
--- /dev/null
+++ b/app/res/values-ar/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"مشغّل تطبيقات السيارة"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"انقر على البطاقة للحصول على مزيد من المعلومات."</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"انقر على البطاقة لتشغيل Android Auto."</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"مكالمة جارية"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"جارٍ طلب الرقم…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"تشغيل Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"يتعذّر تشغيل Android Auto. لم يتم العثور على أي أنشطة."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{جهاز واحد}zero{# جهاز}two{جهازان}few{# أجهزة}many{# جهازًا}other{# جهاز}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"الطقس"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° مشمس في أغلب الأوقات"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"مدينة القاهرة • درجة الحرارة الأعلى: --° الأدنى: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"ما مِن عناصر تم استخدامها مؤخرًا"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"محو الكل"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"التطبيق غير متاح."</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"وضع الهدوء"</string>
+</resources>
diff --git a/app/res/values-as/strings.xml b/app/res/values-as/strings.xml
new file mode 100644
index 00000000..23500ec7
--- /dev/null
+++ b/app/res/values-as/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"গাড়ী লঞ্চাৰ"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"অধিক তথ্যৰ বাবে কাৰ্ডত টিপক"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"লঞ্চ কৰিবলৈ কাৰ্ডত টিপক"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"চলি থকা কল"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ডায়েল কৰি থকা হৈছে…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto লঞ্চ কৰক"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto লঞ্চ কৰিব পৰা নগ’ল। কোনো কাৰ্যকলাপ পোৱা নগ’ল।"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# টা ডিভাইচ}one{# টা ডিভাইচ}other{# টা ডিভাইচ}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"বতৰ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° অধিক সময় ৰৌদ্ৰোজ্জ্বল"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"মাউণ্টেইন ভিউ • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"কোনো শেহতীয়া বস্তু নাই"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"আটাইবোৰ মচক"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"এপ্‌টো উপলব্ধ নহয়"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"শান্ত ম’ড"</string>
+</resources>
diff --git a/app/res/values-az/strings.xml b/app/res/values-az/strings.xml
new file mode 100644
index 00000000..130ebd6f
--- /dev/null
+++ b/app/res/values-az/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Avtomobil başladıcısı"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Ətraflı məlumat üçün karta toxunun"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Başlatmaq üçün karta toxunun"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Davam edən zəng"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Nömrə yığılır…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto-nu başladın"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto-nu başlatmaq mümkün deyil. Fəaliyyət tapılmadı."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# cihaz}other{# cihaz}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Hava"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Əsasən günəşli"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Dağ Görünüşü • Maks.: --° Min.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Son element yoxdur"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Hamısını silin"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Tətbiq əlçatan deyil"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Sakit rejim"</string>
+</resources>
diff --git a/app/res/values-b+sr+Latn/strings.xml b/app/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 00000000..20611121
--- /dev/null
+++ b/app/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Pokretač za automobile"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Dodirnite karticu za više informacija"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Dodirnite karticu da biste pokrenuli uslugu"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Poziv je u toku"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Poziva se…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Pokreni Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Pokretanje usluge Android Auto nije uspelo. Nije pronađena nijedna aktivnost."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# uređaj}one{# uređaj}few{# uređaja}other{# uređaja}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Vreme"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° uglavnom sunčano"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Novi Sad • Najviša: --° Najniža: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nema nedavnih stavki"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Obriši sve"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplikacija nije dostupna"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Režim opuštanja"</string>
+</resources>
diff --git a/app/res/values-be/strings.xml b/app/res/values-be/strings.xml
new file mode 100644
index 00000000..2e6f4dad
--- /dev/null
+++ b/app/res/values-be/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Праграма запуску для аўтамабіля"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Націсніце на картку, каб атрымаць дадатковую інфармацыю"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Націсніце на картку, каб выканаць запуск"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Бягучы выклік"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Ідзе набор нумара…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Запусціць Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Не ўдалося запусціць Android Auto. Дзеянні не знойдзены."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# прылада}one{# прылада}few{# прылады}many{# прылад}other{# прылады}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Надвор\'е"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--°, пераважна сонечна"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Маўтын-В\'ю • макс.: --°, мін.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Няма нядаўніх элементаў"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Ачысціць усё"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Праграма недаступная"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Рэжым спакою"</string>
+</resources>
diff --git a/app/res/values-bg/strings.xml b/app/res/values-bg/strings.xml
new file mode 100644
index 00000000..8425793d
--- /dev/null
+++ b/app/res/values-bg/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Стартов панел на автомобила"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Докоснете картата за още информация"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Докоснете картата за стартиране"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Текущо обаждане"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Набиране…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Стартиране на Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto не може да се стартира. Няма намерена активност."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# устройство}other{# устройства}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Времето"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Предимно слънчево"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Макс: --° Мин: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Няма скорошни елементи"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Изчистване на всичко"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Приложението не е налично"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Режим на покой"</string>
+</resources>
diff --git a/app/res/values-bn/strings.xml b/app/res/values-bn/strings.xml
new file mode 100644
index 00000000..d9b579ca
--- /dev/null
+++ b/app/res/values-bn/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"আরও তথ্যের জন্য \'কার্ড\' বিকল্পে ট্যাপ করুন"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"লঞ্চ করতে \'কার্ড\' বিকল্পে ট্যাপ করুন"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"চালু থাকা কল"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ডায়াল করা হচ্ছে…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto লঞ্চ করুন"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto লঞ্চ করা যায়নি। কোনও অ্যাক্টিভিটি পাওয়া যায়নি।"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{#টি ডিভাইস}one{#টি ডিভাইস}other{#টি ডিভাইস}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Weather"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° সাধারণত রৌদ্রোজ্জ্বল"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"পাহাড়ের দৃশ্য • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"কোনও সাম্প্রতিক আইটেম নেই"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"সব মুছে দিন"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"অ্যাপ উপলভ্য নেই"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"\'কাম\' মোড"</string>
+</resources>
diff --git a/app/res/values-bs/strings.xml b/app/res/values-bs/strings.xml
new file mode 100644
index 00000000..23c696f4
--- /dev/null
+++ b/app/res/values-bs/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Pokretač za automobil"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Dodirnite karticu za više informacija"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Dodirnite karticu da pokrenete"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Poziv u toku"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Biranje…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Pokrenite Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Nije moguće pokrenuti Android Auto. Nije pronađena nijedna aktivnost."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# uređaj}one{# uređaj}few{# uređaja}other{# uređaja}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Vrijeme"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Pretežno sunčano"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • V: --° N: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nema nedavnih stavki"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Obriši sve"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplikacija nije dostupna"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Način rada za opuštanje"</string>
+</resources>
diff --git a/app/res/values-ca/strings.xml b/app/res/values-ca/strings.xml
new file mode 100644
index 00000000..e2d8eec9
--- /dev/null
+++ b/app/res/values-ca/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Menú d\'aplicacions del cotxe"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Toca la targeta per veure més informació"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Toca la targeta per iniciar"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Trucada en curs"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"S\'està marcant…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Inicia Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"No es pot iniciar Android Auto. No s\'ha trobat cap activitat."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# dispositiu}other{# dispositius}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Temps"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Principalment assolellat"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Màx.: --° Mín.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"No hi ha cap element recent"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Esborra-ho tot"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"L\'aplicació no està disponible"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Mode de calma"</string>
+</resources>
diff --git a/app/res/values-cs/strings.xml b/app/res/values-cs/strings.xml
new file mode 100644
index 00000000..8fd05bd6
--- /dev/null
+++ b/app/res/values-cs/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Spouštěč v autě"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Klepnutím na kartu zobrazíte další informace"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Klepnutím na kartu spustíte"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Probíhající hovor"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Vytáčení…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Spustit Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto se nepodařilo spustit. Nebyla nalezena žádná aktivita."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# zařízení}few{# zařízení}many{# zařízení}other{# zařízení}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Počasí"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Většinou slunečno"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Nejvyšší: --° Nejnižší: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Žádné nedávné položky"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Vymazat vše"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplikace není k dispozici"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Klidný režim"</string>
+</resources>
diff --git a/app/res/values-da/strings.xml b/app/res/values-da/strings.xml
new file mode 100644
index 00000000..f17d3fa9
--- /dev/null
+++ b/app/res/values-da/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Tryk på kortet for at få flere oplysninger"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Tryk på kortet for at starte"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Igangværende opkald"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Ringer op…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Start Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto kunne ikke startes. Der blev ikke fundet nogen aktivitet."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# enhed}one{# enhed}other{# enheder}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Vejr"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"-- ° overvejende solskin"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • H: -- ° L: -- °"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Ingen nye elementer"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Ryd alt"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Appen er ikke tilgængelig"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Beroligende tilstand"</string>
+</resources>
diff --git a/app/res/values-de/strings.xml b/app/res/values-de/strings.xml
new file mode 100644
index 00000000..ef60b012
--- /dev/null
+++ b/app/res/values-de/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Auto-Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Für weitere Informationen auf die Karte tippen"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Zum Starten auf die Karte tippen"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Aktiver Anruf"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Rufaufbau…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto starten"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto kann nicht gestartet werden. Keine Aktivität gefunden."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# Gerät}other{# Geräte}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Wetter"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Größtenteils sonnig"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • H: --° T: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Keine kürzlich verwendeten Elemente"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Alles löschen"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"App nicht verfügbar"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Ruhemodus"</string>
+</resources>
diff --git a/app/res/values-el/strings.xml b/app/res/values-el/strings.xml
new file mode 100644
index 00000000..9c9bf066
--- /dev/null
+++ b/app/res/values-el/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Εφαρμογή εκκίνησης αυτοκινήτου"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Πατήστε την κάρτα για περισσότερες πληροφορίες"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Πατήστε την κάρτα για εκκίνηση"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Κλήση σε εξέλιξη"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Κλήση…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Εκκίνηση του Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Δεν είναι δυνατή η εκκίνηση τη εφαρμογής Android Auto. Δεν βρέθηκαν δραστηριότητες."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# συσκευή}other{# συσκευές}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Καιρός"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Κυρίως ηλιοφάνεια"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Υ: --° Χ: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Δεν υπάρχουν πρόσφατα στοιχεία"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Διαγραφή όλων"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Η εφαρμογή δεν είναι διαθέσιμη"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Λειτουργία ηρεμίας"</string>
+</resources>
diff --git a/app/res/values-en-rAU/strings.xml b/app/res/values-en-rAU/strings.xml
new file mode 100644
index 00000000..9c42c4d2
--- /dev/null
+++ b/app/res/values-en-rAU/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Tap card for more info"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Tap card to launch"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Ongoing call"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Dialling…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Launch Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Unable to launch Android Auto. No activity found."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# device}other{# devices}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Weather"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"–° Mostly sunny"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • H: –° L: –°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"No recent items"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Clear all"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"App isn\'t available"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Calm mode"</string>
+</resources>
diff --git a/app/res/values-en-rCA/strings.xml b/app/res/values-en-rCA/strings.xml
new file mode 100644
index 00000000..a62433b6
--- /dev/null
+++ b/app/res/values-en-rCA/strings.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_title (1056886619192068947) -->
+ <skip />
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <!-- no translation found for tap_for_more_info_text (4240146824238692769) -->
+ <skip />
+ <!-- no translation found for tap_to_launch_text (7150379866796152196) -->
+ <skip />
+ <!-- no translation found for ongoing_call_duration_text_separator (2140398350095052096) -->
+ <skip />
+ <!-- no translation found for ongoing_call_text (7160701768924041827) -->
+ <skip />
+ <!-- no translation found for dialing_call_text (3286036311692512894) -->
+ <skip />
+ <!-- no translation found for projected_launch_text (5034079820478748609) -->
+ <skip />
+ <!-- no translation found for projected_onclick_launch_error_toast_text (8853804785626030351) -->
+ <skip />
+ <!-- no translation found for projection_devices (2556503818120676439) -->
+ <skip />
+ <!-- no translation found for weather_app_name (4356705068077942048) -->
+ <skip />
+ <!-- no translation found for fake_weather_main_text (2545755284647327839) -->
+ <skip />
+ <!-- no translation found for fake_weather_footer_text (8640814250285014485) -->
+ <skip />
+ <!-- no translation found for times_separator (1962841895013564645) -->
+ <skip />
+ <!-- no translation found for recents_empty_state_text (8228569970506899117) -->
+ <skip />
+ <!-- no translation found for recents_clear_all_text (3594272268167720553) -->
+ <skip />
+ <!-- no translation found for failure_opening_recent_task_message (963567570097465902) -->
+ <skip />
+ <!-- no translation found for calm_mode_title (4364804976931157567) -->
+ <skip />
+</resources>
diff --git a/app/res/values-en-rGB/strings.xml b/app/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000..9c42c4d2
--- /dev/null
+++ b/app/res/values-en-rGB/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Tap card for more info"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Tap card to launch"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Ongoing call"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Dialling…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Launch Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Unable to launch Android Auto. No activity found."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# device}other{# devices}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Weather"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"–° Mostly sunny"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • H: –° L: –°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"No recent items"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Clear all"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"App isn\'t available"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Calm mode"</string>
+</resources>
diff --git a/app/res/values-en-rIN/strings.xml b/app/res/values-en-rIN/strings.xml
new file mode 100644
index 00000000..9c42c4d2
--- /dev/null
+++ b/app/res/values-en-rIN/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Tap card for more info"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Tap card to launch"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Ongoing call"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Dialling…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Launch Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Unable to launch Android Auto. No activity found."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# device}other{# devices}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Weather"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"–° Mostly sunny"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • H: –° L: –°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"No recent items"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Clear all"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"App isn\'t available"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Calm mode"</string>
+</resources>
diff --git a/app/res/values-en-rXC/strings.xml b/app/res/values-en-rXC/strings.xml
new file mode 100644
index 00000000..3a23f197
--- /dev/null
+++ b/app/res/values-en-rXC/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎Car Launcher‎‏‎‎‏‎"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎Tap card for more info‎‏‎‎‏‎"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎Tap card to launch‎‏‎‎‏‎"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎ • ‎‏‎‎‏‎"</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎Ongoing call‎‏‎‎‏‎"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‏‏‎‎Dialing…‎‏‎‎‏‎"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‏‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‎‎‎‎‏‎Launch Android Auto‎‏‎‎‏‎"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎Unable to launch Android Auto. No activity found.‎‏‎‎‏‎"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‎# device‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‎# devices‎‏‎‎‏‎}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎‎‏‎‎‎‎‎‎Weather‎‏‎‎‏‎"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎--° Mostly sunny‎‏‎‎‏‎"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‏‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‎‏‎Mountain View • H: --° L: --°‎‏‎‎‏‎"</string>
+ <string name="times_separator" msgid="1962841895013564645">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‏‎‎‎‏‎‎‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‎‏‎/‎‏‎‎‏‎"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‏‏‎‎‏‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎No recent items‎‏‎‎‏‎"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‏‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎Clear All‎‏‎‎‏‎"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‎‏‏‏‎‎App isn\'t available‎‏‎‎‏‎"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‎‎‎‏‏‏‏‏‏‎Calm mode‎‏‎‎‏‎"</string>
+</resources>
diff --git a/app/res/values-es-rUS/strings.xml b/app/res/values-es-rUS/strings.xml
new file mode 100644
index 00000000..bc3a90dd
--- /dev/null
+++ b/app/res/values-es-rUS/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Selector para vehículos"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Presiona la tarjeta para obtener más información"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Presiona la tarjeta para iniciar"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Llamada en curso"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Marcando…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Iniciar Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"No se puede iniciar Android Auto. No se encontró ninguna actividad."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Clima"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Mayormente soleado"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • M: --° M: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"No hay elementos recientes"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Borrar todo"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"La app no está disponible"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Modo calma"</string>
+</resources>
diff --git a/app/res/values-es/strings.xml b/app/res/values-es/strings.xml
new file mode 100644
index 00000000..961c95b9
--- /dev/null
+++ b/app/res/values-es/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Menú de aplicaciones del coche"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Toca la tarjeta para ver más información"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Toca la tarjeta para iniciar la aplicación"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Llamada en curso"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Marcando…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Iniciar Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"No se ha podido iniciar Android Auto. No se ha encontrado actividad."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Tiempo"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--°, mayormente soleado"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Máx.: --° Mín.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"No hay elementos recientes"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Borrar todo"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"La aplicación no está disponible"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Modo Calma"</string>
+</resources>
diff --git a/app/res/values-et/strings.xml b/app/res/values-et/strings.xml
new file mode 100644
index 00000000..db6e3e66
--- /dev/null
+++ b/app/res/values-et/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Auto käivitusprogramm"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Lisateabe saamiseks puudutage kaarti"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Käivitamiseks puudutage kaarti"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Käimasolev kõne"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Valimine …"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto käivitamine"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Autot ei õnnestu käivitada. Ühtegi tegevust ei leitud."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# seade}other{# seadet}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Ilm"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° – enamasti päikeseline"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • K: --° M: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Hiljutisi üksusi pole"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Kustuta kõik"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Rakendus ei ole saadaval"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Lõõgastusrežiim"</string>
+</resources>
diff --git a/app/res/values-eu/strings.xml b/app/res/values-eu/strings.xml
new file mode 100644
index 00000000..c53b647b
--- /dev/null
+++ b/app/res/values-eu/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Autoa exekutatzeko tresna"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Informazio gehiago lortzeko, sakatu txartela"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Exekutatzeko, sakatu txartela"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Dei bat abian da"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Markatzen…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Exekutatu Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Ezin da exekutatu Android Auto. Ez da jarduerarik aurkitu."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# gailu}other{# gailu}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Eguraldia"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"-- ° (gehienbat eguzkitsu)"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Altuena: -- ° Baxuena: -- °"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Ez dago azkenaldiko elementurik"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Garbitu guztia"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Ez dago erabilgarri aplikazioa"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Modu lasaia"</string>
+</resources>
diff --git a/app/res/values-fa/strings.xml b/app/res/values-fa/strings.xml
new file mode 100644
index 00000000..c4ceec83
--- /dev/null
+++ b/app/res/values-fa/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"راه‌انداز خودرو"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"برای اطلاعات بیشتر، روی کارت ضربه بزنید"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"برای راه‌اندازی، روی کارت ضربه بزنید"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"تماس درحال انجام"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"درحال شماره‌گیری…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"راه‌اندازی Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto راه‌اندازی نشد. فعالیتی پیدا نشد."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# دستگاه}one{# دستگاه}other{# دستگاه}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"وضعیت آب‌وهوا"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° بیشتر آفتابی"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"مانتین ویو • بیشینه: --° کمینه: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"مورد جدیدی وجود ندارد"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"پاک کردن همه"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"برنامه دردسترس نیست"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"حالت آرام"</string>
+</resources>
diff --git a/app/res/values-fi/strings.xml b/app/res/values-fi/strings.xml
new file mode 100644
index 00000000..8d31ddc0
--- /dev/null
+++ b/app/res/values-fi/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Auton käynnistysohjelma"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Katso lisätietoja napauttamalla korttia"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Käynnistä napauttamalla korttia"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Käynnissä oleva puhelu"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Soitetaan…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Käynnistä Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Autoa ei voi käynnistää. Tapahtumia ei löytynyt."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# laite}other{# laitetta}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Sää"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Enimmäkseen aurinkoista"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Maks.: --° Min.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Ei viimeaikaisia kohteita"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Tyhjennä kaikki"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Sovellus ei ole käytettävissä"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Rauhallinen tila"</string>
+</resources>
diff --git a/app/res/values-fr-rCA/strings.xml b/app/res/values-fr-rCA/strings.xml
new file mode 100644
index 00000000..e638bd1b
--- /dev/null
+++ b/app/res/values-fr-rCA/strings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Lanceur d\'applications pour la voiture"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Touchez la carte pour en savoir plus"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Touchez la carte pour lancer"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Appel en cours…"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Composition en cours…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Lancez Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Impossible de lancer Android Auto. Aucune activité trouvée."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# appareil}one{# appareil}other{# appareils}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Météo"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° et principalement ensoleillé"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Max. : --°, Min. : --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Aucun élément récent"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Tout effacer"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"L\'application n\'est pas accessible"</string>
+ <!-- no translation found for calm_mode_title (4364804976931157567) -->
+ <skip />
+</resources>
diff --git a/app/res/values-fr/strings.xml b/app/res/values-fr/strings.xml
new file mode 100644
index 00000000..8573c016
--- /dev/null
+++ b/app/res/values-fr/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Appuyer sur la carte pour en savoir plus"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Appuyer sur la carte pour effectuer le lancement"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Appel en cours"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Appel…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Lancez Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Impossible de lancer Android Auto. Aucune activité trouvée."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# appareil}one{# appareil}other{# appareils}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Météo"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"-- ° Ensoleillé dans l\'ensemble"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Max. : -- ° - Min. : -- °"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Aucun élément récent"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Tout effacer"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Appli indisponible"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Mode calme"</string>
+</resources>
diff --git a/app/res/values-gl/strings.xml b/app/res/values-gl/strings.xml
new file mode 100644
index 00000000..b5815696
--- /dev/null
+++ b/app/res/values-gl/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Launcher do coche"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Toca a tarxeta para obter máis información"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Toca a tarxeta para iniciar"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Chamada en curso"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Marcando…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Iniciar Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Non se puido iniciar Android Auto. Non se atopou ningunha actividade."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"O tempo"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--°, principalmente solleiro"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Máxima: --°; mínima: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Non hai ningún elemento recente"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Borrar todo"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"A aplicación non está dispoñible"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Modo de calma"</string>
+</resources>
diff --git a/app/res/values-gu/strings.xml b/app/res/values-gu/strings.xml
new file mode 100644
index 00000000..ff9c5b71
--- /dev/null
+++ b/app/res/values-gu/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"કાર લૉન્ચર"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"વધુ માહિતી માટે કાર્ડ પર ટૅપ કરો"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"લૉન્ચ કરવા માટે કાર્ડ પર ટૅપ કરો"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"ચાલી રહેલો કૉલ"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ડાયલ કરી રહ્યાં છીએ…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto સુવિધા લૉન્ચ કરો"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto સુવિધા લૉન્ચ કરી શકાતી નથી. કોઈ પ્રવૃત્તિ મળી નથી."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# ડિવાઇસ}one{# ડિવાઇસ}other{# ડિવાઇસ}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"હવામાન"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° મોટેભાગે તડકો"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • મહત્તમ: --° ન્યૂનતમ: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"તાજેતરની કોઈ આઇટમ નથી"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"બધું સાફ કરો"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"ઍપ ઉપલબ્ધ નથી"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"શાંત મોડ"</string>
+</resources>
diff --git a/app/res/values-hi/strings.xml b/app/res/values-hi/strings.xml
new file mode 100644
index 00000000..bbc3ee22
--- /dev/null
+++ b/app/res/values-hi/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"ज़्यादा जानकारी के लिए कार्ड पर टैप करें"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"लॉन्च करने के लिए कार्ड पर टैप करें"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"कॉल पहले से चल रहा है"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"डायल किया जा रहा है…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto की सुविधा लॉन्च करें"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto की सुविधा लॉन्च नहीं की जा सकी. कोई गतिविधि नहीं मिली."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# डिवाइस}one{# डिवाइस}other{# डिवाइस}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"मौसम"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° ज़्यादातर समय धूप रहेगी"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"माउंटेन व्यू • अधिकतम तापमान: --° न्यूनतम तापमान: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"हाल ही का कोई आइटम मौजूद नहीं है"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"सभी मिटाएं"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"ऐप्लिकेशन उपलब्ध नहीं है"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"काम (शांत) मोड"</string>
+</resources>
diff --git a/app/res/values-hr/strings.xml b/app/res/values-hr/strings.xml
new file mode 100644
index 00000000..1c33dff4
--- /dev/null
+++ b/app/res/values-hr/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Pokretač za automobil"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Dodirnite karticu za više informacija"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Dodirnite karticu za pokretanje"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Poziv u tijeku"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Biranje broja…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Pokrenite Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Pokretanje Android Auta nije uspjelo. Nije pronađena nijedna aktivnost."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# uređaj}one{# uređaj}few{# uređaja}other{# uređaja}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Vrijeme"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° uglavnom sunčano"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • V: --° N: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nema nedavnih stavki"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Izbriši sve"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplikacija nije dostupna"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Način opuštanja"</string>
+</resources>
diff --git a/app/res/values-hu/strings.xml b/app/res/values-hu/strings.xml
new file mode 100644
index 00000000..4c08fa71
--- /dev/null
+++ b/app/res/values-hu/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Autóindító"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"További információért koppintson a kártyára."</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Az indításhoz koppintson a kártyára"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Hívás folyamatban"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Tárcsázás…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto indítása"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Az Android Auto indítása nem sikerült. Nem található tevékenység."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# eszköz}other{# eszköz}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Időjárás"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Túlnyomóan napos"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Max.: --° Min.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nincsenek mostanában használt elemek"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Összes törlése"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Az alkalmazás nem áll rendelkezésre"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Nyugalom mód"</string>
+</resources>
diff --git a/app/res/values-hy/strings.xml b/app/res/values-hy/strings.xml
new file mode 100644
index 00000000..906fb6bf
--- /dev/null
+++ b/app/res/values-hy/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Մեքենայի գործարկիչ"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Հպեք քարտին՝ ավելին իմանալու համար"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Հպեք քարտին՝ գործարկելու համար"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Ընթացիկ զանգ"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Համարի հավաքում…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Գործարկել Android Auto-ն"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Չհաջողվեց գործարկել Android Auto-ն։ Ոչ մի գործողություն չի գտնվել։"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# սարք}one{# սարք}other{# սարք}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Եղանակ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Հիմնականում արևոտ"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Մաունթին Վյու • Առավ.՝ --° Նվազ.՝ --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Նոր տարրեր չկան"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Ջնջել բոլորը"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Հավելվածը հասանելի չէ"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Հանգստի ռեժիմ"</string>
+</resources>
diff --git a/app/res/values-in/strings.xml b/app/res/values-in/strings.xml
new file mode 100644
index 00000000..ab9c4913
--- /dev/null
+++ b/app/res/values-in/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Peluncur untuk Mobil"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Ketuk kartu untuk info selengkapnya"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Ketuk kartu untuk meluncurkan"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Panggilan sedang berlangsung"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Memanggil…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Luncurkan Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Tidak dapat meluncurkan Android Auto. Tidak ditemukan aktivitas."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# perangkat}other{# perangkat}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Cuaca"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Sebagian besar cerah"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Suhu tertinggi: --° Suhu terendah: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Tidak ada item baru"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Hapus Semua"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplikasi tidak tersedia"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Mode tenang"</string>
+</resources>
diff --git a/app/res/values-is/strings.xml b/app/res/values-is/strings.xml
new file mode 100644
index 00000000..3362bd4a
--- /dev/null
+++ b/app/res/values-is/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Ræsiforrit bíls"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Ýttu á spjaldið til að fá meiri upplýsingar"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Ýttu á spjaldið til að ræsa"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Símtal í gangi"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Hringir…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Ræsa Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Ekki er hægt að ræsa Android Auto. Engin virkni fannst."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# tæki}one{# tæki}other{# tæki}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Veður"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Sólskin að mestu"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Fjallasýn • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Engin nýleg atriði"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Hreinsa allt"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Forritið er ekki í boði"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Róleg stilling"</string>
+</resources>
diff --git a/app/res/values-it/strings.xml b/app/res/values-it/strings.xml
new file mode 100644
index 00000000..15b98905
--- /dev/null
+++ b/app/res/values-it/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Avvio app dell\'auto"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Tocca la scheda per avere ulteriori informazioni"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Tocca la scheda per avviare"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Chiamata in corso"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Chiamata in corso…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Avvia Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Impossibile avviare Android Auto. Non è stata trovata alcuna attività."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# dispositivo}other{# dispositivi}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Meteo"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--°, prevalentemente soleggiato"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Max: --° Min: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nessun elemento recente"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Cancella tutto"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"App non disponibile"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Modalità Calma"</string>
+</resources>
diff --git a/app/res/values-iw/strings.xml b/app/res/values-iw/strings.xml
new file mode 100644
index 00000000..050d1870
--- /dev/null
+++ b/app/res/values-iw/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"מרכז האפליקציות ברכב"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"יש להקיש על הכרטיס למידע נוסף"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"יש להקיש על הכרטיס כדי להפעיל"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"שיחה פעילה"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"מתבצע חיוג…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"הפעלה של Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"לא ניתן להפעיל את Android Auto. לא נמצאה פעילות."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{מכשיר אחד (#)}one{# מכשירים}two{# מכשירים}other{# מכשירים}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"מזג אוויר"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"°-- בהיר ברוב שעות היום"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"תל אביב • מקס\': °-- מינ\': °--"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"אין פריטים מהזמן האחרון"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"ניקוי הכול"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"האפליקציה לא זמינה"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"מצב רגיעה"</string>
+</resources>
diff --git a/app/res/values-ja/strings.xml b/app/res/values-ja/strings.xml
new file mode 100644
index 00000000..ce968b5e
--- /dev/null
+++ b/app/res/values-ja/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"車用ランチャー"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"カードをタップして詳細を確認"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"カードをタップして起動"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"通話中"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"発信中…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto の起動"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto を起動できません。アクティビティが見つかりません。"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# 台のデバイス}other{# 台のデバイス}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"天気情報"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° 晴れ"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"最近のアイテムはありません"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"すべて消去"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"このアプリは使用できません"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Calm モード"</string>
+</resources>
diff --git a/app/res/values-ka/strings.xml b/app/res/values-ka/strings.xml
new file mode 100644
index 00000000..9920b173
--- /dev/null
+++ b/app/res/values-ka/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"მანქანის გამშვები"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"შეეხეთ ბარათს მეტი ინფორმაციისთვის"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"შეეხეთ ბარათს გასაშვებად"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"მიმდინარე ზარი"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"მიმდინარეობს აკრეფა…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"გაუშვით Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto-ს გაშვება შეუძლებელია. აქტივობა ვერ მოიძებნა."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# მოწყობილობა}other{# მოწყობილობა}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"ამინდი"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° უმეტესად მზიანი"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"მთების ხედი • მაქს.: --° მინ.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"ბოლოდროინდელი ერთეულები არ არის"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"ყველას გასუფთავება"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"აპი მიუწვდომელია"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"წყნარი რეჟიმი"</string>
+</resources>
diff --git a/app/res/values-kk/strings.xml b/app/res/values-kk/strings.xml
new file mode 100644
index 00000000..fe1b8d98
--- /dev/null
+++ b/app/res/values-kk/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Толық ақпарат алу үшін картаны түртіңіз."</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Іске қосу үшін картаны түртіңіз."</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Жүріп жатқан қоңырау"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Теріліп жатыр…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto функциясын іске қосу"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto функциясы іске қосылмады. Ешқандай әрекет табылмады."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# құрылғы}other{# құрылғы}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Ауа райы"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° көбіне күн ашық"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Cоңғы қосылған элемент жоқ."</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Барлығын өшіру"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Қолданба қолжетімді емес."</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Тыныштық режимі"</string>
+</resources>
diff --git a/app/res/values-km/strings.xml b/app/res/values-km/strings.xml
new file mode 100644
index 00000000..0ca0780d
--- /dev/null
+++ b/app/res/values-km/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"កម្មវិធី​ចាប់ផ្ដើមសម្រាប់រថយន្ត"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"ចុចកាត ដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"ចុចកាត ដើម្បីចាប់ផ្ដើម"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"កំពុង​បន្ត​ការ​ហៅ"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"កំពុងហៅ…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"បើកដំណើរការ Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"មិនអាចបើកដំណើរការ Android Auto បានទេ។ រកមិនឃើញសកម្មភាពទេ។"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{ឧបករណ៍ #}other{ឧបករណ៍ #}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"អាកាសធាតុ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° ភាគច្រើន​បើកថ្ងៃ"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"ទិដ្ឋភាពភ្នំ • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"មិនមានធាតុថ្មីៗទេ"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"សម្អាតទាំងអស់"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"មិន​មាន​កម្មវិធី"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"មុខងារស្ងាត់"</string>
+</resources>
diff --git a/app/res/values-kn/strings.xml b/app/res/values-kn/strings.xml
new file mode 100644
index 00000000..2d42f2fd
--- /dev/null
+++ b/app/res/values-kn/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"ಕಾರ್ ಲಾಂಚರ್"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಕಾರ್ಡ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"ಪ್ರಾರಂಭಿಸಲು ಕಾರ್ಡ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ಡಯಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto ಪ್ರಾರಂಭಿಸಿ"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto ಪ್ರಾರಂಭಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಯಾವುದೇ ಚಟುವಟಿಕೆ ಕಂಡುಬಂದಿಲ್ಲ."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# ಸಾಧನ}one{# ಸಾಧನಗಳು}other{# ಸಾಧನಗಳು}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"ಹವಾಮಾನ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° ಬಹುತೇಕ ಬಿಸಿಲಿನ ವಾತಾವರಣ"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"ಮೌಂಟೇನ್ ವ್ಯೂ • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"ಎಲ್ಲವನ್ನೂ ಅಳಿಸಿ"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"ಆ್ಯಪ್ ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"ಶಾಂತ ಮೋಡ್"</string>
+</resources>
diff --git a/app/res/values-ko/strings.xml b/app/res/values-ko/strings.xml
new file mode 100644
index 00000000..b85a2628
--- /dev/null
+++ b/app/res/values-ko/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"차량 런처"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"자세히 보려면 카드를 탭하세요."</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"시작하려면 카드를 탭하세요."</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"진행 중인 통화"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"전화 거는 중…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto 시작"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto를 시작할 수 없습니다. 활동이 없습니다."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{기기 #대}other{기기 #대}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"날씨"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° 대체로 맑음"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"마운틴 뷰 • 최고: --° 최저: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"최근 항목이 없습니다."</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"모두 지우기"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"앱을 사용할 수 없음"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"고요 모드"</string>
+</resources>
diff --git a/app/res/values-ky/strings.xml b/app/res/values-ky/strings.xml
new file mode 100644
index 00000000..5ff6cb17
--- /dev/null
+++ b/app/res/values-ky/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Автоунааны жүргүзгүч"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Кеңири маалымат алуу үчүн картаны таптап коюңуз"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Иштетүү үчүн картаны таптап коюңуз"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Учурдагы чалуу"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Терилүүдө…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto\'ну ишке киргизүү"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto иштетилген жок. Аракеттер табылган жок."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# түзмөк}other{# түзмөк}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Аба ырайы"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Көбүнесе күн чайыттай ачык болот"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Маунтин-Вью • Ж: --° Т: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Жакында колдонулган нерселер жок"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Баарын тазалоо"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Колдонмо жеткиликтүү эмес"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Тынчтык режими"</string>
+</resources>
diff --git a/res/values-land/dimens.xml b/app/res/values-land/dimens.xml
index 3840a4a7..3840a4a7 100644
--- a/res/values-land/dimens.xml
+++ b/app/res/values-land/dimens.xml
diff --git a/app/res/values-lo/strings.xml b/app/res/values-lo/strings.xml
new file mode 100644
index 00000000..6cd80499
--- /dev/null
+++ b/app/res/values-lo/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"ລັນເຊີລົດ"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"ແຕະບັດເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"ແຕະບັດເພື່ອເປີດໃຊ້"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"ສາຍທີ່ສົນທະນາຢູ່"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ກຳລັງໂທອອກ…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"ເປີດໃຊ້ Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"ບໍ່ສາມາດເປີດໃຊ້ Android Auto ໄດ້. ບໍ່ພົບການເຄື່ອນໄຫວ."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{ອຸປະກອນ # ເຄື່ອງ}other{ອຸປະກອນ # ເຄື່ອງ}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"ສະພາບອາກາດ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° ແດດກ້າເປັນສ່ວນໃຫຍ່"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"ວິວພູເຂົາ • ສູງສຸດ: --° ຕ່ຳສຸດ: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"ບໍ່ມີລາຍການຫຼ້າສຸດ"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"ລຶບລ້າງທັງໝົດ"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"ແອັບບໍ່ພ້ອມໃຫ້ນຳໃຊ້"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"ໂໝດສະຫງົບ"</string>
+</resources>
diff --git a/app/res/values-lt/strings.xml b/app/res/values-lt/strings.xml
new file mode 100644
index 00000000..1c0d051d
--- /dev/null
+++ b/app/res/values-lt/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Automobilio paleidimo priemonė"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Palieskite kortelę, kad sužinotumėte daugiau informacijos"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Palieskite kortelę, kad paleistumėte"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Vykstantis skambutis"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Renkamas numeris…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Paleisti „Android Auto“"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Nepavyko paleisti „Android Auto“. Nerasta jokios veiklos."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# įrenginys}one{# įrenginys}few{# įrenginiai}many{# įrenginio}other{# įrenginių}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Orai"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Daugiausia saulėta"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mauntin Vju • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nėra jokių naujausių elementų"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Išvalyti viską"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Programa nepasiekiama"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Ramybės režimas"</string>
+</resources>
diff --git a/app/res/values-lv/strings.xml b/app/res/values-lv/strings.xml
new file mode 100644
index 00000000..4d8b5393
--- /dev/null
+++ b/app/res/values-lv/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Automašīnas palaišanas programma"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Pieskarieties kartītei, lai iegūtu plašāku informāciju"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Pieskarieties kartītei, lai palaistu"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Pašreizējais zvans"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Notiek numura sastādīšana…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Palaist Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Nevar palaist Android Auto. Netika atrasta neviena darbība."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# ierīce}zero{# ierīču}one{# ierīce}other{# ierīces}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Laikapstākļi"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--°; galvenokārt saulains laiks"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mauntinvjū • Augstākā: --°; zemākā: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nav nesenu vienumu"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Notīrīt visu"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Lietotne nav pieejama"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Miera režīms"</string>
+</resources>
diff --git a/app/res/values-mk/strings.xml b/app/res/values-mk/strings.xml
new file mode 100644
index 00000000..a7f5d5cb
--- /dev/null
+++ b/app/res/values-mk/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Стартер на автомобил"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Допрете ја картичката за повеќе информации"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Допрете ја картичката за да се стартува"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Тековен повик"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Се бира…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Стартувајте ја Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Не може да се стартува Android Auto. Не е најдена активност."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# уред}one{# уред}other{# уреди}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Време"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"-- ° Претежно сончево"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Маунтин Вју • В: -- ° Н: -- °"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Нема неодамнешни ставки"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Избриши ги сите"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Апликацијата не е достапна"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Режим на мирување"</string>
+</resources>
diff --git a/app/res/values-ml/strings.xml b/app/res/values-ml/strings.xml
new file mode 100644
index 00000000..c65d5bbe
--- /dev/null
+++ b/app/res/values-ml/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"കാർ ലോഞ്ചർ"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"കൂടുതൽ വിവരങ്ങൾക്ക് കാർഡ് ടാപ്പ് ചെയ്യുക"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"ലോഞ്ച് ചെയ്യാൻ കാർഡ് ടാപ്പ് ചെയ്യുക"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"നടന്നുകൊണ്ടിരിക്കുന്ന കോൾ"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ഡയൽ ചെയ്യുന്നു…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto ലോഞ്ച് ചെയ്യുക"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto ലോഞ്ച് ചെയ്യാനാകുന്നില്ല. ആക്റ്റിവിറ്റിയൊന്നും കണ്ടെത്തിയില്ല."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# ഉപകരണം}other{# ഉപകരണങ്ങൾ}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"കാലാവസ്ഥ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° കൂടുതലും തെളിഞ്ഞ ആകാശം"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • കൂടിയത്: --° കുറഞ്ഞത്: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"എല്ലാം മായ്‌ക്കുക"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"ആപ്പ് ലഭ്യമല്ല"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"\'ശാന്തം\' മോഡ്"</string>
+</resources>
diff --git a/app/res/values-mn/strings.xml b/app/res/values-mn/strings.xml
new file mode 100644
index 00000000..7a0ec373
--- /dev/null
+++ b/app/res/values-mn/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Машины эхлүүлэгч"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Дэлгэрэнгүй мэдээлэл авах бол картыг товшино уу"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Эхлүүлэхийн тулд картыг товшино уу"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Үргэлжилж буй дуудлага"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Залгаж байна…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Аuto-г эхлүүлэх"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto-г эхлүүлэх боломжгүй. Ямар ч үйл ажиллагаа олдсонгүй."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# төхөөрөмж}other{# төхөөрөмж}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Цаг агаар"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Ихэвчлэн нартай"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Маунтин Вью • Дээд: --° Доод: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Ямар ч саяхны зүйл байхгүй"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Бүгдийг арилгах"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Апп боломжгүй байна"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Тайван горим"</string>
+</resources>
diff --git a/app/res/values-mr/strings.xml b/app/res/values-mr/strings.xml
new file mode 100644
index 00000000..dc2bce32
--- /dev/null
+++ b/app/res/values-mr/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"कार लाँचर"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"अधिक माहितीसाठी कार्डवर टॅप करा"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"लाँच करण्यासाठी कार्डवर टॅप करा"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"सुरू असलेला कॉल"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"डायल करत आहे…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto लाँच करा"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto लाँच करता आले नाही. कोणतीही अ‍ॅक्टिव्हिटी आढळली नाही."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# डिव्हाइस}other{# डिव्हाइस}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"हवामान"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° बहुतांशी सुर्यप्रकाशित"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"माउंटन व्ह्यू • कमाल: --° किमान: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"कोणतेही अलीकडील आयटम नाहीत"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"सर्व साफ करा"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"अ‍ॅप उपलब्ध नाही"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"शांत मोड"</string>
+</resources>
diff --git a/app/res/values-ms/strings.xml b/app/res/values-ms/strings.xml
new file mode 100644
index 00000000..fe432622
--- /dev/null
+++ b/app/res/values-ms/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Pelancar Kereta"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Ketik kad untuk mendapatkan maklumat lanjut"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Ketik kad untuk lancarkan"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Panggilan sedang berlangsung"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Mendail…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Lancarkan Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Tidak dapat melancarkan Android Auto. Tiada aktiviti ditemukan."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# peranti}other{# peranti}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Cuaca"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Sebahagian besarnya cerah"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Pemandangan Gunung • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Tiada item terbaharu"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Kosongkan Semua"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Apl tidak tersedia"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Mod Calm"</string>
+</resources>
diff --git a/app/res/values-my/strings.xml b/app/res/values-my/strings.xml
new file mode 100644
index 00000000..57b50051
--- /dev/null
+++ b/app/res/values-my/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"ကား Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"ပိုမိုသိရှိရန် ကတ်ကိုတို့ပါ"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"ဖွင့်ရန် ကတ်ကိုတို့ပါ"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"လက်ရှိခေါ်ဆိုမှု"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ခေါ်ဆိုနေသည်…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto ဖွင့်ရန်"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto ဖွင့်၍မရပါ။ လုပ်ဆောင်ချက် မတွေ့ပါ။"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{စက် # ခု}other{စက် # ခု}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"မိုးလေဝသ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° အများအားဖြင့် နေသာသည်"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"တောင်ပေါ်ရှုခင်း • မြင့်- --° နိမ့်- --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"မကြာသေးမီက သုံးထားသည်များ မရှိပါ"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"အားလုံးရှင်းရန်"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"အက်ပ် မရနိုင်ပါ"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"အငြိမ်မုဒ်"</string>
+</resources>
diff --git a/app/res/values-nb/strings.xml b/app/res/values-nb/strings.xml
new file mode 100644
index 00000000..e9f4b4a5
--- /dev/null
+++ b/app/res/values-nb/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Trykk på kortet for mer informasjon"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Trykk på kortet for å åpne det"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Pågående samtale"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Slår nummeret …"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Start Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Kan ikke starte Android Auto. Fant ingen aktiviteter."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# enhet}other{# enheter}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Været"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° For det meste sol"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Høyeste temp.: --° Laveste temp.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Ingen nylige elementer"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Fjern alt"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Appen er ikke tilgjengelig"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Roligmodus"</string>
+</resources>
diff --git a/app/res/values-ne/strings.xml b/app/res/values-ne/strings.xml
new file mode 100644
index 00000000..40539714
--- /dev/null
+++ b/app/res/values-ne/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"कार लन्चर"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"थप जानकारी प्राप्त गर्न कार्डमा ट्याप गर्नुहोस्"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"लन्च गर्न कार्डमा ट्याप गर्नुहोस्"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"जारी कल"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"डायल गरिँदै छ…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto लन्च गर्नुहोस्"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto लन्च गर्न सकिएन। कुनै गतिविधि भेट्टिएन।"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# डिभाइस}other{# वटा डिभाइस}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"मौसम"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° अधिकांश घमाइलो"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"माउन्टेन भ्यू • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"हालसालैको कुनै पनि सामग्री छैन"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"सबै सामग्री मेटाउनुहोस्"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"एप उपलब्ध छैन"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"शान्त मोड"</string>
+</resources>
diff --git a/app/res/values-nl/strings.xml b/app/res/values-nl/strings.xml
new file mode 100644
index 00000000..86a9cdbb
--- /dev/null
+++ b/app/res/values-nl/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Tik op de kaart voor meer informatie"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Tik op de kaart om te starten"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Actief gesprek"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Kiezen…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto starten"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Kan Android Auto niet starten. Geen activiteit gevonden."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# apparaat}other{# apparaten}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Weer"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"-- ° Grotendeels zonnig"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Max: -- ° Min: -- °"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Geen recente items"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Alles wissen"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"App is niet beschikbaar"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Kalme modus"</string>
+</resources>
diff --git a/app/res/values-or/strings.xml b/app/res/values-or/strings.xml
new file mode 100644
index 00000000..410bac80
--- /dev/null
+++ b/app/res/values-or/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"କାର ଲଞ୍ଚର"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"ଅଧିକ ସୂଚନା ପାଇଁ କାର୍ଡକୁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"ଲଞ୍ଚ କରିବା ପାଇଁ କାର୍ଡକୁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"ଚାଲିଥିବା କଲ୍"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ଡାଏଲ କରାଯାଉଛି…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Autoକୁ ଲଞ୍ଚ କରନ୍ତୁ"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Autoକୁ ଲଞ୍ଚ କରିବା ପାଇଁ ଅସମର୍ଥ। କୌଣସି କାର୍ଯ୍ୟକଳାପ ମିଳୁ ନାହିଁ।"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# ଡିଭାଇସ}other{# ଡିଭାଇସ}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Weather"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° ପ୍ରାୟତଃ ଖରା"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"ମାଉଣ୍ଟେନ ଭ୍ୟୁ • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ ନାହିଁ"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"ସବୁ ଖାଲି କରନ୍ତୁ"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"ଆପ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"ଶାନ୍ତ ମୋଡ"</string>
+</resources>
diff --git a/app/res/values-pa/strings.xml b/app/res/values-pa/strings.xml
new file mode 100644
index 00000000..1e52c852
--- /dev/null
+++ b/app/res/values-pa/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"ਕਾਰ ਲਾਂਚਰ"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਕਾਰਡ \'ਤੇ ਟੈਪ ਕਰੋ"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"ਲਾਂਚ ਕਰਨ ਲਈ ਕਾਰਡ \'ਤੇ ਟੈਪ ਕਰੋ"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"ਜਾਰੀ ਕਾਲ"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ਡਾਇਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto ਲਾਂਚ ਕਰੋ"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto ਨੂੰ ਲਾਂਚ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕੋਈ ਸਰਗਰਮੀ ਨਹੀਂ ਮਿਲੀ।"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# ਡੀਵਾਈਸ}one{# ਡੀਵਾਈਸ}other{# ਡੀਵਾਈਸ}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"ਮੌਸਮ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° ਜ਼ਿਆਦਾਤਰ ਧੁੱਪ"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"ਅੰਮ੍ਰਿਤਸਰ • ਉੱਚ: --° ਨਿਮਨ: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"ਕੋਈ ਹਾਲੀਆ ਆਈਟਮ ਨਹੀਂ"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"ਸ਼ਾਂਤ ਮੋਡ"</string>
+</resources>
diff --git a/app/res/values-pl/strings.xml b/app/res/values-pl/strings.xml
new file mode 100644
index 00000000..3fbe11a6
--- /dev/null
+++ b/app/res/values-pl/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Program uruchamiający w samochodzie"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Aby uzyskać więcej informacji, kliknij kartę"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Aby uruchomić, kliknij kartę"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Trwa rozmowa"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Wybieram numer…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Uruchom Androida Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Nie można uruchomić Androida Auto. Nie znaleziono żadnych działań."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# urządzenie}few{# urządzenia}many{# urządzeń}other{# urządzenia}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Pogoda"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--°, przeważnie słonecznie"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Maks.: --° Min.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Brak ostatnich elementów"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Wyczyść wszystko"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplikacja jest niedostępna"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Tryb cichy"</string>
+</resources>
diff --git a/app/res/values-pt-rPT/strings.xml b/app/res/values-pt-rPT/strings.xml
new file mode 100644
index 00000000..ff491a22
--- /dev/null
+++ b/app/res/values-pt-rPT/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Launcher do carro"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Toque no cartão para ver mais informações"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Toque no cartão para iniciar"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Chamada em curso"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"A marcar…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Iniciar Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Não é possível iniciar o Android Auto. Não foram encontradas atividades."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Tempo"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Céu maioritariamente limpo"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Máx.: --° Mín.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nenhum item recente"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Limpar tudo"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"A app não está disponível"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Modo Calm"</string>
+</resources>
diff --git a/app/res/values-pt/strings.xml b/app/res/values-pt/strings.xml
new file mode 100644
index 00000000..daa7dd97
--- /dev/null
+++ b/app/res/values-pt/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Tela de início do carro"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Toque no card para mais informações"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Toque no card para iniciar"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Chamada em andamento"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Chamando…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Inicie o Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Não foi possível iniciar o Android Auto. Nenhuma atividade foi encontrada."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# dispositivo}one{# dispositivo}other{# dispositivos}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Previsão do tempo"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Predominantemente ensolarado"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Mínima: --° Máxima: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nenhum item recente"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Limpar tudo"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"O app não está disponível"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Modo foco"</string>
+</resources>
diff --git a/app/res/values-ro/strings.xml b/app/res/values-ro/strings.xml
new file mode 100644
index 00000000..5d46cd87
--- /dev/null
+++ b/app/res/values-ro/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Lansator de aplicații pentru mașină"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Pentru mai multe informații, atinge cardul"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Pentru a lansa, atinge cardul"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">"•"</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Apel în desfășurare"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Se apelează…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Lansează Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Nu se poate lansa Android Auto. Nu a fost găsită nicio activitate."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# dispozitiv}few{# dispozitive}other{# de dispozitive}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Meteo"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° În mare parte însorit"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Max: --° Min: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Niciun element recent"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Șterge tot"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplicația nu este disponibilă"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Modul Calm"</string>
+</resources>
diff --git a/app/res/values-ru/strings.xml b/app/res/values-ru/strings.xml
new file mode 100644
index 00000000..33dc160a
--- /dev/null
+++ b/app/res/values-ru/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Панель запуска для автомобиля"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Нажмите на карточку, чтобы узнать больше."</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Нажмите на карточку, чтобы запустить."</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">"•"</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Текущий вызов"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Набор номера…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Запустить Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Не удается запустить Android Auto. Ничего не найдено."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# устройство}one{# устройство}few{# устройства}many{# устройств}other{# устройства}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Погода"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Преимущественно солнечно"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Москва • макс. --°, мин. --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Нет недавних объектов"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Очистить"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Приложение недоступно"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Режим покоя"</string>
+</resources>
diff --git a/app/res/values-si/strings.xml b/app/res/values-si/strings.xml
new file mode 100644
index 00000000..c18a55cb
--- /dev/null
+++ b/app/res/values-si/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"මෝටර් රථ දියත්කරණය"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"වැඩි විස්තර සඳහා කාඩ්පත තට්ටු කරන්න"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"දියත් කිරීමට කාඩ්පත තට්ටු කරන්න"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"කරගෙනය යන ඇමතුම"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"අමතමින්…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto දියත් කරන්න"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto දියත් කිරීමට නොහැකිය. ක්‍රියාකාරකම් නොමැත."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# උපාංගයක්}one{උපාංග #ක්}other{උපාංග #ක්}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"කාලගුණය"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° බොහෝ විට අව්ව"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"කඳුකර දර්ශනය • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"මෑත අයිතම නැත"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"සියල්ල හිස් කරන්න"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"යෙදුම නොතිබේ"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"සන්සුන් ප්‍රකාරය"</string>
+</resources>
diff --git a/app/res/values-sk/strings.xml b/app/res/values-sk/strings.xml
new file mode 100644
index 00000000..46f65489
--- /dev/null
+++ b/app/res/values-sk/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Spúšťač v aute"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Ďalšie informácie získate klepnutím na kartu"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Spustíte klepnutím na kartu"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Prebiehajúci hovor"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Vytáča sa…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Spustiť Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto sa nepodarilo spustiť. Nebola nájdená žiadna aktivita."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# zariadenie}few{# zariadenia}many{# devices}other{# zariadení}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Počasie"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Väčšinou slnečno"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Najvyššia: --° Najnižšia: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Žiadne nedávne položky"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Vymazať všetko"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplikácia nie je k dispozícii"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Pokojný režim"</string>
+</resources>
diff --git a/app/res/values-sl/strings.xml b/app/res/values-sl/strings.xml
new file mode 100644
index 00000000..9a408fc1
--- /dev/null
+++ b/app/res/values-sl/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Zaganjalnik za avtomobil"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Dotaknite se kartice za več informacij"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Dotaknite se kartice za zagon"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Aktivni klic"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Klicanje …"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Zaženite storitev Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Ni mogoče zagnati Androida Auto. Najdena ni bila nobena dejavnost."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# naprava}one{# naprava}two{# napravi}few{# naprave}other{# naprav}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Vreme"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° pretežno sončno"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • V: --° N: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Ni nedavnih elementov"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Izbriši vse"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplikacija ni na voljo"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Umirjeni način"</string>
+</resources>
diff --git a/app/res/values-sq/strings.xml b/app/res/values-sq/strings.xml
new file mode 100644
index 00000000..3d7d39b5
--- /dev/null
+++ b/app/res/values-sq/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Nisësi për makinën"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Trokit te karta për më shumë informacione"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Trokit te karta për ta hapur"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Telefonatë në vazhdim"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Po formon numrin…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Hap Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto nuk mund të hapet. Nuk u gjet asnjë aktivitet."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# pajisje}other{# pajisje}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Moti"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Kryesisht me diell"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • L: --° U: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Nuk ka asnjë artikull të fundit"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Pastro të gjitha"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Aplikacioni nuk ofrohet"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Modaliteti i qetësisë"</string>
+</resources>
diff --git a/app/res/values-sr/strings.xml b/app/res/values-sr/strings.xml
new file mode 100644
index 00000000..3a3ae8f1
--- /dev/null
+++ b/app/res/values-sr/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Покретач за аутомобиле"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Додирните картицу за више информација"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Додирните картицу да бисте покренули услугу"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Позив је у току"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Позива се…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Покрени Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Покретање услуге Android Auto није успело. Није пронађена ниједна активност."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# уређај}one{# уређај}few{# уређаја}other{# уређаја}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Време"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° углавном сунчано"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Нови Сад • Највиша: --° Најнижа: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Нема недавних ставки"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Обриши све"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Апликација није доступна"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Режим опуштања"</string>
+</resources>
diff --git a/app/res/values-sv/strings.xml b/app/res/values-sv/strings.xml
new file mode 100644
index 00000000..af06154b
--- /dev/null
+++ b/app/res/values-sv/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Tryck på kortet för mer information"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Tryck på kortet för att starta"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Pågående samtal"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Ringer upp …"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Starta Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Det gick inte att starta Android Auto. Ingen aktivitet hittades."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# enhet}other{# enheter}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Väder"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Mestadels soligt"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • max: --° min: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Listan är tom"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Rensa allt"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Appen är inte tillgänglig"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Lugnt läge"</string>
+</resources>
diff --git a/app/res/values-sw/strings.xml b/app/res/values-sw/strings.xml
new file mode 100644
index 00000000..9e71a9d3
--- /dev/null
+++ b/app/res/values-sw/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Kifungua Programu cha Gari"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Gusa kadi ili upate maelezo zaidi"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Gusa kadi ili ufungue"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Simu inayoendelea"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Inapiga…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Fungua Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Imeshindwa kufungua Android Auto. Hakuna shughuli iliyopatikana."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{Kifaa #}other{Vifaa #}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Hali ya Hewa"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Jua muda mwingi"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mwonekano wa Mlima • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Hakuna vipengee vya hivi karibuni"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Futa Zote"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Programu haipatikani"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Hali ya utulivu"</string>
+</resources>
diff --git a/app/res/values-ta/strings.xml b/app/res/values-ta/strings.xml
new file mode 100644
index 00000000..fb294154
--- /dev/null
+++ b/app/res/values-ta/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"கூடுதல் தகவல்களுக்குக் கார்டைத் தட்டவும்"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"தொடங்குவதற்குக் கார்டைத் தட்டவும்"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"செயலில் இருக்கும் அழைப்பு"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"டயல் செய்கிறது…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Autoவைத் தொடங்கு"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Autoவைத் தொடங்க முடியவில்லை. செயல்பாடு எதுவுமில்லை."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# சாதனம்}other{# சாதனங்கள்}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"வானிலை"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° பெரும்பாலும் வெயிலடிக்கும்"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"மவுண்டைன் வியூ • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"சமீபத்தியவை இல்லை"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"அனைத்தையும் அழி"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"ஆப்ஸ் கிடைக்கவில்லை"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"அமைதிப் பயன்முறை"</string>
+</resources>
diff --git a/app/res/values-te/strings.xml b/app/res/values-te/strings.xml
new file mode 100644
index 00000000..887b13f7
--- /dev/null
+++ b/app/res/values-te/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"కార్ లాంచర్"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"మరింత సమాచారం కోసం కార్డ్‌ను ట్యాప్ చేయండి"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"లాంచ్ చేయడానికి కార్డ్‌ను ట్యాప్ చేయండి"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"మాట్లాడుతున్న కాల్"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"డయల్ చేస్తోంది…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Autoను లాంచ్ చేయండి"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Autoను లాంచ్ చేయడం సాధ్యం కాలేదు. ఏ యాక్టివిటీ కనుగొనబడలేదు."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# పరికరం}other{# పరికరాలు}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"వాతావరణం"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"చాలావరకు --° ఎండగా ఉంటుంది"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"మౌంటెయిన్ వ్యూ • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"ఇటీవలి ఐటెమ్‌లు ఏవీ లేవు"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"అన్నీ తీసివేయండి"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"యాప్ అందుబాటులో లేదు"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"క్లెయిమ్ మోడ్"</string>
+</resources>
diff --git a/app/res/values-th/strings.xml b/app/res/values-th/strings.xml
new file mode 100644
index 00000000..f84e327b
--- /dev/null
+++ b/app/res/values-th/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"แตะการ์ดเพื่อดูข้อมูลเพิ่มเติม"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"แตะการ์ดเพื่อเปิด"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"สายที่สนทนาอยู่"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"กำลังโทรออก…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"เปิด Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"เปิด Android Auto ไม่ได้ ไม่พบกิจกรรม"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{อุปกรณ์ # เครื่อง}other{อุปกรณ์ # เครื่อง}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"สภาพอากาศ"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° แดดจัดเป็นส่วนใหญ่"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"เมาน์เทนวิว • สูงสุด: --° ต่ำสุด: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"ไม่มีรายการล่าสุด"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"ล้างทั้งหมด"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"แอปไม่พร้อมใช้งาน"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"โหมด Calm"</string>
+</resources>
diff --git a/app/res/values-tl/strings.xml b/app/res/values-tl/strings.xml
new file mode 100644
index 00000000..3c76a8bf
--- /dev/null
+++ b/app/res/values-tl/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"I-tap ang card para sa higit pang impormasyon"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"I-tap ang card na ilulunsad"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Kasalukuyang tawag"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Dina-dial…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Ilunsad ang Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Hindi mailunsad ang Android Auto. Walang nakitang aktibidad."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# device}one{# device}other{# na device}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Lagay ng panahon"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Maaraw sa pangkalahatan"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Walang kamakailang item"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"I-clear Lahat"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Hindi available ang app"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Calm mode"</string>
+</resources>
diff --git a/app/res/values-tr/strings.xml b/app/res/values-tr/strings.xml
new file mode 100644
index 00000000..eecca891
--- /dev/null
+++ b/app/res/values-tr/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Daha fazla bilgi için karta dokunun"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Başlatmak için karta dokunun"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Devam eden çağrı"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Aranıyor…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto\'yu başlatın"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto başlatılamadı. Hiçbir etkinlik bulunamadı."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# cihaz}other{# cihaz}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Hava durumu"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Çoğunlukla güneşli"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • E.Y.: --° E.D.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Yeni öğe yok"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Tümünü Temizle"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Uygulama kullanılamıyor"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Sakin mod"</string>
+</resources>
diff --git a/app/res/values-uk/strings.xml b/app/res/values-uk/strings.xml
new file mode 100644
index 00000000..1aa273eb
--- /dev/null
+++ b/app/res/values-uk/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Панель запуску для автомобіля"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Натисніть картку, щоб дізнатися більше"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Натисніть картку, щоб запустити"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Активний виклик"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Набір номера…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Запустити Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Не вдається запустити Android Auto. Не знайдено жодних дій."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# пристрій}one{# пристрій}few{# пристрої}many{# пристроїв}other{# пристрою}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Погода"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--°, переважно сонячно"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Маунтін-В’ю • Макс.: --° Мін.: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Немає нещодавніх об’єктів"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Очистити все"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Додаток недоступний"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Спокійний режим"</string>
+</resources>
diff --git a/app/res/values-ur/strings.xml b/app/res/values-ur/strings.xml
new file mode 100644
index 00000000..230dc649
--- /dev/null
+++ b/app/res/values-ur/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"کار لانچر"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"مزید معلومات کے لیے کارڈ پر تھپتھپائیں"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"شروع کرنے کے لیے کارڈ پر تھپتھپائیں"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"جاری کال"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"ڈائل ہو رہی ہے…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto شروع کریں"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto شروع کرنے سے قاصر۔ کوئی سرگرمی نہیں ملی۔"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# آلہ}other{# آلات}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"موسم"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° زیادہ تر دھوپ"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"ماؤنٹین کا منظر • H: --° L: --°‎"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"کوئی حالیہ آئٹم نہیں"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"تمام صاف کریں"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"ایپ دستیاب نہیں ہے"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"پُرسکون وضع"</string>
+</resources>
diff --git a/app/res/values-uz/strings.xml b/app/res/values-uz/strings.xml
new file mode 100644
index 00000000..97bc0cc1
--- /dev/null
+++ b/app/res/values-uz/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Avtomobil uchun launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Batafsil axborot olish uchun bildirgi ustiga bosing"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Ishga tushirish uchun bildirgi ustiga bosing"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Joriy chaqiruv"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Raqam terilmoqda…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Android Auto xizmatini ishga tushirish"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Android Auto ishga tushmadi. Hech qanday harakat topilmadi."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# ta qurilma}other{# ta qurilma}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Ob-havo"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Asosan quyoshli"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • Maks: --° Min: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Yaqinda ishlatilgan ilovalar yoʻq"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Hammasini yopish"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Ilova mavjud emas"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Dam olish rejimi"</string>
+</resources>
diff --git a/app/res/values-vi/strings.xml b/app/res/values-vi/strings.xml
new file mode 100644
index 00000000..8e84aaed
--- /dev/null
+++ b/app/res/values-vi/strings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Trình chạy cho ô tô"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Nhấn vào thẻ để xem thêm thông tin"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Nhấn vào thẻ để mở trình chạy"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Cuộc gọi đang diễn ra"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Đang quay số…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Chạy Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Không thể chạy Android Auto. Không tìm thấy hoạt động nào."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# thiết bị}other{# thiết bị}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Thời tiết"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Nhiều nắng"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Mountain View • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Không có mục nào gần đây"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Xoá tất cả"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"Hiện không có ứng dụng"</string>
+ <!-- no translation found for calm_mode_title (4364804976931157567) -->
+ <skip />
+</resources>
diff --git a/app/res/values-zh-rCN/strings.xml b/app/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000..1992d3b4
--- /dev/null
+++ b/app/res/values-zh-rCN/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"车载启动器"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"点按卡片即可了解详情"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"点按卡片即可启动"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"正在通话"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"正在拨号…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"启动 Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"无法启动 Android Auto。未找到任何活动。"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# 部设备}other{# 部设备}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"天气"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° 以晴为主"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"山景城 • 高:--° 低:--°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"没有最近用过的项目"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"全部清除"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"应用无法打开"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"平静模式"</string>
+</resources>
diff --git a/app/res/values-zh-rHK/strings.xml b/app/res/values-zh-rHK/strings.xml
new file mode 100644
index 00000000..031c0afd
--- /dev/null
+++ b/app/res/values-zh-rHK/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Car Launcher"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"輕按資訊卡以瞭解詳情"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"輕按資訊卡以啟動"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"通話中"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"正在撥號…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"啟動 Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"無法啟動 Android Auto。找不到活動。"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# 部裝置}other{# 部裝置}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"天氣"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° 大致晴朗"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"山景城 • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"沒有最近項目"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"全部清除"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"目前無法使用這個應用程式"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"平靜模式"</string>
+</resources>
diff --git a/app/res/values-zh-rTW/strings.xml b/app/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000..128f7393
--- /dev/null
+++ b/app/res/values-zh-rTW/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"車輛啟動器"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"輕觸資訊卡即可瞭解詳情"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"輕觸資訊卡即可啟動"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"通話中"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"撥號中…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"啟動 Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"無法啟動 Android Auto。找不到任何活動。"</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{# 部裝置}other{# 部裝置}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"天氣"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° 大致晴朗"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"山景城 • 最高溫:--° 最低溫:--°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"沒有最近使用的項目"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"全部清除"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"應用程式目前無法使用"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"平靜模式"</string>
+</resources>
diff --git a/app/res/values-zu/strings.xml b/app/res/values-zu/strings.xml
new file mode 100644
index 00000000..7abc29f5
--- /dev/null
+++ b/app/res/values-zu/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title" msgid="1056886619192068947">"Isiqalisi Semoto"</string>
+ <string name="default_media_song_title" msgid="7837564242036091946"></string>
+ <string name="tap_for_more_info_text" msgid="4240146824238692769">"Thepha ikhadi ngolwazi olwengeziwe"</string>
+ <string name="tap_to_launch_text" msgid="7150379866796152196">"Thepha ikhadi ukuqalisa"</string>
+ <string name="ongoing_call_duration_text_separator" msgid="2140398350095052096">" • "</string>
+ <string name="ongoing_call_text" msgid="7160701768924041827">"Ikholi eqhubekayo"</string>
+ <string name="dialing_call_text" msgid="3286036311692512894">"Iyadayela…"</string>
+ <string name="projected_launch_text" msgid="5034079820478748609">"Qalisa i-Android Auto"</string>
+ <string name="projected_onclick_launch_error_toast_text" msgid="8853804785626030351">"Ayikwazi ukuqalisa i-Android Auto. Awukho umsebenzi otholakalayo."</string>
+ <string name="projection_devices" msgid="2556503818120676439">"{count,plural, =1{Idivayisi e-#}one{Amadivayisi angu-#}other{Amadivayisi angu-#}}"</string>
+ <string name="weather_app_name" msgid="4356705068077942048">"Isimo sezulu"</string>
+ <string name="fake_weather_main_text" msgid="2545755284647327839">"--° Kuzoshisa isikhathi esiningi"</string>
+ <string name="fake_weather_footer_text" msgid="8640814250285014485">"Ukubuka Kwentaba • H: --° L: --°"</string>
+ <string name="times_separator" msgid="1962841895013564645">"/"</string>
+ <string name="recents_empty_state_text" msgid="8228569970506899117">"Azikho izinto zakamuva"</string>
+ <string name="recents_clear_all_text" msgid="3594272268167720553">"Sula Konke"</string>
+ <string name="failure_opening_recent_task_message" msgid="963567570097465902">"I-app ayitholakali"</string>
+ <string name="calm_mode_title" msgid="4364804976931157567">"Imodi ezolile"</string>
+</resources>
diff --git a/app/res/values/arrays.xml b/app/res/values/arrays.xml
new file mode 100644
index 00000000..1f028e9f
--- /dev/null
+++ b/app/res/values/arrays.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+
+ <!-- Packages allowed to retrieve Quick Controls from CarLauncher -->
+ <string-array name="launcher_qc_provider_package_allowlist" translatable="false">
+ <item>com.android.systemui</item>
+ </string-array>
+
+</resources>
diff --git a/res/values/attrs.xml b/app/res/values/attrs.xml
index 99b757cc..99b757cc 100644
--- a/res/values/attrs.xml
+++ b/app/res/values/attrs.xml
diff --git a/app/res/values/bools.xml b/app/res/values/bools.xml
new file mode 100644
index 00000000..fe492b76
--- /dev/null
+++ b/app/res/values/bools.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<resources>
+
+ <!-- If the control bar's seekbar should be displayed -->
+ <bool name="show_seek_bar">false</bool>
+
+ <!-- If the control bar's seekbar uses the color from media source -->
+ <bool name="use_media_source_color_for_seek_bar">true</bool>
+
+</resources>
+
diff --git a/res/values/colors.xml b/app/res/values/colors.xml
index 83e190b3..954c3cf4 100644
--- a/res/values/colors.xml
+++ b/app/res/values/colors.xml
@@ -15,21 +15,14 @@
-->
<resources>
<color name="date_divider_bar_color">@*android:color/car_grey_500</color>
- <color name="icon_tint">@*android:color/car_tint</color>
<color name="media_button_tint">@*android:color/car_tint</color>
- <color name="recent_apps_line_divider_color">@*android:color/car_list_divider</color>
- <color name="card_background_scrim">#000000</color>
+ <color name="card_background_scrim">#11151B</color>
<color name="tap_for_more_text_color">#DADCE0</color>
<color name="dialer_button_icon_color">#FFFFFF</color>
<color name="dialer_end_call_button_color">#EE675C</color>
<color name="minimized_progress_bar_background">#5CFFFFFF</color>
- <color name="shortcuts_icon_color">@*android:color/white</color>
<color name="launcher_home_icon_color">@*android:color/car_accent_light</color>
<color name="seek_bar_color">@*android:color/car_accent</color>
- <color name="page_indicator_bar_color">@*android:color/car_accent_light</color>
- <color name="app_item_on_hover_border_color">@*android:color/car_accent_light</color>
- <color name="app_item_on_hover_background_color">#3d66b5ff</color>
- <color name="app_name_color">@*android:color/car_grey_200</color>
<color name="recents_background_color">@*android:color/car_grey_900</color>
<color name="default_recents_thumbnail_color">@*android:color/car_grey_846</color>
<color name="clear_all_recents_text_color">@*android:color/car_accent</color>
diff --git a/res/values/config.xml b/app/res/values/config.xml
index f1e843ae..1bf9bae4 100644
--- a/res/values/config.xml
+++ b/app/res/values/config.xml
@@ -46,6 +46,12 @@
-->
<string name="config_smallCanvasOptimizedMapIntent" translatable="false"></string>
+ <!-- An intent to start tos map activity when user has not accepted terms of service
+ URI, for example:
+ "intent:#Intent;component=com.android.car.carlauncher/com.android.car.carlauncher.homescreen.MapActivityTos;action=android.intent.action.MAIN;end"
+ -->
+ <string name="config_tosMapIntent" translatable="false"></string>
+
<!--
A list of package names that will prompt a restart of the Task inside TaskView,
when the package is updated.
@@ -61,23 +67,24 @@
-->
<bool name="config_useRemoteCarTaskView">true</bool>
- <!-- Service information to get screen mirroring information -->
- <string name="config_msg_mirroring_service_pkg_name" translatable="false">com.android.car.multidisplay.controlcenter</string>
- <string name="config_msg_mirroring_service_class_name" translatable="false">com.android.car.multidisplay.controlcenter.service.ControlCenterService</string>
-
- <!--
- Keep in sync with the config file in {@link com.android.car.multidisplay.controlcenter}
- ControlCenterService constants that allow other apps to get information about mirrored apps
- -->
- <integer name="config_msg_register_mirroring_pkg_code">1</integer>
- <integer name="config_msg_unregister_mirroring_pkg_code">2</integer>
- <integer name="config_msg_send_mirroring_pkg_code">3</integer>
- <string name="config_msg_mirroring_pkg_name_key" translatable="false">msg_mirroring_pkg_name_key</string>
- <string name="config_msg_mirroring_redirect_uri_key" translatable="false">msg_mirroring_redirect_uri_key</string>
-
<!--
The Activity to use as a passenger Launcher, if empty, it assumes CarLauncher can do
the passenger Launcher role too.
-->
<string name="config_passengerLauncherComponent">com.android.car.multidisplay/.launcher.LauncherActivity</string>
+
+ <!-- Boolean value to indicate if the secondary descriptive text of homescreen cards
+ without controls should have multiple lines -->
+ <bool name="config_homecard_single_line_secondary_descriptive_text">true</bool>
+
+ <!-- Config values for Calm mode and information shown on the Calm mode screen -->
+ <bool name="config_enableCalmMode">true</bool>
+ <bool name="config_calmMode_showClock">true</bool>
+ <bool name="config_calmMode_showMedia">true</bool>
+ <bool name="config_calmMode_showNavigation">true</bool>
+ <bool name="config_calmMode_showDate">true</bool>
+ <bool name="config_calmMode_showTemperature">true</bool>
+ <string name="config_calmMode_packageName">com.android.car.carlauncher</string>
+ <string name="config_calmMode_activityName">com.android.car.carlauncher.calmmode.CalmModeActivity</string>
+
</resources>
diff --git a/res/values/dimens.xml b/app/res/values/dimens.xml
index 754efaac..7398e4bb 100644
--- a/res/values/dimens.xml
+++ b/app/res/values/dimens.xml
@@ -16,7 +16,7 @@
-->
<resources>
<!-- CarLauncher Activity values -->
- <dimen name="launcher_card_corner_radius">8dp</dimen>
+ <dimen name="launcher_card_corner_radius">32dp</dimen>
<!-- Vertical percentage of screen (not occupied by maps to devote to the contextual space
(Ex: date time temp) -->
<item name="contextual_screen_percentage" type="dimen" format="float">.6</item>
@@ -28,44 +28,6 @@
<!-- Margin surrounding fragments on the main activity -->
<dimen name="main_screen_widget_margin">16dp</dimen>
- <!-- AppGridActivity -->
- <dimen name="app_grid_width">1440dp</dimen>
- <dimen name="app_grid_height">628dp</dimen>
- <dimen name="app_grid_margin_horizontal">70dp</dimen>
- <dimen name="app_grid_margin_vertical">0dp</dimen>
- <dimen name="app_icon_size">84dp</dimen>
- <dimen name="app_icon_scaled_size">100dp</dimen>
- <item name="app_icon_opacity_unavailable" type="dimen" format="float">0.5</item>
- <item name="app_icon_opacity" type="dimen" format="float">1.0</item>
- <dimen name="app_name_margin_horizontal">6dp</dimen>
- <dimen name="app_item_highlight_corner_radius">18dp</dimen>
- <dimen name="app_item_highlight_edge_width">5dp</dimen>
- <dimen name="page_indicator_edge_corner_radius">4dp</dimen>
- <dimen name="page_indicator_height">4dp</dimen>
- <!-- Gap between top of screen (statusbar) and header content -->
- <dimen name="recent_apps_divider_margin">40dp</dimen>
- <dimen name="app_grid_header_margin">@*android:dimen/car_padding_4</dimen>
- <dimen name="panel_margin">@*android:dimen/car_margin</dimen>
- <!-- Height of the text and exit button on the app selection screen -->
- <dimen name="app_bar_height">@*android:dimen/car_app_bar_height</dimen>
- <dimen name="icon_size">@*android:dimen/car_primary_icon_size</dimen>
- <dimen name="recent_apps_row_height">@*android:dimen/car_list_divider_height</dimen>
- <dimen name="app_grid_touch_target_size">@*android:dimen/car_touch_target_size</dimen>
- <!-- Padding around the touch target (makes ripple look better) -->
- <dimen name="app_touch_target_padding">@*android:dimen/car_padding_2</dimen>
- <dimen name="app_touch_target_margin">@*android:dimen/car_padding_1</dimen>
- <dimen name="app_grid_row_margin">@*android:dimen/car_padding_4</dimen>
- <dimen name="app_icon_description_margin">@*android:dimen/car_padding_2</dimen>
- <dimen name="app_icon_ripple_radius">@*android:dimen/car_radius_2</dimen>
-
- <!-- AppSearchActivity -->
- <dimen name="search_item_width">760dp</dimen>
- <dimen name="search_result_margin">@*android:dimen/car_padding_1</dimen>
- <dimen name="search_result_text_margin">@*android:dimen/car_keyline_3</dimen>
- <dimen name="search_box_height">65dp</dimen>
- <dimen name="search_bar_margin">@*android:dimen/car_keyline_1</dimen>
- <dimen name="search_bar_drawable_text_padding">46dp</dimen>
-
<!-- Card dimensions -->
<dimen name="card_width">388dp</dimen>
@@ -107,17 +69,6 @@
<dimen name="control_bar_padding">0dp</dimen>
- <!-- percentage of view holders on the next page that must be fully visible to the user to
- trigger page snap to the next page -->
- <item name="page_snap_threshold" format="float" type="dimen">0.3</item>
-
- <!-- Velocity value of a swipe to trigger a fling to the next page -->
- <item name="fling_threshold" format="float" type="dimen">1000</item>
-
- <!-- distance that users must drag (hold and attempt to move the app icon) to initiate
- drag and drop for reordering app icons. -->
- <dimen name="threshold_to_start_drag_drop">8dp</dimen>
-
<!-- Recent task -->
<dimen name="recent_task_icon_size">48dp</dimen>
<dimen name="recent_task_dismiss_button_size">@dimen/recent_task_icon_size</dimen>
@@ -130,10 +81,16 @@
other handlers. -->
<item name="recent_task_start_swipe_threshold" type="dimen" format="float">5</item>
<item name="disabled_recent_task_alpha" type="dimen" format="float">0.35</item>
-
<!-- task width can be calculated using the following formula:
available height of thumbnail * width of screen / height of screen between the insets
This will allow most task thumbnails to be displayed without cropping. -->
<dimen name="recent_task_width_first">1036dp</dimen>
<dimen name="recent_task_width">432dp</dimen>
+
+ <!-- Calm mode sizes -->
+ <dimen name="calm_mode_padding">12dp</dimen>
+ <dimen name="calm_mode_icon_size_regular">32dp</dimen>
+ <dimen name="calm_mode_icon_size_small">16dp</dimen>
+ <dimen name="calm_mode_icon_margin">4dp</dimen>
+ <dimen name="calm_mode_text_size">24sp</dimen>
</resources>
diff --git a/app/res/values/integers.xml b/app/res/values/integers.xml
new file mode 100644
index 00000000..bddc3f93
--- /dev/null
+++ b/app/res/values/integers.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<resources>
+ <integer name="card_content_text_block_max_lines">3</integer>
+ <!-- Number of buttons shown for the media playback controls bar -->
+ <integer name="playback_controls_bar_columns">3</integer>
+
+ <!-- Max for seekbar progress -->
+ <integer name="optional_seekbar_max">1000</integer>
+</resources>
diff --git a/res/values/overlayable.xml b/app/res/values/overlayable.xml
index 3c87167f..8a717159 100644
--- a/res/values/overlayable.xml
+++ b/app/res/values/overlayable.xml
@@ -20,7 +20,7 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="array" name="config_homeCardModuleClasses"/>
<item type="array" name="config_homeCardPreferredMapActivities"/>
<item type="array" name="config_taskViewPackages"/>
- <item type="array" name="hidden_apps"/>
+ <item type="array" name="launcher_qc_provider_package_allowlist"/>
<item type="array" name="packages_hidden_from_recents"/>
<item type="attr" name="cardCornerRadius"/>
<item type="attr" name="cornerFamily"/>
@@ -28,17 +28,16 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="attr" name="shapeAppearanceOverlay"/>
<item type="attr" name="strokeColor"/>
<item type="attr" name="strokeWidth"/>
- <item type="bool" name="car_app_show_recent_apps"/>
- <item type="bool" name="car_app_show_toolbar"/>
- <item type="bool" name="config_allow_reordering"/>
+ <item type="bool" name="config_calmMode_showClock"/>
+ <item type="bool" name="config_calmMode_showDate"/>
+ <item type="bool" name="config_calmMode_showMedia"/>
+ <item type="bool" name="config_calmMode_showNavigation"/>
+ <item type="bool" name="config_calmMode_showTemperature"/>
+ <item type="bool" name="config_enableCalmMode"/>
+ <item type="bool" name="config_homecard_single_line_secondary_descriptive_text"/>
<item type="bool" name="config_useRemoteCarTaskView"/>
<item type="bool" name="show_seek_bar"/>
- <item type="bool" name="use_defined_app_grid_dimensions"/>
<item type="bool" name="use_media_source_color_for_seek_bar"/>
- <item type="bool" name="use_vertical_app_grid"/>
- <item type="color" name="app_item_on_hover_background_color"/>
- <item type="color" name="app_item_on_hover_border_color"/>
- <item type="color" name="app_name_color"/>
<item type="color" name="card_background_scrim"/>
<item type="color" name="clear_all_recents_text_color"/>
<item type="color" name="date_divider_bar_color"/>
@@ -46,39 +45,21 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="color" name="dialer_button_icon_color"/>
<item type="color" name="dialer_end_call_button_color"/>
<item type="color" name="dialer_icon_tint_state_list"/>
- <item type="color" name="icon_tint"/>
<item type="color" name="launcher_home_icon_color"/>
<item type="color" name="media_button_tint"/>
<item type="color" name="minimized_progress_bar_background"/>
- <item type="color" name="page_indicator_bar_color"/>
- <item type="color" name="recent_apps_line_divider_color"/>
<item type="color" name="recents_background_color"/>
<item type="color" name="seek_bar_color"/>
- <item type="color" name="shortcuts_icon_color"/>
<item type="color" name="tap_for_more_text_color"/>
- <item type="dimen" name="app_bar_height"/>
- <item type="dimen" name="app_grid_header_margin"/>
- <item type="dimen" name="app_grid_height"/>
- <item type="dimen" name="app_grid_margin_horizontal"/>
- <item type="dimen" name="app_grid_margin_vertical"/>
- <item type="dimen" name="app_grid_row_margin"/>
- <item type="dimen" name="app_grid_touch_target_size"/>
- <item type="dimen" name="app_grid_width"/>
- <item type="dimen" name="app_icon_description_margin"/>
- <item type="dimen" name="app_icon_opacity"/>
- <item type="dimen" name="app_icon_opacity_unavailable"/>
- <item type="dimen" name="app_icon_ripple_radius"/>
- <item type="dimen" name="app_icon_scaled_size"/>
- <item type="dimen" name="app_icon_size"/>
- <item type="dimen" name="app_item_highlight_corner_radius"/>
- <item type="dimen" name="app_item_highlight_edge_width"/>
- <item type="dimen" name="app_name_margin_horizontal"/>
- <item type="dimen" name="app_touch_target_margin"/>
- <item type="dimen" name="app_touch_target_padding"/>
<item type="dimen" name="button_outline_thickness"/>
<item type="dimen" name="button_tap_target_icon_padding"/>
<item type="dimen" name="button_tap_target_size"/>
<item type="dimen" name="button_trio_margin"/>
+ <item type="dimen" name="calm_mode_icon_margin"/>
+ <item type="dimen" name="calm_mode_icon_size_regular"/>
+ <item type="dimen" name="calm_mode_icon_size_small"/>
+ <item type="dimen" name="calm_mode_padding"/>
+ <item type="dimen" name="calm_mode_text_size"/>
<item type="dimen" name="card_background_image_blur_radius"/>
<item type="dimen" name="card_background_scrim_alpha"/>
<item type="dimen" name="card_content_image_margin"/>
@@ -93,20 +74,12 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="dimen" name="descriptive_text_only_top_margin"/>
<item type="dimen" name="descriptive_text_with_controls_top_margin"/>
<item type="dimen" name="disabled_recent_task_alpha"/>
- <item type="dimen" name="fling_threshold"/>
<item type="dimen" name="home_card_button_size"/>
<item type="dimen" name="horizontal_border_size"/>
- <item type="dimen" name="icon_size"/>
<item type="dimen" name="launcher_card_corner_radius"/>
<item type="dimen" name="main_screen_widget_margin"/>
<item type="dimen" name="media_top_margin"/>
- <item type="dimen" name="page_indicator_edge_corner_radius"/>
- <item type="dimen" name="page_indicator_height"/>
- <item type="dimen" name="page_snap_threshold"/>
- <item type="dimen" name="panel_margin"/>
<item type="dimen" name="playback_controls_margin"/>
- <item type="dimen" name="recent_apps_divider_margin"/>
- <item type="dimen" name="recent_apps_row_height"/>
<item type="dimen" name="recent_task_col_space"/>
<item type="dimen" name="recent_task_dismiss_button_size"/>
<item type="dimen" name="recent_task_icon_size"/>
@@ -114,44 +87,32 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="dimen" name="recent_task_swiped_threshold"/>
<item type="dimen" name="recent_task_width"/>
<item type="dimen" name="recent_task_width_first"/>
- <item type="dimen" name="search_bar_drawable_text_padding"/>
- <item type="dimen" name="search_bar_margin"/>
- <item type="dimen" name="search_box_height"/>
- <item type="dimen" name="search_item_width"/>
- <item type="dimen" name="search_result_margin"/>
- <item type="dimen" name="search_result_text_margin"/>
<item type="dimen" name="secondary_text_margin_top"/>
<item type="dimen" name="tap_text_margin"/>
<item type="dimen" name="text_block_top_margin"/>
- <item type="dimen" name="threshold_to_start_drag_drop"/>
<item type="dimen" name="vertical_border_size"/>
- <item type="drawable" name="app_item_highlight"/>
<item type="drawable" name="car_button_background"/>
<item type="drawable" name="control_bar_contact_image_background"/>
<item type="drawable" name="control_bar_image_background"/>
<item type="drawable" name="default_audio_background"/>
<item type="drawable" name="dialer_button_active_state_circle"/>
- <item type="drawable" name="ic_app_info"/>
<item type="drawable" name="ic_apps_black"/>
<item type="drawable" name="ic_arrow_back_black"/>
<item type="drawable" name="ic_call_end"/>
<item type="drawable" name="ic_call_end_button"/>
<item type="drawable" name="ic_clear_black"/>
<item type="drawable" name="ic_dialpad"/>
- <item type="drawable" name="ic_force_stop_caution_icon"/>
<item type="drawable" name="ic_launcher_home"/>
+ <item type="drawable" name="ic_media"/>
<item type="drawable" name="ic_mic_on"/>
<item type="drawable" name="ic_mute_activatable"/>
+ <item type="drawable" name="ic_navigation"/>
<item type="drawable" name="ic_recent_dismiss"/>
<item type="drawable" name="ic_search_black"/>
- <item type="drawable" name="page_indicator_bar"/>
+ <item type="drawable" name="ic_temperature"/>
<item type="drawable" name="recent_clear_all_button_background"/>
<item type="drawable" name="recent_dismiss_button_background"/>
- <item type="id" name="app_icon"/>
- <item type="id" name="app_item"/>
- <item type="id" name="app_name"/>
- <item type="id" name="apps_grid"/>
- <item type="id" name="apps_grid_background"/>
+ <item type="id" name="barrier"/>
<item type="id" name="bottom_card"/>
<item type="id" name="bottom_edge"/>
<item type="id" name="bottom_line"/>
@@ -159,23 +120,32 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="id" name="button_left"/>
<item type="id" name="button_right"/>
<item type="id" name="button_trio"/>
+ <item type="id" name="calm_mode_container"/>
<item type="id" name="card_background"/>
<item type="id" name="card_background_image"/>
<item type="id" name="card_background_scrim"/>
<item type="id" name="card_icon"/>
<item type="id" name="card_name"/>
<item type="id" name="card_view"/>
+ <item type="id" name="clock"/>
+ <item type="id" name="date"/>
+ <item type="id" name="date_and_temperature_container"/>
<item type="id" name="descriptive_text_layout"/>
<item type="id" name="descriptive_text_with_controls_layout"/>
- <item type="id" name="divider"/>
<item type="id" name="divider_horizontal"/>
<item type="id" name="empty_state"/>
<item type="id" name="end_edge"/>
- <item type="id" name="focus_area"/>
+ <item type="id" name="fragment_container_view"/>
<item type="id" name="maps_card"/>
<item type="id" name="media_descriptive_text"/>
+ <item type="id" name="media_group"/>
+ <item type="id" name="media_icon"/>
<item type="id" name="media_layout"/>
<item type="id" name="media_playback_controls_bar"/>
+ <item type="id" name="media_title"/>
+ <item type="id" name="nav_group"/>
+ <item type="id" name="nav_state"/>
+ <item type="id" name="nav_state_icon"/>
<item type="id" name="optional_image"/>
<item type="id" name="optional_progress_bar"/>
<item type="id" name="optional_seek_bar"/>
@@ -183,10 +153,7 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="id" name="optional_timer"/>
<item type="id" name="optional_timer_separator"/>
<item type="id" name="optional_times"/>
- <item type="id" name="page_indicator"/>
- <item type="id" name="page_indicator_container"/>
<item type="id" name="primary_text"/>
- <item type="id" name="recent_apps_row"/>
<item type="id" name="recent_tasks_group"/>
<item type="id" name="recent_tasks_list"/>
<item type="id" name="recent_tasks_list_focus_area"/>
@@ -197,32 +164,22 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="id" name="task_dismiss_button"/>
<item type="id" name="task_icon"/>
<item type="id" name="task_thumbnail"/>
+ <item type="id" name="temperature"/>
+ <item type="id" name="temperature_group"/>
+ <item type="id" name="temperature_icon"/>
<item type="id" name="text_block"/>
<item type="id" name="text_block_layout"/>
<item type="id" name="top_card"/>
<item type="id" name="top_edge"/>
<item type="id" name="top_line"/>
<item type="id" name="vertical_barrier"/>
- <item type="integer" name="car_app_selector_column_number"/>
- <item type="integer" name="car_app_selector_row_number"/>
<item type="integer" name="card_content_text_block_max_lines"/>
- <item type="integer" name="config_msg_register_mirroring_pkg_code"/>
- <item type="integer" name="config_msg_send_mirroring_pkg_code"/>
- <item type="integer" name="config_msg_unregister_mirroring_pkg_code"/>
- <item type="integer" name="ms_background_highlight_duration"/>
- <item type="integer" name="ms_drop_animation_delay"/>
- <item type="integer" name="ms_long_press_animation_duration"/>
- <item type="integer" name="ms_off_page_hover_before_scroll"/>
- <item type="integer" name="ms_release_animation_duration"/>
- <item type="integer" name="ms_scrollbar_appear_animation_delay"/>
- <item type="integer" name="ms_scrollbar_appear_animation_duration"/>
- <item type="integer" name="ms_scrollbar_fade_animation_delay"/>
- <item type="integer" name="ms_scrollbar_fade_animation_duration"/>
<item type="integer" name="optional_seekbar_max"/>
<item type="integer" name="playback_controls_bar_columns"/>
- <item type="layout" name="app_grid_activity"/>
- <item type="layout" name="app_item"/>
<item type="layout" name="button_trio"/>
+ <item type="layout" name="calm_mode_activity"/>
+ <item type="layout" name="calm_mode_date_and_temperature"/>
+ <item type="layout" name="calm_mode_fragment"/>
<item type="layout" name="car_launcher"/>
<item type="layout" name="car_launcher_multiwindow"/>
<item type="layout" name="card_content_descriptive_text_only"/>
@@ -233,7 +190,6 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="layout" name="control_bar_container"/>
<item type="layout" name="descriptive_text"/>
<item type="layout" name="optional_seek_bar_with_times"/>
- <item type="layout" name="recent_apps_row"/>
<item type="layout" name="recent_clear_all_view"/>
<item type="layout" name="recent_task_view"/>
<item type="layout" name="recent_task_view_first"/>
@@ -241,28 +197,18 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="layout" name="recents_activity"/>
<item type="layout" name="tap_for_more_text"/>
<item type="layout" name="text_block"/>
- <item type="string" name="app_launcher_app_info_action"/>
- <item type="string" name="app_launcher_stop_app_action"/>
- <item type="string" name="app_launcher_stop_app_cant_stop_text"/>
- <item type="string" name="app_launcher_stop_app_dialog_text"/>
- <item type="string" name="app_launcher_stop_app_dialog_title"/>
- <item type="string" name="app_launcher_stop_app_success_toast_text"/>
- <item type="string" name="app_launcher_title_all_apps"/>
- <item type="string" name="app_launcher_title_media_only"/>
<item type="string" name="app_title"/>
- <item type="string" name="config_msg_mirroring_pkg_name_key"/>
- <item type="string" name="config_msg_mirroring_redirect_uri_key"/>
- <item type="string" name="config_msg_mirroring_service_class_name"/>
- <item type="string" name="config_msg_mirroring_service_pkg_name"/>
+ <item type="string" name="calm_mode_title"/>
+ <item type="string" name="config_calmMode_activityName"/>
+ <item type="string" name="config_calmMode_packageName"/>
<item type="string" name="config_passengerLauncherComponent"/>
<item type="string" name="config_smallCanvasOptimizedMapIntent"/>
+ <item type="string" name="config_tosMapIntent"/>
<item type="string" name="default_media_song_title"/>
<item type="string" name="dialing_call_text"/>
- <item type="string" name="driving_toast_text"/>
<item type="string" name="failure_opening_recent_task_message"/>
<item type="string" name="fake_weather_footer_text"/>
<item type="string" name="fake_weather_main_text"/>
- <item type="string" name="hide_debug_apps"/>
<item type="string" name="ongoing_call_duration_text_separator"/>
<item type="string" name="ongoing_call_text"/>
<item type="string" name="projected_launch_text"/>
@@ -270,29 +216,30 @@ REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
<item type="string" name="projection_devices"/>
<item type="string" name="recents_clear_all_text"/>
<item type="string" name="recents_empty_state_text"/>
- <item type="string" name="reset_appgrid_dialogue_message"/>
- <item type="string" name="reset_appgrid_title"/>
- <item type="string" name="show_debug_apps"/>
<item type="string" name="tap_for_more_info_text"/>
<item type="string" name="tap_to_launch_text"/>
<item type="string" name="times_separator"/>
<item type="string" name="weather_app_name"/>
- <item type="style" name="ActionDialogTheme"/>
- <item type="style" name="AppDisplayNameStyle"/>
+ <item type="style" name="CalmMode"/>
+ <item type="style" name="CalmMode.BackgroundImage"/>
+ <item type="style" name="CalmMode.Icon"/>
+ <item type="style" name="CalmMode.Icon.Temperature"/>
+ <item type="style" name="CalmMode.Text"/>
+ <item type="style" name="CalmMode.Text.Clock"/>
+ <item type="style" name="CalmMode.Text.Date"/>
+ <item type="style" name="CalmMode.Text.MediaTitle"/>
<item type="style" name="CardViewStyle"/>
<item type="style" name="ClearAllRecentTasksButton"/>
<item type="style" name="ContextualSpace"/>
<item type="style" name="HiddenRecentTaskThumbnail"/>
- <item type="style" name="HorizontalLineDivider"/>
<item type="style" name="RecentTaskDismissButton"/>
<item type="style" name="RecentTaskIcon"/>
<item type="style" name="RecentTaskThumbnail"/>
<item type="style" name="RecentTaskThumbnail.RoundedBorder"/>
<item type="style" name="RecentTasksList"/>
<item type="style" name="RecentTasksListFocusArea"/>
+ <item type="style" name="Theme.CalmMode"/>
<item type="style" name="Theme.Launcher"/>
- <item type="style" name="Theme.Launcher.AppGridActivity"/>
- <item type="style" name="Theme.Launcher.AppGridActivity.NoToolbar"/>
<item type="style" name="TitleText"/>
</policy>
</overlayable>
diff --git a/app/res/values/strings.xml b/app/res/values/strings.xml
new file mode 100644
index 00000000..2ec8f424
--- /dev/null
+++ b/app/res/values/strings.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_title">Car Launcher</string>
+
+ <string name="default_media_song_title"></string>
+
+ <string name="tap_for_more_info_text">Tap card for more info</string>
+ <string name="tap_to_launch_text">Tap card to launch</string>
+
+ <!-- InCallModel strings -->
+ <!-- Separates the duration from the ongoing_call_text -->
+ <string name="ongoing_call_duration_text_separator">&#160;&#8226;&#160;</string>
+ <string name="ongoing_call_text">Ongoing call</string>
+ <string name="dialing_call_text">Dialing&#8230;</string>
+
+ <!-- ProjectionModel strings -->
+ <string name="projected_launch_text">Launch Android Auto</string>
+ <string name="projected_onclick_launch_error_toast_text">Unable to launch Android Auto. No activity found.</string>
+ <string name="projection_devices">{count, plural,
+ =1 {# device}
+ other {# devices}
+ }
+ </string>
+
+ <!-- FakeWeatherModel strings -->
+ <string name="weather_app_name">Weather</string>
+ <string name="fake_weather_main_text">--\u00B0 Mostly sunny</string>
+ <string name="fake_weather_footer_text">Mountain View &#8226; H: --\u00B0 L: --\u00B0</string>
+
+ <!-- Separator between current time and max time in control bar, optional times [CHAR_LIMIT=5] -->
+ <string name="times_separator"> / </string>
+ <string name="recents_empty_state_text">No recent items</string>
+ <string name="recents_clear_all_text">Clear All</string>
+ <string name="failure_opening_recent_task_message">App isn\'t available</string>
+ <!--
+ A list of package names that are excluded from recents.
+ DO NOT TRANSLATE.
+ -->
+ <string-array name="packages_hidden_from_recents" translatable="false">
+ </string-array>
+
+ <!-- Calm mode strings -->
+ <string name="calm_mode_title">Calm mode</string>
+</resources>
diff --git a/res/values/styles.xml b/app/res/values/styles.xml
index 73c8ae4c..c0ea7b30 100644
--- a/res/values/styles.xml
+++ b/app/res/values/styles.xml
@@ -30,20 +30,6 @@
<item name="android:textAlignment">viewStart</item>
</style>
- <style name="AppDisplayNameStyle">
- <item name="android:textSize">@*android:dimen/car_body2_size</item>
- <item name="android:textColor">@color/app_name_color</item>
- <item name="android:fontFamily">sans-serif</item>
- <item name="android:ellipsize">end</item>
- <item name="android:maxLines">1</item>
- </style>
-
- <style name="HorizontalLineDivider">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">@*android:dimen/car_list_divider_height</item>
- <item name="android:background">@*android:color/car_list_divider</item>
- </style>
-
<style name="RecentTasksListFocusArea">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">0dp</item>
@@ -99,4 +85,56 @@
<item name="cornerFamily">rounded</item>
<item name="cornerSize">8dp</item>
</style>
+
+ <style name="CalmMode">
+ </style>
+
+ <style name="CalmMode.Text" parent="CalmMode">
+ <item name="android:textColor">@android:color/white</item>
+ <item name="android:textSize">@dimen/calm_mode_text_size</item>
+ <item name="android:minHeight">@dimen/calm_mode_icon_size_regular</item>
+ </style>
+
+ <style name="CalmMode.Icon" parent="CalmMode">
+ <item name="android:layout_width">@dimen/calm_mode_icon_size_regular</item>
+ <item name="android:layout_height">@dimen/calm_mode_icon_size_regular</item>
+ <item name="android:scaleType">fitCenter</item>
+ <item name="android:tint">@android:color/white</item>
+ </style>
+
+ <style name="CalmMode.BackgroundImage" parent="CalmMode">
+ <item name="android:src">@android:color/black</item>
+ <item name="android:scaleType">centerCrop</item>
+ </style>
+
+ <style name="CalmMode.Text.Date" parent="CalmMode.Text">
+ <item name="android:format12Hour">EE, MMM dd</item>
+ <item name="android:format24Hour">EE, MMM dd</item>
+ </style>
+
+ <style name="CalmMode.Text.MediaTitle" parent="CalmMode.Text">
+ <item name="android:ellipsize">end</item>
+ <item name="android:maxWidth">300dp</item>
+ <item name="android:maxLines">2</item>
+ <item name="android:textAlignment">viewStart</item>
+ </style>
+
+ <style name="CalmMode.Text.Clock" parent="CalmMode.Text">
+ <item name="android:gravity">center</item>
+ <item name="android:textAlignment">center</item>
+ <item name="android:textSize">200sp</item>
+ <item name="android:lineSpacingMultiplier">0.75</item>
+ <item name="android:format12Hour">hh\nmm</item>
+ <item name="android:format24Hour">HH\nmm</item>
+ <item name="android:letterSpacing">0.02</item>
+ <item name="android:lineSpacingExtra">-10sp</item>
+ <item name="android:fontVariationSettings">"'wght' 100, 'wdth' 10"</item>
+ <item name="android:fontFamily">roboto-flex</item>
+ </style>
+
+ <style name="CalmMode.Icon.Temperature" parent="CalmMode.Icon">
+ <item name="android:layout_width">@dimen/calm_mode_icon_size_small</item>
+ <item name="android:layout_height">@dimen/calm_mode_icon_size_small</item>
+ </style>
+
</resources>
diff --git a/app/res/values/themes.xml b/app/res/values/themes.xml
new file mode 100644
index 00000000..06183e35
--- /dev/null
+++ b/app/res/values/themes.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <style name="Theme.Launcher" parent="Theme.CarUi.NoToolbar">
+ <item name="textAppearanceGridItem">@android:style/TextAppearance.DeviceDefault.Medium</item>
+ <item name="textAppearanceGridItemSecondary">@android:style/TextAppearance.DeviceDefault.Small</item>
+ </style>
+
+ <style name="Theme.CalmMode" parent="Theme.CarUi.NoToolbar">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowFullscreen">true</item>
+ <item name="android:windowSplashScreenAnimatedIcon">@android:color/transparent</item>
+ <item name="android:windowBackground">@android:color/black</item>
+ </style>
+</resources>
diff --git a/src/com/android/car/carlauncher/CarFullscreenTaskMonitorListener.java b/app/src/com/android/car/carlauncher/CarFullscreenTaskMonitorListener.java
index 2ac0eed6..2ac0eed6 100644
--- a/src/com/android/car/carlauncher/CarFullscreenTaskMonitorListener.java
+++ b/app/src/com/android/car/carlauncher/CarFullscreenTaskMonitorListener.java
diff --git a/src/com/android/car/carlauncher/CarLauncher.java b/app/src/com/android/car/carlauncher/CarLauncher.java
index 2a50ef42..c686584d 100644
--- a/src/com/android/car/carlauncher/CarLauncher.java
+++ b/app/src/com/android/car/carlauncher/CarLauncher.java
@@ -17,24 +17,24 @@
package com.android.car.carlauncher;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+import static android.car.settings.CarSettings.Secure.KEY_USER_TOS_ACCEPTED;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
+import static com.android.car.carlauncher.CarLauncherViewModel.CarLauncherViewModelFactory;
+
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.TaskStackListener;
import android.car.Car;
-import android.car.app.CarActivityManager;
-import android.car.app.CarTaskViewController;
-import android.car.app.CarTaskViewControllerCallback;
-import android.car.app.ControlledRemoteCarTaskView;
-import android.car.app.ControlledRemoteCarTaskViewCallback;
-import android.car.app.ControlledRemoteCarTaskViewConfig;
import android.car.user.CarUserManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.res.Configuration;
+import android.database.ContentObserver;
import android.os.Bundle;
+import android.os.Handler;
import android.os.UserManager;
+import android.provider.Settings;
import android.util.Log;
import android.view.Display;
import android.view.ViewGroup;
@@ -69,13 +69,13 @@ import java.util.Set;
*/
public class CarLauncher extends FragmentActivity {
public static final String TAG = "CarLauncher";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private ActivityManager mActivityManager;
private TaskViewManager mTaskViewManager;
+ private Car mCar;
private CarTaskView mTaskView;
- private ControlledRemoteCarTaskView mRemoteCarTaskView;
private int mCarLauncherTaskId = INVALID_TASK_ID;
private Set<HomeCardModule> mHomeCardModules;
@@ -84,10 +84,15 @@ public class CarLauncher extends FragmentActivity {
private boolean mUseSmallCanvasOptimizedMap;
private boolean mUseRemoteCarTaskView;
private ViewGroup mMapsCard;
+ private CarLauncherViewModel mCarLauncherViewModel;
+
+ @VisibleForTesting
+ ContentObserver mTosContentObserver;
private final TaskStackListener mTaskStackListener = new TaskStackListener() {
@Override
- public void onTaskFocusChanged(int taskId, boolean focused) {}
+ public void onTaskFocusChanged(int taskId, boolean focused) {
+ }
@Override
public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
@@ -195,62 +200,21 @@ public class CarLauncher extends FragmentActivity {
}
}
initializeCards();
+ setupContentObserversForTos();
}
private void setupRemoteCarTaskView(ViewGroup parent) {
- Car.createCar(/* context= */ this, /* handler= */ null,
- Car.CAR_WAIT_TIMEOUT_WAIT_FOREVER,
- (car, ready) -> {
- if (!ready) {
- Log.w(TAG, "CarService is not ready.");
- return;
- }
- CarActivityManager carAM = (CarActivityManager) car.getCarManager(
- Car.CAR_ACTIVITY_SERVICE);
-
- carAM.getCarTaskViewController(
- this,
- getMainExecutor(),
- new CarTaskViewControllerCallback() {
- @Override
- public void onConnected(
- CarTaskViewController carTaskViewController) {
- carTaskViewController.createControlledRemoteCarTaskView(
- new ControlledRemoteCarTaskViewConfig.Builder()
- .setActivityIntent(getMapsIntent())
- .setShouldAutoRestartOnTaskRemoval(true)
- .build(),
- getMainExecutor(),
- new ControlledRemoteCarTaskViewCallback() {
- @Override
- public void onTaskViewCreated(
- ControlledRemoteCarTaskView taskView) {
- mRemoteCarTaskView = taskView;
- parent.addView(taskView);
- }
-
- @Override
- public void onTaskViewInitialized() {
- maybeLogReady();
- }
-
- @Override
- public void onTaskViewReleased() {
- mRemoteCarTaskView = null;
- parent.removeAllViews();
- }
- });
- }
-
- @Override
- public void onDisconnected(
- CarTaskViewController carTaskViewController) {
- Log.d(TAG, "onDisconnected");
- mRemoteCarTaskView = null;
- parent.removeAllViews();
- }
- });
- });
+ mCarLauncherViewModel = new ViewModelProvider(this,
+ new CarLauncherViewModelFactory(this, getMapsIntent()))
+ .get(CarLauncherViewModel.class);
+
+ getLifecycle().addObserver(mCarLauncherViewModel);
+
+ mCarLauncherViewModel.getRemoteCarTaskView().observe(this, taskView -> {
+ if (taskView != null && taskView.getParent() == null) {
+ parent.addView(taskView);
+ }
+ });
}
private void setUpTaskView(ViewGroup parent) {
@@ -305,28 +269,34 @@ public class CarLauncher extends FragmentActivity {
protected void onDestroy() {
super.onDestroy();
TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener);
+ if (mTosContentObserver != null) {
+ Log.i(TAG, "Unregister content observer for tos state");
+ getContentResolver().unregisterContentObserver(mTosContentObserver);
+ mTosContentObserver = null;
+ }
release();
}
- private boolean isTaskViewInitialized() {
- return (mTaskView != null && mTaskView.isInitialized())
- || (mRemoteCarTaskView != null && mRemoteCarTaskView.isInitialized());
- }
-
private int getTaskViewTaskId() {
if (mTaskView != null) {
return mTaskView.getTaskId();
}
- if (mRemoteCarTaskView != null) {
- return mRemoteCarTaskView.getTaskInfo() == null
- ? INVALID_TASK_ID : mRemoteCarTaskView.getTaskInfo().taskId;
+ if (mCarLauncherViewModel != null) {
+ return mCarLauncherViewModel.getRemoteCarTaskViewTaskId();
}
return INVALID_TASK_ID;
}
private void release() {
mTaskView = null;
- mRemoteCarTaskView = null;
+ // When using a ViewModel for the RemoteCarTaskViews, the task view can still be attached
+ // to the mMapsCard due to which the CarLauncher activity does not get garbage collected
+ // during activity recreation.
+ mMapsCard = null;
+ if (mCar != null) {
+ mCar.disconnect();
+ mCar = null;
+ }
}
@Override
@@ -342,17 +312,17 @@ public class CarLauncher extends FragmentActivity {
R.array.config_homeCardModuleClasses)) {
try {
long reflectionStartTime = System.currentTimeMillis();
- HomeCardModule cardModule = (HomeCardModule) Class.forName(
- providerClassName).newInstance();
- cardModule.setViewModelProvider(new ViewModelProvider( /* owner= */this));
+ HomeCardModule cardModule = (HomeCardModule)
+ Class.forName(providerClassName).newInstance();
+ cardModule.setViewModelProvider(new ViewModelProvider(/* owner= */this));
mHomeCardModules.add(cardModule);
if (DEBUG) {
long reflectionTime = System.currentTimeMillis() - reflectionStartTime;
Log.d(TAG, "Initialization of HomeCardModule class " + providerClassName
+ " took " + reflectionTime + " ms");
}
- } catch (IllegalAccessException | InstantiationException |
- ClassNotFoundException e) {
+ } catch (IllegalAccessException | InstantiationException
+ | ClassNotFoundException e) {
Log.w(TAG, "Unable to create HomeCardProvider class " + providerClassName, e);
}
}
@@ -367,7 +337,7 @@ public class CarLauncher extends FragmentActivity {
/** Logs that the Activity is ready. Used for startup time diagnostics. */
private void maybeLogReady() {
boolean isResumed = isResumed();
- boolean taskViewInitialized = isTaskViewInitialized();
+ boolean taskViewInitialized = mTaskView != null && mTaskView.isInitialized();
if (DEBUG) {
Log.d(TAG, "maybeLogReady(" + getUserId() + "): mapsReady="
+ taskViewInitialized + ", started=" + isResumed + ", alreadyLogged: "
@@ -394,12 +364,50 @@ public class CarLauncher extends FragmentActivity {
}
}
- private Intent getMapsIntent() {
+ @VisibleForTesting
+ protected Intent getMapsIntent() {
Intent mapIntent = mUseSmallCanvasOptimizedMap
? CarLauncherUtils.getSmallCanvasOptimizedMapIntent(this)
: CarLauncherUtils.getMapsIntent(this);
+
+ String packageName = mapIntent.getComponent() != null
+ ? mapIntent.getComponent().getPackageName()
+ : null;
+ Set<String> tosDisabledPackages = AppLauncherUtils.getTosDisabledPackages(this);
+
+ // Launch tos map intent when the user has not accepted tos and when the
+ // default maps package is not available to package manager, or it's disabled by tos
+ if (!AppLauncherUtils.tosAccepted(this)
+ && (packageName == null || tosDisabledPackages.contains(packageName))) {
+ mapIntent = CarLauncherUtils.getTosMapIntent(this);
+ Log.i(TAG, "Launching tos activity in task view");
+ }
// Don't want to show this Activity in Recents.
mapIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
return mapIntent;
}
+
+ private void setupContentObserversForTos() {
+ if (AppLauncherUtils.tosStatusUninitialized(/* context = */ this)
+ || !AppLauncherUtils.tosAccepted(/* context = */ this)) {
+ Log.i(TAG, "TOS not accepted, setting up content observers for TOS state");
+ } else {
+ Log.i(TAG, "TOS accepted, state will remain accepted, "
+ + "don't need to observe this value");
+ return;
+ }
+ mTosContentObserver = new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+ // TODO (b/280077391): Release the remote task view and recreate the map activity
+ Log.i(TAG, "TOS state updated:" + AppLauncherUtils.tosAccepted(getBaseContext()));
+ recreate();
+ }
+ };
+ getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(KEY_USER_TOS_ACCEPTED),
+ /* notifyForDescendants*/ false,
+ mTosContentObserver);
+ }
}
diff --git a/src/com/android/car/carlauncher/CarLauncherUtils.java b/app/src/com/android/car/carlauncher/CarLauncherUtils.java
index 916977f2..9440ed07 100644
--- a/src/com/android/car/carlauncher/CarLauncherUtils.java
+++ b/app/src/com/android/car/carlauncher/CarLauncherUtils.java
@@ -70,12 +70,28 @@ public class CarLauncherUtils {
}
/**
+ * Return an intent used to launch the tos map activity
+ * @param context The application context
+ * @return Tos Intent, null if the config is incorrect
+ */
+ public static Intent getTosMapIntent(Context context) {
+ String intentString = context.getString(R.string.config_tosMapIntent);
+ try {
+ return Intent.parseUri(intentString, Intent.URI_ANDROID_APP_SCHEME);
+ } catch (URISyntaxException se) {
+ Log.w(TAG, "Invalid intent URI in config_tosMapIntent", se);
+ return null;
+ }
+ }
+
+ /**
* Returns {@code true} if a proper limited map intent is configured via
* {@code config_smallCanvasOptimizedMapIntent} string resource.
*/
public static boolean isSmallCanvasOptimizedMapIntentConfigured(Context context) {
String intentString = context.getString(R.string.config_smallCanvasOptimizedMapIntent);
if (intentString.isEmpty()) {
+ Log.d(TAG, "Empty intent URI in config_smallCanvasOptimizedMapIntent");
return false;
}
@@ -83,6 +99,8 @@ public class CarLauncherUtils {
Intent.parseUri(intentString, Intent.URI_INTENT_SCHEME);
return true;
} catch (URISyntaxException e) {
+ Log.w(TAG, "Invalid intent URI in config_smallCanvasOptimizedMapIntent: \""
+ + intentString);
return false;
}
}
diff --git a/app/src/com/android/car/carlauncher/CarLauncherViewModel.java b/app/src/com/android/car/carlauncher/CarLauncherViewModel.java
new file mode 100644
index 00000000..3bafbd57
--- /dev/null
+++ b/app/src/com/android/car/carlauncher/CarLauncherViewModel.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher;
+
+import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
+
+import static java.util.Objects.requireNonNull;
+
+import android.annotation.NonNull;
+import android.annotation.SuppressLint;
+import android.annotation.UiContext;
+import android.app.ActivityManager;
+import android.car.Car;
+import android.car.app.CarActivityManager;
+import android.car.app.CarTaskViewController;
+import android.car.app.CarTaskViewControllerCallback;
+import android.car.app.CarTaskViewControllerHostLifecycle;
+import android.car.app.ControlledRemoteCarTaskView;
+import android.car.app.ControlledRemoteCarTaskViewCallback;
+import android.car.app.ControlledRemoteCarTaskViewConfig;
+import android.car.app.RemoteCarTaskView;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Build;
+import android.util.Log;
+
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
+
+/**
+ * A car launcher view model to manage the lifecycle of {@link RemoteCarTaskView}.
+ */
+public final class CarLauncherViewModel extends ViewModel implements DefaultLifecycleObserver {
+ private static final String TAG = CarLauncher.TAG;
+ private static final boolean DEBUG = CarLauncher.DEBUG;
+ private static final boolean sAutoRestartOnCrash = Build.IS_USER;
+
+ private final CarActivityManager mCarActivityManager;
+ private final Car mCar;
+ private final CarTaskViewControllerHostLifecycle mHostLifecycle;
+ @SuppressLint("StaticFieldLeak") // We're not leaking this context as it is the window context.
+ private final Context mWindowContext;
+ private final Intent mMapsIntent;
+ private final MutableLiveData<RemoteCarTaskView> mRemoteCarTaskView;
+
+ public CarLauncherViewModel(@UiContext Context context, @NonNull Intent mapsIntent) {
+ mWindowContext = context.createWindowContext(TYPE_APPLICATION_STARTING, /* options */ null);
+ mMapsIntent = mapsIntent;
+ mCar = Car.createCar(mWindowContext);
+ mCarActivityManager = mCar.getCarManager(CarActivityManager.class);
+ mHostLifecycle = new CarTaskViewControllerHostLifecycle();
+ mRemoteCarTaskView = new MutableLiveData<>(null);
+ ControlledRemoteCarTaskViewCallback controlledRemoteCarTaskViewCallback =
+ new ControlledRemoteCarTaskViewCallbackImpl(mRemoteCarTaskView);
+
+ CarTaskViewControllerCallback carTaskViewControllerCallback =
+ new CarTaskViewControllerCallbackImpl(controlledRemoteCarTaskViewCallback);
+
+ mCarActivityManager.getCarTaskViewController(mWindowContext, mHostLifecycle,
+ mWindowContext.getMainExecutor(), carTaskViewControllerCallback);
+ }
+
+ LiveData<RemoteCarTaskView> getRemoteCarTaskView() {
+ return mRemoteCarTaskView;
+ }
+
+ /**
+ * Returns remote car task view task Id.
+ */
+ public int getRemoteCarTaskViewTaskId() {
+ if (mRemoteCarTaskView != null && mRemoteCarTaskView.getValue() != null
+ && mRemoteCarTaskView.getValue().getTaskInfo() != null) {
+ return mRemoteCarTaskView.getValue().getTaskInfo().taskId;
+ }
+ return INVALID_TASK_ID;
+ }
+
+ /**
+ * Shows remote car task view when activity is resumed.
+ */
+ @Override
+ public void onResume(@NonNull LifecycleOwner owner) {
+ DefaultLifecycleObserver.super.onResume(owner);
+ mHostLifecycle.hostAppeared();
+ }
+
+ @Override
+ public void onStop(@NonNull LifecycleOwner owner) {
+ DefaultLifecycleObserver.super.onStop(owner);
+ mHostLifecycle.hostDisappeared();
+ }
+
+ @Override
+ protected void onCleared() {
+ if (mRemoteCarTaskView != null) {
+ mRemoteCarTaskView.setValue(null);
+ }
+ if (mCar != null) {
+ mCar.disconnect();
+ }
+ mHostLifecycle.hostDestroyed();
+ super.onCleared();
+ }
+
+ private static final class ControlledRemoteCarTaskViewCallbackImpl implements
+ ControlledRemoteCarTaskViewCallback {
+ private final MutableLiveData<RemoteCarTaskView> mRemoteCarTaskView;
+
+ private ControlledRemoteCarTaskViewCallbackImpl(
+ MutableLiveData<RemoteCarTaskView> remoteCarTaskView) {
+ mRemoteCarTaskView = remoteCarTaskView;
+ }
+
+ @Override
+ public void onTaskViewCreated(@NonNull ControlledRemoteCarTaskView taskView) {
+ mRemoteCarTaskView.setValue(taskView);
+ }
+
+ @Override
+ public void onTaskViewInitialized() {
+ if (DEBUG) {
+ Log.d(TAG, "MapsTaskView: onTaskViewInitialized");
+ }
+ }
+
+ @Override
+ public void onTaskAppeared(@NonNull ActivityManager.RunningTaskInfo taskInfo) {
+ if (DEBUG) {
+ Log.d(TAG, "MapsTaskView: onTaskAppeared: taskId=" + taskInfo.taskId);
+ }
+ if (!sAutoRestartOnCrash) {
+ mRemoteCarTaskView.getValue().setBackgroundColor(Color.TRANSPARENT);
+ }
+ }
+
+ @Override
+ public void onTaskVanished(@NonNull ActivityManager.RunningTaskInfo taskInfo) {
+ if (DEBUG) {
+ Log.d(TAG, "MapsTaskView: onTaskVanished: taskId=" + taskInfo.taskId);
+ }
+ if (!sAutoRestartOnCrash) {
+ // RemoteCarTaskView color is set to red to indicate
+ // that nothing is wrong with the task view but maps
+ // in the task view has crashed. More details in
+ // b/247156851.
+ mRemoteCarTaskView.getValue().setBackgroundColor(Color.RED);
+ }
+ }
+ }
+
+ private final class CarTaskViewControllerCallbackImpl implements CarTaskViewControllerCallback {
+ private final ControlledRemoteCarTaskViewCallback mControlledRemoteCarTaskViewCallback;
+
+ private CarTaskViewControllerCallbackImpl(
+ ControlledRemoteCarTaskViewCallback controlledRemoteCarTaskViewCallback) {
+ mControlledRemoteCarTaskViewCallback = controlledRemoteCarTaskViewCallback;
+ }
+
+ @Override
+ public void onConnected(@NonNull CarTaskViewController carTaskViewController) {
+ carTaskViewController.createControlledRemoteCarTaskView(
+ new ControlledRemoteCarTaskViewConfig.Builder()
+ .setActivityIntent(mMapsIntent)
+ .setShouldAutoRestartOnTaskRemoval(sAutoRestartOnCrash)
+ .build(),
+ mWindowContext.getMainExecutor(),
+ mControlledRemoteCarTaskViewCallback);
+ }
+
+ @Override
+ public void onDisconnected(@NonNull CarTaskViewController carTaskViewController) {
+ if (DEBUG) {
+ Log.d(TAG, "onDisconnected");
+ }
+ mRemoteCarTaskView.setValue(null);
+ }
+ }
+
+ static final class CarLauncherViewModelFactory implements ViewModelProvider.Factory {
+ private final Context mContext;
+ private final Intent mMapsIntent;
+
+ CarLauncherViewModelFactory(@UiContext Context context, @NonNull Intent mapsIntent) {
+ mMapsIntent = requireNonNull(mapsIntent);
+ mContext = requireNonNull(context);
+ }
+
+ @NonNull
+ @Override
+ public <T extends ViewModel> T create(Class<T> modelClass) {
+ return modelClass.cast(new CarLauncherViewModel(mContext, mMapsIntent));
+ }
+ }
+}
diff --git a/src/com/android/car/carlauncher/CarTaskView.java b/app/src/com/android/car/carlauncher/CarTaskView.java
index f5cf9a6d..5091ea24 100644
--- a/src/com/android/car/carlauncher/CarTaskView.java
+++ b/app/src/com/android/car/carlauncher/CarTaskView.java
@@ -47,6 +47,7 @@ import com.android.wm.shell.taskview.TaskViewTransitions;
* <li>b/225388469: Moves the embedded task to the top to make it resumed.</li>
* </ul>
*/
+
public class CarTaskView extends TaskView {
private static final String TAG = CarTaskView.class.getSimpleName();
@Nullable
diff --git a/src/com/android/car/carlauncher/CarTaskViewCallbacks.java b/app/src/com/android/car/carlauncher/CarTaskViewCallbacks.java
index 03edce5f..03edce5f 100644
--- a/src/com/android/car/carlauncher/CarTaskViewCallbacks.java
+++ b/app/src/com/android/car/carlauncher/CarTaskViewCallbacks.java
diff --git a/src/com/android/car/carlauncher/ControlBarActivity.java b/app/src/com/android/car/carlauncher/ControlBarActivity.java
index 7394d7f7..7394d7f7 100644
--- a/src/com/android/car/carlauncher/ControlBarActivity.java
+++ b/app/src/com/android/car/carlauncher/ControlBarActivity.java
diff --git a/src/com/android/car/carlauncher/ControlledCarTaskView.java b/app/src/com/android/car/carlauncher/ControlledCarTaskView.java
index b2b05312..b2b05312 100644
--- a/src/com/android/car/carlauncher/ControlledCarTaskView.java
+++ b/app/src/com/android/car/carlauncher/ControlledCarTaskView.java
diff --git a/src/com/android/car/carlauncher/ControlledCarTaskViewCallbacks.java b/app/src/com/android/car/carlauncher/ControlledCarTaskViewCallbacks.java
index 56ef8ea7..56ef8ea7 100644
--- a/src/com/android/car/carlauncher/ControlledCarTaskViewCallbacks.java
+++ b/app/src/com/android/car/carlauncher/ControlledCarTaskViewCallbacks.java
diff --git a/src/com/android/car/carlauncher/ControlledCarTaskViewConfig.java b/app/src/com/android/car/carlauncher/ControlledCarTaskViewConfig.java
index e07a0afa..e07a0afa 100644
--- a/src/com/android/car/carlauncher/ControlledCarTaskViewConfig.java
+++ b/app/src/com/android/car/carlauncher/ControlledCarTaskViewConfig.java
diff --git a/src/com/android/car/carlauncher/LaunchRootCarTaskView.java b/app/src/com/android/car/carlauncher/LaunchRootCarTaskView.java
index 3a5f154f..7f78a5c0 100644
--- a/src/com/android/car/carlauncher/LaunchRootCarTaskView.java
+++ b/app/src/com/android/car/carlauncher/LaunchRootCarTaskView.java
@@ -256,4 +256,22 @@ final class LaunchRootCarTaskView extends CarTaskView {
}
return topTask;
}
+
+ /**
+ * Updates the window visibility associated with the root task of this LaunchRootCarTaskView.
+ */
+ public void updateRootTaskVisibility(boolean visibility) {
+ if (mLaunchRootTask == null) {
+ return;
+ }
+ WindowContainerTransaction wct = new WindowContainerTransaction();
+ wct.setHidden(mLaunchRootTask.token, !visibility);
+ // TODO(304309584): remove showEmbeddedTask if better solution is found.
+ // Reorder the LaunchRootCarTaskView to avoid bringing host activity to the front when
+ // touching host activity.
+ if (!visibility) {
+ showEmbeddedTask(wct);
+ }
+ mSyncQueue.queue(wct);
+ }
}
diff --git a/src/com/android/car/carlauncher/LaunchRootCarTaskViewCallbacks.java b/app/src/com/android/car/carlauncher/LaunchRootCarTaskViewCallbacks.java
index e30ffe54..e30ffe54 100644
--- a/src/com/android/car/carlauncher/LaunchRootCarTaskViewCallbacks.java
+++ b/app/src/com/android/car/carlauncher/LaunchRootCarTaskViewCallbacks.java
diff --git a/src/com/android/car/carlauncher/RunnerWithBackoff.java b/app/src/com/android/car/carlauncher/RunnerWithBackoff.java
index 9e3ce14d..9e3ce14d 100644
--- a/src/com/android/car/carlauncher/RunnerWithBackoff.java
+++ b/app/src/com/android/car/carlauncher/RunnerWithBackoff.java
diff --git a/src/com/android/car/carlauncher/SemiControlledCarTaskView.java b/app/src/com/android/car/carlauncher/SemiControlledCarTaskView.java
index 3a7b650c..3a7b650c 100644
--- a/src/com/android/car/carlauncher/SemiControlledCarTaskView.java
+++ b/app/src/com/android/car/carlauncher/SemiControlledCarTaskView.java
diff --git a/src/com/android/car/carlauncher/SemiControlledCarTaskViewCallbacks.java b/app/src/com/android/car/carlauncher/SemiControlledCarTaskViewCallbacks.java
index 040356e3..040356e3 100644
--- a/src/com/android/car/carlauncher/SemiControlledCarTaskViewCallbacks.java
+++ b/app/src/com/android/car/carlauncher/SemiControlledCarTaskViewCallbacks.java
diff --git a/src/com/android/car/carlauncher/TaskViewInputInterceptor.java b/app/src/com/android/car/carlauncher/TaskViewInputInterceptor.java
index 12e771d2..12e771d2 100644
--- a/src/com/android/car/carlauncher/TaskViewInputInterceptor.java
+++ b/app/src/com/android/car/carlauncher/TaskViewInputInterceptor.java
diff --git a/src/com/android/car/carlauncher/TaskViewManager.java b/app/src/com/android/car/carlauncher/TaskViewManager.java
index ef762199..9d298567 100644
--- a/src/com/android/car/carlauncher/TaskViewManager.java
+++ b/app/src/com/android/car/carlauncher/TaskViewManager.java
@@ -67,6 +67,7 @@ import com.android.wm.shell.sysui.ShellCommandHandler;
import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.taskview.TaskViewTransitions;
+import com.android.wm.shell.transition.HomeTransitionObserver;
import com.android.wm.shell.transition.Transitions;
import java.util.ArrayList;
@@ -217,7 +218,8 @@ public final class TaskViewManager {
this(context, handlerExecutor, taskOrganizer,
new SyncTransactionQueue(transactionPool, handlerExecutor),
new Transitions(context, shellinit, shellController, taskOrganizer,
- transactionPool, dc, handlerExecutor, mainHandler, handlerExecutor),
+ transactionPool, dc, handlerExecutor, mainHandler, handlerExecutor,
+ new HomeTransitionObserver(context, handlerExecutor)),
shellinit,
shellController,
new StartingWindowController(context, shellinit,
@@ -292,7 +294,8 @@ public final class TaskViewManager {
DisplayController dc = new DisplayController(mContext,
WindowManagerGlobal.getWindowManagerService(), shellInit, mShellExecutor);
return new Transitions(mContext, shellInit, shellController, mTaskOrganizer,
- txPool, dc, mShellExecutor, mainHandler, mShellExecutor);
+ txPool, dc, mShellExecutor, mainHandler, mShellExecutor,
+ new HomeTransitionObserver(mContext, mShellExecutor));
}
private void initTaskOrganizer(AtomicReference<CarActivityManager> carActivityManagerRef) {
@@ -350,7 +353,7 @@ public final class TaskViewManager {
}
/**
- * updates the window visibility associated with {@link WindowContainerToken}
+ * Updates the window visibility associated with {@link WindowContainerToken}.
*
* @param token {@link WindowContainerToken} of the window that needs to be hidden
* @param visibility {true} if window needs to be displayed {false} otherwise
@@ -362,6 +365,19 @@ public final class TaskViewManager {
}
/**
+ * Updates the window visibility associated with the launch root task of
+ * {@link mLaunchRootCarTaskView}.
+ *
+ * @param visibility {true} if window needs to be displayed {false} otherwise
+ */
+ public void updateLaunchRootCarTaskVisibility(boolean visibility) {
+ if (mLaunchRootCarTaskView == null) {
+ return;
+ }
+ mLaunchRootCarTaskView.updateRootTaskVisibility(visibility);
+ }
+
+ /**
* Creates a {@link SemiControlledCarTaskView}.
*
* @param callbackExecutor the executor which the {@link SemiControlledCarTaskViewCallbacks}
@@ -584,12 +600,6 @@ public final class TaskViewManager {
* is a known SemiControlledCarTaskView.
*/
public void setAllowListedActivities(CarTaskView carTaskView, List<ComponentName> activities) {
- if (activities.size() == 0) {
- if (DBG) {
- Log.d(TAG, "No activity to remove from allowlist");
- }
- return;
- }
for (SemiControlledCarTaskView semiControlledCarTaskView: mSemiControlledTaskViews) {
if (semiControlledCarTaskView.equals(carTaskView)) {
semiControlledCarTaskView.setAllowListedActivities(activities);
diff --git a/app/src/com/android/car/carlauncher/calmmode/CalmModeActivity.java b/app/src/com/android/car/carlauncher/calmmode/CalmModeActivity.java
new file mode 100644
index 00000000..ce0f7d6e
--- /dev/null
+++ b/app/src/com/android/car/carlauncher/calmmode/CalmModeActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.car.carlauncher.R;
+
+public class CalmModeActivity extends FragmentActivity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.calm_mode_activity);
+ }
+}
diff --git a/app/src/com/android/car/carlauncher/calmmode/CalmModeFragment.java b/app/src/com/android/car/carlauncher/calmmode/CalmModeFragment.java
new file mode 100644
index 00000000..7af6fdd3
--- /dev/null
+++ b/app/src/com/android/car/carlauncher/calmmode/CalmModeFragment.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import static android.car.media.CarMediaManager.MEDIA_SOURCE_MODE_PLAYBACK;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.constraintlayout.widget.Group;
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.Transformations;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.android.car.carlauncher.R;
+import com.android.car.media.common.playback.PlaybackViewModel;
+
+public final class CalmModeFragment extends Fragment {
+ private static final String TAG = CalmModeFragment.class.getSimpleName();
+ private static final boolean DEBUG = Build.isDebuggable();
+ private View mContainerView;
+ private Group mMediaGroup;
+ private Group mNavGroup;
+ private Group mTemperatureGroup;
+ private TextView mMediaTitleView;
+ private TextView mNavStateView;
+ private TextView mTemperatureView;
+ private TextView mClockView;
+ private TextView mDateView;
+ private ViewModelProvider mViewModelProvider;
+ private TemperatureViewModel mTemperatureViewModel;
+ private LiveData<TemperatureData> mTemperatureData;
+ private PlaybackViewModel mPlaybackViewModel;
+
+ @Nullable
+ private NavigationStateViewModel mNavigationStateViewModel;
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ if (DEBUG) {
+ Log.v(TAG, "onCreateView");
+ }
+
+ View rootView = inflater.inflate(R.layout.calm_mode_fragment, container, false);
+ mViewModelProvider = new ViewModelProvider(getViewModelStore(),
+ new ViewModelProvider.AndroidViewModelFactory(requireActivity().getApplication()));
+
+ mContainerView = rootView.findViewById(R.id.calm_mode_container);
+ mClockView = rootView.findViewById(R.id.clock);
+ mDateView = rootView.findViewById(R.id.date);
+ mNavGroup = rootView.findViewById(R.id.nav_group);
+ mNavStateView = rootView.findViewById(R.id.nav_state);
+ mTemperatureGroup = rootView.findViewById(R.id.temperature_group);
+ mTemperatureView = rootView.findViewById(R.id.temperature);
+ mMediaGroup = rootView.findViewById(R.id.media_group);
+ mMediaTitleView = rootView.findViewById(R.id.media_title);
+
+ initExitOnClick();
+ initClock();
+ initDate();
+ initNavState();
+ initTemperature();
+ initMediaTitle();
+
+ return rootView;
+ }
+
+ private void initMediaTitle() {
+ if (DEBUG) {
+ Log.v(TAG, "initMediaTitle()");
+ }
+ if (shouldShowMedia()) {
+ mPlaybackViewModel = PlaybackViewModel.get(requireActivity().getApplication(),
+ MEDIA_SOURCE_MODE_PLAYBACK);
+ // Transform LiveData from MediaItemMetadata into a media title CharSequence
+ // If MediaItemMetadata is null, media title value will be null
+ LiveData<CharSequence> mediaTitleLiveData = Transformations.map(
+ mPlaybackViewModel.getMetadata(), mediaItemMetadata ->
+ mediaItemMetadata == null ? null : mediaItemMetadata.getTitle());
+ mediaTitleLiveData.observe(this, this::updateMediaTitle);
+ }
+ }
+
+ private void initTemperature() {
+ if (DEBUG) {
+ Log.v(TAG, "initTemperature()");
+ }
+ if (shouldShowTemperature()) {
+ mTemperatureViewModel = mViewModelProvider.get(TemperatureViewModel.class);
+ mTemperatureData = mTemperatureViewModel.getTemperatureData();
+ mTemperatureData.observe(getViewLifecycleOwner(), this::updateTemperatureData);
+ }
+ }
+
+ private void initDate() {
+ if (DEBUG) {
+ Log.v(TAG, "initDate()");
+ }
+ if (shouldShowDate()) {
+ mDateView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void initClock() {
+ if (DEBUG) {
+ Log.v(TAG, "initClock()");
+ }
+ if (shouldShowClock()) {
+ mClockView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void initExitOnClick() {
+ if (DEBUG) {
+ Log.v(TAG, "initExitOnTouch()");
+ }
+ mContainerView.setOnClickListener((view) -> {
+ if (DEBUG) {
+ Log.v(TAG, "Detected touch, exiting Calm mode");
+ }
+ if (getActivity() != null) {
+ getActivity().finish();
+ }
+ });
+ }
+
+ private void initNavState() {
+ if (DEBUG) {
+ Log.v(TAG, "initNavState()");
+ }
+
+ if (shouldShowNavigation()) {
+ mNavigationStateViewModel = mViewModelProvider.get(NavigationStateViewModel.class);
+ mNavigationStateViewModel
+ .getNavigationState()
+ .observe(this, this::updateNavigationState);
+ }
+ }
+
+ private boolean shouldShowMedia() {
+ return getResources().getBoolean(R.bool.config_calmMode_showMedia);
+ }
+
+ private boolean shouldShowTemperature() {
+ return getResources().getBoolean(R.bool.config_calmMode_showTemperature);
+ }
+
+ private boolean shouldShowClock() {
+ return getResources().getBoolean(R.bool.config_calmMode_showClock);
+ }
+
+ private boolean shouldShowDate() {
+ return getResources().getBoolean(R.bool.config_calmMode_showDate);
+ }
+
+ private boolean shouldShowNavigation() {
+ return getResources().getBoolean(R.bool.config_calmMode_showNavigation);
+ }
+
+ private void updateTemperatureData(@Nullable TemperatureData temperatureData) {
+ if (temperatureData == null) {
+ mTemperatureGroup.setVisibility(View.GONE);
+ mTemperatureView.setText("");
+ return;
+ }
+ mTemperatureGroup.setVisibility(View.VISIBLE);
+ mTemperatureView.setText(
+ TemperatureData.buildTemperatureString(
+ temperatureData, getResources().getConfiguration().getLocales().get(0)));
+ }
+
+ private void updateNavigationState(NavigationStateData navState) {
+ if (DEBUG) {
+ Log.v(TAG, "updateNavigationState navState = " + navState);
+ }
+
+ if (navState == null) {
+ mNavGroup.setVisibility(View.GONE);
+ mNavStateView.setText(null);
+ return;
+ }
+
+ mNavGroup.setVisibility(View.VISIBLE);
+ mNavStateView.setText(
+ NavigationStateData.buildTripStatusString(navState,
+ getResources().getConfiguration().getLocales().get(0)));
+ }
+
+ @VisibleForTesting
+ void updateMediaTitle(CharSequence mediaTitle) {
+ if (DEBUG) {
+ Log.v(TAG, "updateMediaTitle mediaTitle = " + mediaTitle);
+ }
+
+ if (mediaTitle == null || mediaTitle.length() == 0) {
+ mMediaGroup.setVisibility(View.GONE);
+ mMediaTitleView.setText("");
+ return;
+ }
+ mMediaGroup.setVisibility(View.VISIBLE);
+ mMediaTitleView.setText(mediaTitle);
+ }
+}
diff --git a/app/src/com/android/car/carlauncher/calmmode/CalmModeQCProvider.java b/app/src/com/android/car/carlauncher/calmmode/CalmModeQCProvider.java
new file mode 100644
index 00000000..a4be84a1
--- /dev/null
+++ b/app/src/com/android/car/carlauncher/calmmode/CalmModeQCProvider.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import android.app.PendingIntent;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.net.Uri;
+import android.os.Build;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.carlauncher.Flags;
+import com.android.car.carlauncher.R;
+import com.android.car.qc.QCItem;
+import com.android.car.qc.QCList;
+import com.android.car.qc.QCRow;
+import com.android.car.qc.provider.BaseQCProvider;
+
+import java.util.Set;
+
+/**
+ * Remote Quick Control provider for Calm mode in CarLauncher.
+ */
+public class CalmModeQCProvider extends BaseQCProvider {
+ private static final boolean DEBUG = Build.IS_DEBUGGABLE;
+ public static final String AUTHORITY = "com.android.car.carlauncher.calmmode";
+ private static final String TAG = CalmModeQCProvider.class.getSimpleName();
+
+ private static final String CALM_MODE_SEGMENT = "calm_mode";
+ // Start Uris
+ public static final Uri CALM_MODE_URI = new Uri.Builder().scheme(
+ ContentResolver.SCHEME_CONTENT)
+ .authority(AUTHORITY)
+ .appendPath(CALM_MODE_SEGMENT)
+ .build();
+ private Set<String> mAllowListedPackages;
+ private Context mContext;
+ @VisibleForTesting
+ QCItem mQCItem;
+
+ /**
+ * Returns a uri without its parameters (or null if the provided uri is null).
+ */
+ public static Uri removeParameterFromUri(Uri uri) {
+ return uri != null ? uri.buildUpon().clearQuery().build() : null;
+ }
+
+ @Override
+ public boolean onCreate() {
+ if (!Flags.calmMode()) {
+ return false;
+ }
+ boolean returnVal = super.onCreate();
+ if (DEBUG) {
+ Log.v(TAG, "onCreate() returnVal " + returnVal);
+ }
+ mAllowListedPackages = Set.of(getContext().getResources().getStringArray(
+ R.array.launcher_qc_provider_package_allowlist));
+ mContext = getContext();
+ mQCItem = getQCItem();
+ return returnVal;
+ }
+
+ @Override
+ public QCItem onBind(Uri uri) {
+ if (!Flags.calmMode()) {
+ return null;
+ }
+ boolean isValidCalmModeURI = removeParameterFromUri(uri).equals(CALM_MODE_URI);
+ if (DEBUG) {
+ Log.v(TAG, "onBind() uri=" + uri + ", isValidCalmModeURI= " + isValidCalmModeURI);
+ }
+
+ if (!isValidCalmModeURI) {
+ throw new IllegalArgumentException("No QCItem found for uri: " + uri);
+ }
+ return mQCItem;
+ }
+
+ @Override
+ protected Set<String> getAllowlistedPackages() {
+ return mAllowListedPackages;
+ }
+
+ @VisibleForTesting
+ QCItem getQCItem() {
+ Resources resources = mContext.getResources();
+ String packageName = resources.getString(R.string.config_calmMode_packageName);
+ String activityName = resources.getString(R.string.config_calmMode_activityName);
+
+ Intent intent = new Intent();
+ intent.setClassName(packageName, activityName);
+ PendingIntent ambientModeIntent = PendingIntent.getActivity(mContext, 0, intent,
+ PendingIntent.FLAG_IMMUTABLE);
+
+ QCRow calmModeRow = new QCRow.Builder()
+ .setTitle(mContext.getString(R.string.calm_mode_title))
+ .setPrimaryAction(ambientModeIntent)
+ .build();
+
+ return new QCList.Builder().addRow(calmModeRow).build();
+ }
+}
diff --git a/app/src/com/android/car/carlauncher/calmmode/NavigationStateData.java b/app/src/com/android/car/carlauncher/calmmode/NavigationStateData.java
new file mode 100644
index 00000000..632a1127
--- /dev/null
+++ b/app/src/com/android/car/carlauncher/calmmode/NavigationStateData.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import android.car.cluster.navigation.NavigationState;
+import android.icu.number.Notation;
+import android.icu.number.NumberFormatter;
+import android.icu.number.Precision;
+import android.icu.util.MeasureUnit;
+import android.os.Build;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.Locale;
+
+public class NavigationStateData {
+ private static final boolean DEBUG = Build.isDebuggable();
+ private static final String TAG = NavigationStateData.class.getSimpleName();
+ private static final String SEPARATOR = " ";
+ @NonNull
+ private final String mTimeToDestination;
+
+ private double mDistanceToDestination;
+ @NonNull
+ private MeasureUnit mDistanceUnit;
+ private NavigationStateData(
+ @NonNull String timeToDestination,
+ double distanceToDestination,
+ @NonNull MeasureUnit distanceUnit) {
+ this.mTimeToDestination = timeToDestination;
+ this.mDistanceToDestination = distanceToDestination;
+ this.mDistanceUnit = distanceUnit;
+ }
+
+ /**
+ * @return new Builder instance for creating NavigationStateData
+ */
+ @NonNull
+ public static Builder newBuilder() {
+ return new Builder();
+ }
+
+ /**
+ * @param navigationState NavigationStateData to use for building Trip Status string
+ * @param locale Locale to build Trip Status string
+ * @return String representing trip status with time and distance to next destination,
+ * returns null if arguments are invalid, uses default locale if input Locale is null
+ */
+ @Nullable
+ public static String buildTripStatusString(
+ @NonNull NavigationStateData navigationState, @NonNull Locale locale) {
+
+ if (navigationState == null
+ || navigationState.getTimeToDestination() == null
+ || navigationState.getDistanceUnit() == null) {
+ if (DEBUG) {
+ Log.w(
+ TAG,
+ "buildTripStatusString: invalid argument navigationState= "
+ + navigationState
+ + ", returning null");
+ }
+ return null;
+ }
+ if (locale == null) {
+ if (DEBUG) {
+ Log.w(TAG, "buildTripStatusString: locale is null, returning null");
+ }
+ locale = Locale.getDefault();
+ }
+ StringBuilder navStateTextBuilder = new StringBuilder();
+ navStateTextBuilder.append(navigationState.getTimeToDestination());
+ navStateTextBuilder.append(SEPARATOR);
+ navStateTextBuilder.append(NumberFormatter.withLocale(locale)
+ .notation(Notation.compactShort())
+ .precision(Precision.integer())
+ .unit(navigationState.getDistanceUnit())
+ .format(navigationState.getDistanceToDestination())
+ .toString());
+ return navStateTextBuilder.toString();
+ }
+
+ @NonNull
+ public String getTimeToDestination() {
+ return mTimeToDestination;
+ }
+
+ public double getDistanceToDestination() {
+ return mDistanceToDestination;
+ }
+ @NonNull
+ public MeasureUnit getDistanceUnit() {
+ return mDistanceUnit;
+ }
+
+ @Override
+ public String toString() {
+ return "NavigationStateData{"
+ + " timeToDestination='" + mTimeToDestination + '\''
+ + ", distanceToDestination=" + mDistanceToDestination
+ + ", distanceUnit=" + mDistanceUnit
+ + '}';
+ }
+
+ public static class Builder {
+ private String mTimeToDestination;
+ private double mDistanceToDestination;
+ private MeasureUnit mDistanceUnit;
+
+ /**
+ * @param timeToDestination String representation of time remaining to next destination
+ * Example: 1hr 52min
+ * @return {@link Builder} object
+ */
+ public Builder setTimeToDestination(@NonNull String timeToDestination) {
+ this.mTimeToDestination = timeToDestination;
+ return this;
+ }
+
+ /**
+ * @param distanceToDestination String representation of distance remaining to next
+ * destination. Example: "20" This is designed to be compatible with {@link
+ * android.car.cluster.navigation.NavigationState.Distance}
+ * @return {@link Builder} object
+ * @throws NumberFormatException if the {@code distanceToDestination} is not a
+ * number
+ */
+ public Builder setDistanceToDestination(@NonNull String distanceToDestination)
+ throws NumberFormatException {
+ this.mDistanceToDestination = Double.parseDouble(distanceToDestination);
+ return this;
+ }
+
+ /**
+ * @param distanceUnit {@link NavigationState.Distance.Unit} Unit for distance
+ * @return {@link Builder} object
+ * @throws IllegalArgumentException if the {@code distanceUnit} is not a recognized
+ * {@link NavigationState.Distance.Unit}
+ */
+ public Builder setDistanceUnit(@NonNull NavigationState.Distance.Unit distanceUnit)
+ throws IllegalArgumentException {
+ MeasureUnit unit = null;
+ switch (distanceUnit) {
+ case FEET: unit = MeasureUnit.FOOT; break;
+ case YARDS: unit = MeasureUnit.YARD; break;
+ case KILOMETERS: unit = MeasureUnit.KILOMETER; break;
+ case METERS: unit = MeasureUnit.METER; break;
+ case MILES: unit = MeasureUnit.MILE; break;
+ default: break;
+ }
+ if (unit == null) {
+ throw new IllegalArgumentException("Unrecognized NavigationState.Distance.Unit, "
+ + "unable to create NavigationStateData.Builder");
+ }
+ this.mDistanceUnit = unit;
+ return this;
+ }
+
+ /** Builds a {@link NavigationStateData}
+ * @return {@link NavigationStateData} object
+ */
+ @NonNull
+ public NavigationStateData build() {
+ return new NavigationStateData(
+ mTimeToDestination, mDistanceToDestination, mDistanceUnit);
+ }
+
+ }
+
+}
diff --git a/app/src/com/android/car/carlauncher/calmmode/NavigationStateViewModel.java b/app/src/com/android/car/carlauncher/calmmode/NavigationStateViewModel.java
new file mode 100644
index 00000000..225207e1
--- /dev/null
+++ b/app/src/com/android/car/carlauncher/calmmode/NavigationStateViewModel.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import android.app.Application;
+import android.car.Car;
+import android.car.cluster.ClusterHomeManager;
+import android.car.cluster.navigation.NavigationState;
+import android.os.Build;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+
+/**
+ * ViewModel class for showing trip status on Calm mode
+ * This class exposes a {@link androidx.lifecycle.LiveData} for {@link NavigationStateData}
+*/
+public class NavigationStateViewModel extends AndroidViewModel
+ implements ClusterHomeManager.ClusterNavigationStateListener {
+ private static final boolean DEBUG = Build.isDebuggable();
+ private static final String TAG = NavigationStateViewModel.class.getSimpleName();
+ private final MutableLiveData<NavigationStateData> mNavStateData = new MutableLiveData<>();
+ private ClusterHomeManager mClusterHomeManager;
+ private Car mCar;
+
+ public NavigationStateViewModel(@NonNull Application application) {
+ super(application);
+ mCar = Car.createCar(application);
+ if (mCar == null) {
+ if (DEBUG) {
+ Log.w(TAG, "Car is null, unable to get ClusterHomeManager.");
+ }
+ return;
+ }
+ mClusterHomeManager = (ClusterHomeManager) mCar.getCarManager(Car.CLUSTER_HOME_SERVICE);
+ if (mClusterHomeManager == null) {
+ if (DEBUG) {
+ Log.w(TAG, "ClusterHomeManager is null,"
+ + " unable to registerClusterNavigationStateListener.");
+ }
+ return;
+ }
+ mClusterHomeManager.registerClusterNavigationStateListener(
+ application.getMainExecutor(), this);
+ }
+
+
+ @Override
+ public void onNavigationState(byte[] navigationStateByteArr) {
+ if (DEBUG) {
+ Log.v(TAG, "ClusterNavigationStateListener onNavigationState");
+ }
+ NavigationState.NavigationStateProto navigationStateProto;
+ try {
+ navigationStateProto =
+ NavigationState.NavigationStateProto.parseFrom(navigationStateByteArr);
+ } catch (InvalidProtocolBufferException e) {
+ if (DEBUG) {
+ Log.e(TAG, "Unable to parse navigation state proto. " + e);
+ }
+ mNavStateData.setValue(null);
+ return;
+ }
+ if (DEBUG) {
+ Log.v(TAG, "onNavigationState: navigationStateProto = " + navigationStateProto);
+ }
+ if (navigationStateProto == null || navigationStateProto.getDestinationsCount() == 0) {
+ mNavStateData.setValue(null);
+ return;
+ }
+
+ NavigationState.Destination nextDestination = navigationStateProto.getDestinations(0);
+
+ if (!nextDestination.hasDistance()) {
+ mNavStateData.setValue(null);
+ return;
+ }
+
+ try {
+ NavigationStateData.Builder navStateDataBuilder =
+ NavigationStateData.newBuilder()
+ .setTimeToDestination(
+ nextDestination.getFormattedDurationUntilArrival())
+ .setDistanceToDestination(
+ nextDestination.getDistance().getDisplayValue())
+ .setDistanceUnit(nextDestination.getDistance().getDisplayUnits());
+
+ mNavStateData.setValue(navStateDataBuilder.build());
+ } catch (Exception e) {
+ if (DEBUG) {
+ Log.e(TAG, "Unable to create NavigationStateData " + e);
+ }
+ mNavStateData.setValue(null);
+ }
+ }
+
+ @Override
+ protected void onCleared() {
+ super.onCleared();
+ if (DEBUG) {
+ Log.v(TAG, "onCleared()");
+ }
+ if (mCar != null) {
+ mCar.disconnect();
+ }
+ if (mClusterHomeManager != null) {
+ mClusterHomeManager.unregisterClusterNavigationStateListener(this);
+ }
+ }
+
+ public LiveData<NavigationStateData> getNavigationState() {
+ return mNavStateData;
+ }
+}
diff --git a/app/src/com/android/car/carlauncher/calmmode/TemperatureData.java b/app/src/com/android/car/carlauncher/calmmode/TemperatureData.java
new file mode 100644
index 00000000..a26ba0a1
--- /dev/null
+++ b/app/src/com/android/car/carlauncher/calmmode/TemperatureData.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import android.icu.number.Notation;
+import android.icu.number.NumberFormatter;
+import android.icu.number.Precision;
+import android.icu.util.MeasureUnit;
+import android.os.Build;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import java.util.Locale;
+
+/**
+ * Class used to represent temperature
+ * <p>Contains a {@code float value} and {@link MeasureUnit unit}
+ * <p>Use {@link Builder} to create an instance of {@link TemperatureData}
+ */
+public class TemperatureData {
+
+ private static final String TAG = TemperatureData.class.getSimpleName();
+ private static final boolean DEBUG = Build.isDebuggable();
+ private float mValue;
+ @NonNull
+ private MeasureUnit mUnit;
+
+ private TemperatureData(float value, @NonNull MeasureUnit unit) {
+ this.mValue = value;
+ this.mUnit = unit;
+ }
+
+ /**
+ * @param temperatureData temperature data
+ * @param locale locale to use for creating string
+ * @return compact string representation of the value based on the locale
+ */
+ @NonNull
+ public static String buildTemperatureString(
+ @NonNull TemperatureData temperatureData, @NonNull Locale locale) {
+ return NumberFormatter.withLocale(locale)
+ .notation(Notation.compactShort())
+ .precision(Precision.integer())
+ .unit(temperatureData.getUnit())
+ .format(temperatureData.getValue())
+ .toString();
+ }
+
+ /**
+ * Converts temperature value from Celsius to Fahrenheit
+ *
+ * @param temperatureInCelsius temperature value in Celsius
+ * @return temperature value in Fahrenheit
+ */
+ public static float convertCelsiusToFahrenheit(float temperatureInCelsius) {
+ return (temperatureInCelsius * 9f / 5f) + 32;
+ }
+
+ /**
+ * Converts temperature value from Fahrenheit to Celsius
+ *
+ * @param temperatureInFahrenheit temperature value in Fahrenheit
+ * @return temperature value in Celsius
+ */
+ public static float convertFahrenheitToCelsius(float temperatureInFahrenheit) {
+ return (temperatureInFahrenheit - 32) * 5f / 9f;
+ }
+
+ public float getValue() {
+ return mValue;
+ }
+
+ @NonNull
+ public MeasureUnit getUnit() {
+ return mUnit;
+ }
+
+ @Override
+ public String toString() {
+ return "TemperatureData{" + "value=" + mValue + ", unit=" + mUnit + '}';
+ }
+
+
+ /** Converts the value and changes unit from Fahrenheit to Celsius,
+ * does nothing if unit is already Celsius
+ */
+ public void convertToFahrenheit() {
+ if (mUnit == MeasureUnit.CELSIUS) {
+ mValue = convertCelsiusToFahrenheit(mValue);
+ mUnit = MeasureUnit.FAHRENHEIT;
+ return;
+ }
+ // no-op if unit is already FAHRENHEIT
+ if (DEBUG) {
+ Log.v(TAG, "Unit is already FAHRENHEIT. No conversion performed.");
+ }
+ }
+
+ /** Converts the value and changes unit to Fahrenheit,
+ * does nothing if unit is already Fahrenheit
+ */
+ public void convertToCelsius() {
+ if (mUnit == MeasureUnit.FAHRENHEIT) {
+ mValue = convertFahrenheitToCelsius(mValue);
+ mUnit = MeasureUnit.CELSIUS;
+ }
+ // no-op if unit is already CELSIUS
+ if (DEBUG) {
+ Log.v(TAG, "Unit is already CELSIUS. No conversion performed.");
+ }
+ }
+
+ public static final class Builder {
+
+ private float mValue;
+ @NonNull private MeasureUnit mUnit = MeasureUnit.CELSIUS;
+
+ private Builder(float mValue, @NonNull MeasureUnit mUnit) {
+ this.mValue = mValue;
+ this.mUnit = mUnit;
+ }
+
+ public Builder() {}
+
+ /**
+ * @param data TemperatureData object used to create Builder
+ * @return TemperatureData.Builder object
+ */
+ @NonNull
+ public static Builder from(TemperatureData data) {
+ return new Builder(data.getValue(), data.getUnit());
+ }
+
+ /**
+ * @param temperatureCelsius temperature value in degrees Celsius
+ * @return {@link Builder builder}
+ */
+ Builder setValueCelsius(float temperatureCelsius) {
+ mValue = temperatureCelsius;
+ mUnit = MeasureUnit.CELSIUS;
+ return this;
+ }
+
+ Builder setValueFahrenheit(float temperatureFahrenheit) {
+ mValue = temperatureFahrenheit;
+ mUnit = MeasureUnit.FAHRENHEIT;
+ return this;
+ }
+
+ TemperatureData build() {
+ return new TemperatureData(mValue, mUnit);
+ }
+ }
+}
diff --git a/app/src/com/android/car/carlauncher/calmmode/TemperatureViewModel.java b/app/src/com/android/car/carlauncher/calmmode/TemperatureViewModel.java
new file mode 100644
index 00000000..a9ce88b0
--- /dev/null
+++ b/app/src/com/android/car/carlauncher/calmmode/TemperatureViewModel.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import android.app.Application;
+import android.car.Car;
+import android.car.VehicleAreaSeat;
+import android.car.VehiclePropertyIds;
+import android.car.VehicleUnit;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.property.CarPropertyManager;
+import android.icu.util.MeasureUnit;
+import android.os.Build;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
+
+
+public class TemperatureViewModel extends AndroidViewModel
+ implements CarPropertyManager.CarPropertyEventCallback {
+ private static final boolean DEBUG = Build.isDebuggable();
+ private static final String TAG = TemperatureViewModel.class.getSimpleName();
+ private Car mCar;
+ private CarPropertyManager mPropertyManager;
+ private MutableLiveData<TemperatureData> mTemperatureData = new MutableLiveData<>();
+
+ private boolean mIsTemperatureSet;
+ private float mValue;
+ private MeasureUnit mUnit;
+ public TemperatureViewModel(@NonNull Application application) {
+ super(application);
+ mCar = Car.createCar(application);
+ mPropertyManager = mCar.getCarManager(CarPropertyManager.class);
+ // Listen for changes
+ mPropertyManager.registerCallback(this, VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS,
+ CarPropertyManager.SENSOR_RATE_ONCHANGE);
+ mPropertyManager.registerCallback(this, VehiclePropertyIds.ENV_OUTSIDE_TEMPERATURE,
+ CarPropertyManager.SENSOR_RATE_ONCHANGE);
+
+ }
+
+ @Override
+ protected void onCleared() {
+ super.onCleared();
+ if (DEBUG) {
+ Log.v(TAG, "onCleared()");
+ }
+ if (mCar != null && mCar.isConnected()) {
+ mCar.disconnect();
+ mCar = null;
+ }
+ if (mPropertyManager != null) {
+ mPropertyManager.unregisterCallback(this,
+ VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS);
+ mPropertyManager.unregisterCallback(this,
+ VehiclePropertyIds.ENV_OUTSIDE_TEMPERATURE);
+ mPropertyManager = null;
+ }
+ }
+
+ /**
+ * @return CarPropertyValue for VehicleAreaSeat.SEAT_UNKNOWN or null if CarPropertyManager is
+ * not initialized
+ */
+ @VisibleForTesting
+ @Nullable
+ CarPropertyValue getCarPropertyValue(int propertyId) {
+ if (mPropertyManager == null) {
+ return null;
+ }
+ return mPropertyManager.getProperty(propertyId, mPropertyManager.getAreaId(
+ propertyId, VehicleAreaSeat.SEAT_UNKNOWN));
+ }
+
+ @Override
+ public void onChangeEvent(CarPropertyValue carPropertyValue) {
+ if (DEBUG) {
+ Log.v(TAG, "onChangeEvent(carPropertyValue=" + carPropertyValue + ")");
+ }
+ if (carPropertyValue == null) {
+ return;
+ }
+ if (carPropertyValue.getPropertyId() == VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS) {
+ handleUnitChange(carPropertyValue);
+ } else if (carPropertyValue.getPropertyId() == VehiclePropertyIds.ENV_OUTSIDE_TEMPERATURE) {
+ handleValueChange(carPropertyValue);
+ }
+ }
+
+ @VisibleForTesting
+ void handleUnitChange(CarPropertyValue<Integer> newVehicleUnit) {
+ if (newVehicleUnit.getValue() != VehicleUnit.FAHRENHEIT
+ && newVehicleUnit.getValue() != VehicleUnit.CELSIUS) {
+ if (DEBUG) {
+ Log.d(TAG, "handleUnitChange: Invalid temperature unit received");
+ }
+ return;
+ }
+ MeasureUnit newMeasureUnit =
+ newVehicleUnit.getValue() == VehicleUnit.FAHRENHEIT
+ ? MeasureUnit.FAHRENHEIT : MeasureUnit.CELSIUS;
+ if (mUnit == newMeasureUnit) {
+ return;
+ }
+ // If temperature value has been set previously and unit has changed,
+ // convert value and post update
+ if (mIsTemperatureSet) {
+ TemperatureData temperatureData;
+ if (mUnit == MeasureUnit.FAHRENHEIT) {
+ temperatureData = new TemperatureData.Builder().setValueFahrenheit(mValue).build();
+ temperatureData.convertToCelsius();
+ } else {
+ temperatureData = new TemperatureData.Builder().setValueCelsius(mValue).build();
+ temperatureData.convertToFahrenheit();
+ }
+ mTemperatureData.setValue(temperatureData);
+ }
+ mUnit = newMeasureUnit;
+ }
+
+ @VisibleForTesting
+ void handleValueChange(CarPropertyValue<Float> newValue) {
+ if (mIsTemperatureSet && mValue == newValue.getValue()) {
+ return;
+ }
+ // Outside temperature is always received in celsius, assign default
+ if (mUnit == null) {
+ mUnit = MeasureUnit.CELSIUS;
+ }
+ TemperatureData temperatureData =
+ new TemperatureData.Builder().setValueCelsius(newValue.getValue()).build();
+ if (mUnit != MeasureUnit.CELSIUS) {
+ temperatureData.convertToFahrenheit();
+ }
+ mTemperatureData.setValue(temperatureData);
+ mValue = newValue.getValue();
+ if (!mIsTemperatureSet) {
+ mIsTemperatureSet = true;
+ }
+ }
+
+ @Override
+ public void onErrorEvent(int propertyId, int areaId) {
+ if (DEBUG) {
+ Log.w(TAG, "onErrorEvent(propertyId=" + propertyId + ", areaId=" + areaId);
+ }
+ mTemperatureData.setValue(null);
+ }
+
+ public LiveData<TemperatureData> getTemperatureData() {
+ return mTemperatureData;
+ }
+}
diff --git a/src/com/android/car/carlauncher/homescreen/CardPresenter.java b/app/src/com/android/car/carlauncher/homescreen/CardPresenter.java
index b63e6c3f..b63e6c3f 100644
--- a/src/com/android/car/carlauncher/homescreen/CardPresenter.java
+++ b/app/src/com/android/car/carlauncher/homescreen/CardPresenter.java
diff --git a/src/com/android/car/carlauncher/homescreen/HomeCardFragment.java b/app/src/com/android/car/carlauncher/homescreen/HomeCardFragment.java
index 3a09a00f..51a1eb3c 100644
--- a/src/com/android/car/carlauncher/homescreen/HomeCardFragment.java
+++ b/app/src/com/android/car/carlauncher/homescreen/HomeCardFragment.java
@@ -18,6 +18,7 @@ package com.android.car.carlauncher.homescreen;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.util.Log;
import android.util.Size;
import android.view.LayoutInflater;
import android.view.View;
@@ -28,6 +29,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
import com.android.car.apps.common.CrossfadeImageView;
import com.android.car.carlauncher.R;
@@ -51,6 +53,8 @@ import com.android.internal.util.ArrayUtils;
*/
public class HomeCardFragment extends Fragment implements HomeCardInterface.View {
+ private static final String TAG = HomeCardFragment.class.getSimpleName();
+
private Size mSize;
private View mCardBackground;
private CrossfadeImageView mCardBackgroundImage;
@@ -192,7 +196,12 @@ public class HomeCardFragment extends Fragment implements HomeCardInterface.View
* Updates the card's header: name and icon of source app
*/
public void updateHeaderView(CardHeader header) {
- requireActivity().runOnUiThread(() -> {
+ FragmentActivity activity = getActivity();
+ if (activity == null) {
+ Log.w(TAG, "attempting to update header without activity");
+ return;
+ }
+ activity.runOnUiThread(() -> {
mRootView.setVisibility(View.VISIBLE);
mCardTitle.setText(header.getCardTitle());
mCardIcon.setImageDrawable(header.getCardIcon());
@@ -203,7 +212,12 @@ public class HomeCardFragment extends Fragment implements HomeCardInterface.View
* Updates the card's content
*/
public final void updateContentView(CardContent content) {
- requireActivity().runOnUiThread(() -> {
+ FragmentActivity activity = getActivity();
+ if (activity == null) {
+ Log.w(TAG, "attempting to update content without activity");
+ return;
+ }
+ activity.runOnUiThread(() -> {
hideAllViews();
updateContentViewInternal(content);
});
diff --git a/src/com/android/car/carlauncher/homescreen/HomeCardInterface.java b/app/src/com/android/car/carlauncher/homescreen/HomeCardInterface.java
index 5b424365..5b424365 100644
--- a/src/com/android/car/carlauncher/homescreen/HomeCardInterface.java
+++ b/app/src/com/android/car/carlauncher/homescreen/HomeCardInterface.java
diff --git a/src/com/android/car/carlauncher/homescreen/HomeCardModule.java b/app/src/com/android/car/carlauncher/homescreen/HomeCardModule.java
index 8658edd0..8658edd0 100644
--- a/src/com/android/car/carlauncher/homescreen/HomeCardModule.java
+++ b/app/src/com/android/car/carlauncher/homescreen/HomeCardModule.java
diff --git a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardModule.java b/app/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardModule.java
index 4243cfad..4243cfad 100644
--- a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardModule.java
+++ b/app/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardModule.java
diff --git a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java b/app/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java
index 58c95021..58c95021 100644
--- a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java
+++ b/app/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java
diff --git a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java b/app/src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java
index a4b3ac00..a4b3ac00 100644
--- a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java
+++ b/app/src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java
diff --git a/src/com/android/car/carlauncher/homescreen/assistive/FakeWeatherModel.java b/app/src/com/android/car/carlauncher/homescreen/assistive/FakeWeatherModel.java
index 75c721cc..75c721cc 100644
--- a/src/com/android/car/carlauncher/homescreen/assistive/FakeWeatherModel.java
+++ b/app/src/com/android/car/carlauncher/homescreen/assistive/FakeWeatherModel.java
diff --git a/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java b/app/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java
index cb6491e7..cb6491e7 100644
--- a/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java
+++ b/app/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java
diff --git a/src/com/android/car/carlauncher/homescreen/audio/AudioCardModule.java b/app/src/com/android/car/carlauncher/homescreen/audio/AudioCardModule.java
index 6ffb6925..6ffb6925 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/AudioCardModule.java
+++ b/app/src/com/android/car/carlauncher/homescreen/audio/AudioCardModule.java
diff --git a/src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java b/app/src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java
index 25abd144..af9db40b 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java
+++ b/app/src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java
@@ -20,6 +20,7 @@ import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.TextUtils;
+import android.util.Log;
import android.util.Size;
import android.view.View;
import android.view.ViewGroup;
@@ -29,6 +30,8 @@ import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;
+import androidx.fragment.app.FragmentActivity;
+
import com.android.car.apps.common.BitmapUtils;
import com.android.car.apps.common.ImageUtils;
import com.android.car.carlauncher.R;
@@ -56,6 +59,8 @@ public class AudioFragment extends HomeCardFragment {
void onMediaViewInitialized();
}
+ private static final String TAG = AudioFragment.class.getSimpleName();
+
private Chronometer mChronometer;
private View mChronometerSeparator;
private float mBlurRadius;
@@ -251,7 +256,12 @@ public class AudioFragment extends HomeCardFragment {
* Updates the seekbar/progress bar progress and times
*/
public void updateProgress(SeekBarViewModel seekBarViewModel, boolean updateProgress) {
- requireActivity().runOnUiThread(() -> {
+ FragmentActivity activity = getActivity();
+ if (activity == null) {
+ Log.w(TAG, "attempting to update progress without activity");
+ return;
+ }
+ activity.runOnUiThread(() -> {
updateSeekBarAndTimes(seekBarViewModel, updateProgress);
});
}
diff --git a/src/com/android/car/carlauncher/homescreen/audio/AudioModel.java b/app/src/com/android/car/carlauncher/homescreen/audio/AudioModel.java
index 1d1409b7..1d1409b7 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/AudioModel.java
+++ b/app/src/com/android/car/carlauncher/homescreen/audio/AudioModel.java
diff --git a/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java b/app/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java
index 95799757..95799757 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java
+++ b/app/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java
diff --git a/src/com/android/car/carlauncher/homescreen/audio/InCallModel.java b/app/src/com/android/car/carlauncher/homescreen/audio/InCallModel.java
index a36c0409..a36c0409 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/InCallModel.java
+++ b/app/src/com/android/car/carlauncher/homescreen/audio/InCallModel.java
diff --git a/src/com/android/car/carlauncher/homescreen/audio/InCallServiceManagerProvider.java b/app/src/com/android/car/carlauncher/homescreen/audio/InCallServiceManagerProvider.java
index 0121692f..0121692f 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/InCallServiceManagerProvider.java
+++ b/app/src/com/android/car/carlauncher/homescreen/audio/InCallServiceManagerProvider.java
diff --git a/src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java b/app/src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java
index 21c347a0..5becb9f4 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java
+++ b/app/src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java
@@ -33,7 +33,6 @@ import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.Observer;
import com.android.car.apps.common.imaging.ImageBinder;
-import com.android.car.carlauncher.AppLauncherUtils;
import com.android.car.carlauncher.homescreen.HomeCardInterface;
import com.android.car.carlauncher.homescreen.ui.CardContent;
import com.android.car.carlauncher.homescreen.ui.CardHeader;
@@ -132,6 +131,7 @@ public class MediaViewModel extends AndroidViewModel implements AudioModel {
super(application);
mSourceViewModel = sourceViewModel;
mPlaybackViewModel = playbackViewModel;
+
}
@Override
@@ -242,13 +242,7 @@ public class MediaViewModel extends AndroidViewModel implements AudioModel {
private void updateModel() {
MediaSource mediaSource = mSourceViewModel.getPrimaryMediaSource().getValue();
if (mediaSourceChanged()) {
- // Video apps are not surfaced here, even if they happen to offer MediaBrowse.
- // Rationale is that very few apps do this and users might be confused why some
- // apps can be controlled via widget while others can't. For Video apps, the card
- // will switch to showing "no media playing" case.
- if (mediaSource != null
- && !AppLauncherUtils.isVideoApp(mContext.getPackageManager(),
- mediaSource.getPackageName())) {
+ if (mediaSource != null) {
if (Log.isLoggable(TAG, Log.INFO)) {
Log.i(TAG, "Setting Media view to source "
+ mediaSource.getDisplayName(mContext));
@@ -259,10 +253,11 @@ public class MediaViewModel extends AndroidViewModel implements AudioModel {
updateMetadata();
updateProgress();
updateMediaSourceColor();
+
mOnModelUpdateListener.onModelUpdate(/* model = */ this);
} else {
- if (Log.isLoggable(TAG, Log.INFO)) {
- Log.i(TAG, "Not resetting media widget for video apps or apps "
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Not resetting media widget for apps "
+ "that do not support media browse");
}
}
diff --git a/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImpl.java b/app/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImpl.java
index ee652633..ee652633 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImpl.java
+++ b/app/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImpl.java
diff --git a/src/com/android/car/carlauncher/homescreen/ui/CardContent.java b/app/src/com/android/car/carlauncher/homescreen/ui/CardContent.java
index 1df67f9f..1df67f9f 100644
--- a/src/com/android/car/carlauncher/homescreen/ui/CardContent.java
+++ b/app/src/com/android/car/carlauncher/homescreen/ui/CardContent.java
diff --git a/src/com/android/car/carlauncher/homescreen/ui/CardHeader.java b/app/src/com/android/car/carlauncher/homescreen/ui/CardHeader.java
index 304a91e3..304a91e3 100644
--- a/src/com/android/car/carlauncher/homescreen/ui/CardHeader.java
+++ b/app/src/com/android/car/carlauncher/homescreen/ui/CardHeader.java
diff --git a/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextView.java b/app/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextView.java
index 37a08c0a..37a08c0a 100644
--- a/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextView.java
+++ b/app/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextView.java
diff --git a/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextWithControlsView.java b/app/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextWithControlsView.java
index 57835fac..57835fac 100644
--- a/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextWithControlsView.java
+++ b/app/src/com/android/car/carlauncher/homescreen/ui/DescriptiveTextWithControlsView.java
diff --git a/src/com/android/car/carlauncher/homescreen/ui/SeekBarViewModel.java b/app/src/com/android/car/carlauncher/homescreen/ui/SeekBarViewModel.java
index e36aa4b0..e36aa4b0 100644
--- a/src/com/android/car/carlauncher/homescreen/ui/SeekBarViewModel.java
+++ b/app/src/com/android/car/carlauncher/homescreen/ui/SeekBarViewModel.java
diff --git a/src/com/android/car/carlauncher/homescreen/ui/TextBlockView.java b/app/src/com/android/car/carlauncher/homescreen/ui/TextBlockView.java
index 43a198e6..43a198e6 100644
--- a/src/com/android/car/carlauncher/homescreen/ui/TextBlockView.java
+++ b/app/src/com/android/car/carlauncher/homescreen/ui/TextBlockView.java
diff --git a/src/com/android/car/carlauncher/recents/CarQuickStepService.java b/app/src/com/android/car/carlauncher/recents/CarQuickStepService.java
index a4c820e8..a4c820e8 100644
--- a/src/com/android/car/carlauncher/recents/CarQuickStepService.java
+++ b/app/src/com/android/car/carlauncher/recents/CarQuickStepService.java
diff --git a/src/com/android/car/carlauncher/recents/CarRecentsActivity.java b/app/src/com/android/car/carlauncher/recents/CarRecentsActivity.java
index 740c87fe..9c694917 100644
--- a/src/com/android/car/carlauncher/recents/CarRecentsActivity.java
+++ b/app/src/com/android/car/carlauncher/recents/CarRecentsActivity.java
@@ -52,6 +52,8 @@ public class CarRecentsActivity extends AppCompatActivity implements
RecentTasksViewModel.RecentTasksChangeListener {
public static final String OPEN_RECENT_TASK_ACTION =
"com.android.car.carlauncher.recents.OPEN_RECENT_TASK_ACTION";
+ private static final RecentsStatsLogHelper sStatsLogHelper =
+ RecentsStatsLogHelper.getInstance();
private RecentsRecyclerView mRecentsRecyclerView;
private GridLayoutManager mGridLayoutManager;
private RecentTasksViewModel mRecentTasksViewModel;
@@ -91,6 +93,9 @@ public class CarRecentsActivity extends AppCompatActivity implements
throw new UnsupportedOperationException(
"Only classes that inherit GridLayoutManager are supported");
}
+ // getting an instance initializes StatsLogHelper
+ sStatsLogHelper.setPackageManager(getPackageManager());
+
mGridLayoutManager = (GridLayoutManager) mRecentsRecyclerView.getLayoutManager();
int gridSpanCount = mGridLayoutManager.getSpanCount();
mGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@@ -148,6 +153,7 @@ public class CarRecentsActivity extends AppCompatActivity implements
mRecentTasksViewModel.fetchRecentTaskList();
resetViewState();
mRecentsRecyclerView.resetPadding();
+ sStatsLogHelper.logSessionStarted();
}
@Override
@@ -159,6 +165,7 @@ public class CarRecentsActivity extends AppCompatActivity implements
@Override
protected void onStop() {
super.onStop();
+ sStatsLogHelper.logSessionFinished();
mRecentTasksViewModel.clearCache();
}
diff --git a/src/com/android/car/carlauncher/recents/NonDODisabledTaskProvider.java b/app/src/com/android/car/carlauncher/recents/NonDODisabledTaskProvider.java
index 0a47e26a..0a47e26a 100644
--- a/src/com/android/car/carlauncher/recents/NonDODisabledTaskProvider.java
+++ b/app/src/com/android/car/carlauncher/recents/NonDODisabledTaskProvider.java
diff --git a/src/com/android/car/carlauncher/recents/RecentTasksProvider.java b/app/src/com/android/car/carlauncher/recents/RecentTasksProvider.java
index 884763bc..884763bc 100644
--- a/src/com/android/car/carlauncher/recents/RecentTasksProvider.java
+++ b/app/src/com/android/car/carlauncher/recents/RecentTasksProvider.java
diff --git a/src/com/android/car/carlauncher/recents/RecentTasksProviderInterface.java b/app/src/com/android/car/carlauncher/recents/RecentTasksProviderInterface.java
index 29975d65..29975d65 100644
--- a/src/com/android/car/carlauncher/recents/RecentTasksProviderInterface.java
+++ b/app/src/com/android/car/carlauncher/recents/RecentTasksProviderInterface.java
diff --git a/src/com/android/car/carlauncher/recents/RecentTasksViewModel.java b/app/src/com/android/car/carlauncher/recents/RecentTasksViewModel.java
index 92a4e5b9..c8caf30b 100644
--- a/src/com/android/car/carlauncher/recents/RecentTasksViewModel.java
+++ b/app/src/com/android/car/carlauncher/recents/RecentTasksViewModel.java
@@ -38,6 +38,8 @@ import java.util.Map;
import java.util.Set;
public class RecentTasksViewModel {
+ private static final RecentsStatsLogHelper sStatsLogHelper =
+ RecentsStatsLogHelper.getInstance();
private static RecentTasksViewModel sInstance;
private final RecentTasksProviderInterface mDataStore;
private final Set<RecentTasksChangeListener> mRecentTasksChangeListener;
@@ -222,6 +224,10 @@ public class RecentTasksViewModel {
public void openRecentTask(int index) {
if (safeCheckIndex(mRecentTaskIds, index) &&
mDataStore.openRecentTask(mRecentTaskIds.get(index))) {
+ // TODO(b/311427536): log a boolean to indicate if openRecentTask finished successfully
+ ComponentName name = mDataStore.getRecentTaskComponentName(mRecentTaskIds.get(index));
+ sStatsLogHelper.logAppLaunched(/* totalTaskCount */ getRecentTasksSize(),
+ /* eventTaskIndex */ index, /* componentName */ name.getPackageName());
return;
}
// failure to open recent task
@@ -247,9 +253,12 @@ public class RecentTasksViewModel {
if (!safeCheckIndex(mRecentTaskIds, index)) {
return;
}
+ ComponentName name = getRecentTaskComponentName(index);
removeTaskWithId(mRecentTaskIds.get(index));
mRecentTaskIds.remove(index);
mRecentTasksChangeListener.forEach(l -> l.onRecentTaskRemoved(index));
+ sStatsLogHelper.logAppDismissed(/* totalTaskCount */ getRecentTasksSize(),
+ /* eventTaskIndex */ index, /* packageName */ name.getPackageName());
}
/**
@@ -259,6 +268,7 @@ public class RecentTasksViewModel {
for (int recentTaskId : mRecentTaskIds) {
removeTaskWithId(recentTaskId);
}
+ sStatsLogHelper.logClearAll(getRecentTasksSize());
clearCache();
}
diff --git a/app/src/com/android/car/carlauncher/recents/RecentsStatsLogHelper.java b/app/src/com/android/car/carlauncher/recents/RecentsStatsLogHelper.java
new file mode 100644
index 00000000..ef032f5d
--- /dev/null
+++ b/app/src/com/android/car/carlauncher/recents/RecentsStatsLogHelper.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.recents;
+
+import android.annotation.IntDef;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.util.Log;
+
+import com.android.car.carlauncher.CarLauncherStatsLog;
+
+import java.util.UUID;
+
+/**
+ * Helper class that directly interacts with CarLauncherStatsLog, a generated class that contains
+ * logging methods for CarRecentsActivity.
+ */
+public class RecentsStatsLogHelper {
+ public static final String TAG = "RecentsStatsLogHelper";
+ private static RecentsStatsLogHelper sInstance;
+ private PackageManager mPackageManager;
+ private long mSessionId;
+ private long mStartTimeMs;
+ // Integer for taskIndex, to be logged by CarRecentsEventReported
+ public static final int UNSPECIFIED_INDEX = -1;
+ // Integer for totalTaskCount, same as above
+ public static final int UNSPECIFIED_COUNT = -1;
+ // String to be logged as packageName when packageName is not relevant to recents event
+ public static final String UNSPECIFIED_PACKAGE_NAME = "_PACKAGE_NAME_NOT_LOGGED";
+ // Uid to be logged as uid when packageName is not relevant or cannot be resolved
+ public static final int UNSPECIFIED_PACKAGE_UID = -1;
+
+ /**
+ * IntDef representing enum values of CarRecentsEventReported.event_type.
+ */
+ @IntDef({
+ RecentsEventType.UNSPECIFIED,
+ RecentsEventType.SESSION_STARTED,
+ RecentsEventType.SESSION_FINISHED,
+ RecentsEventType.APP_LAUNCHED,
+ RecentsEventType.APP_DISMISSED,
+ RecentsEventType.CLEAR_ALL,
+ })
+ public @interface RecentsEventType {
+ int UNSPECIFIED = CarLauncherStatsLog.CAR_RECENTS_EVENT_REPORTED__EVENT_TYPE__UNSPECIFIED;
+ int SESSION_STARTED =
+ CarLauncherStatsLog.CAR_RECENTS_EVENT_REPORTED__EVENT_TYPE__SESSION_STARTED;
+ int SESSION_FINISHED =
+ CarLauncherStatsLog.CAR_RECENTS_EVENT_REPORTED__EVENT_TYPE__SESSION_FINISHED;
+ int APP_LAUNCHED =
+ CarLauncherStatsLog.CAR_RECENTS_EVENT_REPORTED__EVENT_TYPE__APP_LAUNCHED;
+ int APP_DISMISSED =
+ CarLauncherStatsLog.CAR_RECENTS_EVENT_REPORTED__EVENT_TYPE__APP_DISMISSED;
+ int CLEAR_ALL =
+ CarLauncherStatsLog.CAR_RECENTS_EVENT_REPORTED__EVENT_TYPE__CLEAR_ALL;
+ }
+
+ /**
+ * Returns the current logging instance of RecentsStatsLogHelper to write this devices'
+ * CarLauncherStatsModule.
+ *
+ * @return the logging instance of RecentsStatsLogHelper.
+ */
+ public static RecentsStatsLogHelper getInstance() {
+ if (sInstance == null) {
+ sInstance = new RecentsStatsLogHelper();
+ }
+ return sInstance;
+ }
+
+ public void setPackageManager(PackageManager packageManager) {
+ mPackageManager = packageManager;
+ }
+
+ /**
+ * Logs that a new recents session has started. Additionally, resets measurements and IDs such
+ * as session ID and start time.
+ */
+ public void logSessionStarted() {
+ mSessionId = UUID.randomUUID().getMostSignificantBits();
+ mStartTimeMs = System.currentTimeMillis();
+ writeCarRecentsEventReported(RecentsEventType.SESSION_STARTED);
+ }
+
+ /**
+ * Logs that an app launch interaction has occurred, along with the launched app's package name,
+ * the total open task count in recents, and the launched app's position.
+ */
+ public void logAppLaunched(int totalTaskCount, int eventTaskIndex, String packageName) {
+ writeCarRecentsEventReported(
+ /* eventType */ RecentsEventType.APP_LAUNCHED,
+ /* totalTaskCount */ totalTaskCount,
+ /* eventTaskIndex */ eventTaskIndex,
+ /* packageName */ packageName);
+ }
+
+ /**
+ * Logs that an app dismiss interaction has occurred, along with the dismissed app's package
+ * name, the total open task count in recents, and the dimissed app's position.
+ */
+ public void logAppDismissed(int totalTaskCount, int eventTaskIndex, String packageName) {
+ writeCarRecentsEventReported(
+ /* eventType */ RecentsStatsLogHelper.RecentsEventType.APP_DISMISSED,
+ /* totalTaskCount */ totalTaskCount,
+ /* eventTaskIndex */ eventTaskIndex,
+ /* packageName */ packageName);
+ }
+
+ /**
+ * Logs that clear all has been logged, along with the total open task count in recents.
+ */
+ public void logClearAll(int totalTaskCount) {
+ writeCarRecentsEventReported(
+ /* eventType */ RecentsStatsLogHelper.RecentsEventType.CLEAR_ALL,
+ /* totalTaskCount */ totalTaskCount,
+ /* eventTaskIndex */ UNSPECIFIED_INDEX,
+ /* packageName */ UNSPECIFIED_PACKAGE_NAME);
+ }
+
+ /**
+ * Logs that the current recents session has finished.
+ */
+ public void logSessionFinished() {
+ writeCarRecentsEventReported(RecentsEventType.SESSION_FINISHED);
+ }
+
+ /**
+ * Writes to CarRecentsEvent atom with {@code eventType} as the only field, and log all other
+ * fields as unspecified.
+ *
+ * @param eventType one of {@link RecentsEventType}
+ */
+ private void writeCarRecentsEventReported(int eventType) {
+ writeCarRecentsEventReported(eventType, /* totalTaskCount */ UNSPECIFIED_COUNT,
+ /* eventTaskIndex */ UNSPECIFIED_INDEX, /* packageName */ UNSPECIFIED_PACKAGE_NAME);
+ }
+
+ /**
+ * Writes to CarRecentsEvent atom with all the optional fields filled.
+ *
+ * @param eventType one of {@link RecentsEventType}
+ * @param totalTaskCount the number of tasks displayed in recents screen
+ * @param eventTaskIndex the index of the recents task of this interaction
+ * @param packageName the package name of the app interacted with
+ */
+ private void writeCarRecentsEventReported(int eventType, int totalTaskCount,
+ int eventTaskIndex, String packageName) {
+ if (Build.isDebuggable()) {
+ Log.v(TAG, "writing CAR_RECENTS_EVENT_REPORTED with eventType=" + eventType
+ + ", packageName=" + packageName);
+ }
+ writeCarRecentsEventReported(
+ /* sessionId */ mSessionId,
+ /* eventId */ UUID.randomUUID().getMostSignificantBits(),
+ /* eventType */ eventType,
+ /* totalTaskCount */ totalTaskCount,
+ /* taskIndex */ eventTaskIndex,
+ /* timeToEventMs */ System.currentTimeMillis() - mStartTimeMs,
+ /* packageUid */ getPackageUid(packageName));
+ }
+
+ private int getPackageUid(String packageName) {
+ if (packageName == null) {
+ return UNSPECIFIED_PACKAGE_UID;
+ }
+ try {
+ ApplicationInfo appInfo = mPackageManager.getApplicationInfo(packageName,
+ PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA));
+ return appInfo.uid;
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.d(TAG, "getPackageUid() on " + packageName + " was not found");
+ }
+ return UNSPECIFIED_PACKAGE_UID;
+ }
+
+ private void writeCarRecentsEventReported(long sessionId, long eventId, int eventType,
+ int totalTaskCount, int eventTaskIndex, long timeToEventMs, int packageUid) {
+ CarLauncherStatsLog.write(
+ /* atomId */ CarLauncherStatsLog.CAR_RECENTS_EVENT_REPORTED,
+ /* session_id */ sessionId,
+ /* event_id */ eventId,
+ /* event_type */ eventType,
+ /* total_task_count */ totalTaskCount,
+ /* event_task_index */ eventTaskIndex,
+ /* long time_to_event_millis */ timeToEventMs,
+ /* package_uid */ packageUid);
+ }
+}
diff --git a/src/com/android/car/carlauncher/recents/RecentsUtils.java b/app/src/com/android/car/carlauncher/recents/RecentsUtils.java
index a0c57867..a0c57867 100644
--- a/src/com/android/car/carlauncher/recents/RecentsUtils.java
+++ b/app/src/com/android/car/carlauncher/recents/RecentsUtils.java
diff --git a/src/com/android/car/carlauncher/recents/view/BaseTaskViewHolder.java b/app/src/com/android/car/carlauncher/recents/view/BaseTaskViewHolder.java
index 8bea629a..8bea629a 100644
--- a/src/com/android/car/carlauncher/recents/view/BaseTaskViewHolder.java
+++ b/app/src/com/android/car/carlauncher/recents/view/BaseTaskViewHolder.java
diff --git a/src/com/android/car/carlauncher/recents/view/ClearAllViewHolder.java b/app/src/com/android/car/carlauncher/recents/view/ClearAllViewHolder.java
index 1f47b516..1f47b516 100644
--- a/src/com/android/car/carlauncher/recents/view/ClearAllViewHolder.java
+++ b/app/src/com/android/car/carlauncher/recents/view/ClearAllViewHolder.java
diff --git a/src/com/android/car/carlauncher/recents/view/DismissTaskClickListener.java b/app/src/com/android/car/carlauncher/recents/view/DismissTaskClickListener.java
index c3928c43..c3928c43 100644
--- a/src/com/android/car/carlauncher/recents/view/DismissTaskClickListener.java
+++ b/app/src/com/android/car/carlauncher/recents/view/DismissTaskClickListener.java
diff --git a/src/com/android/car/carlauncher/recents/view/RecentTasksAdapter.java b/app/src/com/android/car/carlauncher/recents/view/RecentTasksAdapter.java
index 9be766ea..9be766ea 100644
--- a/src/com/android/car/carlauncher/recents/view/RecentTasksAdapter.java
+++ b/app/src/com/android/car/carlauncher/recents/view/RecentTasksAdapter.java
diff --git a/src/com/android/car/carlauncher/recents/view/RecentsRecyclerView.java b/app/src/com/android/car/carlauncher/recents/view/RecentsRecyclerView.java
index eae5c565..eae5c565 100644
--- a/src/com/android/car/carlauncher/recents/view/RecentsRecyclerView.java
+++ b/app/src/com/android/car/carlauncher/recents/view/RecentsRecyclerView.java
diff --git a/src/com/android/car/carlauncher/recents/view/TaskClickListener.java b/app/src/com/android/car/carlauncher/recents/view/TaskClickListener.java
index db870593..db870593 100644
--- a/src/com/android/car/carlauncher/recents/view/TaskClickListener.java
+++ b/app/src/com/android/car/carlauncher/recents/view/TaskClickListener.java
diff --git a/src/com/android/car/carlauncher/recents/view/TaskTouchHelperCallback.java b/app/src/com/android/car/carlauncher/recents/view/TaskTouchHelperCallback.java
index 706554e8..706554e8 100644
--- a/src/com/android/car/carlauncher/recents/view/TaskTouchHelperCallback.java
+++ b/app/src/com/android/car/carlauncher/recents/view/TaskTouchHelperCallback.java
diff --git a/src/com/android/car/carlauncher/recents/view/TaskTouchListener.java b/app/src/com/android/car/carlauncher/recents/view/TaskTouchListener.java
index c1907198..c1907198 100644
--- a/src/com/android/car/carlauncher/recents/view/TaskTouchListener.java
+++ b/app/src/com/android/car/carlauncher/recents/view/TaskTouchListener.java
diff --git a/src/com/android/car/carlauncher/recents/view/TaskViewHolder.java b/app/src/com/android/car/carlauncher/recents/view/TaskViewHolder.java
index 420c50f7..420c50f7 100644
--- a/src/com/android/car/carlauncher/recents/view/TaskViewHolder.java
+++ b/app/src/com/android/car/carlauncher/recents/view/TaskViewHolder.java
diff --git a/src/com/android/car/carlauncher/taskstack/TaskStackChangeListeners.java b/app/src/com/android/car/carlauncher/taskstack/TaskStackChangeListeners.java
index b3d4c0c6..b3d4c0c6 100644
--- a/src/com/android/car/carlauncher/taskstack/TaskStackChangeListeners.java
+++ b/app/src/com/android/car/carlauncher/taskstack/TaskStackChangeListeners.java
diff --git a/tests/Android.bp b/app/tests/Android.bp
index f8266ca2..322c2de6 100644
--- a/tests/Android.bp
+++ b/app/tests/Android.bp
@@ -45,11 +45,13 @@ android_test {
"androidx.test.espresso.contrib",
"androidx.test.espresso.intents",
"androidx.test.ext.junit",
+ "androidx.fragment_fragment-testing",
"hamcrest-library",
"mockito-target-extended",
"truth",
"testables",
"CarLauncher-core",
+ "flag-junit",
],
platform_apis: true,
diff --git a/tests/AndroidManifest.xml b/app/tests/AndroidManifest.xml
index e862fe6d..8054b2d0 100644
--- a/tests/AndroidManifest.xml
+++ b/app/tests/AndroidManifest.xml
@@ -16,25 +16,23 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.car.carlauncher.test">
-
+ xmlns:tools="http://schemas.android.com/tools"
+ package="com.android.car.carlauncher.test">
<application
android:debuggable="true"
- android:label="@string/app_title">
-
- <activity android:name="com.android.car.carlauncher.TaskViewManagerTest$TestActivity" />
+ android:label="@string/app_test_title"
+ tools:replace="android:label">
- <!-- This is used in AppLauncherUtilTests -->
- <activity android:name="com.android.car.carlauncher.TaskViewInputInterceptorTest$TestActivity" />
- <activity android:name="com.android.car.carlauncher.TestActivity" />
- <meta-data
- android:name="com.android.automotive"
- android:resource="@xml/automotive_app_desc" />
- <uses-library android:name="android.test.runner" />
+ <activity android:name="com.android.car.carlauncher.TaskViewManagerTest$TestActivity"/>
+ <activity
+ android:name="com.android.car.carlauncher.TaskViewInputInterceptorTest$TestActivity"/>
+ <uses-library android:name="android.test.runner"/>
+ <provider android:name="com.android.car.carlauncher.calmmode.CalmModeQCProvider"
+ tools:node="remove"/>
</application>
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
android:label="Tests for Car Launcher"
- android:targetPackage="com.android.car.carlauncher.test" />
+ android:targetPackage="com.android.car.carlauncher.test"/>
</manifest>
diff --git a/tests/AndroidTest.xml b/app/tests/AndroidTest.xml
index 5c933636..5c933636 100644
--- a/tests/AndroidTest.xml
+++ b/app/tests/AndroidTest.xml
diff --git a/app/tests/res/values-af/strings.xml b/app/tests/res/values-af/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-af/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-am/strings.xml b/app/tests/res/values-am/strings.xml
new file mode 100644
index 00000000..5d0cf230
--- /dev/null
+++ b/app/tests/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"የመኪናማስጀመሪያሙከራዎች"</string>
+</resources>
diff --git a/app/tests/res/values-ar/strings.xml b/app/tests/res/values-ar/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ar/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-as/strings.xml b/app/tests/res/values-as/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-az/strings.xml b/app/tests/res/values-az/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-az/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-b+sr+Latn/strings.xml b/app/tests/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-be/strings.xml b/app/tests/res/values-be/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-be/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-bg/strings.xml b/app/tests/res/values-bg/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-bg/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-bn/strings.xml b/app/tests/res/values-bn/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-bn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-bs/strings.xml b/app/tests/res/values-bs/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-bs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ca/strings.xml b/app/tests/res/values-ca/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ca/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-cs/strings.xml b/app/tests/res/values-cs/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-cs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-da/strings.xml b/app/tests/res/values-da/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-da/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-de/strings.xml b/app/tests/res/values-de/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-de/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-el/strings.xml b/app/tests/res/values-el/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-el/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-en-rAU/strings.xml b/app/tests/res/values-en-rAU/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-en-rAU/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-en-rGB/strings.xml b/app/tests/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-en-rGB/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-en-rIN/strings.xml b/app/tests/res/values-en-rIN/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-en-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-en-rXC/strings.xml b/app/tests/res/values-en-rXC/strings.xml
new file mode 100644
index 00000000..081738b7
--- /dev/null
+++ b/app/tests/res/values-en-rXC/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎CarLauncherTests‎‏‎‎‏‎"</string>
+</resources>
diff --git a/app/tests/res/values-es-rUS/strings.xml b/app/tests/res/values-es-rUS/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-es-rUS/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-es/strings.xml b/app/tests/res/values-es/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-es/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-et/strings.xml b/app/tests/res/values-et/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-et/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-eu/strings.xml b/app/tests/res/values-eu/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-eu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-fa/strings.xml b/app/tests/res/values-fa/strings.xml
new file mode 100644
index 00000000..b9aa2309
--- /dev/null
+++ b/app/tests/res/values-fa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"آزمایش راه‌انداز خودرو"</string>
+</resources>
diff --git a/app/tests/res/values-fi/strings.xml b/app/tests/res/values-fi/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-fi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-fr-rCA/strings.xml b/app/tests/res/values-fr-rCA/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-fr-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-fr/strings.xml b/app/tests/res/values-fr/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-fr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-gl/strings.xml b/app/tests/res/values-gl/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-gl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-gu/strings.xml b/app/tests/res/values-gu/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-gu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-hi/strings.xml b/app/tests/res/values-hi/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-hi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-hr/strings.xml b/app/tests/res/values-hr/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-hr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-hu/strings.xml b/app/tests/res/values-hu/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-hu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-hy/strings.xml b/app/tests/res/values-hy/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-hy/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-in/strings.xml b/app/tests/res/values-in/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-in/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-is/strings.xml b/app/tests/res/values-is/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-is/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-it/strings.xml b/app/tests/res/values-it/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-it/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-iw/strings.xml b/app/tests/res/values-iw/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-iw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ja/strings.xml b/app/tests/res/values-ja/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ja/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ka/strings.xml b/app/tests/res/values-ka/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ka/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-kk/strings.xml b/app/tests/res/values-kk/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-kk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-km/strings.xml b/app/tests/res/values-km/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-km/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-kn/strings.xml b/app/tests/res/values-kn/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-kn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ko/strings.xml b/app/tests/res/values-ko/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ko/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ky/strings.xml b/app/tests/res/values-ky/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ky/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-lo/strings.xml b/app/tests/res/values-lo/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-lo/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-lt/strings.xml b/app/tests/res/values-lt/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-lt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-lv/strings.xml b/app/tests/res/values-lv/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-lv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-mk/strings.xml b/app/tests/res/values-mk/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-mk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ml/strings.xml b/app/tests/res/values-ml/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ml/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-mn/strings.xml b/app/tests/res/values-mn/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-mn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-mr/strings.xml b/app/tests/res/values-mr/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-mr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ms/strings.xml b/app/tests/res/values-ms/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ms/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-my/strings.xml b/app/tests/res/values-my/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-my/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-nb/strings.xml b/app/tests/res/values-nb/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-nb/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ne/strings.xml b/app/tests/res/values-ne/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ne/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-nl/strings.xml b/app/tests/res/values-nl/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-nl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-or/strings.xml b/app/tests/res/values-or/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-pa/strings.xml b/app/tests/res/values-pa/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-pa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-pl/strings.xml b/app/tests/res/values-pl/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-pl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-pt-rPT/strings.xml b/app/tests/res/values-pt-rPT/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-pt-rPT/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-pt/strings.xml b/app/tests/res/values-pt/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-pt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ro/strings.xml b/app/tests/res/values-ro/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ro/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ru/strings.xml b/app/tests/res/values-ru/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ru/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-si/strings.xml b/app/tests/res/values-si/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-si/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-sk/strings.xml b/app/tests/res/values-sk/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-sk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-sl/strings.xml b/app/tests/res/values-sl/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-sl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-sq/strings.xml b/app/tests/res/values-sq/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-sq/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-sr/strings.xml b/app/tests/res/values-sr/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-sr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-sv/strings.xml b/app/tests/res/values-sv/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-sv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-sw/strings.xml b/app/tests/res/values-sw/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-sw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ta/strings.xml b/app/tests/res/values-ta/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ta/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-te/strings.xml b/app/tests/res/values-te/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-te/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-th/strings.xml b/app/tests/res/values-th/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-th/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-tl/strings.xml b/app/tests/res/values-tl/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-tl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-tr/strings.xml b/app/tests/res/values-tr/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-tr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-uk/strings.xml b/app/tests/res/values-uk/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-uk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-ur/strings.xml b/app/tests/res/values-ur/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-ur/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-uz/strings.xml b/app/tests/res/values-uz/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-uz/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-vi/strings.xml b/app/tests/res/values-vi/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-vi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-zh-rCN/strings.xml b/app/tests/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-zh-rHK/strings.xml b/app/tests/res/values-zh-rHK/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-zh-rHK/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-zh-rTW/strings.xml b/app/tests/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000..42f3ece2
--- /dev/null
+++ b/app/tests/res/values-zh-rTW/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values-zu/strings.xml b/app/tests/res/values-zu/strings.xml
new file mode 100644
index 00000000..48237042
--- /dev/null
+++ b/app/tests/res/values-zu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="5099375056282404070">"I-CarLauncherTests"</string>
+</resources>
diff --git a/app/tests/res/values/strings.xml b/app/tests/res/values/strings.xml
new file mode 100644
index 00000000..89dde052
--- /dev/null
+++ b/app/tests/res/values/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title">CarLauncherTests</string>
+</resources>
diff --git a/app/tests/src/com/android/car/carlauncher/CarLauncherTest.java b/app/tests/src/com/android/car/carlauncher/CarLauncherTest.java
new file mode 100644
index 00000000..427f065c
--- /dev/null
+++ b/app/tests/src/com/android/car/carlauncher/CarLauncherTest.java
@@ -0,0 +1,287 @@
+/*
+ * Copyright (C) 2020 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher;
+
+import static android.car.settings.CarSettings.Secure.KEY_USER_TOS_ACCEPTED;
+
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.car.user.CarUserManager;
+import android.car.user.CarUserManager.UserLifecycleListener;
+import android.content.Intent;
+import android.provider.Settings;
+import android.testing.TestableContext;
+import android.util.ArraySet;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
+
+import org.junit.After;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import java.net.URISyntaxException;
+import java.util.Set;
+
+@Suppress // To be ignored until b/224978827 is fixed
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class CarLauncherTest extends AbstractExtendedMockitoTestCase {
+
+ @Rule
+ public TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ private ActivityScenario<CarLauncher> mActivityScenario;
+
+ @Mock
+ private CarUserManager mMockCarUserManager;
+
+ private static final String TOS_MAP_INTENT = "intent:#Intent;"
+ + "component=com.android.car.carlauncher/"
+ + "com.android.car.carlauncher.homescreen.MapActivityTos;"
+ + "action=android.intent.action.MAIN;end";
+ private static final String DEFAULT_MAP_INTENT = "intent:#Intent;"
+ + "component=com.android.car.maps/"
+ + "com.android.car.maps.MapActivity;"
+ + "action=android.intent.action.MAIN;end";
+ private static final String CUSTOM_MAP_INTENT = "intent:#Intent;component=com.custom.car.maps/"
+ + "com.custom.car.maps.MapActivity;"
+ + "action=android.intent.action.MAIN;end";
+
+ @Override
+ protected void onSessionBuilder(CustomMockitoSessionBuilder session) {
+ session.spyStatic(AppLauncherUtils.class);
+ session.spyStatic(CarLauncherUtils.class);
+ }
+
+ @After
+ public void tearDown() {
+ if (mActivityScenario != null) {
+ mActivityScenario.close();
+ }
+ }
+
+ @Test
+ public void onResume_mapsCard_isVisible() {
+ mActivityScenario = ActivityScenario.launch(CarLauncher.class);
+ mActivityScenario.moveToState(Lifecycle.State.RESUMED);
+
+ onView(withId(R.id.maps_card)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void onResume_assistiveCard_isVisible() {
+ mActivityScenario = ActivityScenario.launch(CarLauncher.class);
+ mActivityScenario.moveToState(Lifecycle.State.RESUMED);
+
+ onView(withId(R.id.top_card)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void onResume_audioCard_isVisible() {
+ mActivityScenario = ActivityScenario.launch(CarLauncher.class);
+ mActivityScenario.moveToState(Lifecycle.State.RESUMED);
+
+ onView(withId(R.id.bottom_card)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void onDestroy_unregistersUserLifecycleListener() {
+ mActivityScenario = ActivityScenario.launch(CarLauncher.class);
+ mActivityScenario.onActivity(activity -> activity.setCarUserManager(mMockCarUserManager));
+
+ mActivityScenario.moveToState(Lifecycle.State.DESTROYED);
+
+ verify(mMockCarUserManager).removeListener(any(UserLifecycleListener.class));
+ }
+
+ @Test
+ public void onCreate_tosMapActivity_tosUnaccepted_canvasOptimizedMapsDisabledByTos() {
+ doReturn(false).when(() -> AppLauncherUtils.tosAccepted(any()));
+ doReturn(true)
+ .when(() ->
+ CarLauncherUtils.isSmallCanvasOptimizedMapIntentConfigured(any()));
+ doReturn(createIntentFromString(TOS_MAP_INTENT))
+ .when(() -> CarLauncherUtils.getTosMapIntent(any()));
+ doReturn(createIntentFromString(DEFAULT_MAP_INTENT))
+ .when(() -> CarLauncherUtils.getSmallCanvasOptimizedMapIntent(any()));
+ doReturn(tosDisabledPackages())
+ .when(() -> AppLauncherUtils.getTosDisabledPackages(any()));
+
+ mActivityScenario = ActivityScenario.launch(CarLauncher.class);
+
+ mActivityScenario.onActivity(activity -> {
+ Intent mapIntent = activity.getMapsIntent();
+ // If TOS is not accepted, and the default map is disabled by TOS, or
+ // package name maybe null when resolving intent from package manager.
+ // We replace the map intent with TOS map activity
+ assertEquals(createIntentFromString(TOS_MAP_INTENT).getComponent().getClassName(),
+ mapIntent.getComponent().getClassName());
+ });
+ }
+
+ @Test
+ public void onCreate_tosMapActivity_tosUnaccepted_mapsNotDisabledByTos() {
+ doReturn(false).when(() -> AppLauncherUtils.tosAccepted(any()));
+ doReturn(true)
+ .when(() -> CarLauncherUtils.isSmallCanvasOptimizedMapIntentConfigured(any()));
+ doReturn(createIntentFromString(CUSTOM_MAP_INTENT))
+ .when(() -> CarLauncherUtils.getSmallCanvasOptimizedMapIntent(any()));
+ doReturn(tosDisabledPackages())
+ .when(() -> AppLauncherUtils.getTosDisabledPackages(any()));
+
+ mActivityScenario = ActivityScenario.launch(CarLauncher.class);
+
+ mActivityScenario.onActivity(activity -> {
+ Intent mapIntent = activity.getMapsIntent();
+ // If TOS is not accepted, and the default map is not disabled by TOS,
+ // these can be some other navigation app set as default,
+ // package name will not be null.
+ // We will not replace the map intent with TOS map activity
+ assertEquals(
+ createIntentFromString(CUSTOM_MAP_INTENT).getComponent().getClassName(),
+ mapIntent.getComponent().getClassName());
+ });
+ }
+
+ @Test
+ public void onCreate_tosMapActivity_tosAccepted() {
+ doReturn(true).when(() -> AppLauncherUtils.tosAccepted(any()));
+ doReturn(createIntentFromString(TOS_MAP_INTENT))
+ .when(() -> CarLauncherUtils.getTosMapIntent(any()));
+
+ mActivityScenario = ActivityScenario.launch(CarLauncher.class);
+
+ mActivityScenario.onActivity(activity -> {
+ Intent mapIntent = activity.getMapsIntent();
+ // If TOS is accepted, map intent is not replaced
+ assertNotEquals("com.android.car.carlauncher.homescreen.MapActivityTos",
+ mapIntent.getComponent().getClassName());
+ });
+ }
+
+ @Test
+ public void onCreate_tosStateContentObserver_tosAccepted() {
+ TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 2);
+
+ mActivityScenario = ActivityScenario.launch(new Intent(mContext, CarLauncher.class));
+ mActivityScenario.moveToState(Lifecycle.State.RESUMED);
+
+ mActivityScenario.onActivity(activity -> {
+ // Content observer not setup because tos is accepted
+ assertNull(activity.mTosContentObserver);
+ });
+ }
+
+ @Test
+ public void onCreate_registerTosStateContentObserver_tosNotAccepted() {
+ TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 1);
+
+ mActivityScenario = ActivityScenario.launch(new Intent(mContext, CarLauncher.class));
+ mActivityScenario.moveToState(Lifecycle.State.RESUMED);
+
+ mActivityScenario.onActivity(activity -> {
+ // Content observer is setup because tos is not accepted
+ assertNotNull(activity.mTosContentObserver);
+ });
+ }
+
+ @Test
+ public void onCreate_registerTosStateContentObserver_tosNotInitialized() {
+ TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 0);
+
+ mActivityScenario = ActivityScenario.launch(new Intent(mContext, CarLauncher.class));
+ mActivityScenario.moveToState(Lifecycle.State.RESUMED);
+
+ mActivityScenario.onActivity(activity -> {
+ // Content observer is setup because tos is not initialized
+ assertNotNull(activity.mTosContentObserver);
+ });
+ }
+
+ @Test
+ public void recreate_tosStateContentObserver_tosNotAccepted() {
+ TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 1);
+
+ mActivityScenario = ActivityScenario.launch(new Intent(mContext, CarLauncher.class));
+
+ mActivityScenario.onActivity(activity -> {
+ assertNotNull(activity.mTosContentObserver); // Content observer is setup
+
+ // Accept TOS
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 2);
+ activity.mTosContentObserver.onChange(true);
+ });
+ // Content observer is null after recreate
+ mActivityScenario.onActivity(activity -> assertNull(activity.mTosContentObserver));
+ }
+
+ @Test
+ public void recreate_tosStateContentObserver_tosNotInitialized() {
+ TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 0);
+
+ mActivityScenario = ActivityScenario.launch(new Intent(mContext, CarLauncher.class));
+
+ mActivityScenario.onActivity(activity -> {
+ assertNotNull(activity.mTosContentObserver); // Content observer is setup
+
+ // TOS changed to unaccepted
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 1);
+ activity.mTosContentObserver.onChange(true);
+ });
+ // Content observer is not null after recreate
+ mActivityScenario.onActivity(activity -> assertNotNull(activity.mTosContentObserver));
+ }
+
+ private Intent createIntentFromString(String intentString) {
+ try {
+ return Intent.parseUri(intentString, Intent.URI_ANDROID_APP_SCHEME);
+ } catch (URISyntaxException se) {
+ return null;
+ }
+ }
+
+ private Set<String> tosDisabledPackages() {
+ Set<String> packages = new ArraySet<>();
+ packages.add("com.android.car.maps");
+ packages.add("com.android.car.assistant");
+ return packages;
+ }
+}
diff --git a/app/tests/src/com/android/car/carlauncher/CarLauncherViewModelFactoryTest.java b/app/tests/src/com/android/car/carlauncher/CarLauncherViewModelFactoryTest.java
new file mode 100644
index 00000000..722a3edb
--- /dev/null
+++ b/app/tests/src/com/android/car/carlauncher/CarLauncherViewModelFactoryTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher;
+
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
+
+import static com.android.car.carlauncher.CarLauncherViewModel.CarLauncherViewModelFactory;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.content.Context;
+import android.content.Intent;
+import android.view.WindowManager;
+
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.carlauncher.TaskViewManagerTest.TestActivity;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+@RunWith(AndroidJUnit4.class)
+public class CarLauncherViewModelFactoryTest extends AbstractExtendedMockitoTestCase {
+ @Rule
+ public final ActivityScenarioRule<TestActivity> mActivityRule =
+ new ActivityScenarioRule<>(TestActivity.class);
+
+ @Mock
+ private Context mContext;
+ @Mock
+ private Intent mIntent;
+
+ private CarLauncherViewModelFactory mCarLauncherViewModelFactory;
+ private TestActivity mActivity;
+
+ @Before
+ public void setUp() {
+ mActivityRule.getScenario().onActivity(activity -> mActivity = activity);
+ Context windowContext = mActivity
+ .createWindowContext(TYPE_APPLICATION_STARTING, /* options */ null);
+ when(mContext.createWindowContext(eq(WindowManager.LayoutParams.TYPE_APPLICATION_STARTING),
+ any())).thenReturn(windowContext);
+ mCarLauncherViewModelFactory = new CarLauncherViewModelFactory(mContext, mIntent);
+ }
+
+ @After
+ public void tearDown() throws InterruptedException {
+ mCarLauncherViewModelFactory = null;
+ mActivityRule.getScenario().close();
+ mActivity.finishCompletely();
+ }
+
+ @Test
+ public void testCreate_instanceNotNull() {
+ CarLauncherViewModel carLauncherViewModel =
+ mCarLauncherViewModelFactory.create(CarLauncherViewModel.class);
+ assertThat(carLauncherViewModel).isNotNull();
+ }
+}
diff --git a/app/tests/src/com/android/car/carlauncher/CarLauncherViewModelTest.java b/app/tests/src/com/android/car/carlauncher/CarLauncherViewModelTest.java
new file mode 100644
index 00000000..087d5a11
--- /dev/null
+++ b/app/tests/src/com/android/car/carlauncher/CarLauncherViewModelTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Instrumentation;
+import android.car.app.RemoteCarTaskView;
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.core.app.ActivityCompat;
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.car.carlauncher.TaskViewManagerTest.TestActivity;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+@RunWith(AndroidJUnit4.class)
+public final class CarLauncherViewModelTest extends AbstractExtendedMockitoTestCase {
+ private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ private final Context mContext = mInstrumentation.getContext();
+
+ @Rule
+ public final ActivityScenarioRule<TestActivity> mActivityRule =
+ new ActivityScenarioRule<>(TestActivity.class);
+
+ @Mock
+ private Intent mIntent;
+
+ private RemoteCarTaskView mRemoteCarTaskView;
+ private TestActivity mActivity;
+
+
+ @Before
+ public void setUp() {
+ mActivityRule.getScenario().onActivity(activity -> mActivity = activity);
+ }
+
+ @After
+ public void tearDown() throws InterruptedException {
+ mActivityRule.getScenario().close();
+ mActivity.finishCompletely();
+ mRemoteCarTaskView = null;
+ }
+
+ @Test
+ public void testOnConfigChange_sameRemoteCarTaskView() {
+ // Arrange
+ createCarLauncherViewModel();
+ RemoteCarTaskView oldRemoteCarTaskView = mRemoteCarTaskView;
+
+ // Act
+ triggerActivityRecreation();
+
+ // Assert
+ assertThat(oldRemoteCarTaskView).isSameInstanceAs(mRemoteCarTaskView);
+ }
+
+ @Test
+ public void testViewModelOnCleared_clearsRemoteCarTaskView() {
+ // Arrange
+ CarLauncherViewModel carLauncherViewModel = createCarLauncherViewModel();
+
+ // Act
+ runOnMain(carLauncherViewModel::onCleared);
+ mInstrumentation.waitForIdleSync();
+
+ // Assert
+ assertThat(mRemoteCarTaskView).isNull();
+ }
+
+ private CarLauncherViewModel createCarLauncherViewModel() {
+ CarLauncherViewModel carLauncherViewModel = new CarLauncherViewModel(mActivity, mIntent);
+ runOnMain(() -> carLauncherViewModel.getRemoteCarTaskView().observeForever(
+ remoteCarTaskView -> mRemoteCarTaskView = remoteCarTaskView));
+ mInstrumentation.waitForIdleSync();
+ return carLauncherViewModel;
+ }
+
+ private void triggerActivityRecreation() {
+ // Causes activity recreation with a new instance resulting in the same flow as
+ // activity being recreated due to a configuration change.
+ runOnMain(() -> ActivityCompat.recreate(mActivity));
+ mInstrumentation.waitForIdleSync();
+ }
+
+ private void runOnMain(Runnable runnable) {
+ mContext.getMainExecutor().execute(runnable);
+ }
+}
diff --git a/tests/src/com/android/car/carlauncher/TaskViewInputInterceptorTest.java b/app/tests/src/com/android/car/carlauncher/TaskViewInputInterceptorTest.java
index 45809d92..7c900949 100644
--- a/tests/src/com/android/car/carlauncher/TaskViewInputInterceptorTest.java
+++ b/app/tests/src/com/android/car/carlauncher/TaskViewInputInterceptorTest.java
@@ -17,9 +17,7 @@
package com.android.car.carlauncher;
import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SPY;
-
import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
@@ -52,6 +50,7 @@ import androidx.lifecycle.Lifecycle;
import androidx.test.core.app.ActivityScenario;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.Suppress;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
@@ -68,6 +67,7 @@ import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+@Suppress // CarTaskView in Launcher are not supported anymore and hence this test is not required
@RunWith(AndroidJUnit4.class)
public class TaskViewInputInterceptorTest extends AbstractExtendedMockitoTestCase {
private static final UiAutomation UI_AUTOMATION =
diff --git a/tests/src/com/android/car/carlauncher/TaskViewManagerTest.java b/app/tests/src/com/android/car/carlauncher/TaskViewManagerTest.java
index 1e2411d2..1e2411d2 100644
--- a/tests/src/com/android/car/carlauncher/TaskViewManagerTest.java
+++ b/app/tests/src/com/android/car/carlauncher/TaskViewManagerTest.java
diff --git a/app/tests/src/com/android/car/carlauncher/calmmode/CalmModeFragmentTest.java b/app/tests/src/com/android/car/carlauncher/calmmode/CalmModeFragmentTest.java
new file mode 100644
index 00000000..6345cc0c
--- /dev/null
+++ b/app/tests/src/com/android/car/carlauncher/calmmode/CalmModeFragmentTest.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import static androidx.lifecycle.Lifecycle.State.RESUMED;
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.*;
+
+import android.app.Activity;
+
+import androidx.fragment.app.testing.FragmentScenario;
+
+import com.android.car.carlauncher.R;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CalmModeFragmentTest {
+
+ private FragmentScenario<CalmModeFragment> mFragmentScenario;
+ private CalmModeFragment mCalmModeFragment;
+ private Activity mActivity;
+
+ @Before
+ public void setUp() {
+ mFragmentScenario =
+ FragmentScenario.launchInContainer(
+ CalmModeFragment.class, null, R.style.Theme_CalmMode);
+ mFragmentScenario.onFragment(fragment -> mCalmModeFragment = fragment);
+ mActivity = mCalmModeFragment.getActivity();
+ }
+
+ @After
+ public void tearDown() throws InterruptedException {
+ if (mFragmentScenario != null) {
+ mFragmentScenario.close();
+ }
+ }
+
+ @Test
+ public void fragmentResumed_testContainerTouched_activityFinishes() {
+ mFragmentScenario.moveToState(RESUMED);
+
+ onView(withId(R.id.calm_mode_container)).perform(click());
+
+ assertTrue(mActivity.isFinishing());
+ }
+
+ @Test
+ public void fragmentResumed_testClock_isVisible() {
+ mFragmentScenario.moveToState(RESUMED);
+
+ onView(withId(R.id.clock)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void fragmentResumed_testDate_isVisible() {
+ mFragmentScenario.moveToState(RESUMED);
+
+ onView(withId(R.id.date)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void fragmentResumed_testMedia_isVisible() {
+ String testMediaTitle = "Test media title";
+ mFragmentScenario.moveToState(RESUMED);
+
+ mActivity.runOnUiThread(()->mCalmModeFragment.updateMediaTitle(testMediaTitle));
+
+ onView(withId(R.id.media_title)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void fragmentResumed_testMediaTitleNull_isGone() {
+ String testMediaTitle = null;
+ mFragmentScenario.moveToState(RESUMED);
+
+ mActivity.runOnUiThread(()->mCalmModeFragment.updateMediaTitle(testMediaTitle));
+
+ onView(withId(R.id.media_title)).check(matches(not(isDisplayed())));
+ }
+}
diff --git a/app/tests/src/com/android/car/carlauncher/calmmode/CalmModeQCProviderTest.java b/app/tests/src/com/android/car/carlauncher/calmmode/CalmModeQCProviderTest.java
new file mode 100644
index 00000000..efb3049b
--- /dev/null
+++ b/app/tests/src/com/android/car/carlauncher/calmmode/CalmModeQCProviderTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import static junit.framework.Assert.assertNull;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.net.Uri;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.carlauncher.Flags;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+public class CalmModeQCProviderTest {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ private static final String ALLOW_LIST_PKG = "com.android.systemui";
+ private CalmModeQCProvider mCalmModeQCProvider;
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Before
+ public void setUp() {
+ mCalmModeQCProvider = new CalmModeQCProvider();
+ ExtendedMockito.spyOn(mCalmModeQCProvider);
+ ExtendedMockito.doReturn(mContext).when(mCalmModeQCProvider).getContext();
+ mSetFlagsRule.enableFlags(Flags.FLAG_CALM_MODE);
+ }
+
+ @Test
+ public void onCreate_allowlistSet() {
+ mCalmModeQCProvider.onCreate();
+ Set<String> allowlist = mCalmModeQCProvider.getAllowlistedPackages();
+
+ assertTrue(allowlist.contains(ALLOW_LIST_PKG));
+ }
+
+ @Test
+ public void onCreate_QCItemIsNotNull() {
+ mCalmModeQCProvider.onCreate();
+
+ assertNotNull(mCalmModeQCProvider.mQCItem);
+ }
+
+ @Test
+ public void onBind_invalidUri_throwsException() {
+ mCalmModeQCProvider.onCreate();
+
+ assertThrows(IllegalArgumentException.class, () -> mCalmModeQCProvider.onBind(Uri.EMPTY));
+ }
+
+ @Test
+ public void onBind_validUri_returnsQCItem() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_CALM_MODE);
+
+ mCalmModeQCProvider.onCreate();
+
+ assertNotNull(mCalmModeQCProvider.onBind(CalmModeQCProvider.CALM_MODE_URI));
+ }
+
+ @Test
+ public void onBind_flagOff_returnsNull() {
+ mSetFlagsRule.disableFlags(Flags.FLAG_CALM_MODE);
+
+ mCalmModeQCProvider.onCreate();
+
+ assertNull(mCalmModeQCProvider.onBind(CalmModeQCProvider.CALM_MODE_URI));
+ }
+}
diff --git a/app/tests/src/com/android/car/carlauncher/calmmode/NavigationStateDataTest.java b/app/tests/src/com/android/car/carlauncher/calmmode/NavigationStateDataTest.java
new file mode 100644
index 00000000..b614cbeb
--- /dev/null
+++ b/app/tests/src/com/android/car/carlauncher/calmmode/NavigationStateDataTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.when;
+
+import android.car.cluster.navigation.NavigationState;
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.icu.util.MeasureUnit;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Locale;
+
+@RunWith(AndroidJUnit4.class)
+public class NavigationStateDataTest extends AbstractExtendedMockitoTestCase {
+
+ private static final String TIME_TO_DEST = "1hr 30min";
+ private static final double DISTANCE_TO_DEST = 100;
+ private static final String DISTANCE_TO_DEST_STR = "100";
+ private static final MeasureUnit DISTANCE_UNIT_IMPERIAL = MeasureUnit.MILE;
+ private static final MeasureUnit DISTANCE_UNIT_METRIC = MeasureUnit.MILE;
+ private static final String DISTANCE_UNIT_IMPERIAL_STR = "mi";
+ private static final String DISTANCE_UNIT_METRIC_STR = "mi";
+ private static final Locale LOCALE_US = Locale.US;
+ private static final float TEST_FLOAT_DELTA = 0.05f;
+ @Mock
+ private NavigationStateData mNavigationStateDataImperial;
+ @Mock
+ private NavigationStateData mNavigationStateDataMetric;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ when(mNavigationStateDataImperial.getTimeToDestination()).thenReturn(TIME_TO_DEST);
+ when(mNavigationStateDataImperial.getDistanceToDestination()).thenReturn(DISTANCE_TO_DEST);
+ when(mNavigationStateDataImperial.getDistanceUnit()).thenReturn(DISTANCE_UNIT_IMPERIAL);
+
+ when(mNavigationStateDataMetric.getTimeToDestination()).thenReturn(TIME_TO_DEST);
+ when(mNavigationStateDataMetric.getDistanceToDestination()).thenReturn(DISTANCE_TO_DEST);
+ when(mNavigationStateDataMetric.getDistanceUnit()).thenReturn(DISTANCE_UNIT_METRIC);
+ }
+
+ @After
+ public void tearDown() throws Exception {}
+
+ @Test
+ public void testBuilder_validArgs_objectCreated() {
+ NavigationStateData navStateData =
+ NavigationStateData.newBuilder()
+ .setTimeToDestination(TIME_TO_DEST)
+ .setDistanceToDestination(DISTANCE_TO_DEST_STR)
+ .setDistanceUnit(NavigationState.Distance.Unit.MILES)
+ .build();
+
+ assertNotNull(navStateData);
+ assertEquals(TIME_TO_DEST, navStateData.getTimeToDestination());
+ assertEquals(DISTANCE_TO_DEST, navStateData.getDistanceToDestination(), TEST_FLOAT_DELTA);
+ assertEquals(MeasureUnit.MILE, navStateData.getDistanceUnit());
+ }
+
+ @Test
+ public void testBuildTripStatusString_nullNavState_returnsNull() {
+ assertNull(NavigationStateData.buildTripStatusString(null, LOCALE_US));
+ }
+
+ @Test
+ public void testBuildTripStatusString_nullTime_returnsNull() {
+ when(mNavigationStateDataImperial.getTimeToDestination()).thenReturn(null);
+ final String tripStatusActual =
+ NavigationStateData.buildTripStatusString(mNavigationStateDataImperial, null);
+ assertNull(tripStatusActual);
+ }
+
+ @Test
+ public void testBuildTripStatusString_nullDistanceUnit_returnsNull() {
+ when(mNavigationStateDataImperial.getDistanceUnit()).thenReturn(null);
+ final String tripStatusActual =
+ NavigationStateData.buildTripStatusString(mNavigationStateDataImperial, LOCALE_US);
+ assertNull(tripStatusActual);
+ }
+
+ @Test
+ public void testBuildTripStatusString_navStateDataImperial_matchesForLocaleUS() {
+ final String tripStatusExpected =
+ TIME_TO_DEST + " " + DISTANCE_TO_DEST_STR + " " + DISTANCE_UNIT_IMPERIAL_STR;
+ final String tripStatusActual =
+ NavigationStateData.buildTripStatusString(mNavigationStateDataImperial, LOCALE_US);
+ assertEquals(tripStatusExpected, tripStatusActual);
+ }
+
+ @Test
+ public void testBuildTripStatusString_navStateDataMetric_matchesForLocaleUS() {
+ final String tripStatusExpected =
+ TIME_TO_DEST + " " + DISTANCE_TO_DEST_STR + " " + DISTANCE_UNIT_METRIC_STR;
+ final String tripStatusActual =
+ NavigationStateData.buildTripStatusString(mNavigationStateDataMetric, LOCALE_US);
+ assertEquals(tripStatusExpected, tripStatusActual);
+ }
+}
diff --git a/app/tests/src/com/android/car/carlauncher/calmmode/NavigationStateViewModelTest.java b/app/tests/src/com/android/car/carlauncher/calmmode/NavigationStateViewModelTest.java
new file mode 100644
index 00000000..efa1938d
--- /dev/null
+++ b/app/tests/src/com/android/car/carlauncher/calmmode/NavigationStateViewModelTest.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import static junit.framework.Assert.assertNotNull;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.Car;
+import android.car.cluster.ClusterHomeManager;
+import android.car.cluster.navigation.NavigationState;
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.icu.util.MeasureUnit;
+
+import androidx.annotation.NonNull;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.car.apps.common.testutils.InstantTaskExecutorRule;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class NavigationStateViewModelTest extends AbstractExtendedMockitoTestCase {
+ @Rule
+ public InstantTaskExecutorRule mInstantExecutorRule = new InstantTaskExecutorRule();
+ @Mock
+ private ClusterHomeManager mClusterHomeManager;
+ @Mock
+ private Car mCar;
+ private NavigationStateViewModel mNavigationStateViewModel;
+
+ private static NavigationState.NavigationStateProto buildNavStateProto(
+ String distanceValue,
+ NavigationState.Distance.Unit distanceUnit,
+ String durationUntilArrival) {
+ NavigationState.Distance distance =
+ NavigationState.Distance.newBuilder()
+ .setDisplayValue(distanceValue)
+ .setDisplayUnits(distanceUnit)
+ .build();
+ NavigationState.Destination destination =
+ NavigationState.Destination.newBuilder()
+ .setDistance(distance)
+ .setFormattedDurationUntilArrival(durationUntilArrival)
+ .build();
+ return NavigationState.NavigationStateProto.newBuilder()
+ .addDestinations(destination)
+ .build();
+ }
+
+ @Override
+ protected void onSessionBuilder(@NonNull CustomMockitoSessionBuilder builder) {
+ builder.spyStatic(Car.class);
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ ExtendedMockito.doAnswer(invocation -> mCar).when(() -> Car.createCar(any()));
+ when(mCar.getCarManager(eq(Car.CLUSTER_HOME_SERVICE))).thenReturn(mClusterHomeManager);
+
+ mNavigationStateViewModel =
+ new NavigationStateViewModel(ApplicationProvider.getApplicationContext());
+ mNavigationStateViewModel = spy(mNavigationStateViewModel);
+ }
+
+ @Test
+ public void constructor_viewModelCreateSuccess() {
+ assertNotNull(mNavigationStateViewModel);
+ verify(mCar).getCarManager(eq(Car.CLUSTER_HOME_SERVICE));
+ verify(mClusterHomeManager).registerClusterNavigationStateListener(any(), any());
+ }
+
+ @Test
+ public void constructor_carIsNull_viewModelCreateSuccess() {
+ ExtendedMockito.doAnswer(invocation -> null).when(() -> Car.createCar(any()));
+ NavigationStateViewModel navStateVM =
+ new NavigationStateViewModel(ApplicationProvider.getApplicationContext());
+ assertNotNull(navStateVM);
+ }
+
+ @Test
+ public void constructor_clusterHomeManagerIsNull_viewModelCreateSuccess() {
+ Car car = mock(Car.class);
+ ExtendedMockito.doAnswer(invocation -> car).when(() -> Car.createCar(any()));
+ when(car.getCarManager(eq(Car.CLUSTER_HOME_SERVICE))).thenReturn(null);
+ NavigationStateViewModel navStateVM =
+ new NavigationStateViewModel(ApplicationProvider.getApplicationContext());
+ assertNotNull(navStateVM);
+ verify(car).getCarManager(eq(Car.CLUSTER_HOME_SERVICE));
+ }
+
+ @Test
+ public void onNavigationState_noDestination_navStateSetToNull() {
+
+ NavigationState.NavigationStateProto navStateProto =
+ NavigationState.NavigationStateProto.newBuilder().build();
+ mNavigationStateViewModel.onNavigationState(navStateProto.toByteArray());
+
+ NavigationStateData navStateData =
+ mNavigationStateViewModel.getNavigationState().getValue();
+ assertNull(navStateData);
+ }
+
+ @Test
+ public void onNavigationState_protoExceptionWhileParsing_navStateIsSetToNull() {
+ mNavigationStateViewModel.onNavigationState(new byte[] {});
+ NavigationStateData navStateData =
+ mNavigationStateViewModel.getNavigationState().getValue();
+ assertNull(navStateData);
+ }
+
+ @Test
+ public void onNavigationState_destinationImperial_navStateIsImperial() {
+ final String timeToDest = "1hr 30min";
+ final String distanceToDest = "100";
+
+ NavigationState.NavigationStateProto navStateProto =
+ buildNavStateProto(distanceToDest, NavigationState.Distance.Unit.MILES, timeToDest);
+ mNavigationStateViewModel.onNavigationState(navStateProto.toByteArray());
+
+ NavigationStateData navStateData =
+ mNavigationStateViewModel.getNavigationState().getValue();
+ assertNotNull(navStateData);
+ assertEquals(timeToDest, navStateData.getTimeToDestination());
+ assertEquals(100, navStateData.getDistanceToDestination(), 0);
+ assertEquals(MeasureUnit.MILE, navStateData.getDistanceUnit());
+ }
+
+ @Test
+ public void onNavigationState_destinationMetric_navStateIsMetric() {
+ final String timeToDest = "30min";
+ final String distanceToDest = "20";
+ NavigationState.NavigationStateProto navStateProto =
+ buildNavStateProto(
+ distanceToDest, NavigationState.Distance.Unit.KILOMETERS, timeToDest);
+ mNavigationStateViewModel.onNavigationState(navStateProto.toByteArray());
+
+ NavigationStateData navStateData =
+ mNavigationStateViewModel.getNavigationState().getValue();
+ assertNotNull(navStateData);
+ assertEquals(timeToDest, navStateData.getTimeToDestination());
+ assertEquals(20, navStateData.getDistanceToDestination(), 0);
+ assertEquals(MeasureUnit.KILOMETER, navStateData.getDistanceUnit());
+ }
+
+ @Test
+ public void onNavigationState_destinationFeet_navStateIsFeet() {
+ final String timeToDest = "3min";
+ final String distanceToDest = "1000";
+ NavigationState.NavigationStateProto navStateProto =
+ buildNavStateProto(distanceToDest, NavigationState.Distance.Unit.FEET, timeToDest);
+ mNavigationStateViewModel.onNavigationState(navStateProto.toByteArray());
+
+ NavigationStateData navStateData =
+ mNavigationStateViewModel.getNavigationState().getValue();
+ assertNotNull(navStateData);
+ assertEquals(timeToDest, navStateData.getTimeToDestination());
+ assertEquals(1000, navStateData.getDistanceToDestination(), 0);
+ assertEquals(MeasureUnit.FOOT, navStateData.getDistanceUnit());
+ }
+
+ @Test
+ public void onCleared_testCarDisconnects() {
+ mNavigationStateViewModel.onCleared();
+ verify(mCar).disconnect();
+ verify(mClusterHomeManager).unregisterClusterNavigationStateListener(any());
+ }
+}
diff --git a/app/tests/src/com/android/car/carlauncher/calmmode/TemperatureDataTest.java b/app/tests/src/com/android/car/carlauncher/calmmode/TemperatureDataTest.java
new file mode 100644
index 00000000..a2b4e6cb
--- /dev/null
+++ b/app/tests/src/com/android/car/carlauncher/calmmode/TemperatureDataTest.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import static org.junit.Assert.assertEquals;
+
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.icu.util.MeasureUnit;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Locale;
+
+public class TemperatureDataTest extends AbstractExtendedMockitoTestCase {
+
+ private static final float TEMP_CONVERSION_DELTA = 0.005f;
+ private static final Locale TEST_LOCALE_US = Locale.US;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testBuilder_celsius_objectCreated() {
+ float testValue = 25.12345f;
+
+ TemperatureData temp = new TemperatureData.Builder().setValueCelsius(testValue).build();
+
+ assertEquals(MeasureUnit.CELSIUS, temp.getUnit());
+ assertEquals(testValue, temp.getValue(), TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testBuilder_fahrenheit_objectCreated() {
+ float testValue = 80.1234f;
+
+ TemperatureData temp = new TemperatureData.Builder().setValueFahrenheit(testValue).build();
+
+ assertEquals(testValue, TEMP_CONVERSION_DELTA, temp.getValue());
+ assertEquals(MeasureUnit.FAHRENHEIT, temp.getUnit());
+ }
+
+ @Test
+ public void testBuilder_noValue_defaultsToZeroCelsius() {
+ float tempZero = 0f;
+
+ TemperatureData temp = new TemperatureData.Builder().build();
+
+ assertEquals(tempZero, temp.getValue(), TEMP_CONVERSION_DELTA);
+ assertEquals(MeasureUnit.CELSIUS, temp.getUnit());
+ }
+
+ @Test
+ public void testConversion_celsiusDecimalPositive_convertsToF() {
+ float tempCVal = 25.12345f;
+ float tempFExpected = 77.22f;
+
+ TemperatureData temp = new TemperatureData.Builder().setValueCelsius(tempCVal).build();
+ temp.convertToFahrenheit();
+
+ assertEquals(tempFExpected, temp.getValue(), TEMP_CONVERSION_DELTA);
+ assertEquals(MeasureUnit.FAHRENHEIT, temp.getUnit());
+ }
+
+ @Test
+ public void testConversion_celsiusRoundPositive_convertsToF() {
+ float tempCVal = 25f;
+ float tempFExpected = 77f;
+
+ TemperatureData temp = new TemperatureData.Builder().setValueCelsius(tempCVal).build();
+ temp.convertToFahrenheit();
+
+ assertEquals(tempFExpected, temp.getValue(), TEMP_CONVERSION_DELTA);
+ assertEquals(temp.getUnit(), MeasureUnit.FAHRENHEIT);
+ }
+
+
+ @Test
+ public void testConversion_celsiusNegative_convertsToF() {
+ float tempCVal = -30f;
+ float tempFExpected = -22f;
+
+ TemperatureData temp =
+ new TemperatureData.Builder().setValueCelsius(tempCVal).build();
+ temp.convertToFahrenheit();
+
+ assertEquals(MeasureUnit.FAHRENHEIT, temp.getUnit());
+ assertEquals(tempFExpected, temp.getValue(), TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConversion_celsiusConvertToC_NoOp() {
+ float tempCVal = -10f;
+
+ TemperatureData temp =
+ new TemperatureData.Builder().setValueCelsius(tempCVal).build();
+ temp.convertToCelsius();
+
+ assertEquals(MeasureUnit.CELSIUS, temp.getUnit());
+ assertEquals(tempCVal, temp.getValue(), TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConversion_fahrenheitPositive_convertsToC() {
+ float tempFVal = 77.2f;
+ float tempCExpected = 25.11f;
+
+ TemperatureData temp =
+ new TemperatureData.Builder().setValueFahrenheit(tempFVal).build();
+ temp.convertToCelsius();
+
+ assertEquals(MeasureUnit.CELSIUS, temp.getUnit());
+ assertEquals(tempCExpected, temp.getValue(), TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testBuilder_fahrenheitNegative_convertsToC() {
+ float tempF = -10f;
+ float tempCExpected = -23.33f;
+
+ TemperatureData temp =
+ new TemperatureData.Builder().setValueFahrenheit(tempF).build();
+ temp.convertToCelsius();
+
+ assertEquals(MeasureUnit.CELSIUS, temp.getUnit());
+ assertEquals(tempCExpected, temp.getValue(), TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testBuilder_fahrenheit_convertsToFNoOp() {
+ float tempF = -10f;
+
+ TemperatureData temp =
+ new TemperatureData.Builder().setValueFahrenheit(tempF).build();
+ temp.convertToFahrenheit();
+
+ assertEquals(MeasureUnit.FAHRENHEIT, temp.getUnit());
+ assertEquals(tempF, temp.getValue(), TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testBuildTemperatureString_positiveCelsius_matchesForLocaleUS() {
+ float tempCVal = 25.12345f;
+ String tempCExpected = "25°C";
+ TemperatureData tempC = new TemperatureData.Builder().setValueCelsius(tempCVal).build();
+
+ String tempCActual = TemperatureData.buildTemperatureString(tempC, TEST_LOCALE_US);
+
+ assertEquals(tempCExpected, tempCActual);
+ }
+
+ @Test
+ public void testBuildTemperatureString_positiveFahrenheit_matchesForLocaleUS() {
+ float tempFVal = 77.2212f;
+ String tempFExpected = "77°F";
+ TemperatureData tempF = new TemperatureData.Builder().setValueFahrenheit(tempFVal).build();
+
+ String tempFActual = TemperatureData.buildTemperatureString(tempF, TEST_LOCALE_US);
+
+ assertEquals(tempFExpected, tempFActual);
+ }
+
+ @Test
+ public void testBuildTemperatureString_negativeCelsius_matchesForLocaleUS() {
+ float tempCVal = -20f;
+ String tempCExpected = "-20°C";
+ TemperatureData tempC = new TemperatureData.Builder().setValueCelsius(tempCVal).build();
+
+ String tempCActual = TemperatureData.buildTemperatureString(tempC, TEST_LOCALE_US);
+
+ assertEquals(tempCExpected, tempCActual);
+ }
+
+ @Test
+ public void testBuildTemperatureString_negativeFahrenheit_matchesForLocaleUS() {
+ float tempFVal = -4f;
+ String tempFExpected = "-4°F";
+ TemperatureData tempF = new TemperatureData.Builder().setValueFahrenheit(tempFVal).build();
+
+ String tempFActual = TemperatureData.buildTemperatureString(tempF, TEST_LOCALE_US);
+
+ assertEquals(tempFExpected, tempFActual);
+ }
+
+ @Test
+ public void testBuildTemperatureString_zeroCelsius_matchesForLocaleUS() {
+ float tempCVal = 0f;
+ String tempCExpected = "0°C";
+ TemperatureData tempC = new TemperatureData.Builder().setValueCelsius(tempCVal).build();
+
+ String tempCActual = TemperatureData.buildTemperatureString(tempC, TEST_LOCALE_US);
+
+ assertEquals(tempCExpected, tempCActual);
+ }
+
+ @Test
+ public void testBuildTemperatureString_zeroFahrenheit_matchesForLocaleUS() {
+ float tempFVal = 0f;
+ String tempFExpected = "0°C";
+ TemperatureData tempF = new TemperatureData.Builder().setValueCelsius(tempFVal).build();
+
+ String tempCActual = TemperatureData.buildTemperatureString(tempF, TEST_LOCALE_US);
+
+ assertEquals(tempFExpected, tempCActual);
+ }
+
+ @Test
+ public void testConvertCelsiusToFahrenheit_positiveRoundC_convertsToF() {
+ float tempCVal = 25f;
+ float tempFExpected = 77f;
+
+ float tempFActual = TemperatureData.convertCelsiusToFahrenheit(tempCVal);
+
+ assertEquals(tempFExpected, tempFActual, TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConvertCelsiusToFahrenheit_positiveDecimalC_convertsToF() {
+ float tempCVal = 25.1234f;
+ float tempFExpected = 77.22f;
+
+ float tempFActual = TemperatureData.convertCelsiusToFahrenheit(tempCVal);
+
+ assertEquals(tempFExpected, tempFActual, TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConvertCelsiusToFahrenheit_negativeRoundC_convertsToF() {
+ float tempCVal = -20f;
+ float tempFExpected = -4f;
+
+ float tempFActual = TemperatureData.convertCelsiusToFahrenheit(tempCVal);
+
+ assertEquals(tempFExpected, tempFActual, TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConvertCelsiusToFahrenheit_zeroC_convertsToF() {
+ float tempCVal = 0f;
+ float tempFExpected = 32f;
+
+ float tempFActual = TemperatureData.convertCelsiusToFahrenheit(tempCVal);
+
+ assertEquals(tempFExpected, tempFActual, TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConvertCelsiusToFahrenheit_celsiusIsZeroF_convertsToF() {
+ float tempCVal = -17.778f;
+ float tempFExpected = 0f;
+
+ float tempFActual = TemperatureData.convertCelsiusToFahrenheit(tempCVal);
+
+ assertEquals(tempFExpected, tempFActual, TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConvertFahrenheitToCelsius_positiveRoundF_convertsToC() {
+ float tempFVal = 77f;
+ float tempCExpected = 25f;
+
+ float tempCActual = TemperatureData.convertFahrenheitToCelsius(tempFVal);
+
+ assertEquals(tempCExpected, tempCActual, TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConvertFahrenheitToCelsius_positiveDecimalF_convertsToC() {
+ float tempFVal = 77.22f;
+ float tempCExpected = 25.1234f;
+
+ float tempCActual = TemperatureData.convertFahrenheitToCelsius(tempFVal);
+
+ assertEquals(tempCExpected, tempCActual, TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConvertFahrenheitToCelsius_negativeRoundF_convertsToC() {
+ float tempFVal = -4f;
+ float tempCExpected = -20f;
+
+ float tempCActual = TemperatureData.convertFahrenheitToCelsius(tempFVal);
+
+ assertEquals(tempCExpected, tempCActual, TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConvertFahrenheitToCelsius_zeroF_convertsToC() {
+ float tempFVal = 0f;
+ float tempCExpected = -17.778f;
+
+ float tempCActual = TemperatureData.convertFahrenheitToCelsius(tempFVal);
+
+ assertEquals(tempCExpected, tempCActual, TEMP_CONVERSION_DELTA);
+ }
+
+ @Test
+ public void testConvertFahrenheitToCelsius_fahrenheitIsZeroC_convertsToC() {
+ float tempFVal = 32f;
+ float tempCExpected = 0f;
+
+ float tempCActual = TemperatureData.convertFahrenheitToCelsius(tempFVal);
+
+ assertEquals(tempCExpected, tempCActual, TEMP_CONVERSION_DELTA);
+ }
+}
diff --git a/app/tests/src/com/android/car/carlauncher/calmmode/TemperatureViewModelTest.java b/app/tests/src/com/android/car/carlauncher/calmmode/TemperatureViewModelTest.java
new file mode 100644
index 00000000..8c759523
--- /dev/null
+++ b/app/tests/src/com/android/car/carlauncher/calmmode/TemperatureViewModelTest.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.calmmode;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+
+import static org.junit.Assert.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.Car;
+import android.car.VehiclePropertyIds;
+import android.car.VehicleUnit;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.property.CarPropertyManager;
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.icu.util.MeasureUnit;
+
+import androidx.annotation.NonNull;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.apps.common.testutils.InstantTaskExecutorRule;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class TemperatureViewModelTest extends AbstractExtendedMockitoTestCase {
+ private static final int TEST_AREA_ID = 1234;
+ private static final float TEST_OUTSIDE_TEMPERATURE_C = 25f;
+ private static final float TEST_OUTSIDE_TEMPERATURE_F = 77f;
+ private TemperatureViewModel mTemperatureViewModel;
+ @Mock
+ private Car mCar;
+ @Mock
+ private CarPropertyManager mCarPropertyManager;
+ @Mock
+ private CarPropertyValue mUnitCarPropVal;
+ @Mock
+ private CarPropertyValue mValueCarPropVal;
+ @Rule
+ public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule();
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mCar.getCarManager(CarPropertyManager.class)).thenReturn(mCarPropertyManager);
+ when(mCar.isConnected()).thenReturn(true);
+ when(mUnitCarPropVal.getPropertyId())
+ .thenReturn(VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS);
+ when(mUnitCarPropVal.getValue()).thenReturn(VehicleUnit.CELSIUS);
+ when(mValueCarPropVal.getPropertyId())
+ .thenReturn(VehiclePropertyIds.ENV_OUTSIDE_TEMPERATURE);
+ when(mValueCarPropVal.getValue()).thenReturn(TEST_OUTSIDE_TEMPERATURE_C);
+ when(mCarPropertyManager.getAreaId(anyInt(), anyInt())).thenReturn(TEST_AREA_ID);
+ when(mCarPropertyManager.getProperty(
+ eq(VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS), anyInt()))
+ .thenReturn(mUnitCarPropVal);
+ when(mCarPropertyManager.getProperty(
+ eq(VehiclePropertyIds.ENV_OUTSIDE_TEMPERATURE), anyInt()))
+ .thenReturn(mValueCarPropVal);
+ when(Car.createCar(any())).thenReturn(mCar);
+ mTemperatureViewModel =
+ new TemperatureViewModel(ApplicationProvider.getApplicationContext());
+ mTemperatureViewModel = spy(mTemperatureViewModel);
+ }
+
+ @Override
+ protected void onSessionBuilder(@NonNull CustomMockitoSessionBuilder builder) {
+ builder.mockStatic(Car.class);
+ }
+
+
+ @Test
+ public void newTemperatureViewModel_nullCar_throwsException() {
+ when(Car.createCar(any())).thenReturn(null);
+
+ assertThrows(
+ NullPointerException.class,
+ () -> new TemperatureViewModel(ApplicationProvider.getApplicationContext()));
+ }
+
+ @Test
+ public void newTemperatureViewModel_nullCarPropertyManager_throwsException() {
+ when(mCar.getCarManager(CarPropertyManager.class)).thenReturn(null);
+
+ assertThrows(
+ NullPointerException.class,
+ () -> new TemperatureViewModel(ApplicationProvider.getApplicationContext()));
+ }
+
+ @Test
+ public void onChangeEvent_propEnvOutsideTemp_handleValueChangeInvoked() {
+ doNothing().when(mTemperatureViewModel).handleValueChange(any());
+
+ mTemperatureViewModel.onChangeEvent(mValueCarPropVal);
+
+ verify(mTemperatureViewModel).handleValueChange(eq(mValueCarPropVal));
+ }
+
+ @Test
+ public void onChangeEvent_propHvacDisplayUnits_handleUnitChangeInvoked() {
+ doNothing().when(mTemperatureViewModel).handleUnitChange(any());
+
+ mTemperatureViewModel.onChangeEvent(mUnitCarPropVal);
+
+ verify(mTemperatureViewModel).handleUnitChange(mUnitCarPropVal);
+ }
+
+ @Test
+ public void onChangeEvent_propNull_nothingInvoked() {
+ mTemperatureViewModel.onChangeEvent(null);
+
+ verify(mTemperatureViewModel, never()).handleValueChange(any());
+ verify(mTemperatureViewModel, never()).handleUnitChange(any());
+ }
+
+ @Test
+ public void testOnCleared_expectedMethodsInvoked() {
+ mTemperatureViewModel.onCleared();
+
+ verify(mCar).disconnect();
+ verify(mCarPropertyManager, times(2)).unregisterCallback(any(), anyInt());
+ }
+
+ @Test
+ public void testGetCarPropertyValue_notNull() {
+ assertNotNull(mTemperatureViewModel.getCarPropertyValue(
+ VehiclePropertyIds.ENV_OUTSIDE_TEMPERATURE));
+ assertNotNull(mTemperatureViewModel.getCarPropertyValue(
+ VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS));
+ }
+
+ @Test
+ public void testHandleUnitChange_changeUnitFromCtoF_dataChanged() {
+ mTemperatureViewModel.onChangeEvent(mValueCarPropVal);
+ mTemperatureViewModel.onChangeEvent(mUnitCarPropVal);
+ when(mUnitCarPropVal.getValue()).thenReturn(VehicleUnit.FAHRENHEIT);
+
+ mTemperatureViewModel.handleUnitChange(mUnitCarPropVal);
+
+ assertNotNull(mTemperatureViewModel.getTemperatureData().getValue());
+ assertEquals(TEST_OUTSIDE_TEMPERATURE_F,
+ mTemperatureViewModel.getTemperatureData().getValue().getValue());
+ assertEquals(MeasureUnit.FAHRENHEIT,
+ mTemperatureViewModel.getTemperatureData().getValue().getUnit());
+ }
+
+ @Test
+ public void testHandleUnitChange_changeUnitFromFtoC_dataChanged() {
+ when(mUnitCarPropVal.getValue()).thenReturn(VehicleUnit.FAHRENHEIT);
+ when(mValueCarPropVal.getValue()).thenReturn(TEST_OUTSIDE_TEMPERATURE_F);
+ mTemperatureViewModel.onChangeEvent(mValueCarPropVal);
+ mTemperatureViewModel.onChangeEvent(mUnitCarPropVal);
+ when(mUnitCarPropVal.getValue()).thenReturn(VehicleUnit.CELSIUS);
+
+ mTemperatureViewModel.handleUnitChange(mUnitCarPropVal);
+
+ assertNotNull(mTemperatureViewModel.getTemperatureData().getValue());
+ assertEquals(TEST_OUTSIDE_TEMPERATURE_C,
+ mTemperatureViewModel.getTemperatureData().getValue().getValue());
+ assertEquals(MeasureUnit.CELSIUS,
+ mTemperatureViewModel.getTemperatureData().getValue().getUnit());
+ }
+
+ @Test
+ public void testHandleUnitChange_changeUnitFromCtoC_dataSame() {
+ mTemperatureViewModel.onChangeEvent(mValueCarPropVal);
+ mTemperatureViewModel.onChangeEvent(mUnitCarPropVal);
+ when(mUnitCarPropVal.getValue()).thenReturn(VehicleUnit.CELSIUS);
+
+ mTemperatureViewModel.handleUnitChange(mUnitCarPropVal);
+
+ assertNotNull(mTemperatureViewModel.getTemperatureData().getValue());
+ assertEquals(TEST_OUTSIDE_TEMPERATURE_C,
+ mTemperatureViewModel.getTemperatureData().getValue().getValue());
+ assertEquals(MeasureUnit.CELSIUS,
+ mTemperatureViewModel.getTemperatureData().getValue().getUnit());
+ }
+
+ @Test
+ public void testHandleValueChange_changeValue_dataChanges() {
+ float testValueUpdate = 60f;
+ when(mValueCarPropVal.getValue()).thenReturn(testValueUpdate);
+
+ mTemperatureViewModel.onChangeEvent(mValueCarPropVal);
+
+ assertNotNull(mTemperatureViewModel.getTemperatureData().getValue());
+ assertEquals(testValueUpdate,
+ mTemperatureViewModel.getTemperatureData().getValue().getValue());
+ }
+
+}
diff --git a/tests/src/com/android/car/carlauncher/homescreen/HomeCardFragmentTest.java b/app/tests/src/com/android/car/carlauncher/homescreen/HomeCardFragmentTest.java
index 0a1afc9d..0a1afc9d 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/HomeCardFragmentTest.java
+++ b/app/tests/src/com/android/car/carlauncher/homescreen/HomeCardFragmentTest.java
diff --git a/tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java b/app/tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java
index cdc2e91d..cdc2e91d 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java
+++ b/app/tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java
diff --git a/tests/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModelTest.java b/app/tests/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModelTest.java
index 7d4715ce..7d4715ce 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModelTest.java
+++ b/app/tests/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModelTest.java
diff --git a/tests/src/com/android/car/carlauncher/homescreen/audio/AudioFragmentTest.java b/app/tests/src/com/android/car/carlauncher/homescreen/audio/AudioFragmentTest.java
index 1f0b5fb7..1f0b5fb7 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/audio/AudioFragmentTest.java
+++ b/app/tests/src/com/android/car/carlauncher/homescreen/audio/AudioFragmentTest.java
diff --git a/tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java b/app/tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java
index 160245d8..160245d8 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java
+++ b/app/tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java
diff --git a/tests/src/com/android/car/carlauncher/homescreen/audio/InCallModelTest.java b/app/tests/src/com/android/car/carlauncher/homescreen/audio/InCallModelTest.java
index 346f7088..346f7088 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/audio/InCallModelTest.java
+++ b/app/tests/src/com/android/car/carlauncher/homescreen/audio/InCallModelTest.java
diff --git a/tests/src/com/android/car/carlauncher/homescreen/audio/MediaViewModelTest.java b/app/tests/src/com/android/car/carlauncher/homescreen/audio/MediaViewModelTest.java
index 14252b0e..f5e0b015 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/audio/MediaViewModelTest.java
+++ b/app/tests/src/com/android/car/carlauncher/homescreen/audio/MediaViewModelTest.java
@@ -18,19 +18,23 @@ package com.android.car.carlauncher.homescreen.audio;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
-import static org.mockito.Mockito.any;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.content.ComponentName;
import android.graphics.drawable.Drawable;
import androidx.lifecycle.MutableLiveData;
import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.apps.common.testutils.InstantTaskExecutorRule;
+import com.android.car.carlauncher.AppLauncherUtils;
import com.android.car.carlauncher.homescreen.HomeCardInterface;
import com.android.car.carlauncher.homescreen.ui.CardHeader;
import com.android.car.carlauncher.homescreen.ui.DescriptiveTextWithControlsView;
@@ -47,12 +51,11 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-@RunWith(JUnit4.class)
-public class MediaViewModelTest {
+@RunWith(AndroidJUnit4.class)
+public class MediaViewModelTest extends AbstractExtendedMockitoTestCase {
private static final CharSequence APP_NAME = "test app name";
private static final Drawable APP_ICON = null;
@@ -101,6 +104,12 @@ public class MediaViewModelTest {
public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule();
private int mSeekBarMax;
+ @Override
+ protected void onSessionBuilder(
+ AbstractExtendedMockitoTestCase.CustomMockitoSessionBuilder session) {
+ session.spyStatic(AppLauncherUtils.class);
+ }
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -142,6 +151,9 @@ public class MediaViewModelTest {
when(mMetadata.getSubtitle()).thenReturn(ARTIST_NAME);
when(mMetadata.getTitle()).thenReturn(SONG_TITLE);
+ when(mMediaSource.getBrowseServiceComponentName())
+ .thenReturn(ComponentName.createRelative("com.test", ".mbs"));
+
mLiveMediaSource.setValue(mMediaSource);
mLiveMetadata.setValue(mMetadata);
@@ -162,9 +174,12 @@ public class MediaViewModelTest {
when(mMediaSource.getDisplayName(any())).thenReturn(APP_NAME);
when(mMediaSource.getIcon()).thenReturn(APP_ICON);
+ when(mMediaSource.getBrowseServiceComponentName())
+ .thenReturn(ComponentName.createRelative("com.test", ".mbs"));
+
mLiveMediaSource.setValue(mMediaSource);
- verify(mOnModelUpdateListener, times(2)).onModelUpdate(mMediaViewModel);
+ verify(mOnModelUpdateListener).onModelUpdate(mMediaViewModel);
CardHeader header = mMediaViewModel.getCardHeader();
assertEquals(header.getCardTitle(), APP_NAME);
assertNull(header.getCardIcon());
@@ -224,3 +239,4 @@ public class MediaViewModelTest {
assertEquals(seekBarViewModel.getSeekBarColor(), COLORS);
}
}
+
diff --git a/tests/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImplTest.java b/app/tests/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImplTest.java
index 461784d0..461784d0 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImplTest.java
+++ b/app/tests/src/com/android/car/carlauncher/homescreen/audio/telecom/InCallServiceImplTest.java
diff --git a/tests/src/com/android/car/carlauncher/recents/NonDODisabledTaskProviderTest.java b/app/tests/src/com/android/car/carlauncher/recents/NonDODisabledTaskProviderTest.java
index 895838fb..895838fb 100644
--- a/tests/src/com/android/car/carlauncher/recents/NonDODisabledTaskProviderTest.java
+++ b/app/tests/src/com/android/car/carlauncher/recents/NonDODisabledTaskProviderTest.java
diff --git a/tests/src/com/android/car/carlauncher/recents/RecentTasksProviderTest.java b/app/tests/src/com/android/car/carlauncher/recents/RecentTasksProviderTest.java
index b03ebe4e..b03ebe4e 100644
--- a/tests/src/com/android/car/carlauncher/recents/RecentTasksProviderTest.java
+++ b/app/tests/src/com/android/car/carlauncher/recents/RecentTasksProviderTest.java
diff --git a/tests/src/com/android/car/carlauncher/recents/RecentsUtilsTest.java b/app/tests/src/com/android/car/carlauncher/recents/RecentsUtilsTest.java
index 99a41333..99a41333 100644
--- a/tests/src/com/android/car/carlauncher/recents/RecentsUtilsTest.java
+++ b/app/tests/src/com/android/car/carlauncher/recents/RecentsUtilsTest.java
diff --git a/tests/src/com/android/car/carlauncher/recents/view/RecentsRecyclerViewTest.java b/app/tests/src/com/android/car/carlauncher/recents/view/RecentsRecyclerViewTest.java
index eb0f2d76..eb0f2d76 100644
--- a/tests/src/com/android/car/carlauncher/recents/view/RecentsRecyclerViewTest.java
+++ b/app/tests/src/com/android/car/carlauncher/recents/view/RecentsRecyclerViewTest.java
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 00000000..5590825f
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+
+ gradle.ext.aaosLatestSDK = 34
+ gradle.ext.aaosTargetSDK = 34
+
+ gradle.ext.repoRootPath = rootDir.parentFile.parentFile.parentFile.parent
+ gradle.ext.prebuiltSdkPath = gradle.ext.repoRootPath + "/prebuilts/sdk/"
+ gradle.ext.lib_car_system_stubs = gradle.ext.prebuiltSdkPath + gradle.ext.aaosLatestSDK + "/system/android.car-system-stubs.jar"
+ gradle.ext.lib_car_apps_common_aar = gradle.ext.prebuiltSdkPath + "current/aaos-libs/car-apps-common.aar"
+ gradle.ext.lib_car_media_common_aar = gradle.ext.prebuiltSdkPath + "current/aaos-libs/car-media-common.aar"
+ gradle.ext.lib_car_ui_lib_aar = gradle.ext.prebuiltSdkPath + "current/aaos-libs/car-ui-lib.aar"
+ gradle.ext.lib_car_ui_lib_oem_apis = gradle.ext.prebuiltSdkPath + "current/aaos-libs/car-ui-lib-oem-apis.jar"
+ gradle.ext.lib_system_stubs = gradle.ext.prebuiltSdkPath + gradle.ext.aaosLatestSDK + "/system/android.jar"
+ gradle.ext.debugCertPath = gradle.ext.repoRootPath + "/packages/apps/Car/Launcher/libs/appgrid/keys/com_android_car_launcher_test.jks"
+ gradle.ext.soongBash = gradle.ext.repoRootPath + "/build/soong/soong_ui.bash"
+ gradle.ext.platformSdkVersion = "34" // Change this to the most recent android API level.
+
+ if (file(gradle.ext.soongBash).exists()) {
+ gradle.ext.platformSdkVersion = (gradle.ext.soongBash + " --dumpvar-mode PLATFORM_SDK_VERSION").execute().text.trim()
+ }
+
+ gradle.ext.getVersionCode = { ->
+ def code = project.hasProperty('versionCode') ? versionCode.toInteger() : gradle.ext.platformSdkVersion.toInteger()
+ println "VersionCode is set to $code"
+ return code
+ }
+ gradle.ext.getVersionName = { ->
+ def name = project.hasProperty('versionName') ? versionName : gradle.ext.platformSdkVersion
+ println "VersionName is set to $name"
+ return name
+ }
+}
+
+plugins {
+ id 'com.android.application' version '8.1.2' apply false
+ id 'com.android.library' version '8.1.2' apply false
+ id 'org.jetbrains.kotlin.android' version '1.8.21' apply false
+ id 'com.google.protobuf' version '0.9.1' apply false
+}
+
+
+allprojects {
+ tasks.withType(JavaCompile).tap {
+ configureEach {
+ // Compile with prebuilt android.jar.
+ options.compilerArgs.add('-Xbootclasspath/p:/' + gradle.ext.lib_system_stubs)
+ // TODO: just pass -Xlint, to enable all the supported types of warnings.
+ options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
+ }
+ }
+}
diff --git a/docklib-util/Android.bp b/docklib-util/Android.bp
new file mode 100644
index 00000000..d7e2f5a8
--- /dev/null
+++ b/docklib-util/Android.bp
@@ -0,0 +1,37 @@
+//
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+
+android_library {
+ name: "CarDockUtilLib",
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
+
+ resource_dirs: ["res"],
+
+ static_libs: [
+ "androidx.lifecycle_lifecycle-extensions",
+ "com.google.android.material_material",
+ "car-ui-lib",
+ ],
+
+ manifest: "AndroidManifest.xml",
+}
diff --git a/docklib-util/AndroidManifest.xml b/docklib-util/AndroidManifest.xml
new file mode 100644
index 00000000..741f73c7
--- /dev/null
+++ b/docklib-util/AndroidManifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2023 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<manifest package="com.android.car.dockutil">
+</manifest>
diff --git a/docklib-util/OWNERS b/docklib-util/OWNERS
new file mode 100644
index 00000000..c7be9702
--- /dev/null
+++ b/docklib-util/OWNERS
@@ -0,0 +1,8 @@
+# Default code reviewers picked from top 3 or more developers.
+# Please update this list if you find better candidates.
+set noparent
+
+danzz@google.com
+jainams@google.com
+nehah@google.com
+igorr@google.com
diff --git a/docklib-util/README b/docklib-util/README
new file mode 100644
index 00000000..90d224a6
--- /dev/null
+++ b/docklib-util/README
@@ -0,0 +1,8 @@
+# AAOS Dock Utility
+
+This library is to provides helper classes for dock in AAOS.
+
+This library provides:
+- Broadcast event and sender utility
+
+This library can be used by multiple packages in the system.
diff --git a/docklib-util/res/drawable/ic_dock_pin.xml b/docklib-util/res/drawable/ic_dock_pin.xml
new file mode 100644
index 00000000..d52696e0
--- /dev/null
+++ b/docklib-util/res/drawable/ic_dock_pin.xml
@@ -0,0 +1,26 @@
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M640,480L720,560L720,640L520,640L520,880L480,920L440,880L440,640L240,640L240,560L320,480L320,200L280,200L280,120L680,120L680,200L640,200L640,480ZM354,560L606,560L560,514L560,200L400,200L400,514L354,560ZM480,560L480,560L480,560L480,560L480,560L480,560L480,560Z"/>
+</vector>
diff --git a/docklib-util/res/drawable/ic_dock_unpin.xml b/docklib-util/res/drawable/ic_dock_unpin.xml
new file mode 100644
index 00000000..ea3a2912
--- /dev/null
+++ b/docklib-util/res/drawable/ic_dock_unpin.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M336,680L480,536L624,680L680,624L536,480L680,336L624,280L480,424L336,280L280,336L424,480L280,624L336,680ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z"/>
+</vector>
diff --git a/docklib-util/res/values/config.xml b/docklib-util/res/values/config.xml
new file mode 100644
index 00000000..93ff11d6
--- /dev/null
+++ b/docklib-util/res/values/config.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+ <!-- Flag to enable/disable dock -->
+ <!-- todo(b/304320644): remove flag -->
+ <bool name="config_enableDock">false</bool>
+</resources>
diff --git a/docklib-util/res/values/strings.xml b/docklib-util/res/values/strings.xml
new file mode 100644
index 00000000..2c24df71
--- /dev/null
+++ b/docklib-util/res/values/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+ <!-- todo(b/314817575): update the string to final value -->
+ <string name="dock_pin_shortcut_label">Pin to the dock</string>
+ <string name="dock_unpin_shortcut_label">Unpin from the dock</string>
+</resources>
diff --git a/docklib-util/src/com/android/car/dockutil/events/DockEvent.java b/docklib-util/src/com/android/car/dockutil/events/DockEvent.java
new file mode 100644
index 00000000..b6d53383
--- /dev/null
+++ b/docklib-util/src/com/android/car/dockutil/events/DockEvent.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dockutil.events;
+
+import androidx.annotation.Nullable;
+
+/**
+ * Enum for events sent by the system to trigger change in the Dock.
+ */
+public enum DockEvent {
+ LAUNCH("com.android.car.docklib.events.LAUNCH"),
+ PIN("com.android.car.docklib.events.PIN"),
+ UNPIN("com.android.car.docklib.events.UNPIN");
+
+ private final String mStr;
+
+ DockEvent(String str) {
+ mStr = str;
+ }
+
+ @Override
+ public String toString() {
+ return mStr;
+ }
+
+ /**
+ * Converts the string to {@link DockEvent}. Returns {@code null} if the string is not
+ * convertible.
+ */
+ @Nullable
+ public static DockEvent toDockEvent(@Nullable String str) {
+ if (LAUNCH.toString().equals(str)) {
+ return LAUNCH;
+ } else if (PIN.toString().equals(str)) {
+ return PIN;
+ } else if (UNPIN.toString().equals(str)) {
+ return UNPIN;
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/docklib-util/src/com/android/car/dockutil/events/DockEventSenderHelper.java b/docklib-util/src/com/android/car/dockutil/events/DockEventSenderHelper.java
new file mode 100644
index 00000000..4f8b52f6
--- /dev/null
+++ b/docklib-util/src/com/android/car/dockutil/events/DockEventSenderHelper.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dockutil.events;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.view.Display;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.dockutil.R;
+
+/**
+ * Helper used to send Dock Events.
+ */
+public class DockEventSenderHelper {
+ public static final String EXTRA_COMPONENT = "EXTRA_COMPONENT";
+
+ private final Context mContext;
+ private final boolean mIsDockEnabled;
+
+ public DockEventSenderHelper(Context context) {
+ mContext = context;
+ mIsDockEnabled = mContext.getResources().getBoolean(R.bool.config_enableDock);
+ }
+
+ /**
+ * Used to send launch event to the dock. Generally used when an app is launched.
+ */
+ public void sendLaunchEvent(@NonNull ActivityManager.RunningTaskInfo taskInfo) {
+ sendEventBroadcast(DockEvent.LAUNCH, taskInfo);
+ }
+
+ /**
+ * @see #sendPinEvent(ComponentName)
+ */
+ public void sendPinEvent(@NonNull ActivityManager.RunningTaskInfo taskInfo) {
+ sendEventBroadcast(DockEvent.PIN, taskInfo);
+ }
+
+ /**
+ * Used to send pin event to the dock. Generally used when an app should be pinned to the dock.
+ */
+ public void sendPinEvent(@NonNull ComponentName componentName) {
+ sendEventBroadcast(DockEvent.PIN, componentName);
+ }
+
+ /**
+ * @see #sendUnpinEvent(ComponentName)
+ */
+ public void sendUnpinEvent(@NonNull ActivityManager.RunningTaskInfo taskInfo) {
+ sendEventBroadcast(DockEvent.UNPIN, taskInfo);
+ }
+
+ /**
+ * Used to send unpin event to the dock. Generally used when an app should be unpinned from the
+ * dock.
+ */
+ public void sendUnpinEvent(@NonNull ComponentName componentName) {
+ sendEventBroadcast(DockEvent.UNPIN, componentName);
+ }
+
+ @VisibleForTesting
+ void sendEventBroadcast(@NonNull DockEvent event,
+ @NonNull ActivityManager.RunningTaskInfo taskInfo) {
+ if (taskInfo.getDisplayId() != Display.DEFAULT_DISPLAY) {
+ return;
+ }
+ ComponentName component = getComponentName(taskInfo);
+ if (component != null) {
+ sendEventBroadcast(event, component);
+ }
+ }
+
+ private void sendEventBroadcast(@NonNull DockEvent event, @NonNull ComponentName component) {
+ if (!mIsDockEnabled) {
+ return;
+ }
+
+ Intent intent = new Intent();
+ intent.setAction(event.toString());
+ intent.putExtra(EXTRA_COMPONENT, component);
+ mContext.sendBroadcast(intent, DockPermission.DOCK_RECEIVER_PERMISSION.toString());
+ }
+
+ @Nullable
+ private ComponentName getComponentName(@NonNull ActivityManager.RunningTaskInfo taskInfo) {
+ if (taskInfo.baseActivity == null && taskInfo.baseIntent.getComponent() == null) {
+ return null;
+ }
+ return taskInfo.baseActivity != null ? taskInfo.baseActivity
+ : taskInfo.baseIntent.getComponent();
+ }
+}
diff --git a/docklib-util/src/com/android/car/dockutil/events/DockPermission.java b/docklib-util/src/com/android/car/dockutil/events/DockPermission.java
new file mode 100644
index 00000000..d82b01f4
--- /dev/null
+++ b/docklib-util/src/com/android/car/dockutil/events/DockPermission.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dockutil.events;
+
+/**
+ * Permission stings declared to be used by dock.
+ */
+public enum DockPermission {
+ DOCK_SENDER_PERMISSION("com.android.car.docklib.permission.BROADCAST_SENDER"),
+ DOCK_RECEIVER_PERMISSION("com.android.car.docklib.permission.BROADCAST_RECEIVER");
+
+ private final String mStr;
+
+ DockPermission(String str) {
+ mStr = str;
+ }
+
+ @Override
+ public String toString() {
+ return mStr;
+ }
+}
diff --git a/docklib-util/src/com/android/car/dockutil/shortcuts/PinShortcutItem.kt b/docklib-util/src/com/android/car/dockutil/shortcuts/PinShortcutItem.kt
new file mode 100644
index 00000000..6aba1579
--- /dev/null
+++ b/docklib-util/src/com/android/car/dockutil/shortcuts/PinShortcutItem.kt
@@ -0,0 +1,47 @@
+package com.android.car.dockutil.shortcuts
+
+import android.content.res.Resources
+import com.android.car.dockutil.R
+import com.android.car.ui.shortcutspopup.CarUiShortcutsPopup
+
+/**
+ * {@link CarUiShortcutsPopup.ShortcutItem} to pin or unpin an app to the dock.
+ * @param isItemPinned if the app is pinned to the dock
+ * @param pinItemClickDelegate {@link Runnable} to pin the app to the dock
+ * @param unpinItemClickDelegate {@link Runnable} to unpin the app to the dock
+ */
+class PinShortcutItem(
+ private val resources: Resources,
+ private val isItemPinned: Boolean,
+ private val pinItemClickDelegate: Runnable,
+ private val unpinItemClickDelegate: Runnable
+) : CarUiShortcutsPopup.ShortcutItem {
+
+ override fun data(): CarUiShortcutsPopup.ItemData {
+ return if (isItemPinned) {
+ CarUiShortcutsPopup.ItemData(
+ R.drawable.ic_dock_unpin, // leftDrawable
+ resources.getString(R.string.dock_unpin_shortcut_label) // shortcutName
+ )
+ } else {
+ CarUiShortcutsPopup.ItemData(
+ R.drawable.ic_dock_pin, // leftDrawable
+ resources.getString(R.string.dock_pin_shortcut_label) // shortcutName
+ )
+ }
+ }
+
+ override fun onClick(): Boolean {
+ // todo(b/314835197): fix pinning/opening media apps
+ if (isItemPinned) {
+ unpinItemClickDelegate.run()
+ } else {
+ pinItemClickDelegate.run()
+ }
+ return true
+ }
+
+ override fun isEnabled(): Boolean {
+ return true
+ }
+}
diff --git a/docklib-util/tests/Android.bp b/docklib-util/tests/Android.bp
new file mode 100644
index 00000000..6883e975
--- /dev/null
+++ b/docklib-util/tests/Android.bp
@@ -0,0 +1,63 @@
+//
+// Copyright (C) 2023 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test {
+ name: "CarDockUtilLibTests",
+
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
+
+ libs: [
+ "android.test.base",
+ ],
+
+ optimize: {
+ enabled: false,
+ },
+
+ static_libs: [
+ "androidx.test.runner",
+ "androidx.test.ext.junit",
+ "mockito-target-extended",
+ "mockito-kotlin2",
+ "truth",
+ "CarDockUtilLib",
+ ],
+
+ manifest: "AndroidManifest.xml",
+
+ instrumentation_for: "CarDockUtilLib",
+
+ dex_preopt: {
+ enabled: false,
+ },
+
+ jni_libs: [
+ // For mockito extended
+ "libdexmakerjvmtiagent",
+ "libstaticjvmtiagent",
+ ],
+
+ test_suites: [
+ "automotive-tests",
+ ],
+}
diff --git a/docklib-util/tests/AndroidManifest.xml b/docklib-util/tests/AndroidManifest.xml
new file mode 100644
index 00000000..4556902c
--- /dev/null
+++ b/docklib-util/tests/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project.
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.car.dockutil.test">
+
+ <application android:debuggable="true">
+ <uses-library android:name="android.test.runner"/>
+ </application>
+
+ <instrumentation
+ android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:label="Tests for Car Dock Util Lib"
+ android:targetPackage="com.android.car.dockutil.test" />
+</manifest>
diff --git a/docklib-util/tests/src/com/android/car/dockutil/events/DockEventSenderHelperTest.java b/docklib-util/tests/src/com/android/car/dockutil/events/DockEventSenderHelperTest.java
new file mode 100644
index 00000000..892e99b6
--- /dev/null
+++ b/docklib-util/tests/src/com/android/car/dockutil/events/DockEventSenderHelperTest.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dockutil.events;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import static com.android.car.dockutil.events.DockEventSenderHelper.EXTRA_COMPONENT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.dockutil.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DockEventSenderHelperTest {
+ @Mock
+ public ActivityManager.RunningTaskInfo mRunningTaskInfo;
+ @Mock
+ public Context mContext;
+ @Mock
+ public Resources mResources;
+ @Mock
+ public Intent mIntent;
+ @Mock
+ public ComponentName mAppComponent;
+ @Captor
+ public ArgumentCaptor<Intent> mIntentCaptor;
+ private DockEventSenderHelper mDockEventSenderHelper;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getResources()).thenReturn(mResources);
+ when(mResources.getBoolean(R.bool.config_enableDock)).thenReturn(true);
+ mDockEventSenderHelper = new DockEventSenderHelper(mContext);
+ }
+
+ @Test
+ public void sendEventBroadcast_nonDefaultDisplay_broadcastNotSent() {
+ when(mRunningTaskInfo.getDisplayId()).thenReturn(DEFAULT_DISPLAY + 1);
+
+ mDockEventSenderHelper.sendEventBroadcast(DockEvent.LAUNCH, mRunningTaskInfo);
+
+ verify(mContext, never()).sendBroadcast(any(Intent.class), anyString());
+ }
+
+ @Test
+ public void sendEventBroadcast_noBastActivity_noBaseIntentComponent_broadcastNotSent() {
+ when(mRunningTaskInfo.getDisplayId()).thenReturn(DEFAULT_DISPLAY);
+ mRunningTaskInfo.baseActivity = null;
+ when(mIntent.getComponent()).thenReturn(null);
+ mRunningTaskInfo.baseIntent = mIntent;
+
+ mDockEventSenderHelper.sendEventBroadcast(DockEvent.LAUNCH, mRunningTaskInfo);
+
+ verify(mContext, never()).sendBroadcast(any(Intent.class), anyString());
+ }
+
+ @Test
+ public void sendEventBroadcast_broadcastSent_receiverPermissionSet() {
+ when(mRunningTaskInfo.getDisplayId()).thenReturn(DEFAULT_DISPLAY);
+ mRunningTaskInfo.baseActivity = mAppComponent;
+
+ mDockEventSenderHelper.sendEventBroadcast(DockEvent.LAUNCH, mRunningTaskInfo);
+
+ verify(mContext).sendBroadcast(any(Intent.class),
+ eq(DockPermission.DOCK_RECEIVER_PERMISSION.toString()));
+ }
+
+
+ @Test
+ public void sendEventBroadcast_launchEvent_broadcastSent() {
+ when(mRunningTaskInfo.getDisplayId()).thenReturn(DEFAULT_DISPLAY);
+ mRunningTaskInfo.baseActivity = mAppComponent;
+
+ mDockEventSenderHelper.sendEventBroadcast(DockEvent.LAUNCH, mRunningTaskInfo);
+
+ verify(mContext).sendBroadcast(mIntentCaptor.capture(), anyString());
+ Intent intentSent = mIntentCaptor.getValue();
+ assertThat(intentSent.getAction()).isEqualTo(DockEvent.LAUNCH.toString());
+ assertThat(intentSent.getExtras()).isNotNull();
+ assertThat(intentSent.getExtras().getParcelable(EXTRA_COMPONENT, ComponentName.class))
+ .isEqualTo(mAppComponent);
+ }
+
+ @Test
+ public void sendEventBroadcast_pinEvent_broadcastSent() {
+ when(mRunningTaskInfo.getDisplayId()).thenReturn(DEFAULT_DISPLAY);
+ mRunningTaskInfo.baseActivity = mAppComponent;
+
+ mDockEventSenderHelper.sendEventBroadcast(DockEvent.PIN, mRunningTaskInfo);
+
+ verify(mContext).sendBroadcast(mIntentCaptor.capture(), anyString());
+ Intent intentSent = mIntentCaptor.getValue();
+ assertThat(intentSent.getAction()).isEqualTo(DockEvent.PIN.toString());
+ assertThat(intentSent.getExtras()).isNotNull();
+ assertThat(intentSent.getExtras().getParcelable(EXTRA_COMPONENT, ComponentName.class))
+ .isEqualTo(mAppComponent);
+ }
+
+
+ @Test
+ public void sendEventBroadcast_unpinEvent_broadcastSent() {
+ when(mRunningTaskInfo.getDisplayId()).thenReturn(DEFAULT_DISPLAY);
+ mRunningTaskInfo.baseActivity = mAppComponent;
+
+ mDockEventSenderHelper.sendEventBroadcast(DockEvent.UNPIN, mRunningTaskInfo);
+
+ verify(mContext).sendBroadcast(mIntentCaptor.capture(), anyString());
+ Intent intentSent = mIntentCaptor.getValue();
+ assertThat(intentSent.getAction()).isEqualTo(DockEvent.UNPIN.toString());
+ assertThat(intentSent.getExtras()).isNotNull();
+ assertThat(intentSent.getExtras().getParcelable(EXTRA_COMPONENT, ComponentName.class))
+ .isEqualTo(mAppComponent);
+ }
+}
diff --git a/docklib-util/tests/src/com/android/car/dockutil/events/DockEventTest.java b/docklib-util/tests/src/com/android/car/dockutil/events/DockEventTest.java
new file mode 100644
index 00000000..ec7b0c84
--- /dev/null
+++ b/docklib-util/tests/src/com/android/car/dockutil/events/DockEventTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dockutil.events;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class DockEventTest {
+ @Test
+ public void toDockEvent_doesNotMatchDockEvent_returnNull() {
+ String event = "fake_dock_event";
+
+ DockEvent ret = DockEvent.toDockEvent(event);
+
+ assertThat(ret).isNull();
+ }
+}
diff --git a/docklib-util/tests/src/com/android/car/dockutil/shortcuts/PinShortcutItemTest.kt b/docklib-util/tests/src/com/android/car/dockutil/shortcuts/PinShortcutItemTest.kt
new file mode 100644
index 00000000..d3498aee
--- /dev/null
+++ b/docklib-util/tests/src/com/android/car/dockutil/shortcuts/PinShortcutItemTest.kt
@@ -0,0 +1,43 @@
+package com.android.car.dockutil.shortcuts
+
+import android.content.res.Resources
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.verify
+
+@RunWith(AndroidJUnit4::class)
+class PinShortcutItemTest {
+ private val resourcesMock = mock<Resources> {}
+ private val pinItemClickDelegateMock = mock<Runnable> {}
+ private val unpinItemClickDelegateMock = mock<Runnable> {}
+
+ @Test
+ fun onClick_pinnedItem_runUnpinDelegate() {
+ val pinShortcutItem = PinShortcutItem(
+ resourcesMock,
+ isItemPinned = true,
+ pinItemClickDelegateMock,
+ unpinItemClickDelegateMock
+ )
+
+ pinShortcutItem.onClick()
+
+ verify(unpinItemClickDelegateMock).run()
+ }
+
+ @Test
+ fun onClick_unpinnedItem_runPinDelegate() {
+ val pinShortcutItem = PinShortcutItem(
+ resourcesMock,
+ isItemPinned = false,
+ pinItemClickDelegateMock,
+ unpinItemClickDelegateMock
+ )
+
+ pinShortcutItem.onClick()
+
+ verify(pinItemClickDelegateMock).run()
+ }
+}
diff --git a/docklib/Android.bp b/docklib/Android.bp
new file mode 100644
index 00000000..79137d0a
--- /dev/null
+++ b/docklib/Android.bp
@@ -0,0 +1,44 @@
+//
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_library {
+ name: "CarDockLib",
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
+
+ resource_dirs: ["res"],
+
+ libs: ["android.car"],
+
+ static_libs: [
+ "androidx.recyclerview_recyclerview",
+ "androidx.core_core-animation-nodeps",
+ "car-ui-lib-no-overlayable",
+ "androidx.lifecycle_lifecycle-extensions",
+ "com.google.android.material_material",
+ "CarDockUtilLib",
+ "SystemUISharedLib"
+ ],
+
+ platform_apis: true,
+
+ manifest: "AndroidManifest.xml",
+}
diff --git a/docklib/AndroidManifest.xml b/docklib/AndroidManifest.xml
new file mode 100644
index 00000000..64ecaf73
--- /dev/null
+++ b/docklib/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2023 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.car.docklib">
+
+ <!-- Permission to allow packages to broadcast events to the dock -->
+ <permission
+ android:name="com.android.car.docklib.permission.BROADCAST_SENDER"
+ android:label="@string/broadcast_sender_permission_label"
+ android:description="@string/broadcast_sender_permission_desc"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- Permission to allow packages to receive broadcast events for the dock -->
+ <permission
+ android:name="com.android.car.docklib.permission.BROADCAST_RECEIVER"
+ android:label="@string/broadcast_receiver_permission_label"
+ android:description="@string/broadcast_receiver_permission_desc"
+ android:protectionLevel="signature|privileged" />
+
+</manifest>
diff --git a/docklib/OWNERS b/docklib/OWNERS
new file mode 100644
index 00000000..3cb098dc
--- /dev/null
+++ b/docklib/OWNERS
@@ -0,0 +1,9 @@
+# Default code reviewers picked from top 3 or more developers.
+# Please update this list if you find better candidates.
+set noparent
+
+danzz@google.com
+jainams@google.com
+nehah@google.com
+igorr@google.com
+
diff --git a/docklib/README b/docklib/README
new file mode 100644
index 00000000..bad65eac
--- /dev/null
+++ b/docklib/README
@@ -0,0 +1,12 @@
+# AAOS Dock
+
+This library is to provide dock functionality in AAOS.
+In this reference the dock exists in SystemUI in system bar but the purpose of this library is to
+allow dock to be placed on any surface.
+
+This library provides:
+- views and controllers
+- Broadcast receiver and permissions
+
+This library should only be used by one package in the system. This means there cannot be more than
+one dock in the system.
diff --git a/docklib/res/layout/dock_app_item_view.xml b/docklib/res/layout/dock_app_item_view.xml
new file mode 100644
index 00000000..f27617dc
--- /dev/null
+++ b/docklib/res/layout/dock_app_item_view.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright (C) 2023 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/dock_item_container"
+ style="@style/ItemContainer">
+
+ <com.google.android.material.imageview.ShapeableImageView
+ android:id="@+id/dock_app_icon"
+ style="@style/AppIcon"
+ android:contentDescription="@null" />
+</FrameLayout>
diff --git a/docklib/res/layout/dock_view.xml b/docklib/res/layout/dock_view.xml
new file mode 100644
index 00000000..d5b61e5b
--- /dev/null
+++ b/docklib/res/layout/dock_view.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/recycler_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
+</merge>
diff --git a/docklib/res/values-en-rXC/strings.xml b/docklib/res/values-en-rXC/strings.xml
new file mode 100644
index 00000000..a48b2a25
--- /dev/null
+++ b/docklib/res/values-en-rXC/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="broadcast_sender_permission_label" msgid="5269973644784898827">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‎‏‏‎‏‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‎‏‎‏‏‎Dock broadcast sender‎‏‎‎‏‎"</string>
+ <string name="broadcast_sender_permission_desc" msgid="5052882219053515363">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎Permission required for package to broadcast events to the Dock.‎‏‎‎‏‎"</string>
+ <string name="broadcast_receiver_permission_label" msgid="6015991948761587466">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‏‎‎Dock broadcast receiver‎‏‎‎‏‎"</string>
+ <string name="broadcast_receiver_permission_desc" msgid="1623002370607914795">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎Permission required for package listen to broadcast events for the Dock.‎‏‎‎‏‎"</string>
+</resources>
diff --git a/docklib/res/values/colors.xml b/docklib/res/values/colors.xml
new file mode 100644
index 00000000..fd2f30ef
--- /dev/null
+++ b/docklib/res/values/colors.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<resources>
+ <color name="icon_default_stroke_color">#FFFFFF</color>
+ <color name="icon_excited_stroke_color">#737272</color>
+</resources>
diff --git a/docklib/res/values/config.xml b/docklib/res/values/config.xml
new file mode 100644
index 00000000..2c355fd5
--- /dev/null
+++ b/docklib/res/values/config.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+ <!-- Number of apps that should be shown on Dock -->
+ <integer name="config_numDockApps">4</integer>
+
+ <!-- A list of components that are shown on Dock by default -->
+ <string-array name="config_defaultDockApps" translatable="false">
+ <item>com.android.vending/com.google.android.finsky.carmainactivity.MainActivity</item>
+ <item>com.android.car.settings/com.android.car.settings.Settings_Launcher_Homepage</item>
+ <item>com.android.car.dialer/com.android.car.dialer.ui.TelecomActivity</item>
+ <item>com.google.android.apps.maps/com.google.android.maps.MapsActivity</item>
+ </string-array>
+
+ <!-- A list of components that are excluded from being shown on Dock -->
+ <string-array name="config_packagesExcludedFromDock" translatable="false">
+ <item>com.android.car.carlauncher</item>
+ </string-array>
+
+ <!-- A list of components that are excluded from being shown on Dock -->
+ <string-array name="config_componentsExcludedFromDock" translatable="false">
+ <item>com.google.android.apps.maps/com.google.android.apps.gmm.car.embedded.activity.LimitedMapsActivity</item>
+ <item>com.google.android.carassistant/com.google.android.libraries.assistant.auto.tng.assistant.ui.activity.AutoAssistantActivity</item>
+ </string-array>
+
+ <integer name="drag_drop_animate_in_duration">800</integer>
+</resources>
diff --git a/docklib/res/values/dimens.xml b/docklib/res/values/dimens.xml
new file mode 100644
index 00000000..d38260fa
--- /dev/null
+++ b/docklib/res/values/dimens.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+
+ <!-- Default size and spacing for an icon on the Dock -->
+ <dimen name="dock_item_size">72dp</dimen>
+ <dimen name="dock_item_spacing">2dp</dimen>
+
+ <dimen name="static_icon_stroke_width">0dp</dimen>
+ <dimen name="dynamic_icon_stroke_width">6dp</dimen>
+ <dimen name="icon_stroke_width_excited">30dp</dimen>
+
+</resources>
diff --git a/docklib/res/values/strings.xml b/docklib/res/values/strings.xml
new file mode 100644
index 00000000..c3100a5a
--- /dev/null
+++ b/docklib/res/values/strings.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+ <string name="broadcast_sender_permission_label">Dock broadcast sender</string>
+ <string name="broadcast_sender_permission_desc">
+ Permission required for package to broadcast events to the Dock.
+ </string>
+ <string name="broadcast_receiver_permission_label">Dock broadcast receiver</string>
+ <string name="broadcast_receiver_permission_desc">
+ Permission required for package listen to broadcast events for the Dock.
+ </string>
+</resources>
diff --git a/docklib/res/values/styles.xml b/docklib/res/values/styles.xml
new file mode 100644
index 00000000..8fee4a8c
--- /dev/null
+++ b/docklib/res/values/styles.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright (C) 2023 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <style name="ItemContainer">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:paddingStart">15dp</item>
+ <item name="android:paddingEnd">15dp</item>
+ </style>
+
+ <style name="AppIcon">
+ <item name="android:layout_width">@dimen/dock_item_size</item>
+ <item name="android:layout_height">@dimen/dock_item_size</item>
+ <item name="android:clipToOutline">true</item>
+ <item name="android:scaleType">centerCrop</item>
+ <item name="android:adjustViewBounds">false</item>
+ <item name="shapeAppearanceOverlay">@style/AppIcon.RoundedBorder</item>
+ </style>
+
+ <style name="AppIcon.RoundedBorder">
+ <item name="cornerFamily">rounded</item>
+ <item name="cornerSize">50%</item>
+ </style>
+</resources>
diff --git a/docklib/src/com/android/car/docklib/DockHelper.kt b/docklib/src/com/android/car/docklib/DockHelper.kt
new file mode 100644
index 00000000..152a4130
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/DockHelper.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib
+
+import android.car.content.pm.CarPackageManager
+import android.content.ComponentName
+import android.content.Context
+import android.content.pm.PackageManager
+import com.android.car.docklib.data.DockAppItem
+
+/**
+ * Helper that reads configs for defaults app to be showed on Dock and converts between
+ * ComponentName and DockItem
+ */
+class DockHelper(
+ private val context: Context,
+ private val carPackageManager: CarPackageManager,
+) {
+ private val packageManager: PackageManager = context.packageManager
+ val defaultApps by lazy {
+ val defaultComponents = context.resources.getStringArray(R.array.config_defaultDockApps)
+ defaultComponents.mapNotNull { component ->
+ val componentName = ComponentName.unflattenFromString(component)
+ componentName?.let { toDockAppItem(componentName) }
+ }
+ }
+ val excludedComponents by lazy {
+ HashSet<String>().apply {
+ addAll(context.resources.getStringArray(R.array.config_componentsExcludedFromDock))
+ }
+ }
+ val excludedPackages by lazy {
+ HashSet<String>().apply {
+ addAll(context.resources.getStringArray(R.array.config_packagesExcludedFromDock))
+ }
+ }
+
+ /* Convert to Dock item from a ComponentName. */
+ fun toDockAppItem(
+ componentName: ComponentName,
+ itemType: DockAppItem.Type = DockAppItem.Type.DYNAMIC
+ ): DockAppItem {
+ // TODO: Compare the component against LauncherApps to make sure the component
+ // is launchable, similar to what app grid has
+ val icon = packageManager.getApplicationIcon(componentName.packageName)
+ val name = packageManager.getActivityInfo(componentName, 0).name
+ return DockAppItem(
+ itemType,
+ componentName,
+ name,
+ icon,
+ carPackageManager.isActivityDistractionOptimized(
+ componentName.packageName,
+ componentName.className
+ )
+ )
+ }
+}
diff --git a/docklib/src/com/android/car/docklib/DockInterface.kt b/docklib/src/com/android/car/docklib/DockInterface.kt
new file mode 100644
index 00000000..0959099a
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/DockInterface.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib
+
+import android.content.ComponentName
+
+interface DockInterface {
+ /** called when an app is statically pinned to the Dock */
+ fun appPinned(componentName: ComponentName)
+
+ /** called when an app is launched */
+ fun appLaunched(componentName: ComponentName)
+
+ /** called when an app should be removed from the Dock */
+ fun appUnpinned(componentName: ComponentName)
+}
diff --git a/docklib/src/com/android/car/docklib/DockViewController.kt b/docklib/src/com/android/car/docklib/DockViewController.kt
new file mode 100644
index 00000000..82852533
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/DockViewController.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib
+
+import android.car.Car
+import android.car.content.pm.CarPackageManager
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.os.Build
+import android.util.Log
+import com.android.car.docklib.events.DockEventsReceiver
+import com.android.car.docklib.task.DockTaskStackChangeListener
+import com.android.car.docklib.view.DockAdapter
+import com.android.car.docklib.view.DockView
+import com.android.systemui.shared.system.TaskStackChangeListeners
+import java.lang.ref.WeakReference
+import java.util.function.Consumer
+
+/**
+ * Create a controller for DockView. It initializes the view with default and persisted icons. Upon
+ * initializing, it will listen to broadcast events, and update the view.
+ *
+ * @param userContext the foreground user context, since the view may be hosted on system context
+ * @param dockView the inflated dock view
+ * @param intentDelegate the system context will need to handle clicks and actions on the icons
+ */
+class DockViewController(
+ private val userContext: Context,
+ dockView: DockView,
+ intentDelegate: Consumer<Intent>
+) : DockInterface {
+ private companion object {
+ private const val TAG = "DockViewController"
+ private val DEBUG = Build.isDebuggable()
+ }
+
+ private val numItems: Int
+ private val car: Car
+ private val dockViewWeakReference: WeakReference<DockView>
+ private val dockViewModel: DockViewModel
+ private var dockHelper: DockHelper? = null
+ private val dockEventsReceiver: DockEventsReceiver
+ private val taskStackChangeListeners: TaskStackChangeListeners
+ private val dockTaskStackChangeListener: DockTaskStackChangeListener
+
+ init {
+ numItems = userContext.resources.getInteger(R.integer.config_numDockApps)
+ val adapter = DockAdapter(numItems, intentDelegate, userContext)
+ dockView.setAdapter(adapter)
+ dockViewWeakReference = WeakReference(dockView)
+ dockViewModel = DockViewModel(numItems) { updatedApps ->
+ dockViewWeakReference.get()?.getAdapter()?.setItems(updatedApps)
+ ?: throw NullPointerException("the View referenced does not exist")
+ }
+ car =
+ Car.createCar(
+ userContext,
+ null, // handler
+ Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT
+ ) { car, ready ->
+ run {
+ if (ready) {
+ val carPackageManager = car.getCarManager(CarPackageManager::class.java)
+ carPackageManager?.let { carPM ->
+ adapter.setCarPackageManager(carPM)
+ // todo(b/314859963): create the DockHelper without depending on carPM
+ dockHelper = DockHelper(userContext, carPM)
+ dockHelper?.let { dockViewModel.updateDefaultApps(it.defaultApps) }
+ }
+ }
+ }
+ }
+ dockEventsReceiver = DockEventsReceiver.registerDockReceiver(userContext, this)
+ dockTaskStackChangeListener = DockTaskStackChangeListener { appLaunched(it) }
+ taskStackChangeListeners = TaskStackChangeListeners.getInstance()
+ taskStackChangeListeners.registerTaskStackListener(dockTaskStackChangeListener)
+ }
+
+ /** Method to stop the dock. Call this upon View being destroyed. */
+ fun destroy() {
+ if (DEBUG) Log.d(TAG, "Destroy called")
+ car.disconnect()
+ userContext.unregisterReceiver(dockEventsReceiver)
+ dockViewModel.destroy()
+ taskStackChangeListeners.unregisterTaskStackListener(dockTaskStackChangeListener)
+ }
+
+ override fun appPinned(componentName: ComponentName) {
+ // TODO("Not yet implemented")
+ }
+
+ override fun appLaunched(componentName: ComponentName) {
+ if (DEBUG) Log.d(TAG, "App launched: $componentName")
+ dockHelper?.let {
+ if (it.excludedPackages.contains(componentName.packageName)) return
+ if (it.excludedComponents.contains(componentName.flattenToString())) return
+
+ val appItem = it.toDockAppItem(componentName)
+ if (DEBUG) Log.d(TAG, "Dynamic app add to dock: $appItem")
+ dockViewModel.addDynamicItem(appItem)
+ }
+ }
+
+ override fun appUnpinned(componentName: ComponentName) {
+ // TODO("Not yet implemented")
+ }
+}
diff --git a/docklib/src/com/android/car/docklib/DockViewModel.kt b/docklib/src/com/android/car/docklib/DockViewModel.kt
new file mode 100644
index 00000000..8037ee0f
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/DockViewModel.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.Observer
+import com.android.car.docklib.data.DockAppItem
+
+/**
+ * This class contains a live list of dock app items. All changes to dock items will go through it
+ * and will be observed by the view layer.
+ */
+class DockViewModel(private val numItems: Int, private val observer: Observer<List<DockAppItem?>>) {
+ private val currentItems = MutableLiveData<List<DockAppItem?>>()
+
+ /* Maintain a mapping of dock index to dock item, with the order of addition,
+ * so it's easier to find least recently updated position.
+ * The order goes from least recently updated item to most recently updated item.
+ * The key in each mapping is the index/position of the item being shown in Dock.
+ */
+ private val internalItems = LinkedHashMap<Int, DockAppItem>()
+
+ init {
+ currentItems.value = List(numItems) { null }
+ currentItems.observeForever(observer)
+ }
+
+ /** Update default apps if the list is not populated */
+ fun updateDefaultApps(defaultApps: List<DockAppItem>) {
+ synchronized(internalItems) {
+ if (internalItems.size >= numItems) return
+ defaultApps.forEachIndexed { index, defaultAppItem ->
+ if (!internalItems.containsKey(index) && index < numItems) {
+ // change to default app if the position is not populated
+ internalItems[index] = defaultAppItem
+ }
+ }
+ currentItems.value = convertMapToList(internalItems)
+ }
+ }
+
+ /**
+ * Add a new app to the dock. If the app is already in the dock, the recency of the app is
+ * refreshed. If not, and the dock has dynamic item(s) to update, then it will replace the least
+ * recent dynamic item.
+ */
+ fun addDynamicItem(appItem: DockAppItem) {
+ synchronized(internalItems) {
+ val indexToUpdate =
+ indexOfItemWithPackageName(appItem.component.packageName)
+ ?: indexOfLeastRecentDynamicItemInDock()
+
+ indexToUpdate?.let {
+ internalItems.remove(it)
+ internalItems[it] = appItem
+ currentItems.value = convertMapToList(internalItems)
+ }
+ }
+ }
+
+ fun destroy() {
+ currentItems.removeObserver(observer)
+ }
+
+ private fun indexOfLeastRecentDynamicItemInDock(): Int? {
+ // edge case - if there is no apps being shown, update first position
+ if (internalItems.size == 0) return 0
+ // since map is ordered from least recent to most recent, return first dynamic entry found
+ internalItems.forEach { appItemEntry ->
+ if (appItemEntry.value.type == DockAppItem.Type.DYNAMIC) return appItemEntry.key
+ }
+ // there is no dynamic item in dock to be replaced
+ return null
+ }
+
+ private fun indexOfItemWithPackageName(packageName: String): Int? {
+ internalItems.forEach { appItemEntry ->
+ if (appItemEntry.value.component.packageName == packageName) {
+ return appItemEntry.key
+ }
+ }
+ return null
+ }
+
+ /** Use the mapping index->item to create the ordered list of Dock items */
+ private fun convertMapToList(map: Map<Int, DockAppItem>) =
+ List(numItems) { index -> map[index] }
+ // TODO b/314409899: use a default DockItem when a position is empty
+}
diff --git a/docklib/src/com/android/car/docklib/data/DockAppItem.kt b/docklib/src/com/android/car/docklib/data/DockAppItem.kt
new file mode 100644
index 00000000..3e679502
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/data/DockAppItem.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib.data
+
+import android.content.ComponentName
+import android.graphics.drawable.Drawable
+
+/** Data class that describes an app being showed on Dock */
+data class DockAppItem(
+ val type: Type,
+ val component: ComponentName,
+ val name: String,
+ val icon: Drawable,
+ val isDistractionOptimized: Boolean,
+) {
+ // todo(b/315210225): handle getting icon lazily
+ enum class Type(val value: String) {
+ DYNAMIC("DYNAMIC"),
+ STATIC("STATIC");
+
+ override fun toString(): String {
+ return value
+ }
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is DockAppItem) return false
+
+ if (this.type != other.type) return false
+ if (this.name != other.name) return false
+ if (this.component != other.component) return false
+ if (this.icon.constantState != other.icon.constantState) return false
+ if (this.isDistractionOptimized != other.isDistractionOptimized) return false
+
+ return true
+ }
+
+ override fun toString(): String {
+ return ("DockAppItem#${hashCode()}{name: $name, component: $component, type: $type, " +
+ "isDistractionOptimized: $isDistractionOptimized, icon: $icon}")
+ }
+}
diff --git a/docklib/src/com/android/car/docklib/events/DockEventsReceiver.java b/docklib/src/com/android/car/docklib/events/DockEventsReceiver.java
new file mode 100644
index 00000000..8442a9d8
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/events/DockEventsReceiver.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib.events;
+
+import static android.content.Context.RECEIVER_EXPORTED;
+
+import static com.android.car.dockutil.events.DockEventSenderHelper.EXTRA_COMPONENT;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Build;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.android.car.docklib.DockInterface;
+import com.android.car.dockutil.events.DockEvent;
+import com.android.car.dockutil.events.DockPermission;
+
+/**
+ * BroadcastReceiver for Dock Events.
+ */
+public class DockEventsReceiver extends BroadcastReceiver {
+ private static final String TAG = "DockEventsReceiver";
+ private static final boolean DEBUG = Build.isDebuggable();
+ // Extras key for the ComponentName associated with the Event
+ private final DockInterface mDockController;
+
+ public DockEventsReceiver(DockInterface dockController) {
+ mDockController = dockController;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ DockEvent event = DockEvent.toDockEvent(intent.getAction());
+ ComponentName component = intent.getParcelableExtra(EXTRA_COMPONENT, ComponentName.class);
+
+ if (event == null || component == null) {
+ return;
+ }
+
+ if (DEBUG) {
+ Log.d(TAG, "DockEvent received of type " + event + " with component: "
+ + component);
+ }
+
+ switch (event) {
+ case LAUNCH:
+ mDockController.appLaunched(component);
+ break;
+ case PIN:
+ mDockController.appPinned(component);
+ break;
+ case UNPIN:
+ mDockController.appUnpinned(component);
+ break;
+ }
+ }
+
+ /**
+ * Helper method to register {@link DockEventsReceiver} through context and listen to dock
+ * events from packages with required permissions.
+ *
+ * @param context the context through which the DockEventsReceiver is registered
+ * @return successfully registered DockEventsReceiver.
+ */
+ public static DockEventsReceiver registerDockReceiver(
+ @NonNull Context context,
+ @NonNull DockInterface dockController
+ ) {
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(DockEvent.LAUNCH.toString());
+ intentFilter.addAction(DockEvent.PIN.toString());
+ intentFilter.addAction(DockEvent.UNPIN.toString());
+ DockEventsReceiver receiver = new DockEventsReceiver(dockController);
+ context.registerReceiver(receiver, intentFilter,
+ DockPermission.DOCK_SENDER_PERMISSION.toString(),
+ /* handler= */null, RECEIVER_EXPORTED);
+ if (DEBUG) {
+ Log.d(TAG, "DockReceiver registered from: " + context.getPackageName());
+ }
+ return receiver;
+ }
+}
diff --git a/docklib/src/com/android/car/docklib/task/DockTaskStackChangeListener.java b/docklib/src/com/android/car/docklib/task/DockTaskStackChangeListener.java
new file mode 100644
index 00000000..d23a98c3
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/task/DockTaskStackChangeListener.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.docklib.task;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.systemui.shared.system.TaskStackChangeListener;
+
+import java.util.function.Consumer;
+
+public class DockTaskStackChangeListener implements TaskStackChangeListener {
+ Consumer<ComponentName> mTaskLaunchDelegate;
+ public DockTaskStackChangeListener(Consumer<ComponentName> taskLaunchDelegate) {
+ mTaskLaunchDelegate = taskLaunchDelegate;
+ }
+
+ @Override
+ public void onTaskMovedToFront(ActivityManager.RunningTaskInfo taskInfo) {
+ ComponentName component = getComponentName(taskInfo);
+ mTaskLaunchDelegate.accept(component);
+ }
+
+ @Nullable
+ private ComponentName getComponentName(@NonNull ActivityManager.RunningTaskInfo taskInfo) {
+ if (taskInfo.baseActivity == null && taskInfo.baseIntent.getComponent() == null) {
+ return null;
+ }
+ return taskInfo.baseActivity != null ? taskInfo.baseActivity
+ : taskInfo.baseIntent.getComponent();
+ }
+
+
+}
diff --git a/docklib/src/com/android/car/docklib/view/DockAdapter.kt b/docklib/src/com/android/car/docklib/view/DockAdapter.kt
new file mode 100644
index 00000000..5a5d746e
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/view/DockAdapter.kt
@@ -0,0 +1,150 @@
+package com.android.car.docklib.view
+
+import android.car.content.pm.CarPackageManager
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.content.pm.PackageManager.NameNotFoundException
+import android.os.Build
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.android.car.docklib.R
+import com.android.car.docklib.data.DockAppItem
+import java.util.function.Consumer
+
+/**
+ * [RecyclerView.Adapter] used to bind Dock items
+ * @param numItems maximum num of items present in the dock
+ * @param items initial list of items in the Dock
+ */
+class DockAdapter(
+ private val numItems: Int,
+ private val intentDelegate: Consumer<Intent>,
+ private val userContext: Context,
+ private val items: Array<DockAppItem?> = arrayOfNulls(numItems)
+) : RecyclerView.Adapter<DockItemViewHolder>() {
+ companion object {
+ private val DEBUG = Build.isDebuggable()
+ private const val TAG = "DockAdapter"
+ }
+
+ private var carPackageManager: CarPackageManager? = null
+
+ enum class PayloadType {
+ CHANGE_SAME_ITEM_TYPE,
+ }
+
+ override fun onBindViewHolder(
+ viewHolder: DockItemViewHolder,
+ position: Int,
+ payloads: MutableList<Any>
+ ) {
+ if (payloads.isEmpty() ||
+ payloads.getOrNull(0) == null ||
+ payloads[0] !is PayloadType
+ ) {
+ return super.onBindViewHolder(viewHolder, position, payloads)
+ }
+ when (payloads[0]) {
+ PayloadType.CHANGE_SAME_ITEM_TYPE ->
+ items[position]?.let {
+ viewHolder.itemTypeChanged(it)
+ }
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, p1: Int): DockItemViewHolder {
+ val view = LayoutInflater.from(parent.context).inflate(
+ R.layout.dock_app_item_view, // resource
+ parent,
+ false // attachToRoot
+ )
+ return DockItemViewHolder(view, intentDelegate)
+ }
+
+ override fun getItemCount() = numItems
+
+ override fun onBindViewHolder(viewHolder: DockItemViewHolder, position: Int) {
+ viewHolder.bind(items[position])
+ }
+
+ fun setItems(items: List<DockAppItem?>) {
+ for (i in 0..<numItems) {
+ if (this.items[i] != items.getOrNull(i)) {
+ this.items[i] = items.getOrNull(i)
+ notifyItemChanged(i)
+ }
+ }
+ }
+
+ /**
+ * Pin new app to the given position
+ */
+ fun pinItemAt(position: Int, componentName: ComponentName) {
+ // todo(b/315222570): move to controller
+ if (!isValidPosition(position)) {
+ return
+ }
+ try {
+ val ai = userContext.packageManager
+ .getActivityInfo(componentName, PackageManager.ComponentInfoFlags.of(0L))
+ items[position] = DockAppItem(
+ DockAppItem.Type.STATIC,
+ componentName,
+ ai.name,
+ ai.loadIcon(userContext.packageManager),
+ carPackageManager?.isActivityDistractionOptimized(
+ componentName.packageName,
+ componentName.className
+ ) ?: false
+ )
+ notifyItemChanged(position)
+ } catch (e: NameNotFoundException) {
+ if (DEBUG) {
+ // don't need to crash for a failed pin, log error instead
+ Log.e(TAG, "Component $componentName not found, pinning failed $e")
+ }
+ }
+ }
+
+ /**
+ * Pin the DockItem at the given position. If the app is already pinned this call is a no-op.
+ */
+ fun pinItemAt(position: Int) {
+ // todo(b/315222570): move to controller
+ changeItemType(position, DockAppItem.Type.STATIC)
+ }
+
+ /**
+ * Unpin the DockItem at the given position. If the app is already unpinned this call is a
+ * no-op.
+ */
+ fun unpinItemAt(position: Int) {
+ // todo(b/315222570): move to controller
+ changeItemType(position, DockAppItem.Type.DYNAMIC)
+ }
+
+ private fun changeItemType(position: Int, newItemType: DockAppItem.Type) {
+ if (!isValidPosition(position) || items[position]?.type == newItemType) {
+ return
+ }
+ items[position]?.let {
+ items[position] = it.copy(type = newItemType)
+ notifyItemChanged(position, PayloadType.CHANGE_SAME_ITEM_TYPE)
+ }
+ }
+
+ /**
+ * Setter for CarPackageManager
+ */
+ fun setCarPackageManager(carPackageManager: CarPackageManager) {
+ this.carPackageManager = carPackageManager
+ }
+
+ private fun isValidPosition(position: Int): Boolean {
+ return position >= 0 && position < items.size
+ }
+}
diff --git a/docklib/src/com/android/car/docklib/view/DockDragListener.kt b/docklib/src/com/android/car/docklib/view/DockDragListener.kt
new file mode 100644
index 00000000..7563bd46
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/view/DockDragListener.kt
@@ -0,0 +1,313 @@
+package com.android.car.docklib.view
+
+import android.content.ClipData
+import android.content.ComponentName
+import android.graphics.Point
+import android.os.Build
+import android.util.Log
+import android.view.DragEvent
+import android.view.SurfaceControl
+import android.view.SurfaceControl.Transaction
+import android.view.View
+import androidx.annotation.VisibleForTesting
+import androidx.core.animation.Animator
+import androidx.core.animation.PropertyValuesHolder
+import androidx.core.animation.ValueAnimator
+import androidx.recyclerview.widget.RecyclerView
+import com.android.car.docklib.R
+import java.lang.Exception
+import java.lang.IndexOutOfBoundsException
+
+/**
+ * {@link View.OnDragListener} for Dock. Receives a drop and moves it to correct location,
+ * transformed to the given size. This should be applied to all individual items in the dock that
+ * wants to receive a drop.
+ */
+open class DockDragListener(
+ private val viewHolder: RecyclerView.ViewHolder,
+ private val callback: Callback
+) : View.OnDragListener {
+ companion object {
+ @VisibleForTesting
+ const val APP_ITEM_DRAG_TAG = "com.android.car.launcher.APP_ITEM_DRAG_TAG"
+
+ @VisibleForTesting
+ const val PVH_POSITION_X = "PVH_POSITION_X"
+
+ @VisibleForTesting
+ const val PVH_POSITION_Y = "PVH_POSITION_Y"
+
+ @VisibleForTesting
+ const val PVH_SCALE_X = "PVH_SCALE_X"
+
+ @VisibleForTesting
+ const val PVH_SCALE_Y = "PVH_SCALE_Y"
+
+ private const val TAG = "DockDragListener"
+ private val DEBUG = Build.isDebuggable()
+ }
+
+ private val animateInDuration: Int
+
+ init {
+ val resources = viewHolder.itemView.context.resources
+ animateInDuration = resources.getInteger(R.integer.drag_drop_animate_in_duration)
+ }
+
+ override fun onDrag(view: View, dragEvent: DragEvent): Boolean {
+ when (dragEvent.action) {
+ DragEvent.ACTION_DRAG_STARTED ->
+ return APP_ITEM_DRAG_TAG.contentEquals(dragEvent.clipDescription?.label)
+
+ DragEvent.ACTION_DRAG_ENTERED -> {
+ callback.exciteView()
+ return true
+ }
+
+ DragEvent.ACTION_DRAG_EXITED -> {
+ callback.resetView()
+ return true
+ }
+
+ DragEvent.ACTION_DROP -> {
+ if (viewHolder.bindingAdapterPosition == RecyclerView.NO_POSITION) {
+ if (DEBUG) Log.d(TAG, "Drop at invalid position")
+ callback.resetView()
+ return false
+ }
+ if (DEBUG) Log.d(TAG, "Drop at position: " + viewHolder.bindingAdapterPosition)
+
+ val item: ClipData.Item
+ try {
+ item = dragEvent.clipData.getItemAt(0)
+ if (item.text == null) throw NullPointerException("ClipData item text is null")
+ } catch (e: Exception) {
+ when (e) {
+ is IndexOutOfBoundsException, is NullPointerException -> {
+ if (DEBUG) Log.d(TAG, "No/Invalid clipData sent with the drop: $e")
+ callback.resetView()
+ return false
+ }
+
+ else -> {
+ throw e
+ }
+ }
+ }
+
+ val component: ComponentName? =
+ ComponentName.unflattenFromString(item.text.toString())
+ if (component == null) {
+ if (DEBUG) {
+ Log.d(TAG, "Invalid component string sent with drop: " + item.text)
+ }
+ callback.resetView()
+ return false
+ }
+ if (DEBUG) Log.d(TAG, "Dropped component: $component")
+
+ // todo(b/312718542): hidden api(dragEvent.dragSurface) usage
+ dragEvent.dragSurface?.let {
+ callback.dragAccepted(component)
+ animateSurfaceIn(it, dragEvent)
+ return true
+ } ?: run {
+ if (DEBUG) Log.d(TAG, "Could not retrieve the drag surface")
+ // drag is success but animation is not possible since there is no dragSurface
+ callback.dragAccepted(component)
+ return false
+ }
+ }
+
+ DragEvent.ACTION_DRAG_ENDED -> {
+ if (!dragEvent.result) {
+ // if drop was accepted the drop action should handle resetting
+ callback.resetView()
+ }
+ return true
+ }
+ }
+ return false
+ }
+
+ /**
+ * Animates the surface from where the it was dropped to the final position and size. Also
+ * responsible for cleaning up the surface after the animation.
+ */
+ private fun animateSurfaceIn(
+ surfaceControl: SurfaceControl,
+ dragEvent: DragEvent,
+ ) {
+ val dropContainerLocation = callback.getDropContainerLocation()
+ // todo(b/312718542): hidden api(offsetX and offsetY) usage
+ val fromX: Float = dropContainerLocation.x + (dragEvent.x - dragEvent.offsetX)
+ val fromY: Float = dropContainerLocation.y + (dragEvent.y - dragEvent.offsetY)
+
+ val dropLocation = callback.getDropLocation()
+ val toX: Float = dropLocation.x.toFloat()
+ val toY: Float = dropLocation.y.toFloat()
+
+ val toScaleX: Float = callback.getDropWidth() / surfaceControl.width
+ val toScaleY: Float = callback.getDropHeight() / surfaceControl.height
+
+ getAnimator(surfaceControl, fromX, fromY, toX, toY, toScaleX, toScaleY).start()
+ }
+
+ /**
+ * Get the animator responsible for animating the {@code surfaceControl} from
+ * {@code fromX, fromY} to its final position {@code toX, toY} with correct scale
+ * {@code toScaleX, toScaleY}.
+ * Default values are added to make this method easier to test. Generally all parameters are
+ * expected to be sent by the caller.
+ */
+ @VisibleForTesting
+ open fun getAnimator(
+ surfaceControl: SurfaceControl,
+ fromX: Float = 0f,
+ fromY: Float = 0f,
+ toX: Float = 0f,
+ toY: Float = 0f,
+ toScaleX: Float = 1f,
+ toScaleY: Float = 1f
+ ): ValueAnimator {
+ val pvhX: PropertyValuesHolder =
+ PropertyValuesHolder.ofFloat(PVH_POSITION_X, fromX, toX)
+ val pvhY: PropertyValuesHolder =
+ PropertyValuesHolder.ofFloat(PVH_POSITION_Y, fromY, toY)
+ val pvhScaleX =
+ PropertyValuesHolder.ofFloat(PVH_SCALE_X, 1f, toScaleX)
+ val pvhScaleY =
+ PropertyValuesHolder.ofFloat(PVH_SCALE_Y, 1f, toScaleY)
+
+ val animator: ValueAnimator =
+ ValueAnimator.ofPropertyValuesHolder(
+ pvhX,
+ pvhY,
+ pvhScaleX,
+ pvhScaleY
+ )
+ animator.setDuration(animateInDuration.toLong())
+ val trx = Transaction()
+ animator.addUpdateListener(getAnimatorUpdateListener(surfaceControl, trx))
+ animator.addListener(
+ getAnimatorListener(surfaceControl, trx, cleanupTrx = Transaction())
+ )
+ return animator
+ }
+
+ /**
+ * Not expected to be used directly or overridden.
+ *
+ * @param trx Transaction used to animate the {@code SurfaceControl} in place.
+ */
+ @VisibleForTesting
+ fun getAnimatorUpdateListener(
+ surfaceControl: SurfaceControl,
+ trx: Transaction
+ ): Animator.AnimatorUpdateListener {
+ return Animator.AnimatorUpdateListener {
+ updatedAnimation ->
+ if (updatedAnimation is ValueAnimator) {
+ trx.setPosition(
+ surfaceControl,
+ updatedAnimation.getAnimatedValue(PVH_POSITION_X) as Float,
+ updatedAnimation.getAnimatedValue(PVH_POSITION_Y) as Float
+ ).setScale(
+ surfaceControl,
+ updatedAnimation.getAnimatedValue(PVH_SCALE_X) as Float,
+ updatedAnimation.getAnimatedValue(PVH_SCALE_Y) as Float
+ ).apply()
+ }
+ }
+ }
+
+ /**
+ * Not expected to be used directly or overridden.
+ * {@code trx} and {@code cleanupTrx} will be closed by this listener.
+ *
+ * @param trx Transaction used to animate the {@code SurfaceControl} in place.
+ * @param cleanupTrx Transaction used to animate out and hide {@code SurfaceControl}
+ */
+ @VisibleForTesting
+ fun getAnimatorListener(
+ surfaceControl: SurfaceControl,
+ trx: Transaction,
+ cleanupTrx: Transaction
+ ): Animator.AnimatorListener {
+ return object : Animator.AnimatorListener {
+ private var isCancelled = false
+ override fun onAnimationStart(var1: Animator) {
+ isCancelled = false
+ }
+
+ override fun onAnimationEnd(var1: Animator) {
+ if (!isCancelled) {
+ cleanup()
+ }
+ }
+
+ override fun onAnimationCancel(var1: Animator) {
+ isCancelled = true
+ cleanup()
+ }
+
+ override fun onAnimationRepeat(var1: Animator) {
+ // no-op
+ }
+
+ fun cleanup() {
+ trx.close()
+ if (surfaceControl.isValid) {
+ // todo(b/312737692): add animations
+ cleanupTrx.hide(surfaceControl)
+ cleanupTrx.remove(surfaceControl)
+ cleanupTrx.apply()
+ cleanupTrx.close()
+ }
+ }
+ }
+ }
+
+ /**
+ * {@link DockDragListener} communicates events back and requests data from the caller using
+ * this callback.
+ */
+ interface Callback {
+ /**
+ * Drag is accepted/successful for the {@code componentName}
+ */
+ fun dragAccepted(componentName: ComponentName) {}
+
+ /**
+ * Excite the view to indicate the item can be dropped in this position when dragged inside
+ * the drop bounds.
+ */
+ fun exciteView() {}
+
+ /**
+ * Reset the view after a drop or if the drop failed or if the item is dragged outside the
+ * drop bounds.
+ */
+ fun resetView() {}
+
+ /**
+ * Get the location of the container that holds the dropped item
+ */
+ fun getDropContainerLocation(): Point
+
+ /**
+ * Get the final location of the dropped item
+ */
+ fun getDropLocation(): Point
+
+ /**
+ * Get the final width of the dropped item
+ */
+ fun getDropWidth(): Float
+
+ /**
+ * Get the final height of the dropped item
+ */
+ fun getDropHeight(): Float
+ }
+}
diff --git a/docklib/src/com/android/car/docklib/view/DockItemLongClickListener.kt b/docklib/src/com/android/car/docklib/view/DockItemLongClickListener.kt
new file mode 100644
index 00000000..2e65b743
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/view/DockItemLongClickListener.kt
@@ -0,0 +1,72 @@
+package com.android.car.docklib.view
+
+import android.content.res.Resources
+import android.view.View
+import androidx.annotation.OpenForTesting
+import androidx.annotation.VisibleForTesting
+import com.android.car.docklib.data.DockAppItem
+import com.android.car.dockutil.shortcuts.PinShortcutItem
+import com.android.car.ui.shortcutspopup.CarUiShortcutsPopup
+
+/**
+ * {@link View.OnLongClickListener} for handling long clicks on dock item.
+ * It is responsible to create and show th popup window
+ *
+ * @param dockAppItem the {@link DockAppItem} to be used on long click.
+ * @param pinItemClickDelegate called when item should be pinned at that position
+ * @param unpinItemClickDelegate called when item should be unpinned at that position
+ */
+@OpenForTesting
+open class DockItemLongClickListener(
+ private var dockAppItem: DockAppItem,
+ private val pinItemClickDelegate: Runnable,
+ private val unpinItemClickDelegate: Runnable
+) : View.OnLongClickListener {
+ override fun onLongClick(view: View?): Boolean {
+ if (view == null) return false
+
+ createCarUiShortcutsPopupBuilder()
+ .addShortcut(
+ createPinShortcutItem(
+ view.context.resources,
+ isItemPinned = (dockAppItem.type == DockAppItem.Type.STATIC),
+ pinItemClickDelegate,
+ unpinItemClickDelegate
+ )
+ )
+ .build(view.context, view)
+ .show()
+ return true
+ }
+
+ /**
+ * Set the {@link DockAppItem} to be used on long click.
+ */
+ fun setDockAppItem(dockAppItem: DockAppItem) {
+ this.dockAppItem = dockAppItem
+ }
+
+ /**
+ * Need to be overridden in test.
+ */
+ @VisibleForTesting
+ @OpenForTesting
+ open fun createCarUiShortcutsPopupBuilder(): CarUiShortcutsPopup.Builder =
+ CarUiShortcutsPopup.Builder()
+
+ /**
+ * Need to be overridden in test.
+ */
+ @VisibleForTesting
+ fun createPinShortcutItem(
+ resources: Resources,
+ isItemPinned: Boolean,
+ pinItemClickDelegate: Runnable,
+ unpinItemClickDelegate: Runnable
+ ): PinShortcutItem = PinShortcutItem(
+ resources,
+ isItemPinned,
+ pinItemClickDelegate,
+ unpinItemClickDelegate
+ )
+}
diff --git a/docklib/src/com/android/car/docklib/view/DockItemViewHolder.kt b/docklib/src/com/android/car/docklib/view/DockItemViewHolder.kt
new file mode 100644
index 00000000..9750f369
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/view/DockItemViewHolder.kt
@@ -0,0 +1,161 @@
+package com.android.car.docklib.view
+
+import android.content.ComponentName
+import android.content.Intent
+import android.content.res.ColorStateList
+import android.graphics.Color
+import android.graphics.Point
+import android.graphics.PorterDuff
+import android.view.View
+import androidx.core.view.setPadding
+import androidx.recyclerview.widget.RecyclerView
+import com.android.car.docklib.R
+import com.android.car.docklib.data.DockAppItem
+import com.google.android.material.imageview.ShapeableImageView
+import java.util.function.Consumer
+
+class DockItemViewHolder(
+ itemView: View,
+ private val intentDelegate: Consumer<Intent>,
+) : RecyclerView.ViewHolder(itemView) {
+
+ companion object {
+ private const val DEFAULT_STROKE_WIDTH = 0f
+ }
+
+ private val staticIconStrokeWidth: Float
+ private val dynamicIconStrokeWidth: Float
+ private val excitedIconStrokeWidth: Float
+ private val iconStrokeColor: Int
+ private val excitedIconStrokeColor: Int
+ private val appIcon: ShapeableImageView
+ private var dockItemLongClickListener: DockItemLongClickListener? = null
+ private var iconStrokeWidth: Float = DEFAULT_STROKE_WIDTH
+
+ init {
+ staticIconStrokeWidth = itemView.resources.getDimension(R.dimen.static_icon_stroke_width)
+ dynamicIconStrokeWidth = itemView.resources.getDimension(R.dimen.dynamic_icon_stroke_width)
+ excitedIconStrokeWidth = itemView.resources.getDimension(R.dimen.icon_stroke_width_excited)
+ // todo(b/314859977): iconStrokeColor should be decided by the app primary color
+ iconStrokeColor = itemView.resources.getColor(
+ R.color.icon_default_stroke_color,
+ null // theme
+ )
+ excitedIconStrokeColor = itemView.resources.getColor(
+ R.color.icon_excited_stroke_color,
+ null // theme
+ )
+ appIcon = itemView.requireViewById(R.id.dock_app_icon)
+ }
+
+ fun bind(dockAppItem: DockAppItem?) {
+ reset()
+ if (dockAppItem == null) return
+
+ itemTypeChanged(dockAppItem)
+
+ appIcon.contentDescription = dockAppItem.name
+ appIcon.setImageDrawable(dockAppItem.icon)
+ appIcon.setOnClickListener {
+ val intent =
+ Intent(Intent.ACTION_MAIN)
+ .setComponent(dockAppItem.component)
+ .addCategory(Intent.CATEGORY_LAUNCHER)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ intentDelegate.accept(intent)
+ }
+ dockItemLongClickListener = DockItemLongClickListener(
+ dockAppItem,
+ pinItemClickDelegate =
+ { (bindingAdapter as? DockAdapter)?.pinItemAt(bindingAdapterPosition) },
+ unpinItemClickDelegate =
+ { (bindingAdapter as? DockAdapter)?.unpinItemAt(bindingAdapterPosition) }
+ )
+ appIcon.onLongClickListener = dockItemLongClickListener
+
+ itemView.setOnDragListener(
+ DockDragListener(
+ viewHolder = this,
+ object : DockDragListener.Callback {
+ override fun dragAccepted(componentName: ComponentName) {
+ pinNewItem(componentName)
+ }
+
+ override fun exciteView() {
+ exciteAppIcon()
+ }
+
+ override fun resetView() {
+ resetAppIcon()
+ }
+
+ override fun getDropContainerLocation(): Point {
+ val containerLocation = itemView.locationOnScreen
+ return Point(containerLocation[0], containerLocation[1])
+ }
+
+ override fun getDropLocation(): Point {
+ val iconLocation = appIcon.locationOnScreen
+ return Point(
+ (iconLocation[0] + iconStrokeWidth.toInt()),
+ (iconLocation[1] + iconStrokeWidth.toInt())
+ )
+ }
+
+ override fun getDropWidth(): Float {
+ return (appIcon.width.toFloat() - iconStrokeWidth * 2)
+ }
+
+ override fun getDropHeight(): Float {
+ return (appIcon.height.toFloat() - iconStrokeWidth * 2)
+ }
+ }
+ )
+ )
+ }
+
+ fun itemTypeChanged(dockAppItem: DockAppItem) {
+ iconStrokeWidth = when (dockAppItem.type) {
+ DockAppItem.Type.STATIC -> staticIconStrokeWidth
+ DockAppItem.Type.DYNAMIC -> dynamicIconStrokeWidth
+ }
+ appIcon.strokeWidth = iconStrokeWidth
+
+ appIcon.invalidate()
+ dockItemLongClickListener?.setDockAppItem(dockAppItem)
+ }
+
+ private fun pinNewItem(componentName: ComponentName) {
+ (bindingAdapter as? DockAdapter)?.pinItemAt(bindingAdapterPosition, componentName)
+ }
+
+ private fun exciteAppIcon() {
+ // todo(b/312737692): add animations
+ appIcon.strokeColor = ColorStateList.valueOf(excitedIconStrokeColor)
+ appIcon.setColorFilter(Color.argb(0.3f, 0f, 0f, 0f), PorterDuff.Mode.DARKEN)
+ appIcon.strokeWidth = excitedIconStrokeWidth
+ appIcon.setPadding(getPaddingFromStrokeWidth(excitedIconStrokeWidth))
+ appIcon.invalidate()
+ }
+
+ private fun resetAppIcon() {
+ appIcon.strokeColor = ColorStateList.valueOf(iconStrokeColor)
+ appIcon.colorFilter = null
+ appIcon.strokeWidth = iconStrokeWidth
+ appIcon.setPadding(getPaddingFromStrokeWidth(iconStrokeWidth))
+ appIcon.invalidate()
+ }
+
+ private fun reset() {
+ iconStrokeWidth = DEFAULT_STROKE_WIDTH
+ resetAppIcon()
+ appIcon.contentDescription = null
+ appIcon.setImageDrawable(null)
+ appIcon.setOnClickListener(null)
+ itemView.setOnDragListener(null)
+ }
+
+ private fun getPaddingFromStrokeWidth(strokeWidth: Float): Int = (strokeWidth / 2).toInt()
+
+ // TODO: b/301484526 Add animation when app icon is changed
+}
diff --git a/docklib/src/com/android/car/docklib/view/DockView.kt b/docklib/src/com/android/car/docklib/view/DockView.kt
new file mode 100644
index 00000000..c0b25644
--- /dev/null
+++ b/docklib/src/com/android/car/docklib/view/DockView.kt
@@ -0,0 +1,50 @@
+package com.android.car.docklib.view
+
+import android.content.Context
+import android.graphics.Rect
+import android.util.AttributeSet
+import android.view.View
+import android.widget.FrameLayout
+import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView.ItemDecoration
+import com.android.car.docklib.R
+
+class DockView
+@JvmOverloads
+constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0,
+ defStyleRes: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) {
+
+ private val recyclerView: RecyclerView
+
+ init {
+ inflate(context, R.layout.dock_view, this)
+ recyclerView = requireViewById(R.id.recycler_view)
+ recyclerView.addItemDecoration(
+ object : ItemDecoration() {
+ override fun getItemOffsets(
+ outRect: Rect,
+ view: View,
+ parent: RecyclerView,
+ state: RecyclerView.State
+ ) {
+ with(outRect) {
+ if (parent.getChildAdapterPosition(view) != 0) {
+ // TODO: b/301484526 set margins in case of RTL and vertical
+ left = resources.getDimensionPixelSize(R.dimen.dock_item_spacing)
+ }
+ }
+ }
+ }
+ )
+ }
+
+ fun getAdapter() = recyclerView.adapter as DockAdapter
+
+ fun setAdapter(adapter: DockAdapter) {
+ recyclerView.adapter = adapter
+ }
+}
diff --git a/docklib/tests/Android.bp b/docklib/tests/Android.bp
new file mode 100644
index 00000000..dd6432ef
--- /dev/null
+++ b/docklib/tests/Android.bp
@@ -0,0 +1,67 @@
+//
+// Copyright (C) 2023 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test {
+ name: "CarDockLibTests",
+
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt"
+ ],
+
+ libs: [
+ "android.car",
+ "android.test.base",
+ ],
+
+ optimize: {
+ enabled: false,
+ },
+
+ static_libs: [
+ "androidx.test.runner",
+ "androidx.test.ext.junit",
+ "androidx.arch.core_core-testing",
+ "mockito-target-extended",
+ "mockito-kotlin2",
+ "truth",
+ "CarDockLib",
+ ],
+
+ manifest: "AndroidManifest.xml",
+
+ instrumentation_for: "CarDockLib",
+
+ platform_apis: true,
+
+ dex_preopt: {
+ enabled: false,
+ },
+
+ jni_libs: [
+ // For mockito extended
+ "libdexmakerjvmtiagent",
+ "libstaticjvmtiagent",
+ ],
+
+ test_suites: [
+ "automotive-tests",
+ ],
+}
diff --git a/docklib/tests/AndroidManifest.xml b/docklib/tests/AndroidManifest.xml
new file mode 100644
index 00000000..d768497c
--- /dev/null
+++ b/docklib/tests/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project.
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.car.docklib.test"
+ xmlns:tools="http://schemas.android.com/tools">
+
+ <permission
+ android:name="com.android.car.docklib.permission.BROADCAST_SENDER"
+ tools:node="remove" />
+
+ <permission
+ android:name="com.android.car.docklib.permission.BROADCAST_RECEIVER"
+ tools:node="remove" />
+
+ <application android:debuggable="true">
+ <uses-library android:name="android.test.runner"/>
+ </application>
+
+ <instrumentation
+ android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:label="Tests for Car Dock Lib"
+ android:targetPackage="com.android.car.docklib.test" />
+</manifest>
diff --git a/docklib/tests/src/com/android/car/docklib/DockHelperTest.kt b/docklib/tests/src/com/android/car/docklib/DockHelperTest.kt
new file mode 100644
index 00000000..1e788f69
--- /dev/null
+++ b/docklib/tests/src/com/android/car/docklib/DockHelperTest.kt
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib
+
+import android.car.content.pm.CarPackageManager
+import android.content.Context
+import android.content.pm.ActivityInfo
+import android.content.pm.PackageManager
+import android.content.res.Resources
+import android.graphics.drawable.Drawable
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.`when`
+
+@RunWith(AndroidJUnit4::class)
+class DockHelperTest {
+
+ private val context = mock(Context::class.java)
+ private val carPackageManager = mock(CarPackageManager::class.java)
+ private val packageManager = mock(PackageManager::class.java)
+
+ @Test
+ fun defaultApps_getCorrectAppsFromConfig() {
+ val resources = mock(Resources::class.java)
+ val item1 =
+ TestUtils.createAppItem(
+ app = "item1",
+ name = "item1",
+ icon = mock(Drawable::class.java),
+ isDrivingOptimized = true
+ )
+ val item2 =
+ TestUtils.createAppItem(
+ app = "item2",
+ name = "item2",
+ icon = mock(Drawable::class.java),
+ isDrivingOptimized = false
+ )
+ `when`(context.resources).thenReturn(resources)
+ `when`(context.packageManager).thenReturn(packageManager)
+ `when`(resources.getStringArray(anyInt()))
+ .thenReturn(
+ arrayOf(item1.component.flattenToString(), item2.component.flattenToString())
+ )
+ `when`(packageManager.getApplicationIcon(item1.component.packageName))
+ .thenReturn(item1.icon)
+ `when`(packageManager.getApplicationIcon(item2.component.packageName))
+ .thenReturn(item2.icon)
+ val activityInfo1 = mock(ActivityInfo::class.java)
+ activityInfo1.name = item1.name
+ `when`(packageManager.getActivityInfo(item1.component, 0)).thenReturn(activityInfo1)
+ val activityInfo2 = mock(ActivityInfo::class.java)
+ activityInfo2.name = item2.name
+ `when`(packageManager.getActivityInfo(item2.component, 0)).thenReturn(activityInfo2)
+ `when`(
+ carPackageManager.isActivityDistractionOptimized(
+ item1.component.packageName,
+ item1.component.className
+ )
+ )
+ .thenReturn(item1.isDistractionOptimized)
+ `when`(
+ carPackageManager.isActivityDistractionOptimized(
+ item2.component.packageName,
+ item2.component.className
+ )
+ )
+ .thenReturn(item2.isDistractionOptimized)
+
+ val defaultApps = DockHelper(context, carPackageManager).defaultApps
+
+ assertThat(defaultApps.size).isEqualTo(2)
+ assertThat(defaultApps[0]).isEqualTo(item1)
+ assertThat(defaultApps[1]).isEqualTo(item2)
+ }
+
+ @Test
+ fun toDockAppItem_fetchCorrectAppName() {
+ val item1 = TestUtils.createAppItem(app = "app", name = "name")
+ `when`(context.packageManager).thenReturn(packageManager)
+ `when`(packageManager.getApplicationIcon(any(String::class.java)))
+ .thenReturn(mock(Drawable::class.java))
+ val activityInfo1 = mock(ActivityInfo::class.java)
+ activityInfo1.name = item1.name
+ `when`(packageManager.getActivityInfo(item1.component, 0)).thenReturn(activityInfo1)
+
+ val dockAppItem = DockHelper(context, carPackageManager).toDockAppItem(item1.component)
+
+ assertThat(dockAppItem.name).isEqualTo(item1.name)
+ }
+
+ @Test
+ fun toDockAppItem_fetchCorrectAppIcon() {
+ val item1 = TestUtils.createAppItem(app = "app", icon = mock(Drawable::class.java))
+ `when`(context.packageManager).thenReturn(packageManager)
+ val activityInfo = mock(ActivityInfo::class.java)
+ activityInfo.name = ""
+ `when`(packageManager.getActivityInfo(any(), eq(0))).thenReturn(activityInfo)
+ `when`(packageManager.getApplicationIcon(item1.component.packageName))
+ .thenReturn(item1.icon)
+
+ val dockAppItem = DockHelper(context, carPackageManager).toDockAppItem(item1.component)
+
+ assertThat(dockAppItem.icon).isEqualTo(item1.icon)
+ }
+
+ @Test
+ fun toDockAppItem_fetchCorrectAppDO() {
+ val item1 = TestUtils.createAppItem(app = "app", isDrivingOptimized = true)
+ `when`(context.packageManager).thenReturn(packageManager)
+ val activityInfo = mock(ActivityInfo::class.java)
+ activityInfo.name = ""
+ `when`(packageManager.getActivityInfo(any(), eq(0))).thenReturn(activityInfo)
+ `when`(packageManager.getApplicationIcon(any(String::class.java)))
+ .thenReturn(mock(Drawable::class.java))
+ `when`(
+ carPackageManager.isActivityDistractionOptimized(
+ item1.component.packageName,
+ item1.component.className
+ )
+ )
+ .thenReturn(item1.isDistractionOptimized)
+
+ val dockAppItem = DockHelper(context, carPackageManager).toDockAppItem(item1.component)
+
+ assertThat(dockAppItem.isDistractionOptimized).isEqualTo(item1.isDistractionOptimized)
+ }
+
+ @Test
+ fun toDockAppItem_fetchCorrectAppInfo() {
+ val item1 =
+ TestUtils.createAppItem(
+ app = "item1",
+ name = "item1",
+ icon = mock(Drawable::class.java),
+ isDrivingOptimized = true
+ )
+ `when`(context.packageManager).thenReturn(packageManager)
+ `when`(packageManager.getApplicationIcon(item1.component.packageName))
+ .thenReturn(item1.icon)
+ val activityInfo1 = mock(ActivityInfo::class.java)
+ activityInfo1.name = item1.name
+ `when`(packageManager.getActivityInfo(item1.component, 0)).thenReturn(activityInfo1)
+ `when`(
+ carPackageManager.isActivityDistractionOptimized(
+ item1.component.packageName,
+ item1.component.className
+ )
+ )
+ .thenReturn(item1.isDistractionOptimized)
+
+ val dockAppItem = DockHelper(context, carPackageManager).toDockAppItem(item1.component)
+
+ assertThat(dockAppItem).isEqualTo(item1)
+ }
+}
diff --git a/docklib/tests/src/com/android/car/docklib/DockViewModelTest.kt b/docklib/tests/src/com/android/car/docklib/DockViewModelTest.kt
new file mode 100644
index 00000000..d7a53d12
--- /dev/null
+++ b/docklib/tests/src/com/android/car/docklib/DockViewModelTest.kt
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib
+
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.car.docklib.data.DockAppItem
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class DockViewModelTest {
+ @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
+
+ private lateinit var items: List<DockAppItem?>
+ private lateinit var model: DockViewModel
+ private val apps =
+ listOf(
+ TestUtils.createAppItem(app = "a"),
+ TestUtils.createAppItem(app = "b"),
+ TestUtils.createAppItem(app = "c"),
+ TestUtils.createAppItem(app = "d"),
+ )
+
+ @Before
+ fun setUp() {
+ model = DockViewModel(4) { items = it }
+ }
+
+ @Test
+ fun setDefaultApps_listSetInOrder() {
+ model.updateDefaultApps(apps)
+
+ assertThat(items.size).isEqualTo(4)
+ assertThat(items[0]).isEqualTo(apps[0])
+ assertThat(items[1]).isEqualTo(apps[1])
+ assertThat(items[2]).isEqualTo(apps[2])
+ assertThat(items[3]).isEqualTo(apps[3])
+ }
+
+ @Test
+ fun addDynamicItem_beforeDefaultApps_index0Updated() {
+ val dynamicItem = TestUtils.createAppItem(app = "da")
+
+ model.addDynamicItem(dynamicItem)
+
+ assertThat(items[0]).isEqualTo(dynamicItem)
+ }
+
+ @Test
+ fun setDefaultApps_afterDynamicItem_fillRemainingPositions() {
+ val dynamicItem = TestUtils.createAppItem(app = "da")
+ model.addDynamicItem(dynamicItem)
+
+ model.updateDefaultApps(apps)
+
+ assertThat(items.size).isEqualTo(4)
+ assertThat(items[0]).isEqualTo(dynamicItem)
+ assertThat(items[1]).isEqualTo(apps[1])
+ assertThat(items[2]).isEqualTo(apps[2])
+ assertThat(items[3]).isEqualTo(apps[3])
+ }
+
+ @Test
+ fun addDynamicItem_allItemsDefault_index0Updated() {
+ model.updateDefaultApps(apps)
+
+ val dynamicItem = TestUtils.createAppItem(app = "da")
+ model.addDynamicItem(dynamicItem)
+
+ assertThat(items.size).isEqualTo(4)
+ assertThat(items[0]).isEqualTo(dynamicItem)
+ assertThat(items[1]).isEqualTo(apps[1])
+ assertThat(items[2]).isEqualTo(apps[2])
+ assertThat(items[3]).isEqualTo(apps[3])
+ }
+
+ @Test
+ fun addDynamicItem_someItemsDefault_index1Updated() {
+ model.updateDefaultApps(apps)
+ val dynamicItem1 = TestUtils.createAppItem(app = "da1")
+ model.addDynamicItem(dynamicItem1)
+
+ val dynamicItem2 = TestUtils.createAppItem(app = "da2")
+ model.addDynamicItem(dynamicItem2)
+
+ assertThat(items.size).isEqualTo(4)
+ assertThat(items[0]).isEqualTo(dynamicItem1)
+ assertThat(items[1]).isEqualTo(dynamicItem2)
+ assertThat(items[2]).isEqualTo(apps[2])
+ assertThat(items[3]).isEqualTo(apps[3])
+ }
+
+ @Test
+ fun addDynamicItem_someItemsDefault_index2Updated() {
+ model.updateDefaultApps(apps)
+ val dynamicItem1 = TestUtils.createAppItem(app = "da1")
+ model.addDynamicItem(dynamicItem1)
+ val dynamicItem2 = TestUtils.createAppItem(app = "da2")
+ model.addDynamicItem(dynamicItem2)
+
+ val dynamicItem3 = TestUtils.createAppItem(app = "da3")
+ model.addDynamicItem(dynamicItem3)
+
+ assertThat(items.size).isEqualTo(4)
+ assertThat(items[0]).isEqualTo(dynamicItem1)
+ assertThat(items[1]).isEqualTo(dynamicItem2)
+ assertThat(items[2]).isEqualTo(dynamicItem3)
+ assertThat(items[3]).isEqualTo(apps[3])
+ }
+
+ @Test
+ fun addDynamicItem_oneItemDefault_index3Updated() {
+ model.updateDefaultApps(apps)
+ val dynamicItem1 = TestUtils.createAppItem(app = "da1")
+ model.addDynamicItem(dynamicItem1)
+ val dynamicItem2 = TestUtils.createAppItem(app = "da2")
+ model.addDynamicItem(dynamicItem2)
+ val dynamicItem3 = TestUtils.createAppItem(app = "da3")
+ model.addDynamicItem(dynamicItem3)
+
+ val dynamicItem4 = TestUtils.createAppItem(app = "da4")
+ model.addDynamicItem(dynamicItem4)
+
+ assertThat(items.size).isEqualTo(4)
+ assertThat(items[0]).isEqualTo(dynamicItem1)
+ assertThat(items[1]).isEqualTo(dynamicItem2)
+ assertThat(items[2]).isEqualTo(dynamicItem3)
+ assertThat(items[3]).isEqualTo(dynamicItem4)
+ }
+
+ @Test
+ fun addDynamicItem_allItemsDynamic_leastRecentItemUpdated() {
+ model.updateDefaultApps(apps)
+ val dynamicItem1 = TestUtils.createAppItem(app = "da1")
+ model.addDynamicItem(dynamicItem1)
+ val dynamicItem2 = TestUtils.createAppItem(app = "da2")
+ model.addDynamicItem(dynamicItem2)
+ val dynamicItem3 = TestUtils.createAppItem(app = "da3")
+ model.addDynamicItem(dynamicItem3)
+ val dynamicItem4 = TestUtils.createAppItem(app = "da4")
+ model.addDynamicItem(dynamicItem4)
+
+ val dynamicItem5 = TestUtils.createAppItem(app = "da5")
+ model.addDynamicItem(dynamicItem5)
+
+ assertThat(items.size).isEqualTo(4)
+ assertThat(items[0]).isEqualTo(dynamicItem5)
+ assertThat(items[1]).isEqualTo(dynamicItem2)
+ assertThat(items[2]).isEqualTo(dynamicItem3)
+ assertThat(items[3]).isEqualTo(dynamicItem4)
+ }
+
+ @Test
+ fun addDynamicItem_appInDock_itemsNotChanged() {
+ model.updateDefaultApps(apps)
+ val dynamicItem1 = TestUtils.createAppItem(app = "da1")
+ model.addDynamicItem(dynamicItem1)
+ val dynamicItem2 = TestUtils.createAppItem(app = "da2")
+ model.addDynamicItem(dynamicItem2)
+ val dynamicItem3 = TestUtils.createAppItem(app = "da3")
+ model.addDynamicItem(dynamicItem3)
+ val dynamicItem4 = TestUtils.createAppItem(app = "da4")
+ model.addDynamicItem(dynamicItem4)
+
+ val dynamicItem1B = TestUtils.createAppItem(app = "da1")
+ model.addDynamicItem(dynamicItem1B)
+
+ assertThat(items.size).isEqualTo(4)
+ assertThat(items[0]).isEqualTo(dynamicItem1)
+ assertThat(items[1]).isEqualTo(dynamicItem2)
+ assertThat(items[2]).isEqualTo(dynamicItem3)
+ assertThat(items[3]).isEqualTo(dynamicItem4)
+ }
+
+ @Test
+ fun addDynamicItem_appInDock_recencyRefreshed() {
+ model.updateDefaultApps(apps)
+ val dynamicItem1 = TestUtils.createAppItem(app = "da1")
+ model.addDynamicItem(dynamicItem1)
+ val dynamicItem2 = TestUtils.createAppItem(app = "da2")
+ model.addDynamicItem(dynamicItem2)
+ val dynamicItem3 = TestUtils.createAppItem(app = "da3")
+ model.addDynamicItem(dynamicItem3)
+ val dynamicItem4 = TestUtils.createAppItem(app = "da4")
+ model.addDynamicItem(dynamicItem4)
+
+ val dynamicItem2B = TestUtils.createAppItem(app = "da2")
+ model.addDynamicItem(dynamicItem2B)
+ val dynamicItem5 = TestUtils.createAppItem(app = "da5")
+ model.addDynamicItem(dynamicItem5)
+ val dynamicItem6 = TestUtils.createAppItem(app = "da6")
+ model.addDynamicItem(dynamicItem6)
+
+ assertThat(items.size).isEqualTo(4)
+ assertThat(items[0]).isEqualTo(dynamicItem5)
+ assertThat(items[1]).isEqualTo(dynamicItem2B)
+ assertThat(items[2]).isEqualTo(dynamicItem6)
+ assertThat(items[3]).isEqualTo(dynamicItem4)
+ }
+}
diff --git a/docklib/tests/src/com/android/car/docklib/TestUtils.kt b/docklib/tests/src/com/android/car/docklib/TestUtils.kt
new file mode 100644
index 00000000..c3625902
--- /dev/null
+++ b/docklib/tests/src/com/android/car/docklib/TestUtils.kt
@@ -0,0 +1,22 @@
+package com.android.car.docklib
+
+import android.content.ComponentName
+import android.graphics.drawable.Drawable
+import com.android.car.docklib.data.DockAppItem
+import org.mockito.Mockito.mock
+
+object TestUtils {
+
+ private val icon = mock(Drawable::class.java)
+
+ /** Create a hardcoded dock item with optional fields */
+ fun createAppItem(
+ type: DockAppItem.Type = DockAppItem.Type.DYNAMIC,
+ app: String = "app",
+ name: String = "app",
+ icon: Drawable = this.icon,
+ isDrivingOptimized: Boolean = true
+ ): DockAppItem {
+ return DockAppItem(type, ComponentName(app, app), name, icon, isDrivingOptimized)
+ }
+}
diff --git a/docklib/tests/src/com/android/car/docklib/data/DockAppItemTest.kt b/docklib/tests/src/com/android/car/docklib/data/DockAppItemTest.kt
new file mode 100644
index 00000000..2da0f3e3
--- /dev/null
+++ b/docklib/tests/src/com/android/car/docklib/data/DockAppItemTest.kt
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib.data
+
+import android.graphics.drawable.Drawable
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.car.docklib.TestUtils
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
+
+@RunWith(AndroidJUnit4::class)
+class DockAppItemTest {
+ @Test
+ fun compareAppItems_equal() {
+ val item1: DockAppItem = TestUtils.createAppItem()
+ val item2: DockAppItem = TestUtils.createAppItem()
+
+ assertThat(item1).isEqualTo(item2)
+ }
+
+ @Test
+ fun compareAppItems_notEqual_differentApps() {
+ val item1: DockAppItem = TestUtils.createAppItem(app = "1")
+ val item2: DockAppItem = TestUtils.createAppItem(app = "2")
+
+ assertThat(item1).isNotEqualTo(item2)
+ }
+
+ @Test
+ fun compareAppItems_notEqual_differentNames() {
+ val item1: DockAppItem = TestUtils.createAppItem(name = "1")
+ val item2: DockAppItem = TestUtils.createAppItem(name = "2")
+
+ assertThat(item1).isNotEqualTo(item2)
+ }
+
+ @Test
+ fun compareAppItems_notEqual_differentStates() {
+ val item1: DockAppItem = TestUtils.createAppItem(type = DockAppItem.Type.DYNAMIC)
+ val item2: DockAppItem = TestUtils.createAppItem(type = DockAppItem.Type.STATIC)
+
+ assertThat(item1).isNotEqualTo(item2)
+ }
+
+ @Test
+ fun compareAppItems_notEqual_differentIcons() {
+ val icon1 = mock<Drawable>()
+ whenever(icon1.constantState).thenReturn(null)
+ val icon2 = mock<Drawable>()
+ whenever(icon2.constantState).thenReturn(mock<Drawable.ConstantState>())
+
+ val item1: DockAppItem = TestUtils.createAppItem(icon = icon1)
+ val item2: DockAppItem = TestUtils.createAppItem(icon = icon2)
+
+ assertThat(item1).isNotEqualTo(item2)
+ }
+
+ @Test
+ fun compareAppItems_notEqual_differentDrivingOptimized() {
+ val item1: DockAppItem = TestUtils.createAppItem(isDrivingOptimized = true)
+ val item2: DockAppItem = TestUtils.createAppItem(isDrivingOptimized = false)
+
+ assertThat(item1).isNotEqualTo(item2)
+ }
+}
diff --git a/docklib/tests/src/com/android/car/docklib/events/DockEventsReceiverTest.java b/docklib/tests/src/com/android/car/docklib/events/DockEventsReceiverTest.java
new file mode 100644
index 00000000..0a9bd837
--- /dev/null
+++ b/docklib/tests/src/com/android/car/docklib/events/DockEventsReceiverTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.docklib.events;
+
+import static com.android.car.dockutil.events.DockEventSenderHelper.EXTRA_COMPONENT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.docklib.DockInterface;
+import com.android.car.dockutil.events.DockEvent;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DockEventsReceiverTest {
+ @Mock
+ public Context mContext;
+ @Mock
+ public Intent mIntent;
+ @Mock
+ public DockInterface mDockInterface;
+
+ private DockEventsReceiver mDockEventsReceiver;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mDockEventsReceiver = new DockEventsReceiver(mDockInterface);
+ }
+
+ @Test
+ public void onReceive_intentWithNoAction_noOp() {
+ when(mIntent.getAction()).thenReturn(null);
+
+ mDockEventsReceiver.onReceive(mContext, mIntent);
+
+ verifyZeroInteractions(mDockInterface);
+ }
+
+ @Test
+ public void onReceive_intentWithActionNotConvertibleToDockEvent_noOp() {
+ String action = "action";
+ assertThat(DockEvent.toDockEvent(action)).isNull();
+ when(mIntent.getAction()).thenReturn(action);
+
+ mDockEventsReceiver.onReceive(mContext, mIntent);
+
+ verifyZeroInteractions(mDockInterface);
+ }
+
+ @Test
+ public void onReceive_intentWithNoData_noOp() {
+ when(mIntent.getAction()).thenReturn(DockEvent.LAUNCH.toString());
+ when(mIntent.getParcelableExtra(eq(EXTRA_COMPONENT), eq(ComponentName.class)))
+ .thenReturn(null);
+
+ mDockEventsReceiver.onReceive(mContext, mIntent);
+
+ verifyZeroInteractions(mDockInterface);
+ }
+
+ @Test
+ public void onReceive_intentWithDockEventAndData_callController() {
+ when(mIntent.getAction()).thenReturn(DockEvent.LAUNCH.toString());
+ ComponentName component = new ComponentName("testPackage", "testClass");
+ when(mIntent.getParcelableExtra(eq(EXTRA_COMPONENT), eq(ComponentName.class)))
+ .thenReturn(component);
+
+ mDockEventsReceiver.onReceive(mContext, mIntent);
+
+ verify(mDockInterface).appLaunched(component);
+ }
+}
diff --git a/docklib/tests/src/com/android/car/docklib/view/DockAdapterTest.kt b/docklib/tests/src/com/android/car/docklib/view/DockAdapterTest.kt
new file mode 100644
index 00000000..d39ed0f5
--- /dev/null
+++ b/docklib/tests/src/com/android/car/docklib/view/DockAdapterTest.kt
@@ -0,0 +1,122 @@
+package com.android.car.docklib.view
+
+import android.content.Context
+import android.content.Intent
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.car.docklib.TestUtils
+import com.android.car.docklib.data.DockAppItem
+import com.google.common.truth.Truth.assertThat
+import java.util.function.Consumer
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.spy
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
+
+@RunWith(AndroidJUnit4::class)
+class DockAdapterTest {
+ private val contextMock = mock<Context> {}
+ private val intentConsumerMock = mock<Consumer<Intent>> {}
+ private val dockItemViewHolderMock = mock<DockItemViewHolder> {}
+
+ @Test
+ fun setItems_dockSizeEqualToListSize_adapterHasDockSize() {
+ val defaultApps =
+ listOf(TestUtils.createAppItem(app = "a"), TestUtils.createAppItem(app = "b"))
+ val adapter = spy(DockAdapter(defaultApps.size, intentConsumerMock, contextMock))
+
+ adapter.setItems(defaultApps)
+
+ assertThat(adapter.itemCount).isEqualTo(defaultApps.size)
+ verify(adapter).notifyItemChanged(0)
+ verify(adapter).notifyItemChanged(1)
+ }
+
+ @Test
+ fun setItems_dockSizeLessThanListSize_adapterHasDockSize() {
+ val defaultApps =
+ listOf(
+ TestUtils.createAppItem(app = "a"),
+ TestUtils.createAppItem(app = "b"),
+ TestUtils.createAppItem(app = "c")
+ )
+ val dockSize = 2
+ val adapter = spy(DockAdapter(dockSize, intentConsumerMock, contextMock))
+
+ adapter.setItems(defaultApps)
+
+ assertThat(adapter.itemCount).isEqualTo(dockSize)
+ verify(adapter).notifyItemChanged(0)
+ verify(adapter).notifyItemChanged(1)
+ }
+
+ @Test
+ fun setItems_dockSizeGreaterThanListSize_adapterHasDockSize() {
+ val defaultApps =
+ listOf(TestUtils.createAppItem(app = "a"), TestUtils.createAppItem(app = "b"))
+ val dockSize = 3
+ val adapter = spy(DockAdapter(dockSize, intentConsumerMock, contextMock))
+
+ adapter.setItems(defaultApps)
+
+ assertThat(adapter.itemCount).isEqualTo(dockSize)
+ verify(adapter).notifyItemChanged(0)
+ verify(adapter).notifyItemChanged(1)
+ verify(adapter, times(0)).notifyItemChanged(2)
+ }
+
+ @Test
+ fun onBindViewHolder_emptyPayload_onBindViewHolderWithoutPayloadCalled() {
+ val adapter = spy(DockAdapter(3, intentConsumerMock, contextMock))
+
+ adapter.onBindViewHolder(dockItemViewHolderMock, 1, MutableList(0) {})
+
+ verify(adapter).onBindViewHolder(eq(dockItemViewHolderMock), eq(1))
+ }
+
+ @Test
+ fun onBindViewHolder_nullPayload_onBindViewHolderWithoutPayloadCalled() {
+ val adapter = spy(DockAdapter(3, intentConsumerMock, contextMock))
+
+ adapter.onBindViewHolder(dockItemViewHolderMock, 1, MutableList(1) {})
+
+ verify(adapter).onBindViewHolder(eq(dockItemViewHolderMock), eq(1))
+ }
+
+ @Test
+ fun onBindViewHolder_payloadOfIncorrectType_onBindViewHolderWithoutPayloadCalled() {
+ class DummyPayload
+ val adapter = spy(DockAdapter(3, intentConsumerMock, contextMock))
+
+ adapter.onBindViewHolder(dockItemViewHolderMock, 1, MutableList(1) {
+ DummyPayload()
+ })
+
+ verify(adapter).onBindViewHolder(eq(dockItemViewHolderMock), eq(1))
+ }
+
+ @Test
+ fun onBindViewHolder_payload_CHANGE_SAME_ITEM_TYPE_itemTypeChangedCalled() {
+ val dockAppItem0 = mock<DockAppItem> {}
+ val dockAppItem1 = mock<DockAppItem> {}
+ val dockAppItem2 = mock<DockAppItem> {}
+ val adapter = spy(
+ DockAdapter(
+ numItems = 3,
+ intentConsumerMock,
+ contextMock,
+ items = arrayOf(dockAppItem0, dockAppItem1, dockAppItem2)
+ )
+ )
+
+ adapter.onBindViewHolder(dockItemViewHolderMock, 1, MutableList(1) {
+ DockAdapter.PayloadType.CHANGE_SAME_ITEM_TYPE
+ })
+
+ verify(adapter, never()).onBindViewHolder(eq(dockItemViewHolderMock), eq(1))
+ verify(dockItemViewHolderMock).itemTypeChanged(eq(dockAppItem1))
+ }
+}
diff --git a/docklib/tests/src/com/android/car/docklib/view/DockDragListenerTest.kt b/docklib/tests/src/com/android/car/docklib/view/DockDragListenerTest.kt
new file mode 100644
index 00000000..371f87ef
--- /dev/null
+++ b/docklib/tests/src/com/android/car/docklib/view/DockDragListenerTest.kt
@@ -0,0 +1,477 @@
+package com.android.car.docklib.view
+
+import android.content.ClipData
+import android.content.ClipDescription
+import android.content.ComponentName
+import android.content.Context
+import android.content.res.Resources
+import android.graphics.Point
+import android.view.DragEvent
+import android.view.DragEvent.ACTION_DRAG_ENTERED
+import android.view.DragEvent.ACTION_DRAG_EXITED
+import android.view.DragEvent.ACTION_DRAG_STARTED
+import android.view.DragEvent.ACTION_DROP
+import android.view.SurfaceControl
+import android.view.View
+import androidx.core.animation.ValueAnimator
+import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView.ViewHolder
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.car.docklib.R
+import com.android.car.docklib.view.DockDragListener.Companion.APP_ITEM_DRAG_TAG
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyFloat
+import org.mockito.kotlin.any
+import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@RunWith(AndroidJUnit4::class)
+class DockDragListenerTest {
+ private val resourcesMock = mock<Resources> {
+ on { getInteger(eq(R.integer.drag_drop_animate_in_duration)) } doReturn 0
+ }
+ private val contextMock = mock<Context> {
+ on { resources } doReturn resourcesMock
+ }
+ private val itemViewMock = mock<View> {
+ on { context } doReturn contextMock
+ }
+ private val viewHolderSpy = spy(object : ViewHolder(itemViewMock) {})
+ private val viewMock = mock<View> {}
+ private val dragEventMock = mock<DragEvent> {}
+ private val clipDescriptionMock = mock<ClipDescription> {}
+ private val clipDataMock = mock<ClipData> {}
+ private val clipDataItemMock = mock<ClipData.Item> {}
+ private val surfaceControlMock = mock<SurfaceControl> {}
+ private val surfaceControlTransactionMock = mock<SurfaceControl.Transaction> {}
+ private val surfaceControlTransactionMock2 = mock<SurfaceControl.Transaction> {}
+ private val callbackMock = mock<DockDragListener.Callback> {}
+ private val valueAnimatorMock = mock<ValueAnimator> {}
+ private val componentNameCaptor = argumentCaptor<ComponentName>()
+ private var dockDragListener = DockDragListener(viewHolderSpy, callbackMock)
+
+ companion object {
+ private val VALID_COMPONENT_NAME = ComponentName(
+ "com.android.car.docklib.view",
+ DockDragListenerTest::javaClass.name
+ ).flattenToString()
+ private const val VALID_ADAPTER_POSITION = 0
+ }
+
+ @Test
+ fun onDrag_ACTION_DRAG_STARTED_clipDescriptionNameInvalid_returnFalse() {
+ val invalidDragTag = "$APP_ITEM_DRAG_TAG-gibberish"
+ whenever(dragEventMock.action) doReturn ACTION_DRAG_STARTED
+ whenever(clipDescriptionMock.label) doReturn invalidDragTag
+ whenever(dragEventMock.clipDescription) doReturn clipDescriptionMock
+
+ val ret = dockDragListener.onDrag(viewMock, dragEventMock)
+
+ assertThat(ret).isFalse()
+ }
+
+ @Test
+ fun onDrag_ACTION_DRAG_STARTED_clipDescriptionNameValid_returnTrue() {
+ val validDragTag = APP_ITEM_DRAG_TAG
+ whenever(dragEventMock.action) doReturn ACTION_DRAG_STARTED
+ whenever(clipDescriptionMock.label) doReturn validDragTag
+ whenever(dragEventMock.clipDescription) doReturn clipDescriptionMock
+
+ val ret = dockDragListener.onDrag(viewMock, dragEventMock)
+
+ assertThat(ret).isTrue()
+ }
+
+ @Test
+ fun onDrag_ACTION_DRAG_ENTERED_exciteViewCallbackTriggered() {
+ whenever(dragEventMock.action) doReturn ACTION_DRAG_ENTERED
+
+ dockDragListener.onDrag(viewMock, dragEventMock)
+
+ verify(callbackMock).exciteView()
+ }
+
+ @Test
+ fun onDrag_ACTION_DRAG_EXITED_resetViewCallbackTriggered() {
+ whenever(dragEventMock.action) doReturn ACTION_DRAG_EXITED
+
+ dockDragListener.onDrag(viewMock, dragEventMock)
+
+ verify(callbackMock).resetView()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_invalidPosition_returnFalse() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn RecyclerView.NO_POSITION
+
+ val ret = dockDragListener.onDrag(viewMock, dragEventMock)
+
+ assertThat(ret).isFalse()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_invalidPosition_resetViewCallbackTriggered() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn RecyclerView.NO_POSITION
+
+ dockDragListener.onDrag(viewMock, dragEventMock)
+
+ verify(callbackMock).resetView()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_noClipData_returnFalse() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+ whenever(clipDataMock.getItemAt(any())) doReturn null
+
+ val ret = dockDragListener.onDrag(viewMock, dragEventMock)
+
+ assertThat(ret).isFalse()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_noClipData_resetViewCallbackTriggered() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+ whenever(clipDataMock.getItemAt(any())) doReturn null
+
+ dockDragListener.onDrag(viewMock, dragEventMock)
+
+ verify(callbackMock).resetView()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_clipDataWithNoText_returnFalse() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(clipDataItemMock.text) doReturn null
+ whenever(clipDataMock.getItemAt(eq(0))) doReturn clipDataItemMock
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+
+ val ret = dockDragListener.onDrag(viewMock, dragEventMock)
+
+ assertThat(ret).isFalse()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_clipDataWithNoText_resetViewCallbackTriggered() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(clipDataItemMock.text) doReturn null
+ whenever(clipDataMock.getItemAt(eq(0))) doReturn clipDataItemMock
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+
+ dockDragListener.onDrag(viewMock, dragEventMock)
+
+ verify(callbackMock).resetView()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_invalidComponentName_returnFalse() {
+ val invalidComponentName = "invalidComponentName"
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(clipDataItemMock.text) doReturn invalidComponentName
+ whenever(clipDataMock.getItemAt(eq(0))) doReturn clipDataItemMock
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+
+ val ret = dockDragListener.onDrag(viewMock, dragEventMock)
+
+ assertThat(ret).isFalse()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_invalidComponentName_resetViewCallbackTriggered() {
+ val invalidComponentName = "invalidComponentName"
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(clipDataItemMock.text) doReturn invalidComponentName
+ whenever(clipDataMock.getItemAt(eq(0))) doReturn clipDataItemMock
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+
+ dockDragListener.onDrag(viewMock, dragEventMock)
+
+ verify(callbackMock).resetView()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_noDragSurface_returnFalse() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(clipDataItemMock.text) doReturn VALID_COMPONENT_NAME
+ whenever(clipDataMock.getItemAt(eq(0))) doReturn clipDataItemMock
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+ whenever(dragEventMock.dragSurface) doReturn null
+
+ val ret = dockDragListener.onDrag(viewMock, dragEventMock)
+
+ assertThat(ret).isFalse()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_noDragSurface_dragAcceptedCallbackTriggered() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(clipDataItemMock.text) doReturn VALID_COMPONENT_NAME
+ whenever(clipDataMock.getItemAt(eq(0))) doReturn clipDataItemMock
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+ whenever(dragEventMock.dragSurface) doReturn null
+
+ dockDragListener.onDrag(viewMock, dragEventMock)
+
+ verify(callbackMock).dragAccepted(componentNameCaptor.capture())
+ assertThat(componentNameCaptor.firstValue).isNotNull()
+ assertThat(componentNameCaptor.firstValue.flattenToString()).isEqualTo(VALID_COMPONENT_NAME)
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_validPositionComponentNameDragSurface_returnTrue() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(clipDataItemMock.text) doReturn VALID_COMPONENT_NAME
+ whenever(clipDataMock.getItemAt(eq(0))) doReturn clipDataItemMock
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+ whenever(dragEventMock.dragSurface) doReturn surfaceControlMock
+ whenever(callbackMock.getDropContainerLocation()).thenReturn(Point(0, 0))
+ whenever(callbackMock.getDropLocation()).thenReturn(Point(0, 0))
+ whenever(callbackMock.getDropHeight()).thenReturn(10f)
+ whenever(callbackMock.getDropWidth()).thenReturn(10f)
+ dockDragListener = object : DockDragListener(viewHolderSpy, callbackMock) {
+ override fun getAnimator(
+ surfaceControl: SurfaceControl,
+ fromX: Float,
+ fromY: Float,
+ toX: Float,
+ toY: Float,
+ toScaleX: Float,
+ toScaleY: Float
+ ): ValueAnimator {
+ return valueAnimatorMock
+ }
+ }
+
+ val ret = dockDragListener.onDrag(viewMock, dragEventMock)
+
+ assertThat(ret).isTrue()
+ }
+
+ @Test
+ fun onDrag_ACTION_DROP_validPositionComponentNameDragSurface_animationStarted() {
+ whenever(dragEventMock.action) doReturn ACTION_DROP
+ whenever(viewHolderSpy.bindingAdapterPosition) doReturn VALID_ADAPTER_POSITION
+ whenever(clipDataItemMock.text) doReturn VALID_COMPONENT_NAME
+ whenever(clipDataMock.getItemAt(eq(0))) doReturn clipDataItemMock
+ whenever(dragEventMock.clipData) doReturn clipDataMock
+ whenever(dragEventMock.dragSurface) doReturn surfaceControlMock
+ whenever(callbackMock.getDropContainerLocation()).thenReturn(Point(0, 0))
+ whenever(callbackMock.getDropLocation()).thenReturn(Point(0, 0))
+ whenever(callbackMock.getDropHeight()).thenReturn(10f)
+ whenever(callbackMock.getDropWidth()).thenReturn(10f)
+ dockDragListener = object : DockDragListener(viewHolderSpy, callbackMock) {
+ override fun getAnimator(
+ surfaceControl: SurfaceControl,
+ fromX: Float,
+ fromY: Float,
+ toX: Float,
+ toY: Float,
+ toScaleX: Float,
+ toScaleY: Float
+ ): ValueAnimator {
+ return valueAnimatorMock
+ }
+ }
+
+ dockDragListener.onDrag(viewMock, dragEventMock)
+
+ verify(valueAnimatorMock).start()
+ }
+
+ @Test
+ fun getAnimator_onAnimationUpdate_surfaceControlSetToNewPosition() {
+ val updatedX = 10f
+ val updatedY = 20f
+ val updatedScaleX = 0.9f
+ val updatedScaleY = 0.9f
+ whenever(
+ valueAnimatorMock.getAnimatedValue(DockDragListener.PVH_POSITION_X)
+ ) doReturn updatedX
+ whenever(
+ valueAnimatorMock.getAnimatedValue(DockDragListener.PVH_POSITION_Y)
+ ) doReturn updatedY
+ whenever(
+ valueAnimatorMock.getAnimatedValue(DockDragListener.PVH_SCALE_X)
+ ) doReturn updatedScaleX
+ whenever(
+ valueAnimatorMock.getAnimatedValue(DockDragListener.PVH_SCALE_Y)
+ ) doReturn updatedScaleY
+ whenever(
+ surfaceControlTransactionMock.setPosition(any<SurfaceControl>(), anyFloat(), anyFloat())
+ ) doReturn surfaceControlTransactionMock
+ whenever(
+ surfaceControlTransactionMock.setScale(any<SurfaceControl>(), anyFloat(), anyFloat())
+ ) doReturn surfaceControlTransactionMock
+
+ val updateListener = dockDragListener.getAnimatorUpdateListener(
+ surfaceControlMock,
+ surfaceControlTransactionMock
+ )
+ updateListener.onAnimationUpdate(valueAnimatorMock)
+
+ verify(surfaceControlTransactionMock)
+ .setPosition(eq(surfaceControlMock), eq(updatedX), eq(updatedY))
+ verify(surfaceControlTransactionMock).apply()
+ }
+
+ @Test
+ fun getAnimator_onAnimationUpdate_surfaceControlSetToNewScale() {
+ val updatedX = 10f
+ val updatedY = 20f
+ val updatedScaleX = 0.9f
+ val updatedScaleY = 0.9f
+ whenever(
+ valueAnimatorMock.getAnimatedValue(DockDragListener.PVH_POSITION_X)
+ ) doReturn updatedX
+ whenever(
+ valueAnimatorMock.getAnimatedValue(DockDragListener.PVH_POSITION_Y)
+ ) doReturn updatedY
+ whenever(
+ valueAnimatorMock.getAnimatedValue(DockDragListener.PVH_SCALE_X)
+ ) doReturn updatedScaleX
+ whenever(
+ valueAnimatorMock.getAnimatedValue(DockDragListener.PVH_SCALE_Y)
+ ) doReturn updatedScaleY
+ whenever(
+ surfaceControlTransactionMock.setPosition(any<SurfaceControl>(), anyFloat(), anyFloat())
+ ) doReturn surfaceControlTransactionMock
+ whenever(
+ surfaceControlTransactionMock.setScale(any<SurfaceControl>(), anyFloat(), anyFloat())
+ ) doReturn surfaceControlTransactionMock
+
+ val updateListener = dockDragListener.getAnimatorUpdateListener(
+ surfaceControlMock,
+ surfaceControlTransactionMock
+ )
+ updateListener.onAnimationUpdate(valueAnimatorMock)
+
+ verify(surfaceControlTransactionMock)
+ .setScale(eq(surfaceControlMock), eq(updatedScaleX), eq(updatedScaleY))
+ verify(surfaceControlTransactionMock).apply()
+ }
+
+ @Test
+ fun getAnimatorListener_onAnimationEnd_transactionsClosed() {
+ whenever(surfaceControlMock.isValid) doReturn true
+
+ val listener = dockDragListener.getAnimatorListener(
+ surfaceControlMock,
+ surfaceControlTransactionMock,
+ surfaceControlTransactionMock2
+ )
+ listener.onAnimationEnd(valueAnimatorMock)
+
+ verify(surfaceControlTransactionMock).close()
+ verify(surfaceControlTransactionMock2).close()
+ }
+
+ @Test
+ fun getAnimatorListener_onAnimationCancel_transactionsClosed() {
+ whenever(surfaceControlMock.isValid) doReturn true
+
+ val listener = dockDragListener.getAnimatorListener(
+ surfaceControlMock,
+ surfaceControlTransactionMock,
+ surfaceControlTransactionMock2
+ )
+ listener.onAnimationCancel(valueAnimatorMock)
+
+ verify(surfaceControlTransactionMock).close()
+ verify(surfaceControlTransactionMock2).close()
+ }
+
+ @Test
+ fun getAnimatorListener_onAnimationCancelAndonAnimationEnd_transactionsClosedOnce() {
+ whenever(surfaceControlMock.isValid) doReturn true
+
+ val listener = dockDragListener.getAnimatorListener(
+ surfaceControlMock,
+ surfaceControlTransactionMock,
+ surfaceControlTransactionMock2
+ )
+ listener.onAnimationCancel(valueAnimatorMock)
+ listener.onAnimationEnd(valueAnimatorMock)
+
+ verify(surfaceControlTransactionMock).close()
+ verify(surfaceControlTransactionMock2).close()
+ }
+
+ @Test
+ fun getAnimatorListener_onAnimationEnd_surfaceControlHidden() {
+ whenever(surfaceControlMock.isValid) doReturn true
+
+ val listener = dockDragListener.getAnimatorListener(
+ surfaceControlMock,
+ surfaceControlTransactionMock,
+ surfaceControlTransactionMock2
+ )
+ listener.onAnimationEnd(valueAnimatorMock)
+
+ verify(surfaceControlTransactionMock2).hide(eq(surfaceControlMock))
+ verify(surfaceControlTransactionMock2).apply()
+ }
+
+ @Test
+ fun getAnimatorListener_onAnimationCancel_surfaceControlHidden() {
+ whenever(surfaceControlMock.isValid) doReturn true
+
+ val listener = dockDragListener.getAnimatorListener(
+ surfaceControlMock,
+ surfaceControlTransactionMock,
+ surfaceControlTransactionMock2
+ )
+ listener.onAnimationCancel(valueAnimatorMock)
+
+ verify(surfaceControlTransactionMock2).hide(eq(surfaceControlMock))
+ verify(surfaceControlTransactionMock2).apply()
+ }
+
+ @Test
+ fun getAnimatorListener_onAnimationEnd_surfaceControlRemoved() {
+ whenever(surfaceControlMock.isValid) doReturn true
+
+ val listener = dockDragListener.getAnimatorListener(
+ surfaceControlMock,
+ surfaceControlTransactionMock,
+ surfaceControlTransactionMock2
+ )
+ listener.onAnimationEnd(valueAnimatorMock)
+
+ verify(surfaceControlTransactionMock2).remove(eq(surfaceControlMock))
+ verify(surfaceControlTransactionMock2).apply()
+ }
+
+ @Test
+ fun getAnimatorListener_onAnimationCancel_surfaceControlRemoved() {
+ whenever(surfaceControlMock.isValid) doReturn true
+
+ val listener = dockDragListener.getAnimatorListener(
+ surfaceControlMock,
+ surfaceControlTransactionMock,
+ surfaceControlTransactionMock2
+ )
+ listener.onAnimationCancel(valueAnimatorMock)
+
+ verify(surfaceControlTransactionMock2).remove(eq(surfaceControlMock))
+ verify(surfaceControlTransactionMock2).apply()
+ }
+}
diff --git a/docklib/tests/src/com/android/car/docklib/view/DockItemLongClickListenerTest.kt b/docklib/tests/src/com/android/car/docklib/view/DockItemLongClickListenerTest.kt
new file mode 100644
index 00000000..d8ba54b9
--- /dev/null
+++ b/docklib/tests/src/com/android/car/docklib/view/DockItemLongClickListenerTest.kt
@@ -0,0 +1,89 @@
+package com.android.car.docklib.view
+
+import android.content.Context
+import android.content.res.Resources
+import android.view.View
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.car.docklib.TestUtils
+import com.android.car.docklib.data.DockAppItem
+import com.android.car.ui.shortcutspopup.CarUiShortcutsPopup
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.verify
+
+@RunWith(AndroidJUnit4::class)
+class DockItemLongClickListenerTest {
+ private val dockAppItemMock = mock<DockAppItem>()
+ private val resourcesMock = mock<Resources>()
+ private val contextMock = mock<Context> { on { resources } doReturn resourcesMock }
+ private val viewMock = mock<View> { on { context } doReturn contextMock }
+ private val runnableMock1 = mock<Runnable>()
+ private val runnableMock2 = mock<Runnable>()
+ private val carUiShortcutsPopupMock = mock<CarUiShortcutsPopup>()
+ private val carUiShortcutsPopupBuilderMock = mock<CarUiShortcutsPopup.Builder>() {
+ on { addShortcut(any<CarUiShortcutsPopup.ShortcutItem>()) } doReturn it
+ on { build(any<Context>(), any<View>()) } doReturn carUiShortcutsPopupMock
+ }
+ private lateinit var dockItemLongClickListener: DockItemLongClickListener
+
+ @Before
+ fun setup() {
+ dockItemLongClickListener = createDockItemLongClickListener()
+ }
+
+ @Test
+ fun onLongClick_shortcutShown() {
+ dockItemLongClickListener.onLongClick(viewMock)
+
+ verify(carUiShortcutsPopupMock).show()
+ }
+
+ @Test
+ fun onLongClick_typeStatic_pinShortcutItem_parameterIsItemPinnedIsTrue() {
+ dockItemLongClickListener =
+ createDockItemLongClickListener(TestUtils.createAppItem(DockAppItem.Type.STATIC))
+
+ dockItemLongClickListener.onLongClick(viewMock)
+
+ verify(dockItemLongClickListener).createPinShortcutItem(
+ any<Resources>(),
+ eq(true),
+ any<Runnable>(),
+ any<Runnable>()
+ )
+ }
+
+ @Test
+ fun onLongClick_typeDynamic_pinShortcutItem_parameterIsItemPinnedIsFalse() {
+ dockItemLongClickListener =
+ createDockItemLongClickListener(TestUtils.createAppItem(DockAppItem.Type.DYNAMIC))
+
+ dockItemLongClickListener.onLongClick(viewMock)
+
+ verify(dockItemLongClickListener).createPinShortcutItem(
+ any<Resources>(),
+ eq(false),
+ any<Runnable>(),
+ any<Runnable>()
+ )
+ }
+
+ private fun createDockItemLongClickListener(
+ dockAppItem: DockAppItem = dockAppItemMock
+ ): DockItemLongClickListener {
+ return spy(object : DockItemLongClickListener(
+ dockAppItem,
+ runnableMock1,
+ runnableMock2
+ ) {
+ override fun createCarUiShortcutsPopupBuilder(): CarUiShortcutsPopup.Builder =
+ carUiShortcutsPopupBuilderMock
+ })
+ }
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 00000000..b5987b65
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,24 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app"s APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+android.enableJetifier=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..7454180f
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..58944a67
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Sep 28 21:17:18 PDT 2023
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 00000000..1b6c7873
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,234 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+APP_NAME="Gradle"
+APP_BASE_NAME=${0##*/}
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 00000000..ac1b06f9
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/libs/OWNERS b/libs/OWNERS
new file mode 100644
index 00000000..0477d2a9
--- /dev/null
+++ b/libs/OWNERS
@@ -0,0 +1,6 @@
+# Default code reviewers picked from top 3 or more developers.
+# Please update this list if you find better candidates.
+
+ankiit@google.com
+alexstetson@google.com
+danzz@google.com
diff --git a/libs/appgrid/Android.bp b/libs/appgrid/Android.bp
new file mode 100644
index 00000000..06dd2c91
--- /dev/null
+++ b/libs/appgrid/Android.bp
@@ -0,0 +1,83 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+java_library_static {
+ name: "launcher_item",
+ host_supported: true,
+ proto: {
+ type: "lite",
+ },
+ sdk_version: "module_current",
+ min_sdk_version: "31",
+ srcs: ["lib/src/com/android/car/carlauncher/proto/launcher_item.proto"]
+}
+
+android_library {
+ name: "CarAppGrid-lib",
+ platform_apis: true,
+
+ srcs: ["lib/src/**/*.java",
+ "lib/src/**/*.kt",
+ "lib/hidden_apis_enabled/**/*.java"],
+
+ resource_dirs: ["lib/res"],
+
+ static_libs: [
+ "androidx-constraintlayout_constraintlayout-solver",
+ "androidx-constraintlayout_constraintlayout",
+ "androidx.lifecycle_lifecycle-extensions",
+ "car-media-common",
+ "guava",
+ "car-ui-lib",
+ "launcher_item",
+ "CarDockUtilLib",
+ ],
+
+ libs: ["android.car"],
+
+ manifest: "lib/AndroidManifest.xml",
+}
+
+// Uses test key instead of the regular "platform" key
+CERTIFICATE = ":com-android-car-launcher-test"
+
+android_app {
+ name: "CarAppGridTestApp",
+
+ manifest: "app/src/main/AndroidManifest.xml",
+
+ resource_dirs: ["app/src/main/res"],
+
+ srcs: ["app/src/**/*.java",
+ "app/src/**/*.kt",],
+
+ platform_apis: true,
+
+ required: ["allowed_privapp_com.android.car.appgrid.test"],
+
+ certificate: CERTIFICATE,
+
+ privileged: true,
+
+ static_libs: ["CarAppGrid-lib"],
+
+ optimize: {
+ enabled: true,
+ },
+}
diff --git a/libs/appgrid/OWNERS b/libs/appgrid/OWNERS
new file mode 100644
index 00000000..c4871a70
--- /dev/null
+++ b/libs/appgrid/OWNERS
@@ -0,0 +1,9 @@
+# Default code reviewers picked from top 3 or more developers.
+# Please update this list if you find better candidates.
+
+ankiit@google.com
+alexstetson@google.com
+danzz@google.com
+nehah@google.com
+stenning@google.com
+alanschen@google.com
diff --git a/libs/appgrid/app/build.gradle b/libs/appgrid/app/build.gradle
new file mode 100644
index 00000000..f6ac89c7
--- /dev/null
+++ b/libs/appgrid/app/build.gradle
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+plugins {
+ id 'com.android.application'
+ id 'org.jetbrains.kotlin.android'
+}
+
+android {
+ namespace 'com.android.car.appgrid.test'
+ compileSdk gradle.ext.aaosTargetSDK
+
+ defaultConfig {
+ applicationId "com.android.car.appgrid.test"
+ minSdk gradle.ext.aaosLatestSDK
+ targetSdk gradle.ext.aaosLatestSDK
+ versionCode gradle.ext.getVersionCode()
+ versionName gradle.ext.getVersionName()
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+
+ signingConfigs {
+ debug {
+ storeFile file(gradle.ext.debugCertPath)
+ storePassword 'carapps'
+ keyAlias 'carapps'
+ keyPassword 'carapps'
+ }
+ }
+
+ buildTypes {
+ debug {
+ testCoverageEnabled = true
+ signingConfig signingConfigs.debug
+ minifyEnabled false
+ shrinkResources false
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+}
+
+dependencies {
+ implementation project(":libs:appgrid:lib")
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+}
diff --git a/libs/appgrid/app/src/main/AndroidManifest.xml b/libs/appgrid/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..0b0f30d8
--- /dev/null
+++ b/libs/appgrid/app/src/main/AndroidManifest.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.car.appgrid.test"
+ xmlns:tools="http://schemas.android.com/tools">
+
+ <!-- Permission to open recent tasks and to allow drag surface control to be transferred from DragEvent. -->
+ <uses-permission android:name="android.permission.START_TASKS_FROM_RECENTS"/>
+ <!-- System permission to query all installed packages -->
+ <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
+ <!-- System permission to control media playback of the active session -->
+ <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
+ <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>
+ <!-- System permission to query users on device -->
+ <uses-permission android:name="android.permission.MANAGE_USERS"/>
+ <uses-permission android:name="android.permission.CREATE_USERS"/>
+ <!-- Needed to change component enabled state when user opens disabled apps. -->
+ <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:supportsRtl="true">
+
+ <activity-alias
+ android:name="com.android.car.appgrid.test.AppGridActivity"
+ android:targetActivity="com.android.car.carlauncher.AppGridActivity"
+ android:launchMode="singleInstance"
+ android:exported="true"
+ android:theme="@style/Theme.Launcher.AppGridActivity"
+ android:excludeFromRecents="true">
+ <meta-data android:name="distractionOptimized" android:value="true"/>
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity-alias>
+
+ </application>
+
+</manifest>
diff --git a/libs/appgrid/app/src/main/res/drawable/ic_launcher.png b/libs/appgrid/app/src/main/res/drawable/ic_launcher.png
new file mode 100644
index 00000000..2af53a49
--- /dev/null
+++ b/libs/appgrid/app/src/main/res/drawable/ic_launcher.png
Binary files differ
diff --git a/libs/appgrid/app/src/main/res/values/strings.xml b/libs/appgrid/app/src/main/res/values/strings.xml
new file mode 100644
index 00000000..4f503460
--- /dev/null
+++ b/libs/appgrid/app/src/main/res/values/strings.xml
@@ -0,0 +1,19 @@
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+ <string name="app_name" translatable="false">CarAppGridTestApp</string>
+</resources>
diff --git a/libs/appgrid/keys/Android.bp b/libs/appgrid/keys/Android.bp
new file mode 100644
index 00000000..befe8fce
--- /dev/null
+++ b/libs/appgrid/keys/Android.bp
@@ -0,0 +1,8 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_app_certificate {
+ name: "com-android-car-launcher-test",
+ certificate: "com_android_car_launcher_test"
+}
diff --git a/libs/appgrid/keys/com_android_car_launcher_test.jks b/libs/appgrid/keys/com_android_car_launcher_test.jks
new file mode 100644
index 00000000..5ac2ba13
--- /dev/null
+++ b/libs/appgrid/keys/com_android_car_launcher_test.jks
Binary files differ
diff --git a/libs/appgrid/keys/com_android_car_launcher_test.pk8 b/libs/appgrid/keys/com_android_car_launcher_test.pk8
new file mode 100644
index 00000000..34f94c73
--- /dev/null
+++ b/libs/appgrid/keys/com_android_car_launcher_test.pk8
Binary files differ
diff --git a/libs/appgrid/keys/com_android_car_launcher_test.x509.pem b/libs/appgrid/keys/com_android_car_launcher_test.x509.pem
new file mode 100644
index 00000000..0161f5e1
--- /dev/null
+++ b/libs/appgrid/keys/com_android_car_launcher_test.x509.pem
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDeTCCAmGgAwIBAgIEeXV+cDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQGEwJV
+UzELMAkGA1UECBMCQ0ExDDAKBgNVBAcTA01UVjETMBEGA1UEChMKQXV0b21vdGl2
+ZTEaMBgGA1UECxMRU3lzdGVtIEV4cGVyaWVuY2UxEjAQBgNVBAMTCUFBT1MgQXBw
+czAeFw0yMTA4MTMyMTQxMzJaFw00NjA4MDcyMTQxMzJaMG0xCzAJBgNVBAYTAlVT
+MQswCQYDVQQIEwJDQTEMMAoGA1UEBxMDTVRWMRMwEQYDVQQKEwpBdXRvbW90aXZl
+MRowGAYDVQQLExFTeXN0ZW0gRXhwZXJpZW5jZTESMBAGA1UEAxMJQUFPUyBBcHBz
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj89/yYWwhOh+qCJVBThj
+skfcpxpTBHvVcd+S+ifiRAyetMAG330Ql4t0gHfEXdRa8hupwaIRAxTN3ipLhyfP
+9EpjfuSf1+lLSUZV7+S0Z98cMHAsQbu5jft9XU5GlQU/KzPDZJYo6A9Hilj4bbou
+PZcTEbsOZuXaKmGsJznVz97nGLQM8AJsVYuKXpho5rL/NRq3l1nSPiHfhWImVRcq
+qbgoTMmn1du4WtsqKhKTnew7ILx17qzYS83+C5WtI4WfoS7x/S3gLpfn56RhIKcT
+aGsxtQFEd4F4ERSXBTnaQJawOcxa7gwm3k8JacO6DvqoA96MekNPcS7EAdLoC2Mm
+8wIDAQABoyEwHzAdBgNVHQ4EFgQUaVopvD/66+afVc8Mj8RFe07dvrYwDQYJKoZI
+hvcNAQELBQADggEBAI0P9RUUFA0MwOmOgS9JknE5saAI+Pcut1kFYCwH22RypCpn
+GP9NJzxEFEDi03fMTRWhaSBkok2nEaWS5Io+eEpSQh9LJXVKpqilSOPev0VR/xQL
+9PYQ/OrmVY1XS5s56LsuKhDD80lSLhQhT2d+FdKQRKlzn3A9ZUA4s/ZIA8SUdJb/
+FKsDQPIDuaHiZG0/8h3kevyq8Zuh0HEQ0YVZzLXyu7d1/ShVjFp7DVs0Pd2MDbyR
+0i4JQSj2zAIhfqg+Wsxy4A2vxXk6LswCBJhouDBThHrIE6VVZoBBZeP03E+lVQaU
+3R1c5X48BOqSsy0m6bfFJkjfynnnYNl7/6GsDr0=
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/libs/appgrid/lib/AndroidManifest.xml b/libs/appgrid/lib/AndroidManifest.xml
new file mode 100644
index 00000000..3d3d8ab1
--- /dev/null
+++ b/libs/appgrid/lib/AndroidManifest.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.car.carlauncher">
+
+ <!-- System permission to query all installed packages -->
+ <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
+
+ <!-- Permission to allow drag surface control to be transferred from DragEvent. -->
+ <uses-permission android:name="android.permission.START_TASKS_FROM_RECENTS"/>
+ <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
+ <!-- System permission to query users on device -->
+ <uses-permission android:name="android.permission.MANAGE_USERS"/>
+ <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
+
+ <!-- Permission to allow broadcasting events to the dock -->
+ <uses-permission android:name="com.android.car.docklib.permission.BROADCAST_SENDER" />
+
+ <application>
+
+ <!--TODO (b/301667893): Remove the Activities and its CarLauncher specific code, once we are
+ able to provide a Fragment for AppGrid-->
+ <activity
+ android:name="com.android.car.carlauncher.AppGridActivity"
+ android:launchMode="singleInstance"
+ android:exported="true"
+ android:theme="@style/Theme.Launcher.AppGridActivity"
+ android:excludeFromRecents="true">
+ <meta-data android:name="distractionOptimized" android:value="true"/>
+ <intent-filter>
+ <action android:name="com.android.car.carlauncher.ACTION_APP_GRID"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ </activity>
+
+ <activity android:name="com.android.car.carlauncher.ResetLauncherActivity"
+ android:theme="@style/ActionDialogTheme"
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:launchMode="singleInstance">
+ <intent-filter>
+ <action android:name="com.android.settings.action.EXTRA_SETTINGS"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ <meta-data
+ android:name="com.android.settings.title"
+ android:resource="@string/reset_appgrid_title"/>
+ <meta-data
+ android:name="com.android.settings.category"
+ android:value="com.android.settings.category.ia.apps"/>
+ </activity>
+
+ </application>
+
+</manifest>
diff --git a/libs/appgrid/lib/build.gradle b/libs/appgrid/lib/build.gradle
new file mode 100644
index 00000000..2cd55c63
--- /dev/null
+++ b/libs/appgrid/lib/build.gradle
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+plugins {
+ id 'com.android.library'
+ id "com.google.protobuf"
+ id 'kotlin-android'
+}
+
+android {
+ namespace 'com.android.car.carlauncher'
+ compileSdk gradle.ext.aaosTargetSDK
+
+ defaultConfig {
+ minSdk gradle.ext.aaosLatestSDK
+ targetSdk gradle.ext.aaosLatestSDK
+ versionCode gradle.ext.getVersionCode()
+ versionName gradle.ext.getVersionName()
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ res.srcDirs = ['res']
+ java.srcDirs = ['src']
+ java {
+ srcDirs += 'hidden_apis_disabled/src/com/android/car/carlauncher/hidden'
+ srcDirs += 'build/generated/source/proto/java'
+ }
+ kotlin {
+ srcDirs += 'build/generated/source/proto/kotlin'
+ }
+ proto {
+ srcDir 'src/com/android/car/carlauncher/proto' // default value
+ }
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ lintOptions {
+ disable 'PrivateResource'
+ }
+}
+
+dependencies {
+ compileOnly files(gradle.ext.lib_car_system_stubs)
+ compileOnly files(gradle.ext.lib_car_ui_lib_oem_apis)
+ implementation project(":libs:car-apps-common")
+ implementation project(":libs:car-media-common")
+ implementation project(":libs:car-ui-lib")
+ implementation 'androidx.core:core-ktx:1.12.0'
+ api 'androidx.annotation:annotation:1.7.0'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'com.google.android.material:material:1.10.0'
+ implementation 'com.android.car.ui:car-ui-lib:2.5.1'
+ implementation 'com.google.guava:guava:31.0.1-jre'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.5'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "androidx.datastore:datastore:1.0.0"
+ implementation "com.google.protobuf:protobuf-javalite:3.20.1"
+}
+
+protobuf {
+ protoc {
+ artifact = "com.google.protobuf:protoc:3.23.4"
+ }
+
+ // Generates the java Protobuf-lite code for the Protobufs in this project. See
+ // https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
+ // for more information.
+ generateProtoTasks {
+ all().each { task ->
+ task.builtins {
+ java {
+ option 'lite'
+ }
+ }
+ }
+ }
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+}
diff --git a/libs/appgrid/lib/hidden_apis_disabled/src/com/android/car/carlauncher/hidden/HiddenApiAccess.java b/libs/appgrid/lib/hidden_apis_disabled/src/com/android/car/carlauncher/hidden/HiddenApiAccess.java
new file mode 100644
index 00000000..b3fbb7d6
--- /dev/null
+++ b/libs/appgrid/lib/hidden_apis_disabled/src/com/android/car/carlauncher/hidden/HiddenApiAccess.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.hidden;
+
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.view.DragEvent;
+import android.view.SurfaceControl;
+
+/***
+ * This classes is a place to surface all hidden/blocked apis which are not available to be accessed
+ * by unbundled application.
+ * All of the apis here are only visible to platform apps.
+ * We will deprecate this class once we find alternative public apis.
+ * Note: This folder location is compiled only with Gradle builds. There exists alternative Soong
+ * build version under (hidden_apis_enabled) folder.
+ * Gradle version fails softly when we need this api, so some functionality might appear broken.
+ *
+ * Gradle builds are testing/development only. Please build with Soong once before merging changes
+ */
+public class HiddenApiAccess {
+ /**
+ * Empty/Null SurfaceControl
+ */
+ public static SurfaceControl getDragSurface(DragEvent event) {
+ return null;
+ }
+
+ /**
+ * Fake android.os.UserManager#hasBaseUserRestriction function
+ * always returns false.
+ */
+ public static boolean hasBaseUserRestriction(UserManager userManager, String restriction,
+ UserHandle user) {
+ return false;
+ }
+
+ /**
+ * Directly resolves int value of the hidden int flag
+ * android.view.View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION
+ */
+ public static int DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION = 1 << 11;
+}
diff --git a/libs/appgrid/lib/hidden_apis_enabled/src/com/android/car/carlauncher/hidden/HiddenApiAccess.java b/libs/appgrid/lib/hidden_apis_enabled/src/com/android/car/carlauncher/hidden/HiddenApiAccess.java
new file mode 100644
index 00000000..b36f057d
--- /dev/null
+++ b/libs/appgrid/lib/hidden_apis_enabled/src/com/android/car/carlauncher/hidden/HiddenApiAccess.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.hidden;
+
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.view.DragEvent;
+import android.view.SurfaceControl;
+import android.view.View;
+
+
+/***
+ * This classes is a place to surface all hidden/blocked apis which are not available to be accessed
+ * by unbundled application.
+ * We will deprecate this class once we find alternative public apis.
+ * Note: This folder location is compiled only with Soong builds. Alternative gradle build
+ * version under (hidden_apis_disabled) folder.
+ */
+public class HiddenApiAccess {
+
+ /**
+ * Calls hidden api {@link android.view.DragEvent#getDragSurface}
+ */
+ public static SurfaceControl getDragSurface(DragEvent event) {
+ return event.getDragSurface();
+ }
+
+ /**
+ * Calls hidden api {@link android.os.UserManager#hasBaseUserRestriction}
+ */
+ public static boolean hasBaseUserRestriction(UserManager userManager, String restriction,
+ UserHandle user) {
+ return userManager.hasBaseUserRestriction(restriction, user);
+ }
+
+ /**
+ * Gets hidden api {@link android.view.View#DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION}
+ */
+ public static int DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION =
+ View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION;
+}
diff --git a/res/drawable/app_item_highlight.xml b/libs/appgrid/lib/res/drawable/app_item_highlight.xml
index 9f3bc57c..9f3bc57c 100644
--- a/res/drawable/app_item_highlight.xml
+++ b/libs/appgrid/lib/res/drawable/app_item_highlight.xml
diff --git a/libs/appgrid/lib/res/drawable/banner_warning_image.xml b/libs/appgrid/lib/res/drawable/banner_warning_image.xml
new file mode 100644
index 00000000..13829693
--- /dev/null
+++ b/libs/appgrid/lib/res/drawable/banner_warning_image.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M479.98,680Q494,680 503.5,670.52Q513,661.03 513,647.02Q513,633 503.52,623.5Q494.04,614 480.02,614Q466,614 456.5,623.48Q447,632.97 447,646.98Q447,661 456.48,670.5Q465.96,680 479.98,680ZM453,527L513,527L513,274L453,274L453,527ZM480.27,880Q397.53,880 324.77,848.5Q252,817 197.5,762.5Q143,708 111.5,635.16Q80,562.32 80,479.5Q80,396.68 111.5,323.84Q143,251 197.5,197Q252,143 324.84,111.5Q397.68,80 480.5,80Q563.32,80 636.16,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,479.73Q880,562.47 848.5,635.23Q817,708 763,762.32Q709,816.63 636,848.32Q563,880 480.27,880Z"/>
+</vector>
diff --git a/res/drawable/ic_app_info.xml b/libs/appgrid/lib/res/drawable/ic_app_info.xml
index 420ba814..420ba814 100644
--- a/res/drawable/ic_app_info.xml
+++ b/libs/appgrid/lib/res/drawable/ic_app_info.xml
diff --git a/res/drawable/ic_force_stop_caution_icon.xml b/libs/appgrid/lib/res/drawable/ic_force_stop_caution_icon.xml
index 8adfb22c..8adfb22c 100644
--- a/res/drawable/ic_force_stop_caution_icon.xml
+++ b/libs/appgrid/lib/res/drawable/ic_force_stop_caution_icon.xml
diff --git a/res/drawable/page_indicator_bar.xml b/libs/appgrid/lib/res/drawable/page_indicator_bar.xml
index 141f58cb..141f58cb 100644
--- a/res/drawable/page_indicator_bar.xml
+++ b/libs/appgrid/lib/res/drawable/page_indicator_bar.xml
diff --git a/res/layout/app_grid_activity.xml b/libs/appgrid/lib/res/layout/app_grid_activity.xml
index 8758ea8c..25549246 100644
--- a/res/layout/app_grid_activity.xml
+++ b/libs/appgrid/lib/res/layout/app_grid_activity.xml
@@ -16,6 +16,7 @@
-->
<com.android.car.ui.FocusArea
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/focus_area"
android:orientation="vertical"
android:layout_width="match_parent"
@@ -27,6 +28,14 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
+ <com.android.car.carlauncher.Banner
+ android:id="@+id/tos_banner"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ app:first_button_text="@string/banner_review_button_text"
+ app:second_button_text="@string/banner_dismiss_button_text"
+ app:title_text="@string/banner_title_text" />
<com.android.car.carlauncher.AppGridRecyclerView
android:id="@+id/apps_grid"
android:layout_width="match_parent"
diff --git a/res/layout/app_item.xml b/libs/appgrid/lib/res/layout/app_item.xml
index 14fde7da..14fde7da 100644
--- a/res/layout/app_item.xml
+++ b/libs/appgrid/lib/res/layout/app_item.xml
diff --git a/libs/appgrid/lib/res/layout/banner.xml b/libs/appgrid/lib/res/layout/banner.xml
new file mode 100644
index 00000000..fca31c1b
--- /dev/null
+++ b/libs/appgrid/lib/res/layout/banner.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/banner_background_color">
+ <TextView
+ android:id="@+id/second_button"
+ android:layout_marginEnd="56dp"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintWidth_max="@dimen/banner_button_maximum_width"
+ app:layout_constraintTop_toTopOf="parent"
+ style="@style/BannerButton"/>
+ <TextView
+ android:background="@android:color/transparent"
+ android:id="@+id/first_button"
+ android:layout_marginEnd="72dp"
+ app:layout_constraintEnd_toStartOf="@id/second_button"
+ app:layout_constraintWidth_max="@dimen/banner_button_maximum_width"
+ app:layout_constraintTop_toTopOf="parent"
+ style="@style/BannerButton"/>
+ <TextView
+ android:id="@+id/banner_title"
+ android:layout_height="wrap_content"
+ android:paddingBottom="@dimen/banner_content_margin"
+ android:layout_marginEnd="24dp"
+ android:layout_marginStart="@dimen/banner_content_margin"
+ android:layout_marginTop="@dimen/banner_content_margin"
+ android:layout_width="0dp"
+ android:textColor="@color/banner_title_text_color"
+ app:layout_constraintEnd_toStartOf="@id/first_button"
+ app:layout_constraintStart_toEndOf="@+id/icon"
+ app:layout_constraintTop_toTopOf="parent"/>
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_height="@dimen/banner_image_view_size"
+ android:layout_marginStart="35dp"
+ android:layout_marginTop="@dimen/banner_content_margin"
+ android:layout_width="@dimen/banner_image_view_size"
+ app:layout_constraintEnd_toStartOf="@+id/banner_title"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:srcCompat="@drawable/banner_warning_image"/>
+</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file
diff --git a/res/layout/recent_apps_row.xml b/libs/appgrid/lib/res/layout/recent_apps_row.xml
index 7c58de14..7c58de14 100644
--- a/res/layout/recent_apps_row.xml
+++ b/libs/appgrid/lib/res/layout/recent_apps_row.xml
diff --git a/libs/appgrid/lib/res/values-af/strings.xml b/libs/appgrid/lib/res/values-af/strings.xml
new file mode 100644
index 00000000..a9e994c4
--- /dev/null
+++ b/libs/appgrid/lib/res/values-af/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Stel approoster terug na A-Z-rangskikking"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Hierdie funksie sal alle gepasmaakte rangskikking verwyder. Wil jy voortgaan?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Alle apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Media-apps"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Stop app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Appinligting"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> is gestop."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Stop app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"As jy ’n app dwing om te stop, kan dit sleg optree."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"App kan nie gestop word nie."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan nie gebruik word terwyl jy bestuur nie."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Versteek ontfoutingapps"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Wys ontfoutingapps"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"voorneme:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Stem in tot gebruikerdiensbepalings om apps te gebruik wat deur gebruikerdiensbepalings gedeaktiveer is"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Hersien"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Nie nou nie"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-am/strings.xml b/libs/appgrid/lib/res/values-am/strings.xml
new file mode 100644
index 00000000..e489dd5a
--- /dev/null
+++ b/libs/appgrid/lib/res/values-am/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"የመተግበሪያ ፍርግርግን ወደ ሀ-ፐ ቅደም ተከተል ዳግም አስጀምር"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ይህ ተግባር ሁሉንም ብጁ ቅደም ተከተል ማስያዞች ያስወግዳል። መቀጠል ይፈልጋሉ?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"ሁሉም መተግበሪያዎች"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"የሚዲያ መተግበሪያዎች"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"መተግበሪያን አቁም"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"የመተግበሪያ መረጃ"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> እንዲቆም ተደርጓል።"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"መተግበሪያ ይቁም?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"አንድ መተግበሪያን በኃይል እንዲቆም ካደረጉት በትክክል ላይሠራ ይችላል።"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"መተግበሪያው ሊቆም አይችልም።"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> በመንዳት ላይ ሳለ ጥቅም ላይ መዋል አይችልም።"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"የስህተት ማረሚያ መተግበሪያዎችን ደብቅ"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"የስህተት ማረሚያ መተግበሪያዎችን አሳይ"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"በተጠቃሚ የአገልግሎት ውል የተሰናከሉ መተግበሪያዎችን ለመጠቀም በተጠቃሚ የአገልግሎት ውሉ ይስማሙ"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"ግምገማ"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"አሁን አይደለም"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ar/strings.xml b/libs/appgrid/lib/res/values-ar/strings.xml
new file mode 100644
index 00000000..b810128b
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ar/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"إعادة ضبط شبكة التطبيقات بالترتيب أ-ي"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ستزيل هذه الدالة أي ترتيب مخصّص. هل تريد المتابعة؟"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"جميع التطبيقات"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"تطبيقات الوسائط"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"إيقاف التطبيق"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"معلومات التطبيقات"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"تم إيقاف \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"هل تريد إيقاف التطبيق؟"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"في حال فرض إيقاف التطبيق، قد لا يعمل بشكل صحيح."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"يتعذّر إيقاف التطبيق."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"لا يمكن استخدام \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" أثناء القيادة."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"إخفاء تطبيقات تصحيح الأخطاء"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"إظهار تطبيقات تصحيح الأخطاء"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"لاستخدام التطبيقات غير المفعَّلة بواسطة بنود خدمة المستخدم، يجب الموافقة على البنود"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"المراجعة"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"لاحقًا"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-as/strings.xml b/libs/appgrid/lib/res/values-as/strings.xml
new file mode 100644
index 00000000..8003b6b4
--- /dev/null
+++ b/libs/appgrid/lib/res/values-as/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"এপৰ গ্ৰিডটো A-Z ক্ৰমলৈ ৰিছেট কৰক"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"এই ফাংশ্বনটোৱে আটাইবোৰ কাষ্টম অৰ্ডাৰ আঁতৰাব। আপুনি অব্যাহত ৰাখিব বিচাৰেনে?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"আটাইবোৰ এপ্‌"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"মিডিয়া এপ্‌"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"এপ্ বন্ধ কৰক"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"এপৰ তথ্য"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> বন্ধ কৰা হৈছে।"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"এপ্ বন্ধ কৰিবনে?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"আপুনি কোনো এপ্‌ বলেৰে বন্ধ কৰিবলৈ চেষ্টা কৰিলে, ই অস্বাভাৱিক আচৰণ কৰিব পাৰে।"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"এপ্‌ বন্ধ কৰিব নোৱাৰি।"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"গাড়ী চলাই থকাৰ সময়ত <xliff:g id="APP_NAME">%1$s</xliff:g> ব্যৱহাৰ কৰিব নোৱাৰি।"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ডিবাগ এপ্‌সমূহ লুকুৱাওক"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"ডিবাগ এপ্‌সমূহ দেখুৱাওক"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"ব্যৱহাৰকাৰীৰ সেৱাৰ চৰ্তাৱলী অক্ষম কৰি থোৱা এপ্‌সমূহ ব্যৱহাৰ কৰিবলৈ, ব্যৱহাৰকাৰীৰ সেৱাৰ চৰ্তাৱলীত সন্মতি দিয়ক"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"পৰ্যালোচনা কৰক"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"এতিয়া নহয়"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-az/strings.xml b/libs/appgrid/lib/res/values-az/strings.xml
new file mode 100644
index 00000000..ff2b6a99
--- /dev/null
+++ b/libs/appgrid/lib/res/values-az/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Tətbiq torunu A-Z-sırası ilə sıfırlayın"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Bu funksiya fərdi sıralamanı siləcək. Davam edilsin?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Bütün tətbiqlər"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Media tətbiqləri"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Tətbiqi dayandırın"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Tətbiq haqqında"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> dayandırılıb."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Tətbiq dayandırılsın?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Tətbiqi məcburi dayandırsanız, səhv işləyə bilər."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Tətbiqi dayandırmaq olmur."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Avtomobil sürərkən <xliff:g id="APP_NAME">%1$s</xliff:g> istifadə edilə bilməz."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Sazlama tətbiqlərini gizlədin"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Sazlama tətbiqlərini göstərin"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"İstifadəçi xidmət şərtlərinə əsasən deaktiv edilən tətbiqlərdən istifadə etmək üçün İstifadəçi xidmət şərtlərini qəbul edin"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Nəzərdən keçirin"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"İndi yox"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-b+sr+Latn/strings.xml b/libs/appgrid/lib/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 00000000..a7863c71
--- /dev/null
+++ b/libs/appgrid/lib/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Resetuj mrežu aplikacija na redosled A–Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Ova funkcija će ukloniti celokupan prilagođen raspored. Želite da nastavite?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Sve aplikacije"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Medijske aplikacije"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Zaustavi aplikaciju"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informacije o aplikaciji"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je zaustavljena."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Želite da zaustavite aplikaciju?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ako prinudno zaustavite aplikaciju, možda će se ponašati neočekivano."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Aplikacija ne može da se zaustavi."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne može da se koristi tokom vožnje."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Sakrij aplikacije za otklanjanje grešaka"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Prikaži aplikacije za otklanjanje grešaka"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Da biste koristili aplikacije onemogućene u skladu sa uslovima korišćenja usluge za korisnika, prihvatite uslove korišćenja usluge za korisnika."</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Pregledaj"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ne sada"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-be/strings.xml b/libs/appgrid/lib/res/values-be/strings.xml
new file mode 100644
index 00000000..71381d03
--- /dev/null
+++ b/libs/appgrid/lib/res/values-be/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Сартаванне праграм у сетцы ў алфавітным парадку"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Гэта функцыя скасуе любы карыстальніцкі парадак сартавання. Працягнуць?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Усе праграмы"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Мультымедыйныя праграмы"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Спыніць праграму"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Звесткі пра праграму"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" спынена."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Спыніць праграму?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Прымусовае спыненне праграмы можа прывесці да збою."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Немагчыма спыніць праграму."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Праграмай \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" нельга карыстацца, калі вы за рулём."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Схаваць праграмы адладкі"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Паказаць праграмы адладкі"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Каб выкарыстоўваць выключаныя праграмы з умовамі выкарыстання для карыстальніка, згадзіцеся з імі"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Прагледзець"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Не зараз"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-bg/strings.xml b/libs/appgrid/lib/res/values-bg/strings.xml
new file mode 100644
index 00000000..d07284f2
--- /dev/null
+++ b/libs/appgrid/lib/res/values-bg/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Нулиране на решетката с приложения и задаване на нареждане от А до Я"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Тази функция ще премахне персонализираното нареждане. Искате ли да продължите?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Всички приложения"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Медийни приложения"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Спиране на приложението"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Информация от приложенията"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Приложението <xliff:g id="APP_NAME">%1$s</xliff:g> е спряно."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Да се спре ли приложението?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ако принудително спрете приложение, то може да не функционира правилно."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Приложението не може да бъде спряно."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се използва при шофиране."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Скриване на приложенията за отстраняване на грешки"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Показване на приложенията за отстраняв. на грешки"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"За да използвате деактивираните от ОУ за потребителите приложения, приемете Общите условия за потребителите"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Преглед"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Не сега"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-bn/strings.xml b/libs/appgrid/lib/res/values-bn/strings.xml
new file mode 100644
index 00000000..45d4e608
--- /dev/null
+++ b/libs/appgrid/lib/res/values-bn/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"A-Z অর্ডারে অ্যাপ গ্রিড রিসেট করুন"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"এই ফাংশন সবকটি কাস্টম অর্ডারিং সরিয়ে দেবে। আপনি কি এগিয়ে যেতে চান?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"সব অ্যাপ"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"মিডিয়া অ্যাপ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"অ্যাপ বন্ধ করুন"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"অ্যাপের তথ্য"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> বন্ধ করা হয়েছে।"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"অ্যাপ বন্ধ করবেন?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"আপনি কোনও অ্যাপকে জোর করে বন্ধ করলে, তা সঠিক ভাবে কাজ নাও করতে পারে।"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"অ্যাপ বন্ধ করা যাচ্ছে না।"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ড্রাইভ করার সময় <xliff:g id="APP_NAME">%1$s</xliff:g> ব্যবহার করা যাবে না।"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ডিবাগ অ্যাপ লুকান"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"ডিবাগ অ্যাপ দেখুন"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"পরিষেবার শর্তাবলীর মাধ্যমে বন্ধ করে দেওয়া অ্যাপগুলি ব্যবহার করতে, ব্যবহারকারীর পরিষেবার শর্তাবলীতে সম্মতি দিন"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"পর্যালোচনা করুন"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"এখন নয়"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-bs/strings.xml b/libs/appgrid/lib/res/values-bs/strings.xml
new file mode 100644
index 00000000..1f931a98
--- /dev/null
+++ b/libs/appgrid/lib/res/values-bs/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Vratite postavke mreže aplikacije na zadano u redoslijed A–Ž"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Ova funkcija će ukloniti sve prilagođene narudžbe. Želite li nastaviti?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Sve aplikacije"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Medijske aplikacije"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Zaustavi aplikaciju"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informacije o aplikaciji"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je zaustavljena."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Zaustaviti aplikaciju?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ako prisilno zaustavite aplikaciju, moguće je da će se ponašati nepredviđeno."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Nije moguće zaustaviti aplikaciju."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Nije moguće koristiti aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> tokom vožnje."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Sakrij aplikacije za otklanjanje grešaka"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Prikaži aplikacije za otklanjanje grešaka"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Da koristite aplikacije onemogućene prema Uslovima korištenja usluge za korisnike, prihvatite Uslove korištenja usluge za korisnike"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Pregledajte"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ne sada"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ca/strings.xml b/libs/appgrid/lib/res/values-ca/strings.xml
new file mode 100644
index 00000000..bad0936e
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ca/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Restableix la quadrícula d\'aplicacions a l\'ordre alfabètic (A-Z)"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Aquesta funció suprimirà l\'ordre personalitzat. Vols continuar?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Totes les aplicacions"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Aplicacions multimèdia"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Atura l\'aplicació"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informació de l\'aplicació"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> s\'ha aturat."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Vols aturar l\'aplicació?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Si forces l\'aturada d\'una aplicació, és possible que no funcioni correctament."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"L\'aplicació no es pot aturar."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"No es pot utilitzar <xliff:g id="APP_NAME">%1$s</xliff:g> mentre es condueix."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Amaga les aplicacions de depuració"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Mostra les aplicacions de depuració"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Per utilitzar les aplicacions desactivades per les condicions del servei d\'usuari, accepta aquestes condicions"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Revisa"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ara no"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-cs/strings.xml b/libs/appgrid/lib/res/values-cs/strings.xml
new file mode 100644
index 00000000..42c7b54a
--- /dev/null
+++ b/libs/appgrid/lib/res/values-cs/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Resetovat mřížku aplikací do pořadí A–Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Tato funkce zruší veškeré vlastní řazení. Chcete pokračovat?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Všechny aplikace"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Mediální aplikace"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Zastavit aplikaci"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informace o aplikaci"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> byla zastavena."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Zastavit aplikaci?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Vynucené zastavení může způsobit nepředvídatelné chování aplikace."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Aplikaci nelze ukončit."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> nelze používat při řízení."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Skrýt ladicí aplikace"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Zobrazit ladicí aplikace"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Pokud chcete používat aplikace deaktivované na základě smluvních podmínek pro uživatele, vyjádřete souhlas se smluvními podmínkami pro uživatele"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Kontrola"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Teď ne"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-da/strings.xml b/libs/appgrid/lib/res/values-da/strings.xml
new file mode 100644
index 00000000..90f9b1e0
--- /dev/null
+++ b/libs/appgrid/lib/res/values-da/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Nulstil appgitteret til rækkefølgen A-Å"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Denne funktion fjerner alle tilpassede rækkefølger. Vil du fortsætte?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Alle apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Medieapps"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Stands app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Appoplysninger"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> er blevet standset."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Vil du standse appen?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Hvis du tvinger en app til at standse, kan det medføre, at den ikke fungerer korrekt."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Appen kan ikke standses."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke bruges under kørsel."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Skjul apps til fejlretning"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Vis apps til fejlretning"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Hvis du vil bruge apps, der er deaktiveret i henhold til servicevilkår for brugere, skal du acceptere servicevilkårene for brugere"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Gennemgå"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ikke nu"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-de/strings.xml b/libs/appgrid/lib/res/values-de/strings.xml
new file mode 100644
index 00000000..259b82b3
--- /dev/null
+++ b/libs/appgrid/lib/res/values-de/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"App-Raster auf Sortierung von A–Z zurücksetzen"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Durch diese Funktion wird die gesamte benutzerdefinierte Sortierung entfernt. Möchtest du fortfahren?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Alle Apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Medien-Apps"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"App beenden"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"App-Info"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> wurde beendet."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"App beenden?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Das Beenden der App zu erzwingen kann zu unerwünschtem Verhalten führen."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Die App kann nicht beendet werden."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> kann während der Fahrt nicht genutzt werden."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Debug-Apps verbergen"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Debug-Apps anzeigen"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Wenn du die deaktivierten Apps verwenden möchtest, musst du den Nutzungsbedingungen zustimmen"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Lesen"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Jetzt nicht"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-el/strings.xml b/libs/appgrid/lib/res/values-el/strings.xml
new file mode 100644
index 00000000..d5f12fa3
--- /dev/null
+++ b/libs/appgrid/lib/res/values-el/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Επαναφορά πλέγματος εφαρμογής σε αύξουσα αλφαβητική σειρά"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Αυτή η λειτουργία θα καταργήσει όλες τις προσαρμοσμένες ταξινομήσεις. Θέλετε να συνεχίσετε;"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Όλες οι εφαρμογές"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Εφαρμογές μέσων"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Διακοπή εφαρμογής"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Πληροφορίες εφαρμογής"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> διακόπηκε."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Διακοπή εφαρμογής;"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Αν κάνετε αναγκαστική διακοπή μιας εφαρμογής, ενδέχεται να μην λειτουργεί σωστά."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Δεν είναι δυνατή η διακοπή της εφαρμογής."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Αδύνατη η χρήση της εφαρμογής <xliff:g id="APP_NAME">%1$s</xliff:g> κατά την οδήγηση."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Απόκρυψη εφαρμογών εντοπισμού σφαλμάτων"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Εμφάνιση εφαρμογών εντοπισμού σφαλμάτων"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Για να χρησιμοποιήσετε εφαρμογές που έχουν απενεργοποιηθεί σύμφωνα με τους Όρους Παροχής Υπηρεσιών χρήστη, αποδεχτείτε τους Όρους Παροχής Υπηρεσιών χρήστη"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Έλεγχος"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Όχι τώρα"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-en-rAU/strings.xml b/libs/appgrid/lib/res/values-en-rAU/strings.xml
new file mode 100644
index 00000000..c7d3cc25
--- /dev/null
+++ b/libs/appgrid/lib/res/values-en-rAU/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Reset app grid to A–Z order"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"This function will remove all customised ordering. Do you want to continue?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"All apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Media apps"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Stop app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"App info"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> has been stopped."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Stop app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"If you force stop an app, it may misbehave."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"App can\'t be stopped."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> can\'t be used while driving."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Hide debug apps"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Show debug apps"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"To use user tos disabled apps, agree to User tos"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Review"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Not now"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-en-rGB/strings.xml b/libs/appgrid/lib/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000..c7d3cc25
--- /dev/null
+++ b/libs/appgrid/lib/res/values-en-rGB/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Reset app grid to A–Z order"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"This function will remove all customised ordering. Do you want to continue?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"All apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Media apps"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Stop app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"App info"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> has been stopped."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Stop app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"If you force stop an app, it may misbehave."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"App can\'t be stopped."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> can\'t be used while driving."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Hide debug apps"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Show debug apps"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"To use user tos disabled apps, agree to User tos"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Review"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Not now"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-en-rIN/strings.xml b/libs/appgrid/lib/res/values-en-rIN/strings.xml
new file mode 100644
index 00000000..c7d3cc25
--- /dev/null
+++ b/libs/appgrid/lib/res/values-en-rIN/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Reset app grid to A–Z order"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"This function will remove all customised ordering. Do you want to continue?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"All apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Media apps"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Stop app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"App info"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> has been stopped."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Stop app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"If you force stop an app, it may misbehave."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"App can\'t be stopped."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> can\'t be used while driving."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Hide debug apps"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Show debug apps"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"To use user tos disabled apps, agree to User tos"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Review"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Not now"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-en-rXC/strings.xml b/libs/appgrid/lib/res/values-en-rXC/strings.xml
new file mode 100644
index 00000000..a9930530
--- /dev/null
+++ b/libs/appgrid/lib/res/values-en-rXC/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎Reset app grid to A-Z order‎‏‎‎‏‎"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‎‏‎‏‏‎‎‎‏‎‎This function will remove all custom ordering. Do you want to continue?‎‏‎‎‏‎"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‏‎All apps‎‏‎‎‏‎"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‏‎‎Media apps‎‏‎‎‏‎"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎Stop app‎‏‎‎‏‎"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎App info‎‏‎‎‏‎"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ has been stopped.‎‏‎‎‏‎"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‏‎‎‎‎‏‎‎Stop app?‎‏‎‎‏‎"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎‎If you force stop an app, it may misbehave.‎‏‎‎‏‎"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎App can’t be stopped.‎‏‎‎‏‎"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ can\'t be used while driving.‎‏‎‎‏‎"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‏‎Hide debug apps‎‏‎‎‏‎"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎Show debug apps‎‏‎‎‏‎"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‎‏‏‎intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end‎‏‎‎‏‎"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎To use user tos disabled apps, agree to User tos‎‏‎‎‏‎"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‎‎‎‎‏‎‎‎Review‎‏‎‎‏‎"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎Not Now‎‏‎‎‏‎"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-es-rUS/strings.xml b/libs/appgrid/lib/res/values-es-rUS/strings.xml
new file mode 100644
index 00000000..80e0ae2f
--- /dev/null
+++ b/libs/appgrid/lib/res/values-es-rUS/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Restablecer la cuadrícula de apps al orden alfabético"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Esta función quitará todo el orden personalizado. ¿Quieres continuar?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Todas las apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Apps de música"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Detener app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Información de la app"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Se detuvo <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"¿Quieres detener la app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Si fuerzas la detención de una app, es posible que funcione incorrectamente."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"No se puede detener la app."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"No puedes usar <xliff:g id="APP_NAME">%1$s</xliff:g> mientras conduces."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ocultar apps de depuración"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Mostrar apps de depuración"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Para usar las apps inhabilitadas, acepta las Condiciones del Servicio del Usuario"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Revisar"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ahora no"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-es/strings.xml b/libs/appgrid/lib/res/values-es/strings.xml
new file mode 100644
index 00000000..fc387e2b
--- /dev/null
+++ b/libs/appgrid/lib/res/values-es/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Cambiar cuadrícula de aplicaciones a orden alfabético"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Esta función eliminará todo el orden personalizado. ¿Quieres continuar?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Todas las aplicaciones"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Aplicaciones multimedia"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Detener aplicación"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Información de la aplicación"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> se ha detenido."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"¿Detener la aplicación?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Si fuerzas la detención de una aplicación, puede que no funcione correctamente."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"La aplicación no se puede detener."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> no se puede usar mientras se conduce."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ocultar aplicaciones de depuración"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Mostrar aplicaciones de depuración"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Para usar las aplicaciones inhabilitadas por los términos del servicio del usuario, acepta estos términos"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Revisar"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ahora no"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-et/strings.xml b/libs/appgrid/lib/res/values-et/strings.xml
new file mode 100644
index 00000000..a009afca
--- /dev/null
+++ b/libs/appgrid/lib/res/values-et/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Lähtesta rakenduste ruudustik A–Z järjestuseks"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"See funktsioon eemaldab kogu kohandatud järjestuse. Kas soovite jätkata?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Kõik rakendused"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Meediarakendused"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Peata rakendus"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Rakenduse teave"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> peatati."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Kas peatada rakendus?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Kui sundpeatate rakenduse, võib see valesti toimida."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Rakendust ei saa peatada."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Rakendust <xliff:g id="APP_NAME">%1$s</xliff:g> ei saa sõidu ajal kasutada."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Peida silumisrakendused"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Kuva silumisrakendused"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Kasutajatingimuste tõttu keelatud rakenduste kasutamiseks nõustuge kasutajatingimustega"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Vaadake üle"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Mitte praegu"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-eu/strings.xml b/libs/appgrid/lib/res/values-eu/strings.xml
new file mode 100644
index 00000000..9a2cbc18
--- /dev/null
+++ b/libs/appgrid/lib/res/values-eu/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Berrezarri aplikazioen sareta hurrenkera alfabetikoan"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Funtzio horrek hurrenkera pertsonalizatua kenduko du. Aurrera egin nahi duzu?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Aplikazio guztiak"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Multimedia-aplikazioak"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Gelditu aplikazioa"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Aplikazioari buruzko informazioa"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Gelditu da <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Aplikazioa gelditu nahi duzu?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Aplikazioak gelditzera behartzen badituzu, baliteke behar bezala ez funtzionatzea."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Ezin da gelditu aplikazioa."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> ezin da erabili gidatu bitartean."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ezkutatu arazteko aplikazioak"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Erakutsi arazteko aplikazioak"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Erabiltzaileentzako zerbitzu-baldintzak desgaituta dauzkaten aplikazioak erabiltzeko, onartu erabiltzaileentzako zerbitzu-baldintzak"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Berrikusi"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Orain ez"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-fa/strings.xml b/libs/appgrid/lib/res/values-fa/strings.xml
new file mode 100644
index 00000000..d179c4f2
--- /dev/null
+++ b/libs/appgrid/lib/res/values-fa/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"بازنشانی جدول برنامه‌ها به ترتیب حروف الفبا"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"این عملکرد همه ترتیب‌های سفارشی را حذف خواهد کرد. می‌خواهید ادامه دهید؟"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"همه برنامه‌ها"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"برنامه‌های رسانه"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"متوقف کردن برنامه"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"اطلاعات برنامه"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> متوقف شده است."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"برنامه متوقف شود؟"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"توقف اجباری برنامه ممکن است باعث عملکرد نادرست آن شود."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"برنامه متوقف نمی‌شود."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"هنگام رانندگی نمی‌توان از <xliff:g id="APP_NAME">%1$s</xliff:g> استفاده کرد."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"پنهان کردن برنامه‌های اشکال‌زدایی"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"نمایش برنامه‌های اشکال‌زدایی"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"برای استفاده از برنامه‌هایی که به‌دلیل شرایط خدمات کاربر غیرفعال شده‌اند، با «شرایط خدمات کاربر» موافقت کنید"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"مرور کردن"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"اکنون نه"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-fi/strings.xml b/libs/appgrid/lib/res/values-fi/strings.xml
new file mode 100644
index 00000000..6ad5ac66
--- /dev/null
+++ b/libs/appgrid/lib/res/values-fi/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Palauta sovellusruudukko A-Ö ‑järjestykseen"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Toiminto poistaa kaikki omat järjestykset. Haluatko jatkaa?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Kaikki sovellukset"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Mediasovellukset"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Sulje sovellus"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Sovelluksen tiedot"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> on suljettu."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Suljetaanko sovellus?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Jos pakotat sovelluksen sulkeutumaan, se ei välttämättä toimi oikein."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Sovellusta ei voi keskeyttää."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi olla käytössä ajon aikana."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Piilota virheenkorjaussovellukset"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Näytä virheenkorjaussovellukset"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Jos haluat käyttää käyttäjien käyttöehtojen estämiä sovelluksia, hyväksy käyttäjien käyttöehdot"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Tarkistus"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ei nyt"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-fr-rCA/strings.xml b/libs/appgrid/lib/res/values-fr-rCA/strings.xml
new file mode 100644
index 00000000..2203ae89
--- /dev/null
+++ b/libs/appgrid/lib/res/values-fr-rCA/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Réinitialiser la grille d\'applications à l\'ordre A à Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Cette fonction va retirer tous les classements personnalisés. Voulez-vous continuer?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Toutes les applications"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Applications multimédias"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Arrêter l\'application"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Détails de l\'application"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> a été arrêtée."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Voulez-vous arrêter l\'application?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Si vous forcez l\'arrêt d\'une application, son fonctionnement peut en être affecté."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Impossible d\'arrêter l\'application."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne peut pas être utilisée en conduisant."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Masquer les applications de débogage"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Afficher les applications de débogage"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Pour utiliser les applications désactivées, acceptez les conditions d\'utilisation de l\'utilisateur"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Avis"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Pas maintenant"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-fr/strings.xml b/libs/appgrid/lib/res/values-fr/strings.xml
new file mode 100644
index 00000000..5a251ec8
--- /dev/null
+++ b/libs/appgrid/lib/res/values-fr/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Rétablir l\'ordre A-Z pour la grille d\'applications"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Cette fonction supprimera tous les tris personnalisés. Voulez-vous continuer ?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Toutes les applications"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Applications multimédias"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Arrêter l\'appli"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informations d\'applications"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"L\'appli <xliff:g id="APP_NAME">%1$s</xliff:g> a été arrêtée."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Arrêter l\'appli ?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"L\'arrêt forcé d\'une appli peut provoquer un fonctionnement instable."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Impossible d\'arrêter l\'appli."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Impossible d\'utiliser <xliff:g id="APP_NAME">%1$s</xliff:g> en conduisant."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Masquer les applis de débogage"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Afficher les applis de débogage"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Pour utiliser les applis dont les conditions d\'utilisation pour les utilisateurs sont désactivées, acceptez les conditions d\'utilisation pour les utilisateurs"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Examen"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Pas maintenant"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-gl/strings.xml b/libs/appgrid/lib/res/values-gl/strings.xml
new file mode 100644
index 00000000..29fb3e9e
--- /dev/null
+++ b/libs/appgrid/lib/res/values-gl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Restablecer a orde alfabética para a grade de aplicacións"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Esta función quitará toda a orde personalizada. Queres continuar?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Todas as aplicacións"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Aplicacións multimedia"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Deter aplicación"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Información da aplicación"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Detívose a aplicación <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Queres deter a aplicación?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Se forzas a parada dunha aplicación, é posible que non funcione correctamente."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Non se pode deter a aplicación."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Non se pode utilizar <xliff:g id="APP_NAME">%1$s</xliff:g> mentres se conduce."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ocultar aplicacións de depuración"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Mostrar aplicacións de depuración"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Para poder usar as aplicacións desactivadas debido ás Condicións de servizo do usuario, acepta esas condicións"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Revisar"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Agora non"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-gu/strings.xml b/libs/appgrid/lib/res/values-gu/strings.xml
new file mode 100644
index 00000000..db2961aa
--- /dev/null
+++ b/libs/appgrid/lib/res/values-gu/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"ઍપ ગ્રિડને A-Z ક્રમ અનુસાર રીસેટ કરો"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"આ સુવિધા, સેટ કરવામાં આવેલા બધા કસ્ટમ ક્રમ કાઢી નાખશે. શું તમે ચાલુ રાખવા માગો છો?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"બધી ઍપ"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"મીડિયા ઍપ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"ઍપ બંધ કરો"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ઍપની માહિતી"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> બંધ કરવામાં આવી છે."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"શું ઍપ બંધ કરીએ?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"જો તમે કોઈ ઍપને ફરજિયાત બંધ કરો, તો તે અયોગ્ય વર્તન કરી શકે છે."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"ઍપ બંધ કરી શકાતી નથી."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ડ્રાઇવ કરતી વખતે <xliff:g id="APP_NAME">%1$s</xliff:g>નો ઉપયોગ કરી શકાતો નથી."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ડિબગ ઍપ છુપાવો"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"ડિબગ ઍપ બતાવો"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"વપરાશકર્તા માટેની TOS હેઠળ બંધ કરેલી હોય એવી ઍપનો ઉપયોગ કરવા માટે, વપરાશકર્તા માટેની TOSથી સંમત થાઓ"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"રિવ્યૂ કરો"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"હમણાં નહીં"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-hi/strings.xml b/libs/appgrid/lib/res/values-hi/strings.xml
new file mode 100644
index 00000000..8c48d203
--- /dev/null
+++ b/libs/appgrid/lib/res/values-hi/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"ऐप्लिकेशन ग्रिड को A से Z के क्रम में रीसेट करें"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"इस कार्रवाई से, पसंद के मुताबिक सेट किए सभी क्रम हटा दिए जाएंगे. क्या आपको यह कार्रवाई करनी है?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"सभी ऐप्लिकेशन"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"मीडिया ऐप्लिकेशन"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"ऐप्लिकेशन को बंद करें"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ऐप्लिकेशन की जानकारी"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> को रोक दिया गया है."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"क्या आपको ऐप्लिकेशन रोकना है?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"अगर किसी ऐप्लिकेशन को ज़बरदस्ती रोका जाता है, तो हो सकता है कि वह ठीक तरह से काम न करें."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"ऐप्लिकेशन को बंद नहीं किया जा सका."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"गाड़ी चलाते समय <xliff:g id="APP_NAME">%1$s</xliff:g> ऐप्लिकेशन इस्तेमाल नहीं किया जा सकता."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"डीबग किए गए ऐप्लिकेशन छिपाएं"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"डीबग किए गए ऐप्लिकेशन दिखाएं"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"उपयोगकर्ता की सेवा की शर्तों के तहत बंद किए गए ऐप्लिकेशन को इस्तेमाल करने के लिए, उन शर्तों के लिए सहमति दें"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"समीक्षा करें"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"अभी नहीं"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-hr/strings.xml b/libs/appgrid/lib/res/values-hr/strings.xml
new file mode 100644
index 00000000..248d7516
--- /dev/null
+++ b/libs/appgrid/lib/res/values-hr/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Vrati rešetku aplikacije na poredak od A do Ž"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Ta će funkcija ukloniti sav prilagođeni poredak. Želite li nastaviti?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Sve aplikacije"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Aplikacije za medijske sadržaje"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Zaustavi aplikaciju"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informacije o aplikaciji"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je zaustavljena."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Želite li zaustaviti aplikaciju?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ako silom zaustavite aplikaciju, možda će se ponašati nepredviđeno."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Aplikacija se ne može zaustaviti."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne može se koristiti tijekom vožnje."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Sakrij aplikacije za otklanjanje pogrešaka"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Prikaži aplikacije za otklanjanje pogrešaka"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Da biste koristili aplikacije koje su onemogućene TOS-om za korisnike, prihvatite TOS za korisnike"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Pregled"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ne sad"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-hu/strings.xml b/libs/appgrid/lib/res/values-hu/strings.xml
new file mode 100644
index 00000000..22954360
--- /dev/null
+++ b/libs/appgrid/lib/res/values-hu/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Alkalmazásrács visszaállítása betűrendbe (A–Z)"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"A funkció bekapcsolásával minden egyéni elrendezést eltávolít. Biztosan folytatja?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Összes alkalmazás"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Médiaalkalmazások"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Alkalmazás leállítása"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Alkalmazásadatok"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> leállítva."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Leállítja az alkalmazást?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ha egy alkalmazást leállásra kényszerít, lehetséges, hogy hibásan fog működni."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Az alkalmazás nem állítható le."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> nem használható vezetés közben."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Hibakereső alkalmazások elrejtése"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Hibakereső alkalmazások megjelenítése"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"A felhasználói ÁSZF alapján letiltott alkalmazások használatához fogadja el a felhasználói ÁSZF-et"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Ellenőrzés"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ne most"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-hy/strings.xml b/libs/appgrid/lib/res/values-hy/strings.xml
new file mode 100644
index 00000000..2f1ed691
--- /dev/null
+++ b/libs/appgrid/lib/res/values-hy/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Հավելվածների ցանցի A–Z դասավորություն"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Այս գործառույթը կհեռացնի հավելվածների հատուկ դասավորությունը։ Շարունակե՞լ։"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Բոլոր հավելվածները"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Մեդիա հավելվածներ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Կանգնեցնել հավելվածը"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Հավելվածի մասին"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը կանգնեցվեց։"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Կանգնեցնե՞լ հավելվածը"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Հավելվածի ստիպողական կանգնեցումը կարող է ազդել դրա աշխատանքի վրա։"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Չհաջողվեց կանգնեցնել հավելվածի աշխատանքը։"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը հնարավոր չէ օգտագործել վարելու ժամանակ։"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Թաքցնել վրիպազերծման հավելվածները"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Ցույց տալ վրիպազերծման հավելվածները"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Ընդունեք օգտատիրոջ օգտագործման պայմանները, որպեսզի կարողանաք օգտվել այն հավելվածներից, որոնք անջատվել են այդ պայմանների համաձայն"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Դիտել"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ոչ հիմա"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-in/strings.xml b/libs/appgrid/lib/res/values-in/strings.xml
new file mode 100644
index 00000000..885f8916
--- /dev/null
+++ b/libs/appgrid/lib/res/values-in/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Reset petak aplikasi agar sesuai urutan A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Fungsi ini akan menghapus semua pengurutan kustom. Ingin melanjutkan?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Semua aplikasi"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Aplikasi media"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Hentikan aplikasi"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Info aplikasi"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah dihentikan."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Hentikan aplikasi?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Jika aplikasi dihentikan paksa, fungsinya mungkin akan terganggu."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Aplikasi tidak dapat dihentikan."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat digunakan saat mengemudi."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Sembunyikan aplikasi debug"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Tampilkan aplikasi debug"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Untuk menggunakan aplikasi yang dinonaktifkan karena TOS pengguna, setujui TOS Pengguna"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Tinjau"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Lain Kali"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-is/strings.xml b/libs/appgrid/lib/res/values-is/strings.xml
new file mode 100644
index 00000000..21819f9a
--- /dev/null
+++ b/libs/appgrid/lib/res/values-is/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Endurstilla forritatöflu á A–Ö röðun"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Þessi eiginleiki fjarlægir alla sérsniðna röðun. Viltu halda áfram?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Öll forrit"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Margmiðlunarforrit"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Stöðva forrit"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Upplýsingar um forrit"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> var stöðvað."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Stöðva forritið?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ef þú þvingar lokun forrits gæti það látið illa."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Ekki er hægt að stöðva forrit."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Ekki er hægt að nota <xliff:g id="APP_NAME">%1$s</xliff:g> við akstur."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Fela villuleitarforrit"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Sýna villuleitarforrit"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Til að nota forrit sem þjónustuskilmálar notenda hafa gert óvirk skaltu samþykkja þjónustuskilmála notenda"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Yfirfara"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ekki núna"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-it/strings.xml b/libs/appgrid/lib/res/values-it/strings.xml
new file mode 100644
index 00000000..2ab37fe6
--- /dev/null
+++ b/libs/appgrid/lib/res/values-it/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Reimposta la griglia delle app in ordine alfabetico"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Questa funzione rimuove tutti gli ordini personalizzati. Vuoi continuare?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Tutte le app"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"App multimediali"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Interrompi l\'app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informazioni app"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"L\'app <xliff:g id="APP_NAME">%1$s</xliff:g> è stata interrotta."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Interrompere l\'app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Se forzi l\'interruzione di un\'app, questa potrebbe funzionare in modo anomalo."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Impossibile interrompere l\'app."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Non è possibile usare l\'app <xliff:g id="APP_NAME">%1$s</xliff:g> durante la guida."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Nascondi app di debug"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Mostra app di debug"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Per usare le app disattivate in relazione ai TdS per l\'utente, acconsenti ai TdS per l\'utente"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Controlla"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Non ora"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-iw/strings.xml b/libs/appgrid/lib/res/values-iw/strings.xml
new file mode 100644
index 00000000..4513b267
--- /dev/null
+++ b/libs/appgrid/lib/res/values-iw/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"איפוס תצוגת האפליקציות לסידור מ-א\' עד ת\'"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"הפונקציה הזו תסיר את כל סידורי התצוגה שהותאמו אישית. רוצה להמשיך?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"כל האפליקציות"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"אפליקציות מדיה"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"עצירת האפליקציה"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"פרטי האפליקציה"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"עצרת את האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"לעצור את האפליקציה?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"אם סוגרים אפליקציה באופן ידני, יכול להיות שהיא לא תפעל כמו שצריך."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"לא ניתן לעצור את פעולת האפליקציה."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"לא ניתן להשתמש באפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> במהלך הנהיגה."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"הסתרת אפליקציות לניפוי באגים"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"הצגת אפליקציות לניפוי באגים"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"כדי להשתמש באפליקציות המושבתות לפי התנאים וההגבלות של המשתמש, יש לאשר את התנאים וההגבלות"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"בדיקה"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"לא עכשיו"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ja/strings.xml b/libs/appgrid/lib/res/values-ja/strings.xml
new file mode 100644
index 00000000..fefa2146
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ja/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"アプリグリッドをアルファベットの昇順にリセット"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"この機能を実行すると、カスタムの並べ替えがすべて削除されます。続行しますか?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"すべてのアプリ"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"メディアアプリ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"アプリを停止"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"アプリ情報"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> を停止しました。"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"アプリを停止しますか?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"アプリを強制停止すると、アプリが正常に機能しないことがあります。"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"アプリを停止できません。"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"運転中は <xliff:g id="APP_NAME">%1$s</xliff:g> を使用できません。"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"デバッグアプリを表示しない"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"デバッグアプリを表示する"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"ユーザー利用規約が無効なアプリを使用するには、ユーザー利用規約に同意してください"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"確認"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"スキップ"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ka/strings.xml b/libs/appgrid/lib/res/values-ka/strings.xml
new file mode 100644
index 00000000..4f7d5e78
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ka/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"აპების ბადის გადატვირთვა A-Z შეკვეთაზე"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ეს ფუნქცია წაშლის ყველა მორგებულ შეკვეთას. გსურთ გაგრძელება?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"ყველა აპი"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"მედია აპები"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"აპის შეჩერება"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"აპის ინფორმაცია"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> შეჩერებულია."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"გსურთ აპის შეჩერება?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"თუ აპს შეწყვეტას აიძულებთ, შესაძლოა, მან ცუდად განაგრძოს მუშაობა."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"აპის შეჩერება შეუძლებელია."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"მანქანის მართვისას <xliff:g id="APP_NAME">%1$s</xliff:g>-ს ვერ გამოიყენებთ."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"გამართვის აპების დამალვა"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"გამართვის აპების ჩვენება"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"მომსახურების პირობების გამო გათიშული აპების გამოსაყენებლად დაეთანხმეთ მომსახურების პირობებს"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"მიმოხილვა"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ახლა არა"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-kk/strings.xml b/libs/appgrid/lib/res/values-kk/strings.xml
new file mode 100644
index 00000000..24ff8762
--- /dev/null
+++ b/libs/appgrid/lib/res/values-kk/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Қолданбалар торын әліпби ретіне қайтару"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Бұл функция арнаулы ретті толығымен өшіреді. Жалғастырғыңыз келе ме?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Барлық қолданба"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Мультимедиа қолданбалары"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Қолданба жұмысын тоқтату"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Қолданба туралы ақпарат"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> жұмысы тоқтатылды."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Қолданба жұмысы тоқтатылсын ба?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Қолданбаны қолмен тоқтату оның жұмысына кері әсерін тигізуі мүмкін."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Қолданба жұмысын тоқтату мүмкін емес."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Көлік жүргізу кезінде <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасын пайдалануға болмайды."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Түзету қолданбаларын жасыру"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Түзету қолданбаларын көрсету"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Қызмет көрсету шарттарына байланысты өшірілген қолданбаларды пайдалану үшін Қызмет көрсету шарттарына келісіңіз."</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Тексеру"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Қазір емес"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-km/strings.xml b/libs/appgrid/lib/res/values-km/strings.xml
new file mode 100644
index 00000000..731e3964
--- /dev/null
+++ b/libs/appgrid/lib/res/values-km/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"កំណត់ក្រឡាកម្មវិធីឡើងវិញទៅជាលំដាប់ A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"មុខងារនេះនឹងដកការបញ្ជាទិញផ្ទាល់ខ្លួនទាំងអស់ចេញ។ តើ​អ្នក​ចង់​បន្ត​ដែរ​ឬ​ទេ?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"កម្មវិធី​ទាំងអស់"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"កម្មវិធីមេឌៀ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"បញ្ឈប់កម្មវិធី"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ព័ត៌មានកម្មវិធី"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> ត្រូវបានបញ្ឈប់។"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"បញ្ឈប់កម្មវិធីឬ?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"ប្រសិនបើអ្នក​បង្ខំឱ្យបញ្ឈប់​កម្មវិធី​ កម្មវិធីអាចនឹង​ដំណើរការ​មិនត្រឹមត្រូវ។"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"មិនអាច​បញ្ឈប់កម្មវិធី​បានទេ។"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"មិនអាចប្រើ​ <xliff:g id="APP_NAME">%1$s</xliff:g> នៅពេលបើកបរបានទេ។"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"លាក់កម្មវិធីជួសជុល"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"បង្ហាញកម្មវិធីជួសជុល"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"ដើម្បីប្រើកម្មវិធី​ដែលបានបិទដោយ​លក្ខខណ្ឌប្រើប្រាស់​សម្រាប់អ្នកប្រើប្រាស់ សូមយល់ព្រមតាម​លក្ខខណ្ឌប្រើប្រាស់​សម្រាប់អ្នកប្រើប្រាស់"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"ពិនិត្យមើល"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"កុំទាន់"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-kn/strings.xml b/libs/appgrid/lib/res/values-kn/strings.xml
new file mode 100644
index 00000000..ecd5344b
--- /dev/null
+++ b/libs/appgrid/lib/res/values-kn/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"ಆ್ಯಪ್ ಗ್ರಿಡ್ ಅನ್ನು A-Z ಆರ್ಡರ್‌ಗೆ ರೀಸೆಟ್ ಮಾಡಿ"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ಈ ಕಾರ್ಯವು ಎಲ್ಲಾ ಕಸ್ಟಮ್ ಆರ್ಡರ್ ಮಾಡುವಿಕೆಯನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ. ನೀವು ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳು"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"ಮಾಧ್ಯಮ ಆ್ಯಪ್‌ಗಳು"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"ಆ್ಯಪ್ ಅನ್ನು ನಿಲ್ಲಿಸಿ"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ಆ್ಯಪ್ ಮಾಹಿತಿ"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ನಿಲ್ಲಿಸಲಾಗಿದೆ."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"ಆ್ಯಪ್ ಅನ್ನು ನಿಲ್ಲಿಸಬೇಕೆ?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಲವಂತವಾಗಿ ನಿಲ್ಲಿಸಿದರೆ, ಅದು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"ಆ್ಯಪ್ ನಿಲ್ಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ಡ್ರೈವ್ ಮಾಡುವಾಗ <xliff:g id="APP_NAME">%1$s</xliff:g> ಬಳಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ಡೀಬಗ್ ಆ್ಯಪ್‌ಗಳನ್ನು ಮರೆಮಾಡಿ"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"ಡೀಬಗ್ ಆ್ಯಪ್‌ಗಳನ್ನು ತೋರಿಸಿ"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"ಬಳಕೆದಾರರ ಸೇವಾ ನಿಯಮಗಳು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ ಆ್ಯಪ್‌ಗಳನ್ನು ಬಳಸಲು, ಬಳಕೆದಾರರ ಸೇವಾ ನಿಯಮಗಳಿಗೆ ಸಮ್ಮತಿಸಿ"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"ಪರಿಶೀಲಿಸಿ"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ಈಗ ಬೇಡ"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ko/strings.xml b/libs/appgrid/lib/res/values-ko/strings.xml
new file mode 100644
index 00000000..3f417fe4
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ko/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"앱 그리드를 가나다순으로 재설정"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"이 기능은 모든 맞춤설정 정렬을 삭제합니다. 계속하시겠습니까?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"모든 앱"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"미디어 앱"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"앱 종료"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"앱 정보"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 종료되었습니다."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"앱을 종료하시겠습니까?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"강제로 앱을 종료하면 예기치 않은 오류가 발생할 수 있습니다."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"앱을 닫을 수 없습니다."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"운전 중에는 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 사용할 수 없습니다."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"디버그 앱 숨기기"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"디버그 앱 표시"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=true;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"사용자 서비스 약관으로 인해 중지된 앱을 사용하려면 사용자 서비스 약관에 동의하세요"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"검토"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"나중에"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ky/strings.xml b/libs/appgrid/lib/res/values-ky/strings.xml
new file mode 100644
index 00000000..a506c7c1
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ky/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Колдонмолор торчосун A-Я тартибинде кайра иреттөө"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Бул функция бардык ыңгайлаштырылган иреттерди өчүрөт. Улантасызбы?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Бардык колдонмолор"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Мультимедиа колдонмолору"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Колдонмону токтотуу"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Колдонмо тууралуу"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> токтотулду."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Колдонмону токтотосузбу?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Колдонмону мажбурлап токтотсоңуз, ал туура эмес иштеп калышы мүмкүн."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Колдонмону токтотууга болбойт."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Айдап баратканда <xliff:g id="APP_NAME">%1$s</xliff:g> колдонулбайт."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Мүчүлүштүктөрдү оңдоочу колдонмолорду жашыруу"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Мүчүлүштүктөрдү оңдоочу колдонмолорду көрсөтүү"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Колдонуучунун пайдалануу шарттарын кабыл албасаңыз, айрым колдонмолорду пайдалана албайсыз"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Карап чыгуу"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Азыр эмес"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-lo/strings.xml b/libs/appgrid/lib/res/values-lo/strings.xml
new file mode 100644
index 00000000..738a1655
--- /dev/null
+++ b/libs/appgrid/lib/res/values-lo/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"ຣີເຊັດຕາຕະລາງແອັບເປັນລຳດັບ A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ຟັງຊັນນີ້ຈະລຶບການຈັດລຳດັບທີ່ກຳນົດເອງອອກທັງໝົດ. ທ່ານຕ້ອງການສືບຕໍ່ບໍ?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"ແອັບທັງໝົດ"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"ແອັບມີເດຍ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"ຢຸດແອັບ"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ຂໍ້ມູນແອັບ"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"ຢຸດ <xliff:g id="APP_NAME">%1$s</xliff:g> ແລ້ວ."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"ຢຸດແອັບໄວ້ບໍ?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"ຫານທ່ານບັງຄັບປິດແອັບໃດໜຶ່ງ, ມັນອາດເຮັດວຽກຜິດປົກກະຕິໄດ້."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"ບໍ່ສາມາດຢຸດແອັບໄດ້."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ບໍ່ສາມາດໃຊ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ໃນຂະນະທີ່ຂັບລົດໄດ້."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ເຊື່ອງແອັບດີບັກ"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"ສະແດງແອັບດີບັກ"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"ເພື່ອໃຊ້ແອັບທີ່ປິດການນຳໃຊ້ໂດຍຂໍ້ກຳນົດບໍລິການຂອງຜູ້ໃຊ້, ໃຫ້ຍອມຮັບຂໍ້ກຳນົດບໍລິການຂອງຜູ້ໃຊ້"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"ກວດສອບ"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ບໍ່ຟ້າວເທື່ອ"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-lt/strings.xml b/libs/appgrid/lib/res/values-lt/strings.xml
new file mode 100644
index 00000000..ca94d0eb
--- /dev/null
+++ b/libs/appgrid/lib/res/values-lt/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Programų tinklelio nustatymas iš naujo į A–Z tvarką"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Ši funkcija pašalins visą tinkintą tvarką. Ar norite tęsti?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Visos programos"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Medijos programos"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Sustabdyti programą"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Programos informacija"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ sustabdyta."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Sustabdyti programą?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Jei priverstinai sustabdysite programą, ji gali neveikti tinkamai."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Programos negalima sustabdyti."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Vairuojant negalima naudoti „<xliff:g id="APP_NAME">%1$s</xliff:g>“."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Slėpti derinimo programas"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Rodyti derinimo programas"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Jei norite naudoti programas, kuriose išjungtos PTS, sutikite su naudotojo PTS"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Peržiūrėti"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ne dabar"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-lv/strings.xml b/libs/appgrid/lib/res/values-lv/strings.xml
new file mode 100644
index 00000000..0ba342d0
--- /dev/null
+++ b/libs/appgrid/lib/res/values-lv/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Lietotņu režģa atiestatīšana uz secību A–Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Ar šo funkciju tiks mainīta pielāgotā lietotņu secība. Vai vēlaties turpināt?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Visas lietotnes"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Multivides lietotnes"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Apturēt lietotnes darbību"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informācija par lietotni"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> darbība ir apturēta."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Vai apturēt lietotnes darbību?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Piespiedu kārtā apturot lietotnes darbību, var rasties šīs lietotnes darbības traucējumi."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Lietotnes darbību nevar apturēt."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Lietotni <xliff:g id="APP_NAME">%1$s</xliff:g> nevar izmantot braukšanas laikā."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Slēpt atkļūdošanas lietotnes"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Rādīt atkļūdošanas lietotnes"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Lai varētu izmantot lietotnes, kas ir atspējotas saskaņā ar lietotājiem paredzētajiem pakalpojumu sniegšanas noteikumiem, piekrītiet šiem noteikumiem."</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Pārskatīt"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Vēlāk"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-mk/strings.xml b/libs/appgrid/lib/res/values-mk/strings.xml
new file mode 100644
index 00000000..1f204c17
--- /dev/null
+++ b/libs/appgrid/lib/res/values-mk/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Ресетирај ја мрежата со апликации во редослед А-Ш"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Оваа функција ќе ги отстрани сите приспособени подредувања. Дали сакате да продолжите?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Сите апликации"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Апликации за аудиовизуелни содржини"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Сопри ја апликацијата"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Информации за апликацијата"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> е сопрена."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Да се сопре апликацијата?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ако сопрете апликација присилно, таа може да не се однесува правилно."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Апликацијата не може да се сопре."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се користи при возење."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Скриј апликации за отстранување грешки"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Прикажи апликации за отстранување грешки"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"За да користите оневозможени апликации со TOS за корисниците, согласете се со TOS за корисниците"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Рецензирајте"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Не сега"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ml/strings.xml b/libs/appgrid/lib/res/values-ml/strings.xml
new file mode 100644
index 00000000..868d31c0
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ml/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"A-Z ക്രമത്തിൽ ആപ്പ് ഗ്രിഡ് റീസെറ്റ് ചെയ്യുക"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ഈ ഫംഗ്ഷൻ, എല്ലാ ഇഷ്‌ടാനുസൃത ക്രമപ്പെടുത്തലുകളും നീക്കം ചെയ്യും. നിങ്ങൾക്ക് തുടരണമെന്നുണ്ടോ?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"എല്ലാ ആപ്പുകളും"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"മീഡിയ ആപ്പുകൾ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"ആപ്പിന്റെ പ്രവർത്തനം നിർത്തുക"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ആപ്പ് വിവരങ്ങൾ"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന്റെ പ്രവർത്തനം നിർത്തി."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"ആപ്പിന്റെ പ്രവർത്തനം നിർത്തണോ?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"ഒരു ആപ്പിന്റെ പ്രവർത്തനം നിർബന്ധിതമായി നിർത്തിയാൽ, അത് ശരിയായി പ്രവർത്തിക്കാനിടയില്ല."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"ആപ്പ് നിർത്താനാകില്ല."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ഡ്രൈവിംഗിനിടെ <xliff:g id="APP_NAME">%1$s</xliff:g> ഉപയോഗിക്കാനാകില്ല."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ഡീബഗ് ആപ്പുകൾ മറയ്ക്കുക"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"ഡീബഗ് ആപ്പുകൾ കാണിക്കുക"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"പ്രവർത്തനരഹിതമാക്കിയ ആപ്പുകൾക്കുള്ള ഉപയോക്തൃ സേവന നിബന്ധനകൾ ഉപയോഗിക്കാൻ, ഉപയോക്തൃ സേവന നിബന്ധനകൾ അംഗീകരിക്കുക"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"അവലോകനം ചെയ്യുക"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ഇപ്പോൾ വേണ്ട"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-mn/strings.xml b/libs/appgrid/lib/res/values-mn/strings.xml
new file mode 100644
index 00000000..476d0098
--- /dev/null
+++ b/libs/appgrid/lib/res/values-mn/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Аппын хүснэгтийг А-Я дараалалтай болгож шинэчлэх"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Энэ функц нь бүх захиалгат дарааллыг хасна. Та үргэлжлүүлэхийг хүсэж байна уу?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Бүх апп"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Медиа аппууд"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Аппыг зогсоох"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Аппын мэдээлэл"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г зогсоосон."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Аппыг зогсоох уу?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Хэрэв та аппыг хүчээр зогсоовол энэ нь буруу ажиллаж магадгүй."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Аппыг зогсоох боломжгүй."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г жолоо барьж байх үед ашиглах боломжгүй."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Дебаг хийх аппуудыг нуух"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Дебаг хийх аппуудыг харуулах"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Хэрэглэгчийн үйлчилгээний нөхцөлөөр (TOS) идэвхгүй болгосон аппуудыг ашиглахын тулд Хэрэглэгчийн үйлчилгээний нөхцөлийг (TOS) зөвшөөрнө үү"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Шалгах"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Одоо биш"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-mr/strings.xml b/libs/appgrid/lib/res/values-mr/strings.xml
new file mode 100644
index 00000000..c4b830fa
--- /dev/null
+++ b/libs/appgrid/lib/res/values-mr/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"अ‍ॅप ग्रिडला A-Z या क्रमाने रीसेट करा"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"हे फंक्शन सर्व कस्टम ऑर्डरिंग काढून टाकेल. तुम्हाला पुढे सुरू ठेवायचे आहे का?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"सर्व अ‍ॅप्स"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"मीडिया अ‍ॅप्स"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"अ‍ॅप थांबवा"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ॲप माहिती"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> थांबवले आहे."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"अ‍ॅप थांबवायचे आहे का?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"तुम्ही अ‍ॅप सक्तीने थांबवल्यास, ते गैरवर्तन करू शकते."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"अ‍ॅप थांबवू शकत नाही."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ड्राइव्ह करताना <xliff:g id="APP_NAME">%1$s</xliff:g> वापरता येऊ शकत नाही."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"डीबग केलेली ॲप्स लपवा"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"डीबग केलेली ॲप्स दाखवा"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"वापरकर्ता ToS बंद केलेली अ‍ॅप्स वापरण्यासाठी, वापरकर्ता ToS ला सहमती द्या"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"पुनरावलोकन करा"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"आता नाही"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ms/strings.xml b/libs/appgrid/lib/res/values-ms/strings.xml
new file mode 100644
index 00000000..161c68d8
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ms/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Tetapkan semula grid apl mengikut susunan A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Fungsi ini akan mengalih keluar semua susunan tersuai. Adakah anda mahu meneruskan tindakan?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Semua apl"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Apl media"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Hentikan apl"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Maklumat apl"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah dihentikan."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Hentikan apl?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Jika anda menghentikan apl secara paksa, fungsi apl mungkin terganggu."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Apl tidak dapat dihentikan."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak boleh digunakan semasa memandu."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Sembunyikan apl nyahpepijat"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Tunjukkan apl nyahpepijat"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=true;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Untuk menggunakan apl dilumpuhkan tos pengguna, sila bersetuju untuk menerima tos Pengguna"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Semak"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Bukan Sekarang"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-my/strings.xml b/libs/appgrid/lib/res/values-my/strings.xml
new file mode 100644
index 00000000..3bdcac72
--- /dev/null
+++ b/libs/appgrid/lib/res/values-my/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"အက်ပ်ဇယားကို A-Z အစီအစဉ်သို့ ပြင်ဆင်သတ်မှတ်ရန်"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ဤလုပ်ဆောင်ချက်သည် စိတ်ကြိုက်စီစဉ်မှုအားလုံးကို ဖယ်ရှားမည်။ ရှေ့ဆက်လိုပါသလား။"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"အက်ပ်အားလုံး"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"မီဒီယာ အက်ပ်များ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"အက်ပ် ရပ်ရန်"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"အက်ပ်အချက်အလက်"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> ရပ်သွားသည်။"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"အက်ပ်ကို ရပ်မလား။"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"အက်ပ်ကို မဖြစ်မနေ ရပ်ခိုင်းလျှင် အမှားဖြစ်နိုင်သည်။"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"အက်ပ်ကို ရပ်၍မရပါ။"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ကားမောင်းနေစဉ် <xliff:g id="APP_NAME">%1$s</xliff:g> ကို သုံး၍မရပါ။"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"အမှားရှာပြင်သည့်အက်ပ်များ ဖျောက်ထားရန်"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"အမှားရှာပြင်သည့်အက်ပ်များ ပြပါ"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"အသုံးပြုသူဆိုင်ရာ ဝန်ဆောင်မှုစည်းမျဉ်းများပိတ်ထားသည့် အက်ပ်များ သုံးရန် ‘အသုံးပြုသူဆိုင်ရာ TOS’ ကို လက်ခံပါ"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"စိစစ်ရန်"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ယခုမလုပ်ပါ"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-nb/strings.xml b/libs/appgrid/lib/res/values-nb/strings.xml
new file mode 100644
index 00000000..65159b63
--- /dev/null
+++ b/libs/appgrid/lib/res/values-nb/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Tilbakestill apprutenettet til A–Å-rekkefølge"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Denne funksjonen fjerner alle tilpassede rekkefølger. Vil du fortsette?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Alle apper"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Medieapper"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Stopp appen"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Appinformasjon"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> er stoppet."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Vil du stoppe appen?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Hvis du tvinger en app til å stoppe, kan det oppstå problemer."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Appen kan ikke stoppes."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Du kan ikke bruke <xliff:g id="APP_NAME">%1$s</xliff:g> mens du kjører."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Skjul feilsøkingsapper"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Vis feilsøkingsapper"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"For å bruke apper som er deaktivert av vilkårene for bruk, må du godta vilkårene for bruk"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Gjennomgå"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ikke nå"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ne/strings.xml b/libs/appgrid/lib/res/values-ne/strings.xml
new file mode 100644
index 00000000..7aae9b0f
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ne/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"एप ग्रिड A देखि Z को क्रममा रिसेट गर्नुहोस्"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"यो फङ्सनले रोजाइअनुसार सेट गरिएका सबै क्रम हटाउने छ। तपाईं जारी राख्न चाहनुहुन्छ?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"सबै एप"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"मिडिया एपहरू"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"एप बन्द गर्नुहोस्"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"एपसम्बन्धी जानकारी"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> बन्द गरिएको छ।"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"एप बन्द गर्ने हो?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"तपाईंले कुनै एपलाई जबरजस्ती रोक्नुभयो भने त्यसले सही तरिकाले काम नगर्न सक्छ।"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"एप बन्द गर्न सकिँदैन।"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ड्राइभ गर्दा <xliff:g id="APP_NAME">%1$s</xliff:g> प्रयोग गर्न सकिँदैन।"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"डिबग एपहरू लुकाइयोस्"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"डिबग एपहरू देखाइयोस्"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"तपाईं प्रयोगकर्ताले सहमति जनाउनु पर्ने सेवाका सर्तहरूका कारण निष्क्रिय पारिएका एपहरू प्रयोग गर्न चाहनुहुन्छ भने प्रयोगकर्ताले सहमति जनाउनु पर्ने सेवाका सर्तहरूमा सहमति जनाउनुहोस्"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"समीक्षा गर्नुहोस्"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"अहिले होइन"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-nl/strings.xml b/libs/appgrid/lib/res/values-nl/strings.xml
new file mode 100644
index 00000000..3a2af953
--- /dev/null
+++ b/libs/appgrid/lib/res/values-nl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"App-raster resetten naar de volgorde A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Met deze functie wordt de aangepaste volgorde helemaal verwijderd. Wil je doorgaan?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Alle apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Media-apps"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"App stoppen"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"App-informatie"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> is gestopt."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"App stoppen?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Als je een app gedwongen stopt, kan deze onverwacht gedrag vertonen."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"De app kan niet worden gestopt."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Je kunt <xliff:g id="APP_NAME">%1$s</xliff:g> niet gebruiken tijdens het rijden"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Foutopsporingsapps verbergen"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Foutopsporingsapps tonen"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Ga akkoord met de servicevoorwaarden voor gebruikers om apps te gebruiken waarvoor de servicevoorwaarden voor gebruikers zijn uitgezet"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Beoordelen"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Niet nu"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-or/strings.xml b/libs/appgrid/lib/res/values-or/strings.xml
new file mode 100644
index 00000000..eda5a9a3
--- /dev/null
+++ b/libs/appgrid/lib/res/values-or/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"A-Z କ୍ରମରେ ଆପ ଗ୍ରିଡକୁ ରିସେଟ କରନ୍ତୁ"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ଏହି ଫଙ୍କସନ ସମସ୍ତ କଷ୍ଟମ ଅର୍ଡରିଂକୁ କାଢ଼ି ଦେବ। ଆପଣ ଜାରି ରଖିବାକୁ ଚାହାଁନ୍ତି?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"ସମସ୍ତ ଆପ୍ସ"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"ମିଡିଆ ଆପ୍ସ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"ଆପକୁ ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ଆପ ସୂଚନା"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ବନ୍ଦ କରାଯାଇଛି।"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"ଆପକୁ ବନ୍ଦ କରିବେ?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"ଯଦି ଆପଣ ଏକ ଆପକୁ ବାଧ୍ୟତାର ସହ ବନ୍ଦ କରନ୍ତି, ତେବେ ଏହା ଠିକ୍ ଭାବେ କାମ ନକରିପାରେ।"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"ଆପ ବନ୍ଦ କରାଯାଇପାରିବ ନାହିଁ।"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ଡ୍ରାଇଭ୍ କରିବା ସମୟରେ <xliff:g id="APP_NAME">%1$s</xliff:g> ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ।"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ଡିବଗ ଆପ୍ସ ଲୁଚାନ୍ତୁ"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"ଡିବଗ ଆପ୍ସ ଦେଖାନ୍ତୁ"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"ୟୁଜର TOS ଅକ୍ଷମ କରାଯାଇଥିବା ଆପ୍ସକୁ ବ୍ୟବହାର କରିବା ପାଇଁ ୟୁଜର TOSରେ ସମ୍ମତ ହୁଅନ୍ତୁ"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"ସମୀକ୍ଷା କରନ୍ତୁ"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ବର୍ତ୍ତମାନ ନୁହେଁ"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-pa/strings.xml b/libs/appgrid/lib/res/values-pa/strings.xml
new file mode 100644
index 00000000..b78886ac
--- /dev/null
+++ b/libs/appgrid/lib/res/values-pa/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"ਐਪ ਗਰਿੱਡ ਨੂੰ A-Z ਕ੍ਰਮ ਵਿੱਚ ਰੀਸੈੱਟ ਕਰੋ"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ਇਸ ਫੰਕਸ਼ਨ ਨਾਲ ਸਾਰਾ ਵਿਉਂਤਿਆ ਕ੍ਰਮ ਹਟ ਜਾਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"ਸਾਰੀਆਂ ਐਪਾਂ"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"ਮੀਡੀਆ ਐਪਾਂ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"ਐਪ ਬੰਦ ਕਰੋ"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ਐਪ ਜਾਣਕਾਰੀ"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ।"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"ਕੀ ਐਪ ਨੂੰ ਬੰਦ ਕਰਨਾ ਹੈ?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਨੂੰ ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰਦੇ ਹੋ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਾ ਕਰੇ।"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"ਐਪ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ਗੱਡੀ ਚਲਾਉਣ ਵੇਲੇ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ਡੀਬੱਗ ਐਪਾਂ ਲੁਕਾਓ"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"ਡੀਬੱਗ ਐਪਾਂ ਦਿਖਾਓ"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"ਵਰਤੋਂਕਾਰ ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ ਅਧੀਨ ਬੰਦ ਕੀਤੀਆਂ ਐਪਾਂ ਨੂੰ ਵਰਤਣ ਲਈ, ਵਰਤੋਂਕਾਰ ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ ਨਾਲ ਸਹਿਮਤ ਹੋਵੋ"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"ਸਮੀਖਿਆ"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ਹਾਲੇ ਨਹੀਂ"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-pl/strings.xml b/libs/appgrid/lib/res/values-pl/strings.xml
new file mode 100644
index 00000000..1e8e257b
--- /dev/null
+++ b/libs/appgrid/lib/res/values-pl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Zresetuj siatkę aplikacji do kolejności alfabetycznej"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Ta funkcja usuwa wszystkie niestandardowe ustawienia kolejności. Czy chcesz kontynuować?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Wszystkie aplikacje"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Aplikacje multimedialne"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Zatrzymaj aplikację"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informacje o aplikacji"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> została zatrzymana."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Zatrzymać aplikację?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Jeśli wymusisz zatrzymanie aplikacji, może ona zadziałać nieprawidłowo."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Aplikacji nie można zatrzymać."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Podczas jazdy nie można korzystać z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ukryj aplikacje do debugowania"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Pokaż aplikacje do debugowania"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Aby używać aplikacji wyłączonych z powodu warunków korzystania z usługi, zaakceptuj te warunki"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Sprawdź"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Nie teraz"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-pt-rPT/strings.xml b/libs/appgrid/lib/res/values-pt-rPT/strings.xml
new file mode 100644
index 00000000..f310ce94
--- /dev/null
+++ b/libs/appgrid/lib/res/values-pt-rPT/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Reponha a grelha de apps para a ordem A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Esta função vai remover toda a ordenação personalizada. Quer continuar?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Todas as apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Apps de multimédia"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Parar app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informações da app"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> foi parada."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Parar a app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Se forçar a paragem de uma app, esta pode apresentar um comportamento anormal."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Não é possível parar a app."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Não é possível usar a app <xliff:g id="APP_NAME">%1$s</xliff:g> durante a condução."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ocultar apps de depuração"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Mostrar apps de depuração"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Para usar apps desativadas pelos TdU do Utilizador, aceite os TdU do Utilizador"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Rever"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Agora não"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-pt/strings.xml b/libs/appgrid/lib/res/values-pt/strings.xml
new file mode 100644
index 00000000..052dc2e1
--- /dev/null
+++ b/libs/appgrid/lib/res/values-pt/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Redefinir a grade de apps para a ordem de A a Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Esta função vai remover a ordem personalizada. Você quer continuar?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Todos os apps"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Apps de música"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Parar o app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informações do app"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> foi parado."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Parar o app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Se você forçar o fechamento de um app, ele pode apresentar mau funcionamento."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Não é possível interromper o app."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não pode ser usado ao dirigir."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ocultar apps de depuração"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Mostrar apps de depuração"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Para usar apps desativados pelos Termos de Serviço do usuário, aceite esses termos"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Revisar"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Agora não"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ro/strings.xml b/libs/appgrid/lib/res/values-ro/strings.xml
new file mode 100644
index 00000000..0d9aa1b2
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ro/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Resetează grila de aplicații la ordinea A – Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Această funcție va elimina orice ordonare personalizată. Continui?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Toate aplicațiile"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Aplicații media"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Oprește aplicația"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informații despre aplicație"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> a fost oprită."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Oprești aplicația?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Dacă forțezi oprirea unei aplicații, aceasta se poate comporta necorespunzător."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Aplicația nu poate fi oprită."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Nu poți folosi <xliff:g id="APP_NAME">%1$s</xliff:g> în timp ce conduci."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ascunde aplicațiile de remediere a erorilor"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Afișează aplicațiile de remediere a erorilor"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Ca să folosești aplicațiile dezactivate deoarece nu au fost acceptate condițiile pentru utilizatori, acceptă condițiile pentru utilizatori"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Examinează"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Nu acum"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ru/strings.xml b/libs/appgrid/lib/res/values-ru/strings.xml
new file mode 100644
index 00000000..fdcee774
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ru/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Изменение порядка в сетке приложений"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Текущий порядок приложений будет изменен на алфавитный. Продолжить?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Все приложения"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Мультимедийные приложения"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Остановить"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Сведения о приложении"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" остановлено."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Остановить приложение?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Принудительное закрытие приложения может отразиться на его функциональности."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Невозможно остановить приложение."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" нельзя использовать при вождении."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Скрыть приложения для отладки"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Показать приложения для отладки"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Примите условия использования, чтобы пользоваться отключенными приложениями."</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Проверить"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Не сейчас"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-si/strings.xml b/libs/appgrid/lib/res/values-si/strings.xml
new file mode 100644
index 00000000..20051df3
--- /dev/null
+++ b/libs/appgrid/lib/res/values-si/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"යෙදුම් ජාලකය A-Z අනුපිළිවෙලට යළි සකසන්න"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"මෙම කාර්යය සියලු අභිරුචි අනුපිළිවෙලක් ඉවත් කරනු ඇත. ඔබට ඉදිරියට යාමට අවශ්‍යද?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"සියලු යෙදුම්"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"මාධ්‍ය යෙදුම්"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"යෙදුම නවත්වන්න"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"යෙදුම් තතු"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> නතර කර ඇත."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"යෙදුම නවත්වන්න ද?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"ඔබ යෙදුමක් බලෙන් නැවත වුවහොත්, එය වැරදි ලෙස ක්‍රියා කරනු ඇත."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"යෙදුම නැවැත්විය නොහැක."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට රිය පදවන අතරේ යතුරු පුවරුව භාවිතා කළ නොහැක."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"නිදොස් කිරීමේ යෙදුම් සඟවන්න"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"නිදොස් කිරීමේ යෙදුම් පෙන්වන්න"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"පරිශීලක tos අබලිත යෙදුම් භාවිතය සඳහා, පරිශීලක tos වෙත එකඟ වන්න"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"සමාලෝචනය කරන්න"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"දැන් නොවේ"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-sk/strings.xml b/libs/appgrid/lib/res/values-sk/strings.xml
new file mode 100644
index 00000000..64381147
--- /dev/null
+++ b/libs/appgrid/lib/res/values-sk/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Resetovať mriežku aplikácií do poradia A – Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Táto funkcia zruší všetko vlastné poradie. Chcete pokračovať?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Všetky aplikácie"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Prehrávače"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Zastaviť aplikáciu"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informácie o aplikácii"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> bola zastavená."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Chcete zastaviť aplikáciu?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ak vynútite zastavenie aplikácie, môže sa správať zvláštne."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Aplikáciu nie je možné ukončiť."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Pri šoférovaní nie je možné používať aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Skryť aplikácie na ladenie"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Zobraziť aplikácie na ladenie"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Ak chcete používať aplikácie deaktivované na základe zmluvných podmienok pre používateľov, vyjadrite súhlas so zmluvnými podmienkami pre používateľov"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Skontrolovať"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Teraz nie"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-sl/strings.xml b/libs/appgrid/lib/res/values-sl/strings.xml
new file mode 100644
index 00000000..ea80a029
--- /dev/null
+++ b/libs/appgrid/lib/res/values-sl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Ponastavi mrežo aplikacij na vrstni red od A do Ž"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Ta funkcija bo odstranila vse razvrščanje po meri. Ali želite nadaljevati?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Vse aplikacije"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Aplikacije za predstavnost"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Ustavi aplikacijo"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Podatki o aplikacijah"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je ustavljena."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Želite ustaviti aplikacijo?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Če boste vsilili zaustavitev aplikacije, morda ne bo pravilno delovala."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Aplikacije ni mogoče ustaviti."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Med vožnjo ni mogoče uporabljati aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Skrij aplikacije za odpravljanje napak"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Prikaži aplikacije za odpravljanje napak"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Če želite uporabljati aplikacije, ki so onemogočene glede na pogoje storitve za uporabnika, sprejmite te pogoje storitve"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Pregled"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Ne zdaj"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-sq/strings.xml b/libs/appgrid/lib/res/values-sq/strings.xml
new file mode 100644
index 00000000..263be176
--- /dev/null
+++ b/libs/appgrid/lib/res/values-sq/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Rivendos rrjetën e aplikacioneve sipas rendit A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Ky funksion do të heqë të gjitha renditjet e personalizuara. Dëshiron të vazhdosh?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Të gjitha aplikacionet"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Aplikacionet e medias"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Ndalo aplikacionin"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Informacione mbi aplikacionin"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> është ndaluar."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Të ndalohet aplikacioni?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Nëse e ndalon me forcë një aplikacion, ai mund të ketë çrregullime në funksionim."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Aplikacioni nuk mund të ndalohet."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" nuk mund të përdoret gjatë drejtimit të makinës."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Fshih aplikacionet e korrigjimit të defekteve"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Shfaq aplikacionet e korrigjimit të defekteve"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Për të përdorur aplikacionet e çaktivizuara sipas kushteve të shërbimit të përdoruesit, prano \"Kushtet e shërbimit të përdoruesit\""</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Shqyrto"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Jo tani"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-sr/strings.xml b/libs/appgrid/lib/res/values-sr/strings.xml
new file mode 100644
index 00000000..0f692f26
--- /dev/null
+++ b/libs/appgrid/lib/res/values-sr/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Ресетуј мрежу апликација на редослед A–Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Ова функција ће уклонити целокупан прилагођен распоред. Желите да наставите?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Све апликације"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Медијске апликације"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Заустави апликацију"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Информације о апликацији"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> је заустављена."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Желите да зауставите апликацију?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ако принудно зауставите апликацију, можда ће се понашати неочекивано."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Апликација не може да се заустави."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се користи током вожње."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Сакриј апликације за отклањање грешака"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Прикажи апликације за отклањање грешака"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Да бисте користили апликације онемогућене у складу са условима коришћења услуге за корисника, прихватите услове коришћења услуге за корисника."</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Прегледај"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Не сада"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-sv/strings.xml b/libs/appgrid/lib/res/values-sv/strings.xml
new file mode 100644
index 00000000..0ef43bcf
--- /dev/null
+++ b/libs/appgrid/lib/res/values-sv/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Återställ rutnätet för appar till ordningen A–Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Funktionen tar bort alla anpassade ordningar. Vill du fortsätta?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Alla appar"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Medieappar"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Avsluta appen"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Appinformation"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> har avslutats."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Vill du avsluta appen?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Om du tvingar appen att avsluta kanske den inte fungerar som den ska."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Det går inte att avsluta appen."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g> går inte att använda under körning."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Dölj felsökningsappar"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Visa felsökningsappar"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Du måste godkänna användarvillkoren för appar för att kunna använda dem"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Granska"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Inte nu"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-sw/strings.xml b/libs/appgrid/lib/res/values-sw/strings.xml
new file mode 100644
index 00000000..66fb8d3a
--- /dev/null
+++ b/libs/appgrid/lib/res/values-sw/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Weka upya gridi ya programu kwa mpango wa A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Utendaji huu utaondoa mipangilio yote maalum ya upangaji. Je, ungependa kuendelea?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Programu zote"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Programu za muziki"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Zima programu"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Maelezo ya programu"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Umezima programu ya <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Je, ungependa kuzima programu?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Huenda programu isifanye kazi ipasavyo, iwapo utalazimisha kuizima."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Programu haiwezi kuzimwa."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Huwezi kutumia <xliff:g id="APP_NAME">%1$s</xliff:g> wakati unaendesha gari."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ficha programu za kutatua hitilafu"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Onyesha programu za kutatua hitilafu"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Ili utumie programu zilizozimwa kutokana na sheria na masharti ya mtumiaji, kubali Sheria na Masharti ya Mtumiaji"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Kagua"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Si Sasa"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ta/strings.xml b/libs/appgrid/lib/res/values-ta/strings.xml
new file mode 100644
index 00000000..e7a66982
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ta/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"ஆப்ஸ் கட்டக் காட்சியை A-Z வரிசைப்படி மீட்டமைத்தல்"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"இது பிரத்தியேக வரிசைகள் அனைத்தையும் அகற்றும். தொடர விரும்புகிறீர்களா?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"அனைத்து ஆப்ஸும்"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"மீடியா ஆப்ஸ்"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"ஆப்ஸை நிறுத்து"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ஆப்ஸ் தகவல்கள்"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் நிறுத்தப்பட்டது."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"ஆப்ஸை நிறுத்தவா?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"ஆப்ஸை உடனே நிறுத்தினால் அது சரியாகச் செயல்படாமல் போகக்கூடும்."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"ஆப்ஸை நிறுத்த முடியாது."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"காரை ஓட்டும்போது <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸைப் பயன்படுத்த முடியாது."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"பிழைதிருத்தும் ஆப்ஸை மறை"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"பிழைதிருத்தும் ஆப்ஸைக் காட்டு"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"பயனர் சேவை விதிமுறைகள் (TOS) முடக்கப்பட்ட ஆப்ஸைப் பயன்படுத்த, அதன் விதிமுறைகளை ஏற்றுக்கொள்ளுங்கள்"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"பாருங்கள்"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"இப்போது வேண்டாம்"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-te/strings.xml b/libs/appgrid/lib/res/values-te/strings.xml
new file mode 100644
index 00000000..a7f46d22
--- /dev/null
+++ b/libs/appgrid/lib/res/values-te/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"యాప్ గ్రిడ్‌ను A-Z ఆర్డర్‌కు రీసెట్ చేయండి"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ఈ ఫంక్షన్ అన్ని అనుకూల ఆర్డరింగ్‌ను తీసివేస్తుంది. మీరు కొనసాగాలనుకుంటున్నారా?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"అన్ని యాప్‌లు"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"మీడియా యాప్‌లు"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"యాప్‌ను ఆపివేయండి"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"యాప్ సమాచారం"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఆపివేయబడింది."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"యాప్‌ను ఆపివేయాలా?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"మీరు యాప్‌ను ఫోర్స్ ఆపివేస్తే, అది సరిగ్గా పని చేయకపోవచ్చు."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"యాప్‌ను ఆపడం సాధ్యం కాదు."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"డ్రైవింగ్ చేస్తున్నపుడు <xliff:g id="APP_NAME">%1$s</xliff:g>ను ఉపయోగించలేరు."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"డీబగ్ యాప్‌లను దాచండి"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"డీబగ్ యాప్‌లను చూపించండి"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"డిజేబుల్ చేసిన యూజర్ TOS యాప్‌లను ఉపయోగించడానికి, యూజర్ TOSను అంగీకరించండి"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"రివ్యూ చేయండి"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ఇప్పుడు కాదు"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-th/strings.xml b/libs/appgrid/lib/res/values-th/strings.xml
new file mode 100644
index 00000000..5a30b02a
--- /dev/null
+++ b/libs/appgrid/lib/res/values-th/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"รีเซ็ตตารางกริดสำหรับแอปเป็นลำดับ A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"ฟังก์ชันนี้จะนำการจัดลำดับที่กำหนดเองออกทั้งหมด ต้องการทำต่อไหม"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"แอปทั้งหมด"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"แอปสื่อ"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"หยุดแอป"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ข้อมูลแอป"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"หยุด <xliff:g id="APP_NAME">%1$s</xliff:g> แล้ว"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"หยุดแอปไหม"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"แอปอาจทำงานผิดพลาดหากบังคับให้หยุด"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"หยุดแอปไม่ได้"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ใช้ <xliff:g id="APP_NAME">%1$s</xliff:g> ขณะขับรถไม่ได้"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ซ่อนแอปแก้ไขข้อบกพร่อง"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"แสดงแอปแก้ไขข้อบกพร่อง"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"หากต้องการใช้แอปที่ปิดใช้โดยข้อกำหนดในการให้บริการของผู้ใช้ ให้ยอมรับข้อกำหนดดังกล่าว"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"ตรวจสอบ"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ไว้ทีหลัง"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-tl/strings.xml b/libs/appgrid/lib/res/values-tl/strings.xml
new file mode 100644
index 00000000..c23a923e
--- /dev/null
+++ b/libs/appgrid/lib/res/values-tl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"I-reset ang grid ng app sa A-Z na pagkakasunod-sunod"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Aalisin ng function na ito ang lahat ng custom na pagkakasunod-sunod. Gusto mo bang magpatuloy?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Lahat ng app"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Mga media app"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Ihinto ang app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Impormasyon ng app"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Inihinto ang <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Ihinto ang app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Kung sapilitan mong ihihinto ang isang app, posible itong gumana nang maayos."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Hindi puwedeng ihinto ang app."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Hindi magagamit ang <xliff:g id="APP_NAME">%1$s</xliff:g> habang nagmamaneho."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"I-hide ang mga debug app"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Ipakita ang mga debug app"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Para gumamit ng mga app na naka-disable ang TOS sa user, sumang-ayon sa TOS sa User"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Pagsusuri"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Hindi Ngayon"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-tr/strings.xml b/libs/appgrid/lib/res/values-tr/strings.xml
new file mode 100644
index 00000000..a8eae95b
--- /dev/null
+++ b/libs/appgrid/lib/res/values-tr/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Uygulama tablosunu A\'dan Z\'ye sıfırla"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Bu işlev tüm özel sıralamayı kaldıracaktır. Devam etmek istiyor musunuz?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Tüm uygulamalar"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Medya uygulamaları"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Uygulamayı durdur"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Uygulama bilgisi"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> durduruldu."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Uygulama durdurulsun mu?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Uygulamayı zorla durdurursanız hatalı davranabilir."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Uygulama durdurulamıyor."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"<xliff:g id="APP_NAME">%1$s</xliff:g>, sürüş sırasında kullanılamaz."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Hata ayıklama uygulamalarını gizle"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Hata ayıklama uygulamalarını göster"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Kullanıcı Hizmet Şartları\'nın devre dışı bıraktığı uygulamaları kullanmak için Kullanıcı Hizmet Şartları\'nı kabul edin"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"İncele"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Şimdi Değil"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-uk/strings.xml b/libs/appgrid/lib/res/values-uk/strings.xml
new file mode 100644
index 00000000..e35e55d7
--- /dev/null
+++ b/libs/appgrid/lib/res/values-uk/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Скинути сітку додатків і повернути розташування в алфавітному порядку (A-Я)"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Якщо застосувати цю функцію, визначений користувачем порядок розташування додатків зміниться. Продовжити?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Усі додатки"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Мультимедійні додатки"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Припинити роботу додатка"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Інформація про додаток"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"Роботу додатка <xliff:g id="APP_NAME">%1$s</xliff:g> припинено."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Припинити роботу додатка?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Примусове вимкнення додатка може призвести до збою в його роботі."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Не вдалося припинити роботу додатка."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Додатком <xliff:g id="APP_NAME">%1$s</xliff:g> не можна користуватися під час руху."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Сховати додатки для налагодження"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Показати додатки для налагодження"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Щоб використовувати вимкнені додатки, прийміть Умови використання"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Переглянути"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Не зараз"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-ur/strings.xml b/libs/appgrid/lib/res/values-ur/strings.xml
new file mode 100644
index 00000000..34191e28
--- /dev/null
+++ b/libs/appgrid/lib/res/values-ur/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"ایپ گرڈ کو A-Z آرڈر پر ری سیٹ کریں"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"یہ فنکشن تمام حسب ضرورت ترتیب کو ہٹا دے گا۔ کیا آپ جاری رکھنا چاہتے ہیں؟"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"سبھی ایپس"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"میڈیا ایپس"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"ایپ بند کریں"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"ایپ کی معلومات"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو بند کر دیا گیا ہے۔"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"ایپ بند کریں؟"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"اگر آپ کسی ایپ کو زبردستی بند کر دیتے ہیں تو یہ غلط برتاؤ کر سکتی ہے۔"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"ایپ کو بند نہیں کیا جا سکتا۔"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"ڈرائیو کرتے وقت <xliff:g id="APP_NAME">%1$s</xliff:g> کا استعمال نہیں کیا جا سکتا۔"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"ڈیبگ ایپس چھپائیں"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"ڈیبگ ایپس دکھائیں"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"صارف کی غیر فعال کردہ سروس کی شرائط والی ایپس کا استعمال کرنے کے لیے صارف کی سروس کی شرائط سے اتفاق کریں"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"جائزہ لیں"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"ابھی نہیں"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-uz/strings.xml b/libs/appgrid/lib/res/values-uz/strings.xml
new file mode 100644
index 00000000..6441fcee
--- /dev/null
+++ b/libs/appgrid/lib/res/values-uz/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Ilova jadvalini alifbo tartibiga qaytarish"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Bu funksiya barcha maxsus buyurtmalarni bekor qiladi. Davom etasizmi?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Barcha ilovalar"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Media ilovalari"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Ilovani toʻxtatish"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Ilova haqida"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi toʻxtatildi."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Ilova toʻxtatilsinmi?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Ilovani majburan toʻxtatish uning ishlashiga taʼsir koʻrsatishi mumkin."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Ilovani toʻxtatish imkonsiz."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Avtomobil rejimida <xliff:g id="APP_NAME">%1$s</xliff:g> ishlamaydi."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Nosozliklarni aniqlash ilovalarini berkitish"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Nosozliklarni aniqlash ilovalarini chiqarish"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Ayrim ilovalardan faqatgina foydalanish shartlarini qabul qilgandan keyin foydalanish mumkin"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Tekshirish"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Hozir emas"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-vi/strings.xml b/libs/appgrid/lib/res/values-vi/strings.xml
new file mode 100644
index 00000000..fee8689c
--- /dev/null
+++ b/libs/appgrid/lib/res/values-vi/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Đặt lại lưới ứng dụng theo thứ tự A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Chức năng này sẽ xoá mọi thứ tự tuỳ chỉnh. Bạn có muốn tiếp tục không?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Tất cả ứng dụng"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Ứng dụng đa phương tiện"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Dừng ứng dụng"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Thông tin ứng dụng"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"<xliff:g id="APP_NAME">%1$s</xliff:g> đã bị dừng."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Dừng ứng dụng?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Nếu bạn buộc một ứng dụng dừng lại, ứng dụng đó có thể hoạt động không đúng cách."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"Không dừng được ứng dụng."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"Không thể dùng <xliff:g id="APP_NAME">%1$s</xliff:g> trong khi lái xe."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Ẩn các ứng dụng gỡ lỗi"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Hiện các ứng dụng gỡ lỗi"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Để sử dụng ứng dụng chưa kích hoạt điều khoản dịch vụ cho người dùng, hãy chấp nhận điều khoản dịch vụ cho người dùng"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Đánh giá"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Để sau"</string>
+</resources>
diff --git a/res/values-w930dp/integers.xml b/libs/appgrid/lib/res/values-w930dp/integers.xml
index abfb840e..abfb840e 100644
--- a/res/values-w930dp/integers.xml
+++ b/libs/appgrid/lib/res/values-w930dp/integers.xml
diff --git a/libs/appgrid/lib/res/values-zh-rCN/strings.xml b/libs/appgrid/lib/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000..6755a3b3
--- /dev/null
+++ b/libs/appgrid/lib/res/values-zh-rCN/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"将应用网格排序重置为按名称首字母升序 (A-Z) 排列"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"此功能会撤消所有自定义排序。要继续吗?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"所有应用"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"媒体应用"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"停止应用"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"应用信息"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"已停止“<xliff:g id="APP_NAME">%1$s</xliff:g>”。"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"要停止应用吗?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"强行停止某个应用可能会导致其出现异常。"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"无法停止应用。"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"驾车时无法使用“<xliff:g id="APP_NAME">%1$s</xliff:g>”。"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"隐藏调试应用"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"显示调试应用"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"若要使用《用户服务条款》所停用的应用,请同意《用户服务条款》"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"查看"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"以后再说"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-zh-rHK/strings.xml b/libs/appgrid/lib/res/values-zh-rHK/strings.xml
new file mode 100644
index 00000000..25836353
--- /dev/null
+++ b/libs/appgrid/lib/res/values-zh-rHK/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"將應用程式網格重設為按字母排序"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"此功能會移除所有自訂順序。你要繼續嗎?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"所有應用程式"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"媒體應用程式"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"停止應用程式"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"應用程式資料"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"已停止「<xliff:g id="APP_NAME">%1$s</xliff:g>」。"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"要停止應用程式嗎?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"強制停止應用程式,可能會導致操作不正常。"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"無法停止應用程式。"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"駕駛時無法使用「<xliff:g id="APP_NAME">%1$s</xliff:g>」。"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"隱藏偵錯應用程式"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"顯示偵錯應用程式"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"如要使用使用者服務條款停用的應用程式,請同意使用者服務條款"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"審核"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"暫時不要"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-zh-rTW/strings.xml b/libs/appgrid/lib/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000..baeb5892
--- /dev/null
+++ b/libs/appgrid/lib/res/values-zh-rTW/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"將應用程式排列顯示重設為按英文字母順序排列"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"這項功能會移除所有自訂排序,要繼續嗎?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"所有應用程式"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"媒體應用程式"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"停止應用程式"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"應用程式資訊"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"已停止「<xliff:g id="APP_NAME">%1$s</xliff:g>」。"</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"要停止應用程式嗎?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"如果你強制停止應用程式,應用程式可能會出現異常行為。"</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"無法停止應用程式。"</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"開車時無法使用「<xliff:g id="APP_NAME">%1$s</xliff:g>」。"</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"隱藏偵錯應用程式"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"顯示偵錯應用程式"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"如要使用因尚未同意使用者服務條款而停用的應用程式,請同意使用者服務條款"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"查看"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"暫時不要"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values-zu/strings.xml b/libs/appgrid/lib/res/values-zu/strings.xml
new file mode 100644
index 00000000..89cc9e9b
--- /dev/null
+++ b/libs/appgrid/lib/res/values-zu/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="reset_appgrid_title" msgid="6491348358859198288">"Setha kabusha igridi ye-app ku-oda le-A-Z"</string>
+ <string name="reset_appgrid_dialogue_message" msgid="2278301828239327586">"Lo msebenzi uzosusa konke uku-oda ngokwezifiso. Ingabe ufuna ukuqhubeka?"</string>
+ <string name="app_launcher_title_all_apps" msgid="3522783138519460233">"Wonke ama-app"</string>
+ <string name="app_launcher_title_media_only" msgid="7194631822174015710">"Ama-app emidiya"</string>
+ <string name="app_launcher_stop_app_action" msgid="4488562150865461282">"Misa i-app"</string>
+ <string name="app_launcher_app_info_action" msgid="475788297140730900">"Ulwazi lwe-app"</string>
+ <string name="app_launcher_stop_app_success_toast_text" msgid="1504575154930117738">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> imisiwe."</string>
+ <string name="app_launcher_stop_app_dialog_title" msgid="339411511647776450">"Misa i-app?"</string>
+ <string name="app_launcher_stop_app_dialog_text" msgid="5113650734637193870">"Uma uphoqelela ukumisa i-app, kungenzeka ukuthi ingasebenzi kahle."</string>
+ <string name="app_launcher_stop_app_cant_stop_text" msgid="6513703446595313338">"I-App ayikwazi ukumiswa."</string>
+ <string name="driving_toast_text" msgid="397905281933065053">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayikwazi ukusetshenziswa ngenkathi ushayela."</string>
+ <string name="hide_debug_apps" msgid="7140064693464751647">"Fihla ama-app okususa iphutha"</string>
+ <string name="show_debug_apps" msgid="2748157232151197494">"Bonisa ama-app okususa iphutha"</string>
+ <string name="user_tos_activity_intent" msgid="5323981034042569291">"intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end"</string>
+ <string name="banner_title_text" msgid="8827498256184464356">"Ukuze usebenzise ama-app akhutshaziwe e-tos, vumelana ne-tos Yomsebenzisi"</string>
+ <string name="banner_review_button_text" msgid="369410598918950148">"Buyekeza"</string>
+ <string name="banner_dismiss_button_text" msgid="5389352614429069562">"Hhayi Manje"</string>
+</resources>
diff --git a/libs/appgrid/lib/res/values/attrs.xml b/libs/appgrid/lib/res/values/attrs.xml
new file mode 100644
index 00000000..36c19074
--- /dev/null
+++ b/libs/appgrid/lib/res/values/attrs.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<resources>
+ <declare-styleable name="Banner">
+ <attr name="first_button_text" format="string"/>
+ <attr name="second_button_text" format="string"/>
+ <attr name="title_text" format="string"/>
+ </declare-styleable>
+</resources> \ No newline at end of file
diff --git a/res/values/bools.xml b/libs/appgrid/lib/res/values/bools.xml
index 64f4c7ef..058b1f0f 100644
--- a/res/values/bools.xml
+++ b/libs/appgrid/lib/res/values/bools.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2022 The Android Open Source Project
+ ~ Copyright (C) 2023 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
@@ -25,12 +25,6 @@
<!-- If the app grid should support user drag and drop to reorder app items -->
<bool name="config_allow_reordering">true</bool>
- <!-- If the control bar's seekbar should be displayed -->
- <bool name="show_seek_bar">false</bool>
-
- <!-- If the control bar's seekbar uses the color from media source -->
- <bool name="use_media_source_color_for_seek_bar">true</bool>
-
<!-- Whether the app grid should use @dimen/app_grid_width and @dimen/app_grid_height.
If this is set to false, app grid will fill the available space, If this is set to true, exact
defined dimensions will be used instead.-->
diff --git a/libs/appgrid/lib/res/values/colors.xml b/libs/appgrid/lib/res/values/colors.xml
new file mode 100644
index 00000000..580f6250
--- /dev/null
+++ b/libs/appgrid/lib/res/values/colors.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<resources>
+ <color name="icon_tint">#FFF8F9FA</color>
+ <color name="recent_apps_line_divider_color">#1FFFFFFF</color>
+ <color name="shortcuts_icon_color">#FFFFFFFF</color>
+ <color name="page_indicator_bar_color">#FF66B5FF</color>
+ <color name="app_item_on_hover_border_color">#FF66B5FF</color>
+ <color name="app_item_on_hover_background_color">#3D66B5FF</color>
+ <color name="app_name_color">#FFE8EAED</color>
+ <color name="banner_background_color">#2E3134</color>
+ <color name="banner_button_text_color">#66B5FF</color>
+ <color name="banner_title_text_color">#FFFFFF</color>
+</resources>
diff --git a/libs/appgrid/lib/res/values/config.xml b/libs/appgrid/lib/res/values/config.xml
new file mode 100644
index 00000000..5d214fc0
--- /dev/null
+++ b/libs/appgrid/lib/res/values/config.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+
+ <!-- Service information to get screen mirroring information -->
+ <string name="config_msg_mirroring_service_pkg_name" translatable="false">
+ com.android.car.multidisplay.controlcenter
+ </string>
+ <string name="config_msg_mirroring_service_class_name" translatable="false">
+ com.android.car.multidisplay.controlcenter.service.ControlCenterService
+ </string>
+
+ <!--
+ Keep in sync with the config file in {@link com.android.car.multidisplay.controlcenter}
+ ControlCenterService constants that allow other apps to get information about mirrored apps
+ -->
+ <integer name="config_msg_register_mirroring_pkg_code">1</integer>
+ <integer name="config_msg_unregister_mirroring_pkg_code">2</integer>
+ <integer name="config_msg_send_mirroring_pkg_code">3</integer>
+ <string name="config_msg_mirroring_pkg_name_key" translatable="false">
+ msg_mirroring_pkg_name_key
+ </string>
+ <string name="config_msg_mirroring_redirect_uri_key" translatable="false">
+ msg_mirroring_redirect_uri_key
+ </string>
+
+</resources>
diff --git a/libs/appgrid/lib/res/values/dimens.xml b/libs/appgrid/lib/res/values/dimens.xml
new file mode 100644
index 00000000..e137acf4
--- /dev/null
+++ b/libs/appgrid/lib/res/values/dimens.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<resources>
+ <dimen name="app_grid_width">1440dp</dimen>
+ <dimen name="app_grid_height">628dp</dimen>
+ <dimen name="app_grid_margin_horizontal">70dp</dimen>
+ <dimen name="app_grid_margin_vertical">0dp</dimen>
+ <dimen name="app_icon_size">84dp</dimen>
+ <dimen name="app_icon_scaled_size">100dp</dimen>
+ <item name="app_icon_opacity_unavailable" type="dimen" format="float">0.5</item>
+ <item name="app_icon_opacity_tos_disabled" type="dimen" format="float">0.46</item>
+ <item name="app_icon_opacity" type="dimen" format="float">1.0</item>
+ <dimen name="app_name_margin_horizontal">6dp</dimen>
+ <dimen name="app_item_highlight_corner_radius">18dp</dimen>
+ <dimen name="app_item_highlight_edge_width">5dp</dimen>
+ <dimen name="page_indicator_edge_corner_radius">4dp</dimen>
+ <dimen name="page_indicator_height">4dp</dimen>
+ <!-- Gap between top of screen (statusbar) and header content -->
+ <dimen name="recent_apps_divider_margin">40dp</dimen>
+ <dimen name="app_grid_header_margin">32dp</dimen>
+ <dimen name="panel_margin">20dp</dimen>
+ <!-- Height of the text and exit button on the app selection screen -->
+ <dimen name="app_bar_height">80dp</dimen>
+ <dimen name="icon_size">56dp</dimen>
+ <dimen name="recent_apps_row_height">1dp</dimen>
+ <dimen name="app_grid_touch_target_size">76dp</dimen>
+ <!-- Padding around the touch target (makes ripple look better) -->
+ <dimen name="app_touch_target_padding">16dp</dimen>
+ <dimen name="app_touch_target_margin">8dp</dimen>
+ <dimen name="app_grid_row_margin">32dp</dimen>
+ <dimen name="app_icon_description_margin">16dp</dimen>
+ <dimen name="app_icon_ripple_radius">8dp</dimen>
+
+ <!-- AppSearchActivity -->
+ <dimen name="search_item_width">760dp</dimen>
+ <dimen name="search_result_margin">8dp</dimen>
+ <dimen name="search_result_text_margin">152dp</dimen>
+ <dimen name="search_box_height">65dp</dimen>
+ <dimen name="search_bar_margin">48dp</dimen>
+ <dimen name="search_bar_drawable_text_padding">46dp</dimen>
+
+ <!-- percentage of view holders on the next page that must be fully visible to the user to
+ trigger page snap to the next page -->
+ <item name="page_snap_threshold" format="float" type="dimen">0.3</item>
+
+ <!-- Velocity value of a swipe to trigger a fling to the next page -->
+ <item name="fling_threshold" format="float" type="dimen">1000</item>
+
+ <!-- distance that users must drag (hold and attempt to move the app icon) to initiate
+ drag and drop for reordering app icons. -->
+ <dimen name="threshold_to_start_drag_drop">8dp</dimen>
+
+ <!-- banner dimensions -->
+ <dimen name="banner_button_maximum_width">300dp</dimen>
+ <dimen name="banner_content_margin">28dp</dimen>
+ <dimen name="banner_image_view_size">30dp</dimen>
+</resources>
diff --git a/res/values/integers.xml b/libs/appgrid/lib/res/values/integers.xml
index c29f078f..18fa1684 100644
--- a/res/values/integers.xml
+++ b/libs/appgrid/lib/res/values/integers.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
+<!-- Copyright (C) 2023 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -40,11 +40,4 @@ limitations under the License.
<integer name="ms_scrollbar_fade_animation_duration">50</integer>
<integer name="ms_scrollbar_fade_animation_delay">500</integer>
- <integer name="card_content_text_block_max_lines">3</integer>
- <!-- Number of buttons shown for the media playback controls bar -->
- <integer name="playback_controls_bar_columns">3</integer>
-
- <!-- Max for seekbar progress -->
- <integer name="optional_seekbar_max">1000</integer>
</resources>
-
diff --git a/libs/appgrid/lib/res/values/overlayable.xml b/libs/appgrid/lib/res/values/overlayable.xml
new file mode 100644
index 00000000..3e29924a
--- /dev/null
+++ b/libs/appgrid/lib/res/values/overlayable.xml
@@ -0,0 +1,143 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.-->
+<!--
+THIS FILE WAS AUTO GENERATED, DO NOT EDIT MANUALLY.
+REGENERATE USING packages/apps/Car/libs/tools/rro/generate-overlayable.py
+-->
+<resources>
+ <overlayable name="CarAppGrid-lib">
+ <policy type="system|product|signature">
+ <item type="array" name="hidden_apps"/>
+ <item type="attr" name="first_button_text"/>
+ <item type="attr" name="second_button_text"/>
+ <item type="attr" name="title_text"/>
+ <item type="bool" name="car_app_show_recent_apps"/>
+ <item type="bool" name="car_app_show_toolbar"/>
+ <item type="bool" name="config_allow_reordering"/>
+ <item type="bool" name="use_defined_app_grid_dimensions"/>
+ <item type="bool" name="use_vertical_app_grid"/>
+ <item type="color" name="app_item_on_hover_background_color"/>
+ <item type="color" name="app_item_on_hover_border_color"/>
+ <item type="color" name="app_name_color"/>
+ <item type="color" name="banner_background_color"/>
+ <item type="color" name="banner_button_text_color"/>
+ <item type="color" name="banner_title_text_color"/>
+ <item type="color" name="icon_tint"/>
+ <item type="color" name="page_indicator_bar_color"/>
+ <item type="color" name="recent_apps_line_divider_color"/>
+ <item type="color" name="shortcuts_icon_color"/>
+ <item type="dimen" name="app_bar_height"/>
+ <item type="dimen" name="app_grid_header_margin"/>
+ <item type="dimen" name="app_grid_height"/>
+ <item type="dimen" name="app_grid_margin_horizontal"/>
+ <item type="dimen" name="app_grid_margin_vertical"/>
+ <item type="dimen" name="app_grid_row_margin"/>
+ <item type="dimen" name="app_grid_touch_target_size"/>
+ <item type="dimen" name="app_grid_width"/>
+ <item type="dimen" name="app_icon_description_margin"/>
+ <item type="dimen" name="app_icon_opacity"/>
+ <item type="dimen" name="app_icon_opacity_tos_disabled"/>
+ <item type="dimen" name="app_icon_opacity_unavailable"/>
+ <item type="dimen" name="app_icon_ripple_radius"/>
+ <item type="dimen" name="app_icon_scaled_size"/>
+ <item type="dimen" name="app_icon_size"/>
+ <item type="dimen" name="app_item_highlight_corner_radius"/>
+ <item type="dimen" name="app_item_highlight_edge_width"/>
+ <item type="dimen" name="app_name_margin_horizontal"/>
+ <item type="dimen" name="app_touch_target_margin"/>
+ <item type="dimen" name="app_touch_target_padding"/>
+ <item type="dimen" name="banner_button_maximum_width"/>
+ <item type="dimen" name="banner_content_margin"/>
+ <item type="dimen" name="banner_image_view_size"/>
+ <item type="dimen" name="fling_threshold"/>
+ <item type="dimen" name="icon_size"/>
+ <item type="dimen" name="page_indicator_edge_corner_radius"/>
+ <item type="dimen" name="page_indicator_height"/>
+ <item type="dimen" name="page_snap_threshold"/>
+ <item type="dimen" name="panel_margin"/>
+ <item type="dimen" name="recent_apps_divider_margin"/>
+ <item type="dimen" name="recent_apps_row_height"/>
+ <item type="dimen" name="search_bar_drawable_text_padding"/>
+ <item type="dimen" name="search_bar_margin"/>
+ <item type="dimen" name="search_box_height"/>
+ <item type="dimen" name="search_item_width"/>
+ <item type="dimen" name="search_result_margin"/>
+ <item type="dimen" name="search_result_text_margin"/>
+ <item type="dimen" name="threshold_to_start_drag_drop"/>
+ <item type="drawable" name="app_item_highlight"/>
+ <item type="drawable" name="banner_warning_image"/>
+ <item type="drawable" name="ic_app_info"/>
+ <item type="drawable" name="ic_force_stop_caution_icon"/>
+ <item type="drawable" name="page_indicator_bar"/>
+ <item type="id" name="app_icon"/>
+ <item type="id" name="app_item"/>
+ <item type="id" name="app_name"/>
+ <item type="id" name="apps_grid"/>
+ <item type="id" name="apps_grid_background"/>
+ <item type="id" name="banner_title"/>
+ <item type="id" name="divider"/>
+ <item type="id" name="first_button"/>
+ <item type="id" name="focus_area"/>
+ <item type="id" name="icon"/>
+ <item type="id" name="page_indicator"/>
+ <item type="id" name="page_indicator_container"/>
+ <item type="id" name="recent_apps_row"/>
+ <item type="id" name="second_button"/>
+ <item type="id" name="tos_banner"/>
+ <item type="integer" name="car_app_selector_column_number"/>
+ <item type="integer" name="car_app_selector_row_number"/>
+ <item type="integer" name="config_msg_register_mirroring_pkg_code"/>
+ <item type="integer" name="config_msg_send_mirroring_pkg_code"/>
+ <item type="integer" name="config_msg_unregister_mirroring_pkg_code"/>
+ <item type="integer" name="ms_background_highlight_duration"/>
+ <item type="integer" name="ms_drop_animation_delay"/>
+ <item type="integer" name="ms_long_press_animation_duration"/>
+ <item type="integer" name="ms_off_page_hover_before_scroll"/>
+ <item type="integer" name="ms_release_animation_duration"/>
+ <item type="integer" name="ms_scrollbar_appear_animation_delay"/>
+ <item type="integer" name="ms_scrollbar_appear_animation_duration"/>
+ <item type="integer" name="ms_scrollbar_fade_animation_delay"/>
+ <item type="integer" name="ms_scrollbar_fade_animation_duration"/>
+ <item type="layout" name="app_grid_activity"/>
+ <item type="layout" name="app_item"/>
+ <item type="layout" name="banner"/>
+ <item type="layout" name="recent_apps_row"/>
+ <item type="string" name="app_launcher_app_info_action"/>
+ <item type="string" name="app_launcher_stop_app_action"/>
+ <item type="string" name="app_launcher_stop_app_cant_stop_text"/>
+ <item type="string" name="app_launcher_stop_app_dialog_text"/>
+ <item type="string" name="app_launcher_stop_app_dialog_title"/>
+ <item type="string" name="app_launcher_stop_app_success_toast_text"/>
+ <item type="string" name="app_launcher_title_all_apps"/>
+ <item type="string" name="app_launcher_title_media_only"/>
+ <item type="string" name="banner_dismiss_button_text"/>
+ <item type="string" name="banner_review_button_text"/>
+ <item type="string" name="banner_title_text"/>
+ <item type="string" name="config_msg_mirroring_pkg_name_key"/>
+ <item type="string" name="config_msg_mirroring_redirect_uri_key"/>
+ <item type="string" name="config_msg_mirroring_service_class_name"/>
+ <item type="string" name="config_msg_mirroring_service_pkg_name"/>
+ <item type="string" name="driving_toast_text"/>
+ <item type="string" name="hide_debug_apps"/>
+ <item type="string" name="reset_appgrid_dialogue_message"/>
+ <item type="string" name="reset_appgrid_title"/>
+ <item type="string" name="show_debug_apps"/>
+ <item type="string" name="user_tos_activity_intent"/>
+ <item type="style" name="ActionDialogTheme"/>
+ <item type="style" name="AppDisplayNameStyle"/>
+ <item type="style" name="BannerButton"/>
+ <item type="style" name="HorizontalLineDivider"/>
+ <item type="style" name="Theme.Launcher.AppGridActivity"/>
+ <item type="style" name="Theme.Launcher.AppGridActivity.NoToolbar"/>
+ </policy>
+ </overlayable>
+</resources>
diff --git a/res/values/strings.xml b/libs/appgrid/lib/res/values/strings.xml
index fb4ef171..5d1d0c68 100644
--- a/res/values/strings.xml
+++ b/libs/appgrid/lib/res/values/strings.xml
@@ -13,18 +13,20 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--->
+ -->
+
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title">Car Launcher</string>
<string name="reset_appgrid_title">Reset app grid to A-Z order</string>
<string name="reset_appgrid_dialogue_message">This function will remove all custom ordering.
- Do you want to continue?</string>
+ Do you want to continue?
+ </string>
<string name="app_launcher_title_all_apps">All apps</string>
<string name="app_launcher_title_media_only">Media apps</string>
<string name="app_launcher_stop_app_action">Stop app</string>
<string name="app_launcher_app_info_action">App info</string>
<string name="app_launcher_stop_app_success_toast_text">
- <xliff:g id="app_name" example="Radio">%1$s</xliff:g> has been stopped.
+ <xliff:g id="app_name" example="Radio">%1$s</xliff:g>
+ has been stopped.
</string>
<!-- Manage applications, title for dialog when killing persistent apps. [CHAR LIMIT=40] -->
<string name="app_launcher_stop_app_dialog_title">Stop app?</string>
@@ -35,42 +37,29 @@
<!-- Manage applications, text for dialog when apps can not be stopped -->
<string name="app_launcher_stop_app_cant_stop_text">App can’t be stopped.</string>
- <string name="default_media_song_title"></string>
-
<string name="driving_toast_text">
- <xliff:g id="app_name" example="Settings">%1$s</xliff:g> can\'t be used while driving.
+ <xliff:g id="app_name" example="Settings">%1$s</xliff:g>
+ can\'t be used while driving.
</string>
- <string name="tap_for_more_info_text">Tap card for more info</string>
- <string name="tap_to_launch_text">Tap card to launch</string>
-
- <!-- InCallModel strings -->
- <!-- Separates the duration from the ongoing_call_text -->
- <string name="ongoing_call_duration_text_separator">&#160;&#8226;&#160;</string>
- <string name="ongoing_call_text">Ongoing call</string>
- <string name="dialing_call_text">Dialing&#8230;</string>
+ <!-- Toolbar MenuItem text for hiding debug apps,
+ only visible on debug builds [CHAR_LIMIT=50] -->
+ <string name="hide_debug_apps">Hide debug apps</string>
+ <!-- Toolbar MenuItem text for showing debug apps,
+ only visible on debug builds [CHAR_LIMIT=50] -->
+ <string name="show_debug_apps">Show debug apps</string>
- <!-- ProjectionModel strings -->
- <string name="projected_launch_text">Launch Android Auto</string>
- <string name="projected_onclick_launch_error_toast_text">Unable to launch Android Auto. No activity found.</string>
- <string name="projection_devices">{count, plural,
- =1 {# device}
- other {# devices}
- }
- </string>
- <!-- FakeWeatherModel strings -->
- <string name="weather_app_name">Weather</string>
- <string name="fake_weather_main_text">--\u00B0 Mostly sunny</string>
- <string name="fake_weather_footer_text">Mountain View &#8226; H: --\u00B0 L: --\u00B0</string>
+ <!-- Intent action meant to invoke user TOS flow.
+ The intent URI has to be formatted according to Intent.URI_INTENT_SCHEME
+ URI, for example should contain the intent action and any extras if necessary:
+ "intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=true;end"
+ -->
- <!-- Toolbar MenuItem text for hiding debug apps, only visible on debug builds [CHAR_LIMIT=50] -->
- <string name="hide_debug_apps">Hide debug apps</string>
- <!-- Toolbar MenuItem text for showing debug apps, only visible on debug builds [CHAR_LIMIT=50] -->
- <string name="show_debug_apps">Show debug apps</string>
+ <string name="user_tos_activity_intent">
+ intent:#Intent;action=com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=false;end
+ </string>
- <!-- Separator between current time and max time in control bar, optional times [CHAR_LIMIT=5] -->
- <string name="times_separator"> / </string>
<!--
A list of package names to exclude from the app selector when filtering is active.
@@ -104,13 +93,8 @@
<item>org.chromium.webview_shell</item>
</string-array>
- <string name="recents_empty_state_text">No recent items</string>
- <string name="recents_clear_all_text">Clear All</string>
- <string name="failure_opening_recent_task_message">App isn\'t available</string>
- <!--
- A list of package names that are excluded from recents.
- DO NOT TRANSLATE.
- -->
- <string-array name="packages_hidden_from_recents" translatable="false">
- </string-array>
+ <!-- TosBanner strings -->
+ <string name="banner_title_text">To use user tos disabled apps, agree to User tos</string>
+ <string name="banner_review_button_text">Review</string>
+ <string name="banner_dismiss_button_text">Not Now</string>
</resources>
diff --git a/libs/appgrid/lib/res/values/styles.xml b/libs/appgrid/lib/res/values/styles.xml
new file mode 100644
index 00000000..3e1d2049
--- /dev/null
+++ b/libs/appgrid/lib/res/values/styles.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<resources>
+
+ <style name="AppDisplayNameStyle">
+ <item name="android:textSize">28sp</item>
+ <item name="android:textColor">@color/app_name_color</item>
+ <item name="android:fontFamily">sans-serif</item>
+ <item name="android:ellipsize">end</item>
+ <item name="android:maxLines">1</item>
+ </style>
+
+ <style name="HorizontalLineDivider">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">1dp</item>
+ <item name="android:background">#1fffffff</item>
+ </style>
+
+ <style name="BannerButton">
+ <item name="android:background">@android:color/transparent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_marginTop">@dimen/banner_content_margin</item>
+ <item name="android:layout_width">0dp</item>
+ <item name="android:paddingBottom">@dimen/banner_content_margin</item>
+ <item name="android:textAllCaps">false</item>
+ <item name="android:textColor">@color/banner_button_text_color</item>
+ <item name="android:textSize">24dp</item>
+ </style>
+
+</resources>
diff --git a/res/values/themes.xml b/libs/appgrid/lib/res/values/themes.xml
index ef5c37f5..df07a68b 100644
--- a/res/values/themes.xml
+++ b/libs/appgrid/lib/res/values/themes.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2018 The Android Open Source Project
+ ~ Copyright (C) 2023 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
@@ -12,23 +12,25 @@
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
- ~ limitations under the License
+ ~ limitations under the License.
-->
<resources>
- <style name="Theme.Launcher" parent="Theme.CarUi.NoToolbar">
- <item name="textAppearanceGridItem">@android:style/TextAppearance.DeviceDefault.Medium</item>
- <item name="textAppearanceGridItemSecondary">@android:style/TextAppearance.DeviceDefault.Small</item>
- </style>
<style name="Theme.Launcher.AppGridActivity" parent="Theme.CarUi.WithToolbar">
- <item name="textAppearanceGridItem">@android:style/TextAppearance.DeviceDefault.Medium</item>
- <item name="textAppearanceGridItemSecondary">@android:style/TextAppearance.DeviceDefault.Small</item>
+ <item name="textAppearanceGridItem">@android:style/TextAppearance.DeviceDefault.Medium
+ </item>
+ <item name="textAppearanceGridItemSecondary">
+ @android:style/TextAppearance.DeviceDefault.Small
+ </item>
</style>
<style name="Theme.Launcher.AppGridActivity.NoToolbar" parent="Theme.CarUi.NoToolbar">
- <item name="textAppearanceGridItem">@android:style/TextAppearance.DeviceDefault.Medium</item>
- <item name="textAppearanceGridItemSecondary">@android:style/TextAppearance.DeviceDefault.Small</item>
+ <item name="textAppearanceGridItem">@android:style/TextAppearance.DeviceDefault.Medium
+ </item>
+ <item name="textAppearanceGridItemSecondary">
+ @android:style/TextAppearance.DeviceDefault.Small
+ </item>
</style>
<style name="ActionDialogTheme" parent="@android:style/Theme.DeviceDefault.NoActionBar">
<item name="android:windowNoTitle">true</item>
diff --git a/src/com/android/car/carlauncher/AppGridActivity.java b/libs/appgrid/lib/src/com/android/car/carlauncher/AppGridActivity.java
index 18c814df..7d24e6b0 100644
--- a/src/com/android/car/carlauncher/AppGridActivity.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/AppGridActivity.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,12 +16,15 @@
package com.android.car.carlauncher;
+import static android.car.settings.CarSettings.Secure.KEY_UNACCEPTED_TOS_DISABLED_APPS;
+import static android.car.settings.CarSettings.Secure.KEY_USER_TOS_ACCEPTED;
import static android.content.Intent.URI_INTENT_SCHEME;
import static com.android.car.carlauncher.AppGridConstants.AppItemBoundDirection;
import static com.android.car.carlauncher.AppGridConstants.PageOrientation;
import static com.android.car.carlauncher.AppLauncherUtils.APP_TYPE_LAUNCHABLES;
import static com.android.car.carlauncher.AppLauncherUtils.APP_TYPE_MEDIA_SERVICES;
+import static com.android.car.carlauncher.hidden.HiddenApiAccess.getDragSurface;
import android.animation.ValueAnimator;
import android.app.AlertDialog;
@@ -41,7 +44,7 @@ import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
-import android.os.Build;
+import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -49,6 +52,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
+import android.provider.Settings;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
@@ -103,13 +107,13 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
AppGridPageSnapper.PageSnapListener, AppItemViewHolder.AppItemDragListener,
AppLauncherUtils.ShortcutsListener, PaginationController.DimensionUpdateListener {
private static final String TAG = "AppGridActivity";
+ private static final boolean DEBUG_BUILD = false;
private static final String MODE_INTENT_EXTRA = "com.android.car.carlauncher.mode";
private static CarUiShortcutsPopup sCarUiShortcutsPopup;
private boolean mShowAllApps = true;
private boolean mShowToolbar = true;
private final Set<String> mHiddenApps = new HashSet<>();
- private final Set<String> mCustomMediaComponents = new HashSet<>();
private PackageManager mPackageManager;
private UsageStatsManager mUsageStatsManager;
private AppInstallUninstallReceiver mInstallUninstallReceiver;
@@ -127,6 +131,7 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
private AppGridLayoutManager mLayoutManager;
private boolean mIsCurrentlyDragging;
private long mOffPageHoverBeforeScrollMs;
+ private Banner mBanner;
private AppGridDragController mAppGridDragController;
private PaginationController mPaginationController;
@@ -151,6 +156,10 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
private Messenger mMessenger;
private String mMirroringPackageName;
private Intent mMirroringIntentRedirect;
+ @VisibleForTesting
+ ContentObserver mTosContentObserver;
+ @VisibleForTesting
+ ContentObserver mTosDisabledAppsContentObserver;
/**
* enum to define the state of display area possible.
@@ -211,7 +220,7 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
});
mCarPackageManager = (CarPackageManager) mCar.getCarManager(Car.PACKAGE_SERVICE);
mCarMediaManager = (CarMediaManager) mCar.getCarManager(Car.CAR_MEDIA_SERVICE);
- initializeLauncherModel();
+ reinitializeLauncherModel();
} catch (CarNotConnectedException e) {
Log.e(TAG, "Car not connected in CarConnectionListener", e);
}
@@ -240,15 +249,11 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
}
}
- private void initializeLauncherModel() {
+ private void reinitializeLauncherModel() {
ExecutorService fetchOrderExecutorService = Executors.newSingleThreadExecutor();
fetchOrderExecutorService.execute(() -> {
- //If the order file is deleted, we need to reset the flag
- if (!mLauncherModel.doesFileExist() && mLauncherModel.isCustomized()) {
- mLauncherModel.setCustomized(false);
- mLauncherModel.setAppOrderRead(false);
- }
- mLauncherModel.updateAppsOrder();
+ // first, we fetch apps order from data store file into memory
+ mLauncherModel.loadAppsOrderFromFile();
fetchOrderExecutorService.shutdown();
});
ExecutorService alphabetizeExecutorService = Executors.newSingleThreadExecutor();
@@ -256,18 +261,17 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
Set<String> appsToHide = mShowAllApps ? Collections.emptySet() : mHiddenApps;
mAppsInfo = AppLauncherUtils.getLauncherApps(getApplicationContext(),
appsToHide,
- mCustomMediaComponents,
mMode.mAppTypes,
mMode.mOpenMediaCenter,
getSystemService(LauncherApps.class),
mCarPackageManager,
mPackageManager,
- new AppLauncherUtils.VideoAppPredicate(mPackageManager),
mCarMediaManager,
AppGridActivity.this,
mMirroringPackageName,
mMirroringIntentRedirect);
- mLauncherModel.generateAlphabetizedAppOrder(mAppsInfo);
+ // then, we ingest all apps info
+ mLauncherModel.processAppsInfoFromPlatform(mAppsInfo);
alphabetizeExecutorService.shutdown();
});
}
@@ -296,15 +300,13 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
mNextScrollDestination = mSnapCallback.getSnapPosition();
updateScrollState();
if (mMode == Mode.ALL_APPS) {
- mLauncherModel.maybeSaveAppsOrder();
+ mLauncherModel.handleAppListChange();
}
}
}
);
mCar = Car.createCar(this, mCarConnectionListener);
mHiddenApps.addAll(Arrays.asList(getResources().getStringArray(R.array.hidden_apps)));
- mCustomMediaComponents.addAll(
- Arrays.asList(getResources().getStringArray(R.array.custom_media_packages)));
setContentView(R.layout.app_grid_activity);
updateMode();
@@ -351,7 +353,7 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
toolbar.setNavButtonMode(NavButtonMode.CLOSE);
- if (Build.IS_DEBUGGABLE) {
+ if (DEBUG_BUILD) {
toolbar.setMenuItems(Collections.singletonList(MenuItem.builder(this)
.setDisplayBehavior(MenuItem.DisplayBehavior.NEVER)
.setTitle(R.string.hide_debug_apps)
@@ -439,6 +441,11 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
dimensionUpdateCallback.addListener(mPageIndicator);
dimensionUpdateCallback.addListener(this);
mPaginationController = new PaginationController(windowBackground, dimensionUpdateCallback);
+
+ mBanner = requireViewById(R.id.tos_banner);
+ updateTosBanner();
+
+ setupContentObserversForTos();
}
@Override
@@ -447,7 +454,7 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
setIntent(intent);
updateMode();
if (mCar.isConnected()) {
- initializeLauncherModel();
+ reinitializeLauncherModel();
}
}
@@ -469,6 +476,8 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
}
}
+ unregisterContentObserversForTos();
+
super.onDestroy();
}
@@ -502,6 +511,7 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
@Override
protected void onResume() {
super.onResume();
+ updateTosBannerVisibility();
updateScrollState();
mAdapter.setLayoutDirection(getResources().getConfiguration().getLayoutDirection());
}
@@ -654,7 +664,7 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
int itemCount = Math.min(mNumOfCols, statsSize);
while (itemsAdded < itemCount && currentIndex < statsSize) {
UsageStats usageStats = stats.get(currentIndex);
- String packageName = usageStats.mPackageName;
+ String packageName = usageStats.getPackageName();
currentIndex++;
// do not include self
@@ -774,7 +784,7 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
return;
}
// TODO b/256684061: find better way to get AppInfo from package name.
- initializeLauncherModel();
+ reinitializeLauncherModel();
}
}
@@ -865,7 +875,7 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
if (action == DragEvent.ACTION_DROP) {
return false;
} else {
- animateDropEnded(event.getDragSurface());
+ animateDropEnded(getDragSurface(event));
}
}
return true;
@@ -874,6 +884,7 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
private void animateDropEnded(@Nullable SurfaceControl dragSurface) {
if (dragSurface == null) {
+ Log.d(TAG, "animateDropEnded, dragSurface unavailable");
return;
}
// update default animation for the drag shadow after user lifts their finger
@@ -893,6 +904,78 @@ public class AppGridActivity extends AppCompatActivity implements InsetsChangedL
delayedDismissAnimator.start();
}
+ private void updateTosBanner() {
+ mBanner.setFirstButtonOnClickListener(v -> {
+ Intent tosIntent = AppLauncherUtils.getIntentForTosAcceptanceFlow(v.getContext());
+ AppLauncherUtils.launchApp(v.getContext(), tosIntent);
+ });
+ mBanner.setSecondButtonOnClickListener(
+ v -> mBanner.setVisibility(View.GONE));
+ }
+
+ private void updateTosBannerVisibility() {
+
+ if (AppLauncherUtils.showTosBanner(this)) {
+ runOnUiThread(() -> {
+ mBanner.setVisibility(View.VISIBLE);
+ });
+ } else {
+ mBanner.setVisibility(View.GONE);
+ }
+ }
+
+ private void setupContentObserversForTos() {
+ if (AppLauncherUtils.tosStatusUninitialized(/* context = */ this)
+ || !AppLauncherUtils.tosAccepted(/* context = */ this)) {
+ Log.i(TAG, "TOS not accepted, setting up content observers for TOS state");
+ } else {
+ Log.i(TAG, "TOS accepted, state will remain accepted, "
+ + "don't need to observe this value");
+ return;
+ }
+ mTosContentObserver = new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+ boolean tosState = AppLauncherUtils.tosAccepted(getBaseContext());
+ Log.i(TAG, "TOS state updated:" + tosState);
+ reinitializeLauncherModel();
+ if (tosState) {
+ unregisterContentObserversForTos();
+ }
+ }
+ };
+ mTosDisabledAppsContentObserver = new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+ reinitializeLauncherModel();
+ }
+ };
+ getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(KEY_USER_TOS_ACCEPTED),
+ /* notifyForDescendants*/ false,
+ mTosContentObserver);
+ getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(KEY_UNACCEPTED_TOS_DISABLED_APPS),
+ /* notifyForDescendants*/ false,
+ mTosDisabledAppsContentObserver
+ );
+ }
+
+ private void unregisterContentObserversForTos() {
+ if (mTosContentObserver != null) {
+ Log.i(TAG, "Unregister content observer for tos state");
+ getContentResolver().unregisterContentObserver(mTosContentObserver);
+ mTosContentObserver = null;
+ }
+ if (mTosDisabledAppsContentObserver != null) {
+ Log.i(TAG, "Unregister content observer for tos disabled apps");
+ getContentResolver().unregisterContentObserver(mTosDisabledAppsContentObserver);
+ mTosDisabledAppsContentObserver = null;
+ }
+ }
+
@VisibleForTesting
void setCarUxRestrictionsManager(CarUxRestrictionsManager carUxRestrictionsManager) {
mCarUxRestrictionsManager = carUxRestrictionsManager;
diff --git a/src/com/android/car/carlauncher/AppGridConstants.java b/libs/appgrid/lib/src/com/android/car/carlauncher/AppGridConstants.java
index fa818f5c..96f06ede 100644
--- a/src/com/android/car/carlauncher/AppGridConstants.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/AppGridConstants.java
@@ -16,7 +16,7 @@
package com.android.car.carlauncher;
-import android.annotation.IntDef;
+import androidx.annotation.IntDef;
/**
* Defines the constants used for custom state attributes (e.g. scrolling state, drag state) and
diff --git a/src/com/android/car/carlauncher/AppGridPageSnapper.java b/libs/appgrid/lib/src/com/android/car/carlauncher/AppGridPageSnapper.java
index 1b2bee2e..a77568e5 100644
--- a/src/com/android/car/carlauncher/AppGridPageSnapper.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/AppGridPageSnapper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,11 +21,11 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;
-import com.google.common.annotations.VisibleForTesting;
/**
* <p>Extension of a {@link LinearSnapHelper} that will snap to the next/previous page.
diff --git a/src/com/android/car/carlauncher/AppGridRecyclerView.java b/libs/appgrid/lib/src/com/android/car/carlauncher/AppGridRecyclerView.java
index d482f58c..8cd8936f 100644
--- a/src/com/android/car/carlauncher/AppGridRecyclerView.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/AppGridRecyclerView.java
@@ -145,4 +145,4 @@ public class AppGridRecyclerView extends RecyclerView implements DimensionUpdate
mPageOrientation));
addItemDecoration(mPageMarginDecoration);
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/car/carlauncher/AppItem.java b/libs/appgrid/lib/src/com/android/car/carlauncher/AppItem.java
index 5350b848..76d3055a 100644
--- a/src/com/android/car/carlauncher/AppItem.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/AppItem.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,6 +32,11 @@ public class AppItem extends LauncherItem {
mAppMetaData = appMetaData;
}
+ public AppItem(AppMetaData appMetaData) {
+ this(appMetaData.getPackageName(), appMetaData.getClassName(),
+ appMetaData.getDisplayName(), appMetaData);
+ }
+
public static final Creator<LauncherItem> CREATOR = new Creator<LauncherItem>() {
@Override
public AppItem createFromParcel(Parcel in) {
diff --git a/src/com/android/car/carlauncher/AppItemDragShadowBuilder.java b/libs/appgrid/lib/src/com/android/car/carlauncher/AppItemDragShadowBuilder.java
index 1ea40e29..1ea40e29 100644
--- a/src/com/android/car/carlauncher/AppItemDragShadowBuilder.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/AppItemDragShadowBuilder.java
diff --git a/src/com/android/car/carlauncher/AppLauncherUtils.java b/libs/appgrid/lib/src/com/android/car/carlauncher/AppLauncherUtils.java
index 29836152..dcf7c933 100644
--- a/src/com/android/car/carlauncher/AppLauncherUtils.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/AppLauncherUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,10 @@
package com.android.car.carlauncher;
import static android.car.settings.CarSettings.Secure.KEY_PACKAGES_DISABLED_ON_RESOURCE_OVERUSE;
+import static android.car.settings.CarSettings.Secure.KEY_UNACCEPTED_TOS_DISABLED_APPS;
+import static android.car.settings.CarSettings.Secure.KEY_USER_TOS_ACCEPTED;
+
+import static com.android.car.carlauncher.hidden.HiddenApiAccess.hasBaseUserRestriction;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -37,8 +41,6 @@ import android.content.pm.LauncherActivityInfo;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.content.res.XmlResourceParser;
import android.net.Uri;
import android.os.Process;
import android.os.UserHandle;
@@ -54,16 +56,16 @@ import android.view.View;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
+import com.android.car.dockutil.events.DockEventSenderHelper;
+import com.android.car.dockutil.shortcuts.PinShortcutItem;
+import com.android.car.media.common.source.MediaSourceUtil;
import com.android.car.ui.shortcutspopup.CarUiShortcutsPopup;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import com.google.common.collect.Sets;
-import java.io.IOException;
import java.lang.annotation.Retention;
-import java.util.ArrayDeque;
+import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -74,13 +76,13 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;
-import java.util.function.Predicate;
/**
* Util class that contains helper method used by app launcher classes.
*/
public class AppLauncherUtils {
private static final String TAG = "AppLauncherUtils";
+ private static final String ANDROIDX_CAR_APP_LAUNCHABLE = "androidx.car.app.launchable";
@Retention(SOURCE)
@IntDef({APP_TYPE_LAUNCHABLES, APP_TYPE_MEDIA_SERVICES})
@@ -89,10 +91,11 @@ public class AppLauncherUtils {
static final int APP_TYPE_LAUNCHABLES = 1;
static final int APP_TYPE_MEDIA_SERVICES = 2;
- private static final String TAG_AUTOMOTIVE_APP = "automotiveApp";
- private static final String TAG_USES = "uses";
- private static final String ATTRIBUTE_NAME = "name";
- private static final String TYPE_VIDEO = "video";
+ // This value indicates if TOS has not been accepted by the user
+ private static final String TOS_NOT_ACCEPTED = "1";
+ // This value indicates if TOS is in uninitialized state
+ private static final String TOS_UNINITIALIZED = "0";
+ static final String TOS_DISABLED_APPS_SEPARATOR = ",";
static final String PACKAGES_DISABLED_ON_RESOURCE_OVERUSE_SEPARATOR = ";";
// Max no. of uses tags in automotiveApp XML. This is an arbitrary limit to be defensive
@@ -112,12 +115,10 @@ public class AppLauncherUtils {
/**
* Helper method that launches the app given the app's AppMetaData.
- *
- * @param app the requesting app's AppMetaData
*/
- static void launchApp(Context context, Intent intent) {
+ public static void launchApp(Context context, Intent intent) {
ActivityOptions options = ActivityOptions.makeBasic();
- options.setLaunchDisplayId(context.getDisplayId());
+ options.setLaunchDisplayId(context.getDisplay().getDisplayId());
context.startActivity(intent, options.toBundle());
}
@@ -169,7 +170,7 @@ public class AppLauncherUtils {
}
}
- private final static LauncherAppsInfo EMPTY_APPS_INFO = new LauncherAppsInfo(
+ private static final LauncherAppsInfo EMPTY_APPS_INFO = new LauncherAppsInfo(
Collections.emptyMap(), Collections.emptyMap());
/*
@@ -200,17 +201,12 @@ public class AppLauncherUtils {
* launcher activities and media services.
*
* @param appsToHide A (possibly empty) list of apps (package names) to hide
- * @param customMediaComponents A (possibly empty) list of media components (component names)
- * that shouldn't be shown in Launcher because their applications'
- * launcher activities will be shown
* @param appTypes Types of apps to show (e.g.: all, or media sources only)
* @param openMediaCenter Whether launcher should navigate to media center when the
* user selects a media source.
* @param launcherApps The {@link LauncherApps} system service
* @param carPackageManager The {@link CarPackageManager} system service
* @param packageManager The {@link PackageManager} system service
- * @param videoAppPredicate Predicate that checks if a given {@link ResolveInfo} resolves
- * to a video app. See {@link #VideoAppPredicate}. Media-services
* of such apps are always excluded.
* @param carMediaManager The {@link CarMediaManager} system service
* @return a new {@link LauncherAppsInfo}
@@ -219,13 +215,11 @@ public class AppLauncherUtils {
static LauncherAppsInfo getLauncherApps(
Context context,
@NonNull Set<String> appsToHide,
- @NonNull Set<String> customMediaComponents,
@AppTypes int appTypes,
boolean openMediaCenter,
LauncherApps launcherApps,
CarPackageManager carPackageManager,
PackageManager packageManager,
- @NonNull Predicate<ResolveInfo> videoAppPredicate,
CarMediaManager carMediaManager,
ShortcutsListener shortcutsListener,
String mirroringAppPkgName,
@@ -236,15 +230,14 @@ public class AppLauncherUtils {
return EMPTY_APPS_INFO;
}
+ boolean isDockEnabled = context.getResources().getBoolean(R.bool.config_enableDock);
+
// Using new list since we require a mutable list to do removeIf.
List<ResolveInfo> mediaServices = new ArrayList<>();
mediaServices.addAll(
packageManager.queryIntentServices(
new Intent(MediaBrowserService.SERVICE_INTERFACE),
PackageManager.GET_RESOLVED_FILTER));
- // Exclude Media Services from Video apps from being considered. These apps should offer a
- // normal Launcher Activity as an entry point.
- mediaServices.removeIf(videoAppPredicate);
List<LauncherActivityInfo> availableActivities =
launcherApps.getActivityList(null, Process.myUserHandle());
@@ -253,6 +246,11 @@ public class AppLauncherUtils {
Map<ComponentName, AppMetaData> launchablesMap = new HashMap<>(launchablesSize);
Map<ComponentName, ResolveInfo> mediaServicesMap = new HashMap<>(mediaServices.size());
Set<String> mEnabledPackages = new ArraySet<>(launchablesSize);
+ Set<String> tosDisabledPackages = getTosDisabledPackages(context);
+
+ Set<String> customMediaComponents = Sets.newHashSet(
+ context.getResources().getStringArray(
+ com.android.car.media.common.R.array.custom_media_packages));
// Process media services
if ((appTypes & APP_TYPE_MEDIA_SERVICES) != 0) {
@@ -262,29 +260,27 @@ public class AppLauncherUtils {
ComponentName componentName = new ComponentName(packageName, className);
mediaServicesMap.put(componentName, info);
mEnabledPackages.add(packageName);
- if (shouldAddToLaunchables(componentName, appsToHide, customMediaComponents,
- appTypes, APP_TYPE_MEDIA_SERVICES)) {
- final boolean isDistractionOptimized = true;
-
- Intent intent = new Intent(Car.CAR_INTENT_ACTION_MEDIA_TEMPLATE);
- intent.putExtra(Car.CAR_EXTRA_MEDIA_COMPONENT, componentName.flattenToString());
-
+ if (shouldAddToLaunchables(context, componentName, appsToHide,
+ customMediaComponents, appTypes, APP_TYPE_MEDIA_SERVICES)) {
CharSequence displayName = info.serviceInfo.loadLabel(packageManager);
AppMetaData appMetaData = new AppMetaData(
displayName,
componentName,
info.serviceInfo.loadIcon(packageManager),
- isDistractionOptimized,
+ /* isDistractionOptimized= */ true,
/* isMirroring = */ false,
+ /* isDisabledByTos= */ tosDisabledPackages.contains(packageName),
contextArg -> {
if (openMediaCenter) {
- AppLauncherUtils.launchApp(contextArg, intent);
+ AppLauncherUtils.launchApp(contextArg,
+ createMediaLaunchIntent(componentName));
} else {
selectMediaSourceAndFinish(contextArg, componentName,
carMediaManager);
}
},
- buildShortcuts(packageName, displayName, shortcutsListener));
+ buildShortcuts(componentName, displayName, shortcutsListener,
+ isDockEnabled));
launchablesMap.put(componentName, appMetaData);
}
}
@@ -294,36 +290,36 @@ public class AppLauncherUtils {
if ((appTypes & APP_TYPE_LAUNCHABLES) != 0) {
for (LauncherActivityInfo info : availableActivities) {
ComponentName componentName = info.getComponentName();
- String packageName = componentName.getPackageName();
- mEnabledPackages.add(packageName);
- if (shouldAddToLaunchables(componentName, appsToHide, customMediaComponents,
- appTypes, APP_TYPE_LAUNCHABLES)) {
+ mEnabledPackages.add(componentName.getPackageName());
+ if (shouldAddToLaunchables(context, componentName, appsToHide,
+ customMediaComponents, appTypes, APP_TYPE_LAUNCHABLES)) {
boolean isDistractionOptimized =
- isActivityDistractionOptimized(carPackageManager, packageName,
- info.getName());
-
- Intent intent = new Intent(Intent.ACTION_MAIN)
- .setComponent(componentName)
- .addCategory(Intent.CATEGORY_LAUNCHER)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ isActivityDistractionOptimized(carPackageManager,
+ componentName.getPackageName(), info.getName());
+ boolean isDisabledByTos = tosDisabledPackages
+ .contains(componentName.getPackageName());
CharSequence displayName = info.getLabel();
- boolean isMirroring = packageName.equals(mirroringAppPkgName);
+ boolean isMirroring = componentName.getPackageName()
+ .equals(mirroringAppPkgName);
AppMetaData appMetaData = new AppMetaData(
displayName,
componentName,
info.getBadgedIcon(0),
isDistractionOptimized,
isMirroring,
+ isDisabledByTos,
contextArg -> {
- if (packageName.equals(mirroringAppPkgName)) {
+ if (componentName.getPackageName().equals(mirroringAppPkgName)) {
Log.d(TAG, "non-media service package name "
+ "equals mirroring pkg name");
}
AppLauncherUtils.launchApp(contextArg,
- isMirroring ? mirroringAppRedirect : intent);
+ isMirroring ? mirroringAppRedirect :
+ createAppLaunchIntent(componentName));
},
- buildShortcuts(packageName, displayName, shortcutsListener));
+ buildShortcuts(componentName, displayName, shortcutsListener,
+ isDockEnabled));
launchablesMap.put(componentName, appMetaData);
}
}
@@ -334,17 +330,13 @@ public class AppLauncherUtils {
String packageName = info.activityInfo.packageName;
String className = info.activityInfo.name;
ComponentName componentName = new ComponentName(packageName, className);
- if (!shouldAddToLaunchables(componentName, appsToHide, customMediaComponents,
- appTypes, APP_TYPE_LAUNCHABLES)) {
+ if (!shouldAddToLaunchables(context, componentName, appsToHide,
+ customMediaComponents, appTypes, APP_TYPE_LAUNCHABLES)) {
continue;
}
boolean isDistractionOptimized =
isActivityDistractionOptimized(carPackageManager, packageName, className);
-
- Intent intent = new Intent(Intent.ACTION_MAIN)
- .setComponent(componentName)
- .addCategory(Intent.CATEGORY_LAUNCHER)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ boolean isDisabledByTos = tosDisabledPackages.contains(packageName);
CharSequence displayName = info.activityInfo.loadLabel(packageManager);
AppMetaData appMetaData = new AppMetaData(
@@ -353,13 +345,13 @@ public class AppLauncherUtils {
info.activityInfo.loadIcon(packageManager),
isDistractionOptimized,
/* isMirroring = */ false,
+ isDisabledByTos,
contextArg -> {
packageManager.setApplicationEnabledSetting(packageName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
- /* Fetch the current enabled setting to make sure the setting is synced
- * before launching the activity. Otherwise, the activity may not
- * launch.
- */
+ // Fetch the current enabled setting to make sure the setting is synced
+ // before launching the activity. Otherwise, the activity may not
+ // launch.
if (packageManager.getApplicationEnabledSetting(packageName)
!= PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
throw new IllegalStateException(
@@ -367,9 +359,41 @@ public class AppLauncherUtils {
+ "]");
}
Log.i(TAG, "Successfully enabled package [" + packageName + "]");
- AppLauncherUtils.launchApp(contextArg, intent);
+ AppLauncherUtils.launchApp(contextArg,
+ createAppLaunchIntent(componentName));
},
- buildShortcuts(packageName, displayName, shortcutsListener));
+ buildShortcuts(componentName, displayName, shortcutsListener,
+ isDockEnabled));
+ launchablesMap.put(componentName, appMetaData);
+ }
+
+ List<ResolveInfo> restrictedActivities = getTosDisabledActivities(
+ context,
+ packageManager,
+ mEnabledPackages
+ );
+ for (ResolveInfo info: restrictedActivities) {
+ String packageName = info.activityInfo.packageName;
+ String className = info.activityInfo.name;
+ ComponentName componentName = new ComponentName(packageName, className);
+
+ boolean isDistractionOptimized =
+ isActivityDistractionOptimized(carPackageManager, packageName, className);
+ boolean isDisabledByTos = tosDisabledPackages.contains(packageName);
+
+ AppMetaData appMetaData = new AppMetaData(
+ info.activityInfo.loadLabel(packageManager),
+ componentName,
+ info.activityInfo.loadIcon(packageManager),
+ isDistractionOptimized,
+ /* isMirroring = */ false,
+ isDisabledByTos,
+ contextArg -> {
+ Intent tosIntent = getIntentForTosAcceptanceFlow(contextArg);
+ launchApp(contextArg, tosIntent);
+ },
+ null
+ );
launchablesMap.put(componentName, appMetaData);
}
}
@@ -377,18 +401,40 @@ public class AppLauncherUtils {
return new LauncherAppsInfo(launchablesMap, mediaServicesMap);
}
- private static Consumer<Pair<Context, View>> buildShortcuts(String packageName,
- CharSequence displayName, ShortcutsListener shortcutsListener) {
+ /**
+ * Gets the intent for launching the TOS acceptance flow
+ *
+ * @param context The app context
+ * @return TOS intent, or null
+ */
+ @Nullable
+ public static Intent getIntentForTosAcceptanceFlow(Context context) {
+ String tosIntentName =
+ context.getResources().getString(R.string.user_tos_activity_intent);
+ try {
+ return Intent.parseUri(tosIntentName, Intent.URI_ANDROID_APP_SCHEME);
+ } catch (URISyntaxException se) {
+ Log.e(TAG, "Invalid intent URI in user_tos_activity_intent", se);
+ return null;
+ }
+ }
+
+ private static Consumer<Pair<Context, View>> buildShortcuts(
+ ComponentName componentName, CharSequence displayName,
+ ShortcutsListener shortcutsListener, boolean isDockEnabled) {
return pair -> {
- CarUiShortcutsPopup carUiShortcutsPopup = new CarUiShortcutsPopup.Builder()
- .addShortcut(
- buildForceStopShortcut(packageName, displayName, pair.first,
- shortcutsListener)
- )
- .addShortcut(buildAppInfoShortcut(packageName, pair.first))
- .build(pair.first,
- pair.second
- );
+ CarUiShortcutsPopup.Builder carUiShortcutsPopupBuilder =
+ new CarUiShortcutsPopup.Builder()
+ .addShortcut(buildForceStopShortcut(componentName.getPackageName(),
+ displayName, pair.first, shortcutsListener))
+ .addShortcut(buildAppInfoShortcut(componentName.getPackageName(),
+ pair.first));
+ if (isDockEnabled) {
+ carUiShortcutsPopupBuilder
+ .addShortcut(buildPinToDockShortcut(componentName, pair.first));
+ }
+ CarUiShortcutsPopup carUiShortcutsPopup = carUiShortcutsPopupBuilder
+ .build(pair.first, pair.second);
carUiShortcutsPopup.show();
shortcutsListener.onShortcutsShow(carUiShortcutsPopup);
@@ -449,6 +495,15 @@ public class AppLauncherUtils {
};
}
+ private static CarUiShortcutsPopup.ShortcutItem buildPinToDockShortcut(
+ ComponentName componentName, Context context) {
+ DockEventSenderHelper mHelper = new DockEventSenderHelper(context);
+ return new PinShortcutItem(context.getResources(), /* isItemPinned= */ false,
+ /* pinItemClickDelegate= */ () -> mHelper.sendPinEvent(componentName),
+ /* unpinItemClickDelegate= */ () -> mHelper.sendUnpinEvent(componentName)
+ );
+ }
+
/**
* Force stops an app
* <p>Note: Uses hidden apis<p/>
@@ -470,7 +525,7 @@ public class AppLauncherUtils {
}
private static boolean isCurrentMediaSource(CarMediaManager carMediaManager,
- String packageName, @CarMediaManager.MediaSourceMode int mode) {
+ String packageName, int mode) {
ComponentName componentName = carMediaManager.getMediaSource(mode);
if (componentName == null) {
//There is no current media source.
@@ -485,7 +540,7 @@ public class AppLauncherUtils {
*/
private static void maybeReplaceMediaSource(CarMediaManager carMediaManager, String packageName,
Map<ComponentName, ResolveInfo> allMediaServices,
- @CarMediaManager.MediaSourceMode int mode) {
+ int mode) {
if (!isCurrentMediaSource(carMediaManager, packageName, mode)) {
return;
}
@@ -519,7 +574,7 @@ public class AppLauncherUtils {
return false;
}
UserHandle user = UserHandle.getUserHandleForUid(appInfo.uid);
- if (userManager.hasBaseUserRestriction(restriction, user)) {
+ if (hasBaseUserRestriction(userManager, restriction, user)) {
Log.d(TAG, " Disabled because " + user + " has " + restriction
+ " restriction");
return true;
@@ -557,181 +612,77 @@ public class AppLauncherUtils {
return false;
}
- /**
- * Predicate that can be used to check if a given {@link ResolveInfo} resolves to a Video app.
- */
- static class VideoAppPredicate implements Predicate<ResolveInfo> {
- private final PackageManager mPackageManager;
-
- VideoAppPredicate(PackageManager packageManager) {
- mPackageManager = packageManager;
- }
-
- @Override
- public boolean test(ResolveInfo resolveInfo) {
- String packageName = resolveInfo != null ? getPackageName(resolveInfo) : null;
- if (packageName == null) {
- Log.w(TAG, "Unable to determine packageName from resolveInfo");
- return false;
- }
- List<String> automotiveAppTypes =
- getAutomotiveAppTypes(mPackageManager, getPackageName(resolveInfo));
- return automotiveAppTypes.contains(TYPE_VIDEO);
- }
-
- protected String getPackageName(ResolveInfo resolveInfo) {
- // A valid ResolveInfo should have exactly one of these set.
- if (resolveInfo.activityInfo != null) {
- return resolveInfo.activityInfo.packageName;
- }
- if (resolveInfo.serviceInfo != null) {
- return resolveInfo.serviceInfo.packageName;
- }
- if (resolveInfo.providerInfo != null) {
- return resolveInfo.providerInfo.packageName;
- }
- // Unexpected case.
- return null;
- }
+ private static List<ResolveInfo> getDisabledActivities(Context context,
+ PackageManager packageManager, Set<String> enabledPackages) {
+ return getActivitiesFromSystemPreferences(
+ context,
+ packageManager,
+ enabledPackages,
+ KEY_PACKAGES_DISABLED_ON_RESOURCE_OVERUSE,
+ PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS,
+ PACKAGES_DISABLED_ON_RESOURCE_OVERUSE_SEPARATOR);
}
-
- /**
- * Returns whether app identified by {@code packageName} declares itself as a video app.
- */
- public static boolean isVideoApp(PackageManager packageManager, String packageName) {
- return getAutomotiveAppTypes(packageManager, packageName).contains(TYPE_VIDEO);
+ private static List<ResolveInfo> getTosDisabledActivities(
+ Context context,
+ PackageManager packageManager,
+ Set<String> enabledPackages) {
+ return getActivitiesFromSystemPreferences(
+ context,
+ packageManager,
+ enabledPackages,
+ KEY_UNACCEPTED_TOS_DISABLED_APPS,
+ PackageManager.MATCH_DISABLED_COMPONENTS,
+ TOS_DISABLED_APPS_SEPARATOR);
}
/**
- * Queries an app manifest and resources to determine the types of AAOS app it declares itself
- * as.
+ * Get a list of activities from packages in system preferences by key
+ * @param context the app context
+ * @param packageManager The PackageManager
+ * @param enabledPackages Set of packages enabled by system
+ * @param settingsKey Key to read from system preferences
+ * @param sep Separator
*
- * @param packageManager {@link PackageManager} to query.
- * @param packageName App package.
- * @return List of AAOS app-types from XML resources.
+ * @return List of activities read from system preferences
*/
- public static List<String> getAutomotiveAppTypes(PackageManager packageManager,
- String packageName) {
- ApplicationInfo appInfo;
- Resources appResources;
- try {
- appInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
- appResources = packageManager.getResourcesForApplication(appInfo);
- } catch (PackageManager.NameNotFoundException e) {
- Log.w(TAG, "Unexpected package not found for: " + packageName, e);
- return new ArrayList<>();
- }
-
- int resourceId =
- appInfo.metaData != null
- ? appInfo.metaData.getInt("com.android.automotive", -1) : -1;
- if (resourceId == -1) {
- return new ArrayList<>();
- }
- try (XmlResourceParser parser = appResources.getXml(resourceId)) {
- return parseAutomotiveAppTypes(parser);
- }
- }
-
- @VisibleForTesting
- static List<String> parseAutomotiveAppTypes(XmlPullParser parser) {
- try {
- // This pattern for parsing can be seen in Javadocs for XmlPullParser.
- List<String> appTypes = new ArrayList<>();
- ArrayDeque<String> tagStack = new ArrayDeque<>();
- int eventType = parser.getEventType();
- while (eventType != XmlPullParser.END_DOCUMENT) {
- if (eventType == XmlPullParser.START_TAG) {
- String tag = parser.getName();
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "Start tag " + tag);
- }
- tagStack.addFirst(tag);
- if (!validTagStack(tagStack)) {
- Log.w(TAG, "Invalid XML; tagStack: " + tagStack);
- return new ArrayList<>();
- }
- if (TAG_USES.equals(tag)) {
- String nameValue =
- parser.getAttributeValue(/* namespace= */ null, ATTRIBUTE_NAME);
- if (TextUtils.isEmpty(nameValue)) {
- Log.w(TAG, "Invalid XML; uses tag with missing/empty name attribute");
- return new ArrayList<>();
- }
- appTypes.add(nameValue);
- if (appTypes.size() > MAX_APP_TYPES) {
- Log.w(TAG, "Too many uses tags in automotiveApp tag");
- return new ArrayList<>();
- }
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "Found appType: " + nameValue);
- }
- }
- } else if (eventType == XmlPullParser.END_TAG) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "End tag " + parser.getName());
- }
- tagStack.removeFirst();
- }
- eventType = parser.next();
- }
- return appTypes;
- } catch (XmlPullParserException | IOException e) {
- Log.w(TAG, "Unexpected exception whiling parsing XML resource", e);
- return new ArrayList<>();
- }
- }
-
- private static boolean validTagStack(ArrayDeque<String> tagStack) {
- // Expected to be called after a new tag is pushed on this stack.
- // Ensures that XML is of form:
- // <automotiveApp>
- // <uses/>
- // <uses/>
- // ....
- // </automotiveApp>
- switch (tagStack.size()) {
- case 1:
- return TAG_AUTOMOTIVE_APP.equals(tagStack.peekFirst());
- case 2:
- return TAG_USES.equals(tagStack.peekFirst());
- default:
- return false;
- }
- }
-
- private static List<ResolveInfo> getDisabledActivities(Context context,
- PackageManager packageManager, Set<String> enabledPackages) {
+ private static List<ResolveInfo> getActivitiesFromSystemPreferences(
+ Context context,
+ PackageManager packageManager,
+ Set<String> enabledPackages,
+ String settingsKey,
+ int filter,
+ String sep) {
ContentResolver contentResolverForUser = context.createContextAsUser(
UserHandle.getUserHandleForUid(Process.myUid()), /* flags= */ 0)
.getContentResolver();
- String settingsValue = Settings.Secure.getString(contentResolverForUser,
- KEY_PACKAGES_DISABLED_ON_RESOURCE_OVERUSE);
- Set<String> disabledPackages = TextUtils.isEmpty(settingsValue) ? new ArraySet<>()
+ String settingsValue = Settings.Secure.getString(contentResolverForUser, settingsKey);
+ Set<String> packages = TextUtils.isEmpty(settingsValue) ? new ArraySet<>()
: new ArraySet<>(Arrays.asList(settingsValue.split(
- PACKAGES_DISABLED_ON_RESOURCE_OVERUSE_SEPARATOR)));
- if (disabledPackages.isEmpty()) {
+ sep)));
+
+ if (packages.isEmpty()) {
return Collections.emptyList();
}
List<ResolveInfo> allActivities = packageManager.queryIntentActivities(
new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER),
PackageManager.ResolveInfoFlags.of(PackageManager.GET_RESOLVED_FILTER
- | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS));
+ | filter));
- List<ResolveInfo> disabledActivities = new ArrayList<>();
+ List<ResolveInfo> activities = new ArrayList<>();
for (int i = 0; i < allActivities.size(); ++i) {
ResolveInfo info = allActivities.get(i);
if (!enabledPackages.contains(info.activityInfo.packageName)
- && disabledPackages.contains(info.activityInfo.packageName)) {
- disabledActivities.add(info);
+ && packages.contains(info.activityInfo.packageName)) {
+ activities.add(info);
}
}
- return disabledActivities;
+ return activities;
}
- private static boolean shouldAddToLaunchables(@NonNull ComponentName componentName,
+ private static boolean shouldAddToLaunchables(Context context,
+ @NonNull ComponentName componentName,
@NonNull Set<String> appsToHide,
@NonNull Set<String> customMediaComponents,
@AppTypes int appTypesToShow,
@@ -745,11 +696,23 @@ public class AppLauncherUtils {
// For a media service in customMediaComponents, if its application's launcher
// activity will be shown in the Launcher, don't show the service's icon in the
// Launcher.
- if (customMediaComponents.contains(componentName.flattenToString())
- && (appTypesToShow & APP_TYPE_LAUNCHABLES) != 0) {
- return false;
+ if (customMediaComponents.contains(componentName.flattenToString())) {
+ if ((appTypesToShow & APP_TYPE_LAUNCHABLES) != 0) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "MBS for custom media app " + componentName
+ + " is skipped in app launcher");
+ }
+ return false;
+ }
+ // Media switcher use case should still show
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "MBS for custom media app " + componentName
+ + " is included in media switcher");
+ }
+ return true;
}
- return true;
+ // Only Keep MBS that is a media template
+ return new MediaSourceUtil(context).isMediaTemplate(componentName);
// Process activities
case APP_TYPE_LAUNCHABLES:
return true;
@@ -806,4 +769,76 @@ public class AppLauncherUtils {
void onStopAppSuccess(String message);
}
+
+ /**
+ * Returns a set of packages that are disabled by tos
+ *
+ * @param context The application context
+ * @return Set of packages disabled by tos
+ */
+ public static Set<String> getTosDisabledPackages(Context context) {
+ ContentResolver contentResolverForUser = context.createContextAsUser(
+ UserHandle.getUserHandleForUid(Process.myUid()), /* flags= */ 0)
+ .getContentResolver();
+ String settingsValue = Settings.Secure.getString(contentResolverForUser,
+ KEY_UNACCEPTED_TOS_DISABLED_APPS);
+ return TextUtils.isEmpty(settingsValue) ? new ArraySet<>()
+ : new ArraySet<>(Arrays.asList(settingsValue.split(
+ TOS_DISABLED_APPS_SEPARATOR)));
+ }
+
+ private static Intent createMediaLaunchIntent(ComponentName componentName) {
+ return new Intent(Car.CAR_INTENT_ACTION_MEDIA_TEMPLATE)
+ .putExtra(Car.CAR_EXTRA_MEDIA_COMPONENT, componentName.flattenToString());
+ }
+
+ private static Intent createAppLaunchIntent(ComponentName componentName) {
+ return new Intent(Intent.ACTION_MAIN)
+ .setComponent(componentName)
+ .addCategory(Intent.CATEGORY_LAUNCHER)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+
+ /**
+ * Check if the tos banner has to be displayed
+ * @param context The application context
+ * @return true if the banner needs to be displayed, false otherwise
+ */
+ static boolean showTosBanner(Context context) {
+ // TODO (b/277235742): Add backoff strategy to dismiss banner
+ return !tosAccepted(context);
+ }
+
+ /**
+ * Check if a user has accepted TOS
+ *
+ * @param context The application context
+ * @return true if the user has accepted Tos, false otherwise
+ */
+ public static boolean tosAccepted(Context context) {
+ ContentResolver contentResolverForUser = context.createContextAsUser(
+ UserHandle.getUserHandleForUid(Process.myUid()), /* flags= */ 0)
+ .getContentResolver();
+ String settingsValue = Settings.Secure.getString(
+ contentResolverForUser,
+ KEY_USER_TOS_ACCEPTED);
+ return !Objects.equals(settingsValue, TOS_NOT_ACCEPTED);
+ }
+
+ /**
+ * Check if TOS status is uninitialized
+ *
+ * @param context The application context
+ *
+ * @return true if tos is uninitialized, false otherwise
+ */
+ static boolean tosStatusUninitialized(Context context) {
+ ContentResolver contentResolverForUser = context.createContextAsUser(
+ UserHandle.getUserHandleForUid(Process.myUid()), /* flags= */ 0)
+ .getContentResolver();
+ String settingsValue = Settings.Secure.getString(
+ contentResolverForUser,
+ KEY_USER_TOS_ACCEPTED);
+ return Objects.equals(settingsValue, TOS_UNINITIALIZED);
+ }
}
diff --git a/src/com/android/car/carlauncher/AppMetaData.java b/libs/appgrid/lib/src/com/android/car/carlauncher/AppMetaData.java
index 7b37260d..bd57b4e2 100644
--- a/src/com/android/car/carlauncher/AppMetaData.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/AppMetaData.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -40,6 +40,7 @@ public final class AppMetaData {
private final Drawable mIcon;
private final boolean mIsDistractionOptimized;
private final boolean mIsMirroring;
+ private final boolean mIsDisabledByTos;
private final Consumer<Context> mLaunchCallback;
private final Consumer<Pair<Context, View>> mAlternateLaunchCallback;
@@ -50,16 +51,18 @@ public final class AppMetaData {
* @param componentName the component name
* @param icon the application's icon
* @param isDistractionOptimized whether mainLaunchIntent is safe for driving
+ * @param isDisabledByTos whether app is disabled by tos
* @param launchCallback action to execute to launch this app
* @param alternateLaunchCallback temporary alternative action to execute (e.g.: for media apps
* this allows opening their own UI).
*/
- AppMetaData(
+ public AppMetaData(
CharSequence displayName,
ComponentName componentName,
Drawable icon,
boolean isDistractionOptimized,
boolean isMirroring,
+ boolean isDisabledByTos,
Consumer<Context> launchCallback,
Consumer<Pair<Context, View>> alternateLaunchCallback) {
mDisplayName = displayName == null ? "" : displayName.toString();
@@ -67,6 +70,7 @@ public final class AppMetaData {
mIcon = icon;
mIsDistractionOptimized = isDistractionOptimized;
mIsMirroring = isMirroring;
+ mIsDisabledByTos = isDisabledByTos;
mLaunchCallback = launchCallback;
mAlternateLaunchCallback = alternateLaunchCallback;
}
@@ -103,7 +107,11 @@ public final class AppMetaData {
return mIsDistractionOptimized;
}
- boolean getIsMirroring() {
+ public boolean getIsDisabledByTos() {
+ return mIsDisabledByTos;
+ }
+
+ public boolean getIsMirroring() {
return mIsMirroring;
}
diff --git a/libs/appgrid/lib/src/com/android/car/carlauncher/Banner.java b/libs/appgrid/lib/src/com/android/car/carlauncher/Banner.java
new file mode 100644
index 00000000..ebfd7f27
--- /dev/null
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/Banner.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+/**
+ * Banner view to display text with multiple cta actions
+ */
+public class Banner extends ConstraintLayout {
+
+ private final TextView mFirstButton;
+ private final TextView mSecondButton;
+ private final TextView mTitleTextView;
+
+ public Banner(@NonNull Context context) {
+ this(context, null);
+ }
+
+ public Banner(@NonNull Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public Banner(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public Banner(
+ @NonNull Context context,
+ @Nullable AttributeSet attrs,
+ int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ inflater.inflate(R.layout.banner, this);
+
+ mFirstButton = requireViewById(R.id.first_button);
+ mSecondButton = requireViewById(R.id.second_button);
+ mTitleTextView = requireViewById(R.id.banner_title);
+
+ TypedArray attrArray = context.getTheme().obtainStyledAttributes(
+ attrs,
+ R.styleable.Banner,
+ defStyleAttr,
+ defStyleRes);
+
+ try {
+ setFirstButtonText(attrArray.getString(R.styleable.Banner_first_button_text));
+ setSecondButtonText(attrArray.getString(R.styleable.Banner_second_button_text));
+ setTitleText(attrArray.getString(R.styleable.Banner_title_text));
+ } finally {
+ attrArray.recycle();
+ }
+ }
+
+ /**
+ * Sets the text to be displayed on the first button
+ *
+ * @param text text to be displayed
+ */
+ public void setFirstButtonText(String text) {
+ mFirstButton.setText(text);
+ }
+
+ /**
+ * Register a callback to be invoked when the first button is clicked.
+ *
+ * @param listener The callback that will run on clicking the button
+ */
+ public void setFirstButtonOnClickListener(@Nullable View.OnClickListener listener) {
+ mFirstButton.setOnClickListener(listener);
+ }
+
+ /**
+ * Sets the text to be displayed on the second button
+ *
+ * @param text text to be displayed
+ */
+ public void setSecondButtonText(String text) {
+ mSecondButton.setText(text);
+ }
+
+ /**
+ * Register a callback to be invoked when the first button is clicked.
+ *
+ * @param listener The callback that will run on clicking the button
+ */
+ public void setSecondButtonOnClickListener(@Nullable View.OnClickListener listener) {
+ mSecondButton.setOnClickListener(listener);
+ }
+
+ /**
+ * Sets the primary text to be displayed on banner
+ *
+ * @param text text to be displayed
+ */
+ public void setTitleText(String text) {
+ mTitleTextView.setText(text);
+ }
+}
diff --git a/src/com/android/car/carlauncher/LauncherItem.java b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherItem.java
index dd8fc67a..42fb35ee 100644
--- a/src/com/android/car/carlauncher/LauncherItem.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherItem.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -64,7 +64,7 @@ public abstract class LauncherItem implements Parcelable {
/**
* This method is used to convert a LauncherItem to a protobuf class
*/
- public LauncherItemMessage launcherItem2Msg(int relativePosition, int containerID) {
+ public LauncherItemMessage convertToMessage(int relativePosition, int containerID) {
LauncherItemMessage.Builder builder = LauncherItemMessage.newBuilder()
.setPackageName(mPackageName)
.setClassName(mClassName)
diff --git a/src/com/android/car/carlauncher/LauncherItemDiffCallback.java b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherItemDiffCallback.java
index 78ae82f7..e0605906 100644
--- a/src/com/android/car/carlauncher/LauncherItemDiffCallback.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherItemDiffCallback.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/com/android/car/carlauncher/LauncherItemHelper.java b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherItemMessageHelper.java
index 8f0446f4..65487251 100644
--- a/src/com/android/car/carlauncher/LauncherItemHelper.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherItemMessageHelper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,6 +16,9 @@
package com.android.car.carlauncher;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import com.android.car.carlauncher.LauncherItemProto.LauncherItemListMessage;
import com.android.car.carlauncher.LauncherItemProto.LauncherItemMessage;
@@ -27,20 +30,14 @@ import java.util.List;
/**
* Helper class that provides method used by LauncherModel
*/
-public class LauncherItemHelper {
- private static final String TAG = "LauncherItemHelper";
-
+public class LauncherItemMessageHelper {
/**
- * This method is used to convert a list of launcher items into protobuf class
+ * Convert a List of {@link LauncherItemMessage} to a single {@link LauncherItemListMessage}.
*/
- public LauncherItemListMessage launcherList2Msg(List<LauncherItem> launcherItemList) {
- List<LauncherItemMessage> msgList = new ArrayList<LauncherItemMessage>();
- if (launcherItemList == null) {
+ @Nullable
+ public LauncherItemListMessage convertToMessage(List<LauncherItemMessage> msgList) {
+ if (msgList == null) {
return null;
- } else {
- for (int i = 0; i < launcherItemList.size(); i++) {
- msgList.add(launcherItemList.get(i).launcherItem2Msg(i, -1));
- }
}
LauncherItemListMessage.Builder builder =
LauncherItemListMessage.newBuilder().addAllLauncherItemMessage(msgList);
@@ -48,20 +45,23 @@ public class LauncherItemHelper {
}
/**
- * This method converts sort the LauncherItemList based on their
- * relative order in the proto file
+ * Converts {@link LauncherItemListMessage} to a List of {@link LauncherItemMessage},
+ * sorts the LauncherItemList based on their relative order in the file, then return the list.
*/
- public List<LauncherItemMessage> sortLauncherItemListMsg(
- LauncherItemListMessage launcherItemListMsg) {
- List<LauncherItemMessage> itemListMsg = launcherItemListMsg.getLauncherItemMessageList();
- List<LauncherItemMessage> items = new ArrayList<>();
- if (!itemListMsg.isEmpty() && itemListMsg.size() > 0) {
- //Need to create a new list for sorting purposes since ProtobufArrayList is not mutable
- items.addAll(itemListMsg);
- Collections.sort(items,
+ @NonNull
+ public List<LauncherItemMessage> getSortedList(@Nullable LauncherItemListMessage protoLstMsg) {
+ if (protoLstMsg == null) {
+ return new ArrayList<>();
+ }
+ List<LauncherItemMessage> itemMsgList = protoLstMsg.getLauncherItemMessageList();
+ List<LauncherItemMessage> sortedItemMsgList = new ArrayList<>();
+ if (!itemMsgList.isEmpty() && itemMsgList.size() > 0) {
+ // need to create a new list for sorting purposes since ProtobufArrayList is not mutable
+ sortedItemMsgList.addAll(itemMsgList);
+ Collections.sort(sortedItemMsgList,
Comparator.comparingInt(LauncherItemMessage::getRelativePosition));
}
- return items;
+ return sortedItemMsgList;
}
}
diff --git a/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherViewModel.java b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherViewModel.java
new file mode 100644
index 00000000..80602abb
--- /dev/null
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherViewModel.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher;
+
+import android.content.ComponentName;
+import android.content.Intent;
+
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.ViewModel;
+
+import com.android.car.carlauncher.apporder.AppOrderController;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A launcher model decides how the apps are displayed.
+ */
+public class LauncherViewModel extends ViewModel {
+ private final AppOrderController mAppOrderController;
+
+ public LauncherViewModel(File launcherFileDir) {
+ mAppOrderController = new AppOrderController(launcherFileDir);
+ }
+
+ public static final Comparator<LauncherItem> ALPHABETICAL_COMPARATOR = Comparator.comparing(
+ LauncherItem::getDisplayName, String::compareToIgnoreCase);
+
+ public LiveData<List<LauncherItem>> getCurrentLauncher() {
+ return mAppOrderController.getAppOrderObservable();
+ }
+
+ /**
+ * Read in apps order from file if exists, then publish app order to UI if valid.
+ */
+ public void loadAppsOrderFromFile() {
+ mAppOrderController.loadAppOrderFromFile();
+ }
+
+ /**
+ * Populate the apps based on alphabetical order and create mapping from packageName to
+ * LauncherItem. Each item in the current launcher is AppItem.
+ */
+ public void processAppsInfoFromPlatform(AppLauncherUtils.LauncherAppsInfo launcherAppsInfo) {
+ Map<ComponentName, LauncherItem> launcherItemsMap = new HashMap<>();
+ List<LauncherItem> launcherItems = new ArrayList<>();
+ List<AppMetaData> appMetaDataList = launcherAppsInfo.getLaunchableComponentsList();
+ for (AppMetaData appMetaData : appMetaDataList) {
+ LauncherItem nextItem = new AppItem(appMetaData);
+ launcherItems.add(nextItem);
+ launcherItemsMap.put(appMetaData.getComponentName(), nextItem);
+ }
+ Collections.sort(launcherItems, LauncherViewModel.ALPHABETICAL_COMPARATOR);
+ mAppOrderController.loadAppListFromPlatform(launcherItemsMap, launcherItems);
+ }
+
+ /**
+ * Notifies the controller that a change in the data model has been observed by the user
+ * interface (e.g. platform apps list has been updated, user has updated the app order.)
+ *
+ * The controller should ONLY handle writing to disk in this method. This will ensure that all
+ * changes to the data model is consistent with the user interface.
+ */
+ public void handleAppListChange() {
+ mAppOrderController.handleAppListChange();
+ }
+
+ /**
+ * Notifies the controller to move the given AppItem to a new position in the data model.
+ */
+ public void setAppPosition(int position, AppMetaData app) {
+ mAppOrderController.setAppPosition(position, app);
+ }
+
+ /**
+ * Updates the launcher data model when app mirroring intent is received.
+ */
+ public void updateMirroringItem(String packageName, Intent mirroringIntent) {
+ mAppOrderController.updateMirroringItem(packageName, mirroringIntent);
+ }
+}
diff --git a/src/com/android/car/carlauncher/LauncherViewModelFactory.java b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherViewModelFactory.java
index a04d9ad4..0abd622e 100644
--- a/src/com/android/car/carlauncher/LauncherViewModelFactory.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/LauncherViewModelFactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,14 +23,14 @@ import java.io.File;
/** A factory class to allow creation of LauncherViewModel by ViewModelProvider. */
public class LauncherViewModelFactory implements ViewModelProvider.Factory{
- private File mAppsOrderFile;
+ private File mLauncherFileDir;
- public LauncherViewModelFactory(File appsOrderFile) {
- mAppsOrderFile = appsOrderFile;
+ public LauncherViewModelFactory(File launcherFileDir) {
+ mLauncherFileDir = launcherFileDir;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
- return (T) new LauncherViewModel(mAppsOrderFile);
+ return (T) new LauncherViewModel(mLauncherFileDir);
}
}
diff --git a/src/com/android/car/carlauncher/PageIndicator.java b/libs/appgrid/lib/src/com/android/car/carlauncher/PageIndicator.java
index e926d8ee..57aab627 100644
--- a/src/com/android/car/carlauncher/PageIndicator.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/PageIndicator.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/com/android/car/carlauncher/RecentAppsRowViewHolder.java b/libs/appgrid/lib/src/com/android/car/carlauncher/RecentAppsRowViewHolder.java
index b762fac0..e5a1c9d1 100644
--- a/src/com/android/car/carlauncher/RecentAppsRowViewHolder.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/RecentAppsRowViewHolder.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/com/android/car/carlauncher/ResetLauncherActivity.java b/libs/appgrid/lib/src/com/android/car/carlauncher/ResetLauncherActivity.java
index 56a7a538..efd098ac 100644
--- a/src/com/android/car/carlauncher/ResetLauncherActivity.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/ResetLauncherActivity.java
@@ -18,6 +18,7 @@ import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
+import com.android.car.carlauncher.apporder.AppOrderController;
import com.android.car.ui.AlertDialogBuilder;
import java.io.File;
@@ -38,7 +39,7 @@ public class ResetLauncherActivity extends Activity {
.setTitle(getString(R.string.reset_appgrid_title))
.setMessage(getString(R.string.reset_appgrid_dialogue_message))
.setPositiveButton(getString(android.R.string.ok), (dialogInterface, which) -> {
- File order = new File(filesDir, LauncherViewModel.ORDER_FILE_NAME);
+ File order = new File(filesDir, AppOrderController.ORDER_FILE_NAME);
order.delete();
finish();
})
diff --git a/libs/appgrid/lib/src/com/android/car/carlauncher/apporder/AppOrderController.java b/libs/appgrid/lib/src/com/android/car/carlauncher/apporder/AppOrderController.java
new file mode 100644
index 00000000..2bc0750d
--- /dev/null
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/apporder/AppOrderController.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.apporder;
+
+import android.content.ComponentName;
+import android.content.Intent;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.MutableLiveData;
+
+import com.android.car.carlauncher.AppItem;
+import com.android.car.carlauncher.AppLauncherUtils;
+import com.android.car.carlauncher.AppMetaData;
+import com.android.car.carlauncher.LauncherItem;
+import com.android.car.carlauncher.LauncherItemMessageHelper;
+import com.android.car.carlauncher.LauncherItemProto.LauncherItemListMessage;
+import com.android.car.carlauncher.LauncherItemProto.LauncherItemMessage;
+import com.android.car.carlauncher.datastore.DataSourceController;
+import com.android.car.carlauncher.datastore.launcheritem.LauncherItemListSource;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Controller that manages the ordering of the app items in app grid.
+ */
+public class AppOrderController implements DataSourceController {
+ // file name holding the user customized app order
+ public static final String ORDER_FILE_NAME = "order.data";
+ private final LauncherItemMessageHelper mItemHelper = new LauncherItemMessageHelper();
+ // The app order of launcher items displayed to users
+ private final MutableLiveData<List<LauncherItem>> mCurrentAppList;
+ private final Map<ComponentName, LauncherItem> mLauncherItemMap = new HashMap<>();
+ private final List<ComponentName> mProtoComponentNames = new ArrayList<>();
+ private final List<LauncherItem> mDefaultOrder;
+ private final List<LauncherItem> mCustomizedOrder;
+ private final LauncherItemListSource mDataSource;
+ private boolean mPlatformAppListLoaded;
+ private boolean mCustomAppOrderFetched;
+ private boolean mIsUserCustomized;
+
+ public AppOrderController(File dataFileDirectory) {
+ this(/* dataSource */ new LauncherItemListSource(dataFileDirectory, ORDER_FILE_NAME),
+ /* appList */ new MutableLiveData<>(new ArrayList<>()),
+ /* defaultOrder */ new ArrayList<>(),
+ /* customizedOrder*/ new ArrayList<>());
+ }
+
+ public AppOrderController(LauncherItemListSource dataSource,
+ MutableLiveData<List<LauncherItem>> appList, List<LauncherItem> defaultOrder,
+ List<LauncherItem> customizedOrder) {
+ mDataSource = dataSource;
+ mCurrentAppList = appList;
+ mDefaultOrder = defaultOrder;
+ mCustomizedOrder = customizedOrder;
+ }
+
+ @Override
+ public boolean checkDataSourceExists() {
+ return mDataSource.exists();
+ }
+
+ public MutableLiveData<List<LauncherItem>> getAppOrderObservable() {
+ return mCurrentAppList;
+ }
+
+ /**
+ * Loads the full app list to be displayed in the app grid.
+ */
+ public void loadAppListFromPlatform(Map<ComponentName, LauncherItem> launcherItemsMap,
+ List<LauncherItem> defaultItemOrder) {
+ mDefaultOrder.clear();
+ mDefaultOrder.addAll(defaultItemOrder);
+ mLauncherItemMap.clear();
+ mLauncherItemMap.putAll(launcherItemsMap);
+ mPlatformAppListLoaded = true;
+ maybePublishAppList();
+ }
+
+ /**
+ * Loads any preexisting app order from the proto datastore on disk.
+ */
+ public void loadAppOrderFromFile() {
+ // handle the app order reset case, where the proto file is removed from file system
+ maybeHandleAppOrderReset();
+ mProtoComponentNames.clear();
+ List<LauncherItemMessage> protoItemMessage = mItemHelper.getSortedList(
+ mDataSource.readFromFile());
+ if (!protoItemMessage.isEmpty()) {
+ mIsUserCustomized = true;
+ for (LauncherItemMessage itemMessage : protoItemMessage) {
+ ComponentName itemComponent = new ComponentName(
+ itemMessage.getPackageName(), itemMessage.getClassName());
+ mProtoComponentNames.add(itemComponent);
+ }
+ }
+ mCustomAppOrderFetched = true;
+ maybePublishAppList();
+ }
+
+ @VisibleForTesting
+ void maybeHandleAppOrderReset() {
+ if (!checkDataSourceExists()) {
+ mIsUserCustomized = false;
+ mCustomizedOrder.clear();
+ }
+ }
+
+ /**
+ * Combine the proto order read from proto with any additional apps read from the platform, then
+ * publish the new list to user interface.
+ *
+ * Prior to publishing the app list to the LiveData (and subsequently to the UI), both (1) the
+ * default platform mapping and (2) user customized order must be read into memory. These
+ * pre-fetch methods may be executed on different threads, so we should only publish the final
+ * ordering when both steps have completed.
+ */
+ @VisibleForTesting
+ void maybePublishAppList() {
+ if (!appsDataLoadingCompleted()) {
+ return;
+ }
+ // app names found in order proto file will be displayed first
+ mCustomizedOrder.clear();
+ List<LauncherItem> customOrder = new ArrayList<>();
+ Set<ComponentName> namesFoundInProto = new HashSet<>();
+ for (ComponentName name: mProtoComponentNames) {
+ if (mLauncherItemMap.containsKey(name)) {
+ customOrder.add(mLauncherItemMap.get(name));
+ namesFoundInProto.add(name);
+ }
+ }
+ mCustomizedOrder.addAll(customOrder);
+ if (shouldUseCustomOrder()) {
+ // new apps from platform not found in proto will be added to the end
+ mCustomizedOrder.clear();
+ List<ComponentName> newPlatformApps = mLauncherItemMap.keySet()
+ .stream()
+ .filter(element -> !namesFoundInProto.contains(element))
+ .collect(Collectors.toList());
+ if (!newPlatformApps.isEmpty()) {
+ Collections.sort(newPlatformApps);
+ for (ComponentName newAppName: newPlatformApps) {
+ customOrder.add(mLauncherItemMap.get(newAppName));
+ }
+ }
+ mCustomizedOrder.addAll(customOrder);
+ mCurrentAppList.postValue(customOrder);
+ } else {
+ mCurrentAppList.postValue(mDefaultOrder);
+ mCustomizedOrder.clear();
+ }
+ // reset apps data loading flags
+ mPlatformAppListLoaded = mCustomAppOrderFetched = false;
+ }
+
+ @VisibleForTesting
+ boolean appsDataLoadingCompleted() {
+ return mPlatformAppListLoaded && mCustomAppOrderFetched;
+ }
+
+ @VisibleForTesting
+ boolean shouldUseCustomOrder() {
+ return mIsUserCustomized && mCustomizedOrder.size() != 0;
+ }
+
+ /**
+ * Persistently writes the current in memory app order into disk.
+ */
+ public void handleAppListChange() {
+ if (mIsUserCustomized) {
+ List<LauncherItem> currentItems = mCurrentAppList.getValue();
+ List<LauncherItemMessage> msgList = new ArrayList<LauncherItemMessage>();
+ for (int i = 0; i < currentItems.size(); i++) {
+ msgList.add(currentItems.get(i).convertToMessage(i, -1));
+ }
+ LauncherItemListMessage appOrderListMessage = mItemHelper.convertToMessage(msgList);
+ mDataSource.writeToFile(appOrderListMessage);
+ }
+ }
+
+ /**
+ * Move an app to a specified index and post the value to LiveData.
+ */
+ public void setAppPosition(int position, AppMetaData app) {
+ List<LauncherItem> current = mCurrentAppList.getValue();
+ LauncherItem item = mLauncherItemMap.get(app.getComponentName());
+ if (current != null && current.size() != 0 && position < current.size() && item != null) {
+ mIsUserCustomized = true;
+ current.remove(item);
+ current.add(position, item);
+ mCurrentAppList.postValue(current);
+ }
+ }
+
+ /**
+ * Handles the incoming mirroring intent from ViewModel.
+ *
+ * Update an AppItem's AppMetaData isMirroring state and its launch callback then post the
+ * updated to LiveData.
+ */
+ public void updateMirroringItem(String packageName, Intent mirroringIntent) {
+ List<LauncherItem> launcherList = mCurrentAppList.getValue();
+ if (launcherList == null) {
+ return;
+ }
+ List<LauncherItem> launcherListCopy = new ArrayList<>();
+ for (LauncherItem item : launcherList) {
+ if (item instanceof AppItem) {
+ // TODO (b/272796126): move deep copying to inside DiffUtil
+ AppMetaData metaData = ((AppItem) item).getAppMetaData();
+ if (item.getPackageName().equals(packageName)) {
+ launcherListCopy.add(new AppItem(item.getPackageName(), item.getClassName(),
+ item.getDisplayName(), new AppMetaData(metaData.getDisplayName(),
+ metaData.getComponentName(), metaData.getIcon(),
+ metaData.getIsDistractionOptimized(), /* isMirroring= */ true,
+ metaData.getIsDisabledByTos(),
+ contextArg ->
+ AppLauncherUtils.launchApp(contextArg, mirroringIntent),
+ metaData.getAlternateLaunchCallback())));
+ } else if (metaData.getIsMirroring()) {
+ Intent intent = new Intent(Intent.ACTION_MAIN)
+ .setComponent(metaData.getComponentName())
+ .addCategory(Intent.CATEGORY_LAUNCHER)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ launcherListCopy.add(new AppItem(item.getPackageName(), item.getClassName(),
+ item.getDisplayName(), new AppMetaData(metaData.getDisplayName(),
+ metaData.getComponentName(), metaData.getIcon(),
+ metaData.getIsDistractionOptimized(), /* isMirroring= */ false,
+ metaData.getIsDisabledByTos(),
+ contextArg ->
+ AppLauncherUtils.launchApp(contextArg, intent),
+ metaData.getAlternateLaunchCallback())));
+ } else {
+ launcherListCopy.add(item);
+ }
+ } else {
+ launcherListCopy.add(item);
+ }
+ }
+ mCurrentAppList.postValue(launcherListCopy);
+ }
+}
diff --git a/libs/appgrid/lib/src/com/android/car/carlauncher/datastore/DataSourceController.java b/libs/appgrid/lib/src/com/android/car/carlauncher/datastore/DataSourceController.java
new file mode 100644
index 00000000..ede13f5c
--- /dev/null
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/datastore/DataSourceController.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.datastore;
+
+/**
+ * Interface to be defined by classes that intend on holding DataStoreFile.
+ */
+public interface DataSourceController {
+
+ /**
+ * @return true if data files path on disk, false otherwise.
+ */
+ boolean checkDataSourceExists();
+}
diff --git a/libs/appgrid/lib/src/com/android/car/carlauncher/datastore/ProtoDataSource.java b/libs/appgrid/lib/src/com/android/car/carlauncher/datastore/ProtoDataSource.java
new file mode 100644
index 00000000..bb1f348d
--- /dev/null
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/datastore/ProtoDataSource.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.datastore;
+
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+import com.google.protobuf.MessageLite;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Class level abstraction representing a proto file holding app data.
+ *
+ * Only a single controller should hold reference to this class. All methods that perform read or
+ * write operations must be thread safe and idempotent.
+ *
+ * @param <T> the proto object type that this data file is holding
+ */
+public abstract class ProtoDataSource<T extends MessageLite> {
+ private final File mFile;
+ private static final String TAG = "ProtoDataSource";
+ private FileInputStream mInputStream;
+ private FileOutputStream mOutputStream;
+
+ public ProtoDataSource(File dataFileDirectory, String dataFileName) {
+ mFile = new File(dataFileDirectory, dataFileName);
+ }
+
+ /**
+ * @return true if the file exists on disk, and false otherwise.
+ */
+ public boolean exists() {
+ return mFile.exists();
+ }
+
+ /**
+ * Used by subclasses to access the mFile object.
+ */
+ protected File getDataFile() {
+ return mFile;
+ }
+
+ /**
+ * Writes the {@link MessageLite} subclass T to the file represented by this object.
+ */
+ public void writeToFile(T data) {
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+ executorService.execute(() -> {
+ try {
+ if (mOutputStream == null) {
+ mOutputStream = new FileOutputStream(getDataFile(), false);
+ }
+ writeDelimitedTo(data, mOutputStream);
+ } catch (IOException e) {
+ Log.e(TAG, "Launcher item list not written to file successfully.");
+ } finally {
+ try {
+ if (mOutputStream != null) {
+ mOutputStream.flush();
+ mOutputStream.getFD().sync();
+ mOutputStream.close();
+ mOutputStream = null;
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Unable to close output stream. ");
+ }
+ }
+ executorService.shutdown();
+ });
+ }
+
+ /**
+ * Reads the {@link MessageLite} subclass T from the file represented by this object.
+ */
+ @Nullable
+ public T readFromFile() {
+ if (!exists()) {
+ Log.e(TAG, "File does not exist. Cannot read from file.");
+ return null;
+ }
+ T result = null;
+ try {
+ if (mInputStream == null) {
+ mInputStream = new FileInputStream(getDataFile());
+ }
+ result = parseDelimitedFrom(mInputStream);
+ } catch (IOException e) {
+ Log.e(TAG, "Read from input stream not successfully");
+ } finally {
+ if (mInputStream != null) {
+ try {
+ mInputStream.close();
+ mInputStream = null;
+ } catch (IOException e) {
+ Log.e(TAG, "Unable to close input stream");
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * This method will be called by {@link ProtoDataSource#readFromFile}.
+ *
+ * Implementation is left to subclass since {@link MessageLite.parseDelimitedFrom(InputStream)}
+ * requires a defined class at compile time. Subclasses should implement this method by directly
+ * calling YourMessageType.parseDelimitedFrom(inputStream) here.
+ *
+ * @param inputStream the input stream to be which the data source should read from.
+ * @return the object T written to this file.
+ * @throws IOException an IOException for when reading from proto fails.
+ */
+ @Nullable
+ protected abstract T parseDelimitedFrom(InputStream inputStream) throws IOException;
+
+ /**
+ * This method will be called by {@link ProtoDataSource#writeToFile(MessageLite)}.
+ *
+ * Implementation is left to subclass since {@link MessageLite#writeDelimitedTo(OutputStream)}
+ * requires a defined class at compile time. Subclasses should implement this method by directly
+ * calling T.writeDelimitedTo(outputStream) here.
+ *
+ * @param outputData the output data T to be written to the file.
+ * @param outputStream the output stream which the data should be written to.
+ * @throws IOException an IO Exception for when writing to proto fails.
+ */
+ protected abstract void writeDelimitedTo(T outputData, OutputStream outputStream)
+ throws IOException;
+}
diff --git a/libs/appgrid/lib/src/com/android/car/carlauncher/datastore/launcheritem/LauncherItemListSource.java b/libs/appgrid/lib/src/com/android/car/carlauncher/datastore/launcheritem/LauncherItemListSource.java
new file mode 100644
index 00000000..1caec8df
--- /dev/null
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/datastore/launcheritem/LauncherItemListSource.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.datastore.launcheritem;
+
+import androidx.annotation.Nullable;
+
+import com.android.car.carlauncher.LauncherItemProto.LauncherItemListMessage;
+import com.android.car.carlauncher.datastore.ProtoDataSource;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * A ProtoDataSource that holds a single LauncherItemListMessage, which is an ordered list of
+ * LauncherItemMessage, each representing a specific app item in the app grid.
+ */
+public class LauncherItemListSource extends ProtoDataSource<LauncherItemListMessage> {
+
+ public LauncherItemListSource(File dataFileDirectory, String dataFileName) {
+ super(dataFileDirectory, dataFileName);
+ }
+
+ @Override
+ @Nullable
+ protected LauncherItemListMessage parseDelimitedFrom(InputStream inputStream)
+ throws IOException {
+ return LauncherItemListMessage.parseDelimitedFrom(inputStream);
+ }
+
+ @Override
+ protected void writeDelimitedTo(LauncherItemListMessage outputData, OutputStream outputStream)
+ throws IOException {
+ outputData.writeDelimitedTo(outputStream);
+ }
+}
diff --git a/src/com/android/car/carlauncher/pagination/PageIndexingHelper.java b/libs/appgrid/lib/src/com/android/car/carlauncher/pagination/PageIndexingHelper.java
index 61c88f5b..61c88f5b 100644
--- a/src/com/android/car/carlauncher/pagination/PageIndexingHelper.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/pagination/PageIndexingHelper.java
diff --git a/src/com/android/car/carlauncher/pagination/PageMeasurementHelper.java b/libs/appgrid/lib/src/com/android/car/carlauncher/pagination/PageMeasurementHelper.java
index 18b6ac29..18b6ac29 100644
--- a/src/com/android/car/carlauncher/pagination/PageMeasurementHelper.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/pagination/PageMeasurementHelper.java
diff --git a/src/com/android/car/carlauncher/pagination/PaginationController.java b/libs/appgrid/lib/src/com/android/car/carlauncher/pagination/PaginationController.java
index 5ef4650d..f12bf934 100644
--- a/src/com/android/car/carlauncher/pagination/PaginationController.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/pagination/PaginationController.java
@@ -19,6 +19,8 @@ package com.android.car.carlauncher.pagination;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import com.android.car.carlauncher.Banner;
+import com.android.car.carlauncher.R;
import com.android.car.carlauncher.pagination.PageMeasurementHelper.GridDimensions;
import com.android.car.carlauncher.pagination.PageMeasurementHelper.PageDimensions;
@@ -31,16 +33,22 @@ import java.util.Set;
public class PaginationController {
private final PageMeasurementHelper mPageMeasurementHelper;
private final DimensionUpdateCallback mCallback;
+ // Terms of Service Banner
+ private final Banner mTosBanner;
public PaginationController(View windowBackground, DimensionUpdateCallback callback) {
mCallback = callback;
mPageMeasurementHelper = new PageMeasurementHelper(windowBackground);
+ mTosBanner = windowBackground.findViewById(R.id.tos_banner);
windowBackground.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
- maybeHandleWindowResize(windowBackground.getMeasuredWidth(),
- windowBackground.getMeasuredHeight());
+ // We need to subtract the banner height from the available window height
+ // available to the app_grid
+ int windowHeight = windowBackground.getMeasuredHeight() - getBannerHeight();
+ int windowWidth = windowBackground.getMeasuredWidth();
+ maybeHandleWindowResize(windowWidth, windowHeight);
}
});
}
@@ -53,6 +61,13 @@ public class PaginationController {
}
}
+ private int getBannerHeight() {
+ if (mTosBanner.getVisibility() == View.VISIBLE) {
+ return mTosBanner.getMeasuredHeight();
+ }
+ return 0;
+ }
+
/**
* Callback contract between this controller and its {@link DimensionUpdateListener} classes.
*
diff --git a/src/com/android/car/carlauncher/proto/launcher_item.proto b/libs/appgrid/lib/src/com/android/car/carlauncher/proto/launcher_item.proto
index ad8e6f71..ad8e6f71 100644
--- a/src/com/android/car/carlauncher/proto/launcher_item.proto
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/proto/launcher_item.proto
diff --git a/src/com/android/car/carlauncher/recyclerview/AppGridAdapter.java b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppGridAdapter.java
index c56fb624..a7d0c898 100644
--- a/src/com/android/car/carlauncher/recyclerview/AppGridAdapter.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppGridAdapter.java
@@ -59,7 +59,7 @@ public class AppGridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
private final int mNumOfRows;
private int mAppItemWidth;
private int mAppItemHeight;
- private final LauncherViewModel mDataModel;
+ private final LauncherViewModel mLauncherViewModel;
// grid order of the mLauncherItems used by DiffUtils in dispatchUpdates to animate UI updates
private final List<LauncherItem> mGridOrderedLauncherItems;
@@ -71,26 +71,26 @@ public class AppGridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
private Mode mAppGridMode;
public AppGridAdapter(Context context, int numOfCols, int numOfRows,
- LauncherViewModel dataModel, AppItemViewHolder.AppItemDragCallback dragCallback,
+ LauncherViewModel launcherViewModel, AppItemViewHolder.AppItemDragCallback dragCallback,
AppGridPageSnapper.AppGridPageSnapCallback snapCallback) {
this(context, numOfCols, numOfRows,
context.getResources().getBoolean(R.bool.use_vertical_app_grid)
? PageOrientation.VERTICAL : PageOrientation.HORIZONTAL,
- LayoutInflater.from(context), dataModel, dragCallback, snapCallback);
+ LayoutInflater.from(context), launcherViewModel, dragCallback, snapCallback);
}
public AppGridAdapter(Context context, int numOfCols, int numOfRows,
@PageOrientation int pageOrientation,
- LayoutInflater layoutInflater, LauncherViewModel dataModel,
+ LayoutInflater layoutInflater, LauncherViewModel launcherViewModel,
AppItemViewHolder.AppItemDragCallback dragCallback,
AppGridPageSnapper.AppGridPageSnapCallback snapCallback) {
this(context, numOfCols, numOfRows, pageOrientation, layoutInflater,
- dataModel, dragCallback, snapCallback, Mode.ALL_APPS);
+ launcherViewModel, dragCallback, snapCallback, Mode.ALL_APPS);
}
public AppGridAdapter(Context context, int numOfCols, int numOfRows,
@PageOrientation int pageOrientation,
- LayoutInflater layoutInflater, LauncherViewModel dataModel,
+ LayoutInflater layoutInflater, LauncherViewModel launcherViewModel,
AppItemViewHolder.AppItemDragCallback dragCallback,
AppGridPageSnapper.AppGridPageSnapCallback snapCallback, Mode mode) {
mContext = context;
@@ -102,7 +102,7 @@ public class AppGridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
mIndexingHelper = new PageIndexingHelper(numOfCols, numOfRows, pageOrientation);
mGridOrderedLauncherItems = new ArrayList<>();
- mDataModel = dataModel;
+ mLauncherViewModel = launcherViewModel;
mAppGridMode = mode;
}
@@ -273,7 +273,7 @@ public class AppGridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
// we need to move package to target index even if the from and to index are the same to
// ensure dispatchLayout gets called to re-anchor the recyclerview to current page.
AppItem selectedApp = (AppItem) mLauncherItems.get(adaptorIndexFrom);
- mDataModel.movePackage(adaptorIndexTo, selectedApp.getAppMetaData());
+ mLauncherViewModel.setAppPosition(adaptorIndexTo, selectedApp.getAppMetaData());
}
diff --git a/src/com/android/car/carlauncher/recyclerview/AppGridItemAnimator.java b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppGridItemAnimator.java
index e4b5d4cc..e4b5d4cc 100644
--- a/src/com/android/car/carlauncher/recyclerview/AppGridItemAnimator.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppGridItemAnimator.java
diff --git a/src/com/android/car/carlauncher/recyclerview/AppGridLayoutManager.java b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppGridLayoutManager.java
index df4b0d0b..df4b0d0b 100644
--- a/src/com/android/car/carlauncher/recyclerview/AppGridLayoutManager.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppGridLayoutManager.java
diff --git a/src/com/android/car/carlauncher/recyclerview/AppItemViewHolder.java b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppItemViewHolder.java
index 18d57cbb..b7a40bbf 100644
--- a/src/com/android/car/carlauncher/recyclerview/AppItemViewHolder.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/AppItemViewHolder.java
@@ -16,9 +16,13 @@
package com.android.car.carlauncher.recyclerview;
+import static android.view.View.DRAG_FLAG_GLOBAL;
+import static android.view.View.DRAG_FLAG_OPAQUE;
+
import static com.android.car.carlauncher.AppGridConstants.AppItemBoundDirection;
import static com.android.car.carlauncher.AppGridConstants.PageOrientation;
import static com.android.car.carlauncher.AppGridConstants.isHorizontal;
+import static com.android.car.carlauncher.hidden.HiddenApiAccess.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION;
import android.content.ClipData;
import android.content.ComponentName;
@@ -95,6 +99,7 @@ public class AppItemViewHolder extends RecyclerView.ViewHolder {
private final boolean mIsDistractionOptimizationRequired;
private final Rect mPageBound;
private final AppGridActivity.Mode mMode;
+
public BindInfo(boolean isDistractionOptimizationRequired,
Rect pageBound,
AppGridActivity.Mode mode) {
@@ -177,10 +182,13 @@ public class AppItemViewHolder extends RecyclerView.ViewHolder {
// previous page, so we need to rebind the app with the correct visibility.
setStateSelected(mComponentName.equals(mDragCallback.mSelectedComponent));
- boolean isLaunchable =
+ boolean isLaunchableDistractionOptimized =
!isDistractionOptimizationRequired || app.getIsDistractionOptimized();
- mAppIcon.setAlpha(mContext.getResources().getFloat(
- isLaunchable ? R.dimen.app_icon_opacity : R.dimen.app_icon_opacity_unavailable));
+ boolean isDisabledByTos = app.getIsDisabledByTos();
+ boolean isLaunchable = isLaunchableDistractionOptimized || isDisabledByTos;
+
+ int opacity = getOpacity(isLaunchable, isDisabledByTos);
+ mAppIcon.setAlpha(mContext.getResources().getFloat(opacity));
if (isLaunchable) {
View.OnClickListener appLaunchListener = new View.OnClickListener() {
@@ -217,6 +225,7 @@ public class AppItemViewHolder extends RecyclerView.ViewHolder {
mAppIcon.setOnTouchListener(new View.OnTouchListener() {
private float mActionDownX;
private float mActionDownY;
+
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
@@ -229,7 +238,7 @@ public class AppItemViewHolder extends RecyclerView.ViewHolder {
mActionDownX,
mActionDownY,
mode)) {
- startDragAndDrop(event.getX(), event.getY());
+ startDragAndDrop(app.getComponentName(), event.getX(), event.getY());
mCanStartDragAction = false;
} else if (action == MotionEvent.ACTION_UP
|| action == MotionEvent.ACTION_CANCEL) {
@@ -386,10 +395,9 @@ public class AppItemViewHolder extends RecyclerView.ViewHolder {
&& isDistancePastThreshold;
}
- private void startDragAndDrop(float eventX, float eventY) {
- ClipData clipData = new ClipData(/* label */ APP_ITEM_DRAG_TAG,
- /* mimeTypes */ new String[]{ "" },
- /* item */ new ClipData.Item(APP_ITEM_DRAG_TAG));
+ private void startDragAndDrop(ComponentName componentName, float eventX, float eventY) {
+ ClipData clipData = ClipData.newPlainText(/* label= */ APP_ITEM_DRAG_TAG,
+ /* text= */ componentName.flattenToString());
// since the app icon is scaled, the touch point that users should be holding when drag
// shadow is deployed should also be scaled
@@ -400,13 +408,13 @@ public class AppItemViewHolder extends RecyclerView.ViewHolder {
/* touchPointX */ dragPoint.x, /* touchPointX */ dragPoint.y,
/* size */ mIconSize, /* scaledSize */ mIconScaledSize);
mAppIcon.startDragAndDrop(clipData, /* dragShadowBuilder */ dragShadowBuilder,
- /* myLocalState */ null, /* flags */ View.DRAG_FLAG_OPAQUE
- | View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION);
+ /* myLocalState */ null, /* flags */ DRAG_FLAG_OPAQUE | DRAG_FLAG_GLOBAL
+ | DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION);
mDragCallback.notifyItemSelected(AppItemViewHolder.this, dragPoint);
}
- class AppItemOnDragListener implements View.OnDragListener{
+ class AppItemOnDragListener implements View.OnDragListener {
@Override
public boolean onDrag(View view, DragEvent event) {
int action = event.getAction();
@@ -646,13 +654,27 @@ public class AppItemViewHolder extends RecyclerView.ViewHolder {
public interface AppItemDragListener {
/** Listener method called during AppItemDragCallback.notifyLongPressed */
void onItemLongPressed(boolean longPressed);
+
/** Listener method called during AppItemDragCallback.notifyItemSelected */
void onItemSelected(int gridPositionFrom);
+
/** Listener method called during AppItemDragCallback.notifyDragEntered */
void onItemDragged();
+
/** Listener method called during AppItemDragCallback.notifyDragExited */
void onDragExited(int gridPosition, @AppItemBoundDirection int exitDirection);
+
/** Listener method called during AppItemDragCallback.notifyItemDropped */
void onItemDropped(int gridPositionFrom, int gridPositionTo);
}
+
+ private int getOpacity(boolean isLaunchable, boolean isDisabledByTos) {
+ if (isDisabledByTos) {
+ return R.dimen.app_icon_opacity_tos_disabled;
+ }
+ if (isLaunchable) {
+ return R.dimen.app_icon_opacity;
+ }
+ return R.dimen.app_icon_opacity_unavailable;
+ }
}
diff --git a/src/com/android/car/carlauncher/recyclerview/PageMarginDecoration.java b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/PageMarginDecoration.java
index 0045da5b..0045da5b 100644
--- a/src/com/android/car/carlauncher/recyclerview/PageMarginDecoration.java
+++ b/libs/appgrid/lib/src/com/android/car/carlauncher/recyclerview/PageMarginDecoration.java
diff --git a/libs/appgrid/lib/tests/Android.bp b/libs/appgrid/lib/tests/Android.bp
new file mode 100644
index 00000000..1e8c0436
--- /dev/null
+++ b/libs/appgrid/lib/tests/Android.bp
@@ -0,0 +1,78 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test {
+ name: "CarAppGridTests",
+
+ srcs: ["src/**/*.java"],
+
+ resource_dirs: ["res"],
+
+ libs: [
+ "android.car",
+ "android.test.base",
+ "android.car-system-stubs",
+ ],
+
+ optimize: {
+ enabled: false,
+ },
+
+ static_libs: [
+ "android.car.testapi",
+ "android.car.test.utils",
+ "androidx.test.core",
+ "androidx.test.runner",
+ "androidx.test.rules",
+ "androidx.test.espresso.core",
+ "androidx.test.espresso.contrib",
+ "androidx.test.espresso.intents",
+ "androidx.test.ext.junit",
+ "hamcrest-library",
+ "mockito-target-extended",
+ "truth",
+ "testables",
+ "CarAppGrid-lib"
+ ],
+
+ platform_apis: true,
+
+ certificate: "platform",
+
+ privileged: true,
+
+ manifest: "AndroidManifest.xml",
+
+ instrumentation_for: "CarAppGrid-lib",
+
+ dex_preopt: {
+ enabled: false,
+ },
+
+ jni_libs: [
+ // For mockito extended
+ "libdexmakerjvmtiagent",
+ "libstaticjvmtiagent",
+ ],
+
+ test_suites: [
+ "automotive-tests",
+ "device-tests",
+ ],
+}
diff --git a/libs/appgrid/lib/tests/AndroidManifest.xml b/libs/appgrid/lib/tests/AndroidManifest.xml
new file mode 100644
index 00000000..ee9b88f6
--- /dev/null
+++ b/libs/appgrid/lib/tests/AndroidManifest.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.car.carlauncher.test">
+
+ <application
+ android:debuggable="true"
+ android:label="@string/app_test_title">
+
+ <activity android:name="com.android.car.carlauncher.TestActivity"/>
+
+ <uses-library android:name="android.test.runner"/>
+
+ <meta-data
+ android:name="com.android.automotive"
+ android:resource="@xml/automotive_app_desc"/>
+
+ </application>
+
+ <instrumentation
+ android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:label="Tests for AppGrid"
+ android:targetPackage="com.android.car.carlauncher.test"/>
+</manifest>
diff --git a/libs/appgrid/lib/tests/res/values-af/strings.xml b/libs/appgrid/lib/tests/res/values-af/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-af/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-am/strings.xml b/libs/appgrid/lib/tests/res/values-am/strings.xml
new file mode 100644
index 00000000..2fbf0749
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"የመተግበሪያፍርግርግሙከራዎች"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ar/strings.xml b/libs/appgrid/lib/tests/res/values-ar/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ar/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-as/strings.xml b/libs/appgrid/lib/tests/res/values-as/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-az/strings.xml b/libs/appgrid/lib/tests/res/values-az/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-az/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-b+sr+Latn/strings.xml b/libs/appgrid/lib/tests/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-be/strings.xml b/libs/appgrid/lib/tests/res/values-be/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-be/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-bg/strings.xml b/libs/appgrid/lib/tests/res/values-bg/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-bg/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-bn/strings.xml b/libs/appgrid/lib/tests/res/values-bn/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-bn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-bs/strings.xml b/libs/appgrid/lib/tests/res/values-bs/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-bs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ca/strings.xml b/libs/appgrid/lib/tests/res/values-ca/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ca/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-cs/strings.xml b/libs/appgrid/lib/tests/res/values-cs/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-cs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-da/strings.xml b/libs/appgrid/lib/tests/res/values-da/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-da/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-de/strings.xml b/libs/appgrid/lib/tests/res/values-de/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-de/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-el/strings.xml b/libs/appgrid/lib/tests/res/values-el/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-el/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-en-rAU/strings.xml b/libs/appgrid/lib/tests/res/values-en-rAU/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-en-rAU/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-en-rGB/strings.xml b/libs/appgrid/lib/tests/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-en-rGB/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-en-rIN/strings.xml b/libs/appgrid/lib/tests/res/values-en-rIN/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-en-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-en-rXC/strings.xml b/libs/appgrid/lib/tests/res/values-en-rXC/strings.xml
new file mode 100644
index 00000000..32ae6dcf
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-en-rXC/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎AppGridTests‎‏‎‎‏‎"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-es-rUS/strings.xml b/libs/appgrid/lib/tests/res/values-es-rUS/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-es-rUS/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-es/strings.xml b/libs/appgrid/lib/tests/res/values-es/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-es/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-et/strings.xml b/libs/appgrid/lib/tests/res/values-et/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-et/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-eu/strings.xml b/libs/appgrid/lib/tests/res/values-eu/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-eu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-fa/strings.xml b/libs/appgrid/lib/tests/res/values-fa/strings.xml
new file mode 100644
index 00000000..a3dafcf8
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-fa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"آزمایش جدول برنامه"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-fi/strings.xml b/libs/appgrid/lib/tests/res/values-fi/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-fi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-fr-rCA/strings.xml b/libs/appgrid/lib/tests/res/values-fr-rCA/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-fr-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-fr/strings.xml b/libs/appgrid/lib/tests/res/values-fr/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-fr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-gl/strings.xml b/libs/appgrid/lib/tests/res/values-gl/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-gl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-gu/strings.xml b/libs/appgrid/lib/tests/res/values-gu/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-gu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-hi/strings.xml b/libs/appgrid/lib/tests/res/values-hi/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-hi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-hr/strings.xml b/libs/appgrid/lib/tests/res/values-hr/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-hr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-hu/strings.xml b/libs/appgrid/lib/tests/res/values-hu/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-hu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-hy/strings.xml b/libs/appgrid/lib/tests/res/values-hy/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-hy/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-in/strings.xml b/libs/appgrid/lib/tests/res/values-in/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-in/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-is/strings.xml b/libs/appgrid/lib/tests/res/values-is/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-is/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-it/strings.xml b/libs/appgrid/lib/tests/res/values-it/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-it/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-iw/strings.xml b/libs/appgrid/lib/tests/res/values-iw/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-iw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ja/strings.xml b/libs/appgrid/lib/tests/res/values-ja/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ja/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ka/strings.xml b/libs/appgrid/lib/tests/res/values-ka/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ka/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-kk/strings.xml b/libs/appgrid/lib/tests/res/values-kk/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-kk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-km/strings.xml b/libs/appgrid/lib/tests/res/values-km/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-km/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-kn/strings.xml b/libs/appgrid/lib/tests/res/values-kn/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-kn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ko/strings.xml b/libs/appgrid/lib/tests/res/values-ko/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ko/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ky/strings.xml b/libs/appgrid/lib/tests/res/values-ky/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ky/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-lo/strings.xml b/libs/appgrid/lib/tests/res/values-lo/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-lo/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-lt/strings.xml b/libs/appgrid/lib/tests/res/values-lt/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-lt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-lv/strings.xml b/libs/appgrid/lib/tests/res/values-lv/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-lv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-mk/strings.xml b/libs/appgrid/lib/tests/res/values-mk/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-mk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ml/strings.xml b/libs/appgrid/lib/tests/res/values-ml/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ml/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-mn/strings.xml b/libs/appgrid/lib/tests/res/values-mn/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-mn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-mr/strings.xml b/libs/appgrid/lib/tests/res/values-mr/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-mr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ms/strings.xml b/libs/appgrid/lib/tests/res/values-ms/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ms/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-my/strings.xml b/libs/appgrid/lib/tests/res/values-my/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-my/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-nb/strings.xml b/libs/appgrid/lib/tests/res/values-nb/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-nb/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ne/strings.xml b/libs/appgrid/lib/tests/res/values-ne/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ne/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-nl/strings.xml b/libs/appgrid/lib/tests/res/values-nl/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-nl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-or/strings.xml b/libs/appgrid/lib/tests/res/values-or/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-pa/strings.xml b/libs/appgrid/lib/tests/res/values-pa/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-pa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-pl/strings.xml b/libs/appgrid/lib/tests/res/values-pl/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-pl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-pt-rPT/strings.xml b/libs/appgrid/lib/tests/res/values-pt-rPT/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-pt-rPT/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-pt/strings.xml b/libs/appgrid/lib/tests/res/values-pt/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-pt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ro/strings.xml b/libs/appgrid/lib/tests/res/values-ro/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ro/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ru/strings.xml b/libs/appgrid/lib/tests/res/values-ru/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ru/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-si/strings.xml b/libs/appgrid/lib/tests/res/values-si/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-si/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-sk/strings.xml b/libs/appgrid/lib/tests/res/values-sk/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-sk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-sl/strings.xml b/libs/appgrid/lib/tests/res/values-sl/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-sl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-sq/strings.xml b/libs/appgrid/lib/tests/res/values-sq/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-sq/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-sr/strings.xml b/libs/appgrid/lib/tests/res/values-sr/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-sr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-sv/strings.xml b/libs/appgrid/lib/tests/res/values-sv/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-sv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-sw/strings.xml b/libs/appgrid/lib/tests/res/values-sw/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-sw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ta/strings.xml b/libs/appgrid/lib/tests/res/values-ta/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ta/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-te/strings.xml b/libs/appgrid/lib/tests/res/values-te/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-te/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-th/strings.xml b/libs/appgrid/lib/tests/res/values-th/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-th/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-tl/strings.xml b/libs/appgrid/lib/tests/res/values-tl/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-tl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-tr/strings.xml b/libs/appgrid/lib/tests/res/values-tr/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-tr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-uk/strings.xml b/libs/appgrid/lib/tests/res/values-uk/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-uk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-ur/strings.xml b/libs/appgrid/lib/tests/res/values-ur/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-ur/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-uz/strings.xml b/libs/appgrid/lib/tests/res/values-uz/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-uz/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-vi/strings.xml b/libs/appgrid/lib/tests/res/values-vi/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-vi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-zh-rCN/strings.xml b/libs/appgrid/lib/tests/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-zh-rHK/strings.xml b/libs/appgrid/lib/tests/res/values-zh-rHK/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-zh-rHK/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-zh-rTW/strings.xml b/libs/appgrid/lib/tests/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000..f7fcedc9
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-zh-rTW/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values-zu/strings.xml b/libs/appgrid/lib/tests/res/values-zu/strings.xml
new file mode 100644
index 00000000..491eff2d
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values-zu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title" msgid="4167394338298199728">"I-AppGridTests"</string>
+</resources>
diff --git a/libs/appgrid/lib/tests/res/values/strings.xml b/libs/appgrid/lib/tests/res/values/strings.xml
new file mode 100644
index 00000000..e0af98e7
--- /dev/null
+++ b/libs/appgrid/lib/tests/res/values/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_test_title">AppGridTests</string>
+</resources>
diff --git a/tests/res/xml/automotive_app_desc.xml b/libs/appgrid/lib/tests/res/xml/automotive_app_desc.xml
index 60271702..60271702 100644
--- a/tests/res/xml/automotive_app_desc.xml
+++ b/libs/appgrid/lib/tests/res/xml/automotive_app_desc.xml
diff --git a/tests/res/xml/empty_test_activity.xml b/libs/appgrid/lib/tests/res/xml/empty_test_activity.xml
index 44e80f20..44e80f20 100644
--- a/tests/res/xml/empty_test_activity.xml
+++ b/libs/appgrid/lib/tests/res/xml/empty_test_activity.xml
diff --git a/tests/res/xml/test_list_item.xml b/libs/appgrid/lib/tests/res/xml/test_list_item.xml
index 89b96a4d..89b96a4d 100644
--- a/tests/res/xml/test_list_item.xml
+++ b/libs/appgrid/lib/tests/res/xml/test_list_item.xml
diff --git a/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridActivityTest.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridActivityTest.java
new file mode 100644
index 00000000..d67191b3
--- /dev/null
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridActivityTest.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher;
+
+import static android.car.settings.CarSettings.Secure.KEY_UNACCEPTED_TOS_DISABLED_APPS;
+import static android.car.settings.CarSettings.Secure.KEY_USER_TOS_ACCEPTED;
+
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.car.drivingstate.CarUxRestrictionsManager;
+import android.content.Intent;
+import android.provider.Settings;
+import android.testing.TestableContext;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+/**
+ * Programmatic tests for AppGridActivity and AppGridScrollBar
+ */
+@RunWith(AndroidJUnit4.class)
+public class AppGridActivityTest {
+ private ActivityScenario<AppGridActivity> mActivityScenario;
+ private CarUxRestrictionsManager mCarUxRestrictionsManager;
+ private PageIndicator mPageIndicator;
+
+ @After
+ public void tearDown() {
+ if (mActivityScenario != null) {
+ mActivityScenario.close();
+ }
+ }
+
+ @Test
+ public void onCreate_appGridRecyclerView_isVisible() {
+ mActivityScenario = ActivityScenario.launch(AppGridActivity.class);
+ onView(withId(R.id.apps_grid)).check(matches(isDisplayed()));
+ onView(withId(R.id.page_indicator_container)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void onResume_ScrollStateIsUpdated() {
+ mActivityScenario = ActivityScenario.launch(AppGridActivity.class);
+ mActivityScenario.onActivity(activity -> {
+ mPageIndicator = mock(PageIndicator.class);
+ activity.setPageIndicator(mPageIndicator);
+ });
+ // The activity needs to be reset to go to the RESUMED state after the
+ // mock object is set up
+ mActivityScenario.moveToState(Lifecycle.State.CREATED);
+ mActivityScenario.moveToState(Lifecycle.State.RESUMED);
+ onView(withId(R.id.apps_grid)).check(matches(isDisplayed()));
+ onView(withId(R.id.page_indicator_container)).check(matches(isDisplayed()));
+ // onResumed will trigger LauncherViewModel.onChanged when the activity first started
+ // which triggers this call again
+ verify(mPageIndicator, atLeast(1)).updatePageCount(anyInt());
+ }
+
+ @Test
+ public void onStop_CarUxRestrictionsManager_unregisterListener() {
+ mActivityScenario = ActivityScenario.launch(AppGridActivity.class);
+ mActivityScenario.onActivity(activity -> {
+ mCarUxRestrictionsManager = mock(CarUxRestrictionsManager.class);
+ activity.setCarUxRestrictionsManager(mCarUxRestrictionsManager);
+ });
+ mActivityScenario.moveToState(Lifecycle.State.DESTROYED);
+ verify(mCarUxRestrictionsManager, times(1)).unregisterListener();
+ }
+
+ @Test
+ public void onCreate_tosIsAccepted_tosContentObserversAreNull() {
+ TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 2);
+
+
+ mActivityScenario = ActivityScenario.launch(new Intent(mContext, AppGridActivity.class));
+
+ mActivityScenario.onActivity(activity -> {
+ assertNull(activity.mTosContentObserver); // Content observer not setup
+ assertNull(activity.mTosDisabledAppsContentObserver); // Content observer not setup
+ });
+ }
+
+ @Test
+ public void afterTosIsAccepted_unregisterTosContentObservers() {
+ TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 1);
+
+ mActivityScenario = ActivityScenario.launch(new Intent(mContext, AppGridActivity.class));
+
+ mActivityScenario.onActivity(activity -> {
+ assertNotNull(activity.mTosContentObserver); // Content observer is setup
+ assertNotNull(activity.mTosDisabledAppsContentObserver); // Content observer is setup
+
+ // Accept TOS
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 2);
+ activity.mTosContentObserver.onChange(true);
+ });
+
+ // Content observer is null after tos is accepted
+ mActivityScenario.onActivity(activity -> {
+ assertNull(activity.mTosContentObserver);
+ assertNull(activity.mTosDisabledAppsContentObserver);
+ });
+ }
+
+ @Test
+ public void tosUninitialized_changesToTosUnaccepted_doNotUnregisterTosContentObservers() {
+ TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 0);
+
+ mActivityScenario = ActivityScenario.launch(new Intent(mContext, AppGridActivity.class));
+
+ mActivityScenario.onActivity(activity -> {
+ assertNotNull(activity.mTosContentObserver); // Content observer is setup
+ assertNotNull(activity.mTosDisabledAppsContentObserver); // Content observer is setup
+
+ // TOS changed to unaccepted
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 1);
+ activity.mTosContentObserver.onChange(true);
+ });
+
+ // Content observer is not null after tos is unaccepted
+ mActivityScenario.onActivity(activity -> {
+ assertNotNull(activity.mTosContentObserver);
+ assertNotNull(activity.mTosDisabledAppsContentObserver);
+ });
+ }
+
+ @Test
+ public void
+ tosNotAccepted_tosDisabledAppsUpdate_doNotUnregisterTosDisabledAppsContentObserver() {
+ TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_USER_TOS_ACCEPTED, 1);
+ Settings.Secure.putString(
+ mContext.getContentResolver(),
+ KEY_UNACCEPTED_TOS_DISABLED_APPS,
+ "tos_disabled_app_one,tos_disabled_app_2");
+
+ mActivityScenario = ActivityScenario.launch(new Intent(mContext, AppGridActivity.class));
+
+ mActivityScenario.onActivity(activity -> {
+ assertNotNull(activity.mTosContentObserver); // Content observer is setup
+ assertNotNull(activity.mTosDisabledAppsContentObserver); // Content observer is setup
+
+ // TOS changed to unaccepted
+ Settings.Secure.putString(mContext.getContentResolver(),
+ KEY_UNACCEPTED_TOS_DISABLED_APPS,
+ "tos_disabled_app_one");
+ activity.mTosContentObserver.onChange(true);
+ });
+
+ // Content observer is not null after tos is unaccepted
+ mActivityScenario.onActivity(activity -> {
+ assertNotNull(activity.mTosContentObserver);
+ assertNotNull(activity.mTosDisabledAppsContentObserver);
+ });
+ }
+}
diff --git a/tests/src/com/android/car/carlauncher/AppGridAdapterTest.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridAdapterTest.java
index 36df7846..ab357b0d 100644
--- a/tests/src/com/android/car/carlauncher/AppGridAdapterTest.java
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridAdapterTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/tests/src/com/android/car/carlauncher/AppGridPageSnapperTest.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridPageSnapperTest.java
index 25a5c598..da1a2d70 100644
--- a/tests/src/com/android/car/carlauncher/AppGridPageSnapperTest.java
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppGridPageSnapperTest.java
@@ -501,6 +501,9 @@ public class AppGridPageSnapperTest {
IdlingRegistry.getInstance().unregister(this);
}
+ /**
+ * Helper method to get IdlingResource for recyclerview.
+ */
public static RecyclerViewIdlingResource register(ActivityScenario<TestActivity> scenario) {
final RecyclerViewIdlingResource[] idlingResources = new RecyclerViewIdlingResource[1];
scenario.onActivity((activity -> {
diff --git a/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppItemViewHolderTest.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppItemViewHolderTest.java
new file mode 100644
index 00000000..9642c211
--- /dev/null
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppItemViewHolderTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.carlauncher.recyclerview.AppItemViewHolder;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class AppItemViewHolderTest {
+
+ private static final String TEST_APP_PACKAGE_NAME = "com.android.car.test";
+ private static final String TEST_TOS_DISABLED_APP_CLASS_NAME = "TosDisabledApp";
+
+ @Mock private View mView;
+ @Mock private Context mContext;
+ @Mock private AppItemViewHolder.AppItemDragCallback mDragCallback;
+ @Mock private AppGridPageSnapper.AppGridPageSnapCallback mSnapCallback;
+ @Mock private ImageView mAppIcon;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = ApplicationProvider.getApplicationContext();
+ }
+
+ @Test
+ public void testTosDisabledAppsOpacity() {
+ setupMocksTosDisabledApps();
+
+ AppItemViewHolder appItemViewHolder =
+ new AppItemViewHolder(mView, mContext, mDragCallback, mSnapCallback);
+
+ ComponentName componentName =
+ new ComponentName(TEST_APP_PACKAGE_NAME, TEST_TOS_DISABLED_APP_CLASS_NAME);
+
+ AppMetaData metaData =
+ new AppMetaData(
+ null,
+ componentName,
+ null,
+ true,
+ false,
+ true,
+ null,
+ null);
+
+ appItemViewHolder.bind(metaData, new AppItemViewHolder.BindInfo(false, null));
+
+ verify(mAppIcon).setAlpha(0.46f);
+ }
+
+ private void setupMocksTosDisabledApps() {
+ LinearLayout appItemView = mock(LinearLayout.class);
+ ViewTreeObserver viewTreeObserver = mock(ViewTreeObserver.class);
+ TextView appName = mock(TextView.class);
+
+ when(mView.findViewById(R.id.app_item)).thenReturn(appItemView);
+ when(appItemView.findViewById(R.id.app_icon)).thenReturn(mAppIcon);
+ when(appItemView.findViewById(R.id.app_name)).thenReturn(appName);
+ when(mAppIcon.getViewTreeObserver()).thenReturn(viewTreeObserver);
+ }
+}
diff --git a/tests/src/com/android/car/carlauncher/AppLauncherUtilsTest.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppLauncherUtilsTest.java
index 3e5d2f34..c027a721 100644
--- a/tests/src/com/android/car/carlauncher/AppLauncherUtilsTest.java
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/AppLauncherUtilsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,19 +17,23 @@
package com.android.car.carlauncher;
import static android.car.settings.CarSettings.Secure.KEY_PACKAGES_DISABLED_ON_RESOURCE_OVERUSE;
+import static android.car.settings.CarSettings.Secure.KEY_UNACCEPTED_TOS_DISABLED_APPS;
+import static android.content.pm.ApplicationInfo.CATEGORY_AUDIO;
+import static android.content.pm.ApplicationInfo.CATEGORY_VIDEO;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
import static android.content.pm.PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
import static com.android.car.carlauncher.AppLauncherUtils.APP_TYPE_LAUNCHABLES;
import static com.android.car.carlauncher.AppLauncherUtils.APP_TYPE_MEDIA_SERVICES;
import static com.android.car.carlauncher.AppLauncherUtils.PACKAGES_DISABLED_ON_RESOURCE_OVERUSE_SEPARATOR;
+import static com.android.car.carlauncher.AppLauncherUtils.TOS_DISABLED_APPS_SEPARATOR;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.mock;
@@ -49,11 +53,13 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
+import android.content.pm.LauncherActivityInfo;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
+import android.os.Bundle;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.media.MediaBrowserService;
@@ -61,27 +67,25 @@ import android.util.ArraySet;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
-import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
+import org.mockito.Mockito;
-import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.function.Consumer;
-import java.util.function.Predicate;
+import java.util.stream.Collectors;
@RunWith(AndroidJUnit4.class)
@SmallTest
@@ -89,23 +93,50 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
private static final String TEST_DISABLED_APP_1 = "com.android.car.test.disabled1";
private static final String TEST_DISABLED_APP_2 = "com.android.car.test.disabled2";
private static final String TEST_ENABLED_APP = "com.android.car.test.enabled";
+ private static final String TEST_TOS_DISABLED_APP_1 = "com.android.car.test.tosdisabled1";
+ private static final String TEST_TOS_DISABLED_APP_2 = "com.android.car.test.tosdisabled2";
private static final String TEST_VIDEO_APP = "com.android.car.test.video";
+ // Default media app
+ private static final String TEST_MEDIA_TEMPLATE_MBS = "com.android.car.test.mbs";
+ // Video app that has a MBS defined but has its own launch activity
+ private static final String TEST_VIDEO_MBS = "com.android.car.test.video.mbs";
+ // NDO App that has opted in its MBS to launch in car
+ private static final String TEST_NDO_MBS_LAUNCHABLE = "com.android.car.test.mbs.launchable";
+ // NDO App that has opted out its MBS to launch in car
+ private static final String TEST_NDO_MBS_NOT_LAUNCHABLE =
+ "com.android.car.test.mbs.notlaunchable";
+
+ private static final String CUSTOM_MEDIA_PACKAGE = "com.android.car.radio";
+ private static final String CUSTOM_MEDIA_CLASS = "com.android.car.radio.service";
+ private static final String CUSTOM_MEDIA_COMPONENT = CUSTOM_MEDIA_PACKAGE
+ + "/" + CUSTOM_MEDIA_CLASS;
private static final String TEST_MIRROR_APP_PKG = "com.android.car.test.mirroring";
+ private static final String TOS_INTENT_NAME = "intent:#Intent;action="
+ + "com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=true;"
+ + "S.mini_flow_extra=GTOS_GATED_FLOW;end";
+ private static final String TOS_INTENT_VERIFY = "#Intent;action="
+ + "com.android.car.SHOW_USER_TOS_ACTIVITY;B.show_value_prop=true;"
+ + "S.mini_flow_extra=GTOS_GATED_FLOW;end";
- private static final Predicate<ResolveInfo> MATCH_NO_APP = (resolveInfo) -> false;
@Mock private Context mMockContext;
@Mock private LauncherApps mMockLauncherApps;
@Mock private PackageManager mMockPackageManager;
@Mock private AppLauncherUtils.ShortcutsListener mMockShortcutsListener;
+ @Mock private Resources mResources;
+
+ @Mock private LauncherActivityInfo mRadioLauncherActivityInfo;
+
private CarMediaManager mCarMediaManager;
private CarPackageManager mCarPackageManager;
- private XmlPullParserFactory mParserFactory;
private Car mCar;
@Before
public void setUp() throws Exception {
+ // Need for CarMediaManager to get the user from the context.
+ when(mMockContext.getUser()).thenReturn(UserHandle.of(ActivityManager.getCurrentUser()));
+
mCar = Car.createCar(mMockContext, /* handler = */ null, Car.CAR_WAIT_TIMEOUT_WAIT_FOREVER,
(car, ready) -> {
if (!ready) {
@@ -114,12 +145,10 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
return;
}
mCarPackageManager = (CarPackageManager) car.getCarManager(Car.PACKAGE_SERVICE);
+ mCarPackageManager = Mockito.spy(mCarPackageManager);
mCarMediaManager = (CarMediaManager) car.getCarManager(Car.CAR_MEDIA_SERVICE);
when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager);
});
-
- mParserFactory = XmlPullParserFactory.newInstance();
- mParserFactory.setNamespaceAware(true);
}
@After
@@ -136,22 +165,94 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
}
@Test
- public void testGetLauncherAppsWithEnableAndLaunchDisabledApps() {
+ public void testGetLauncherApps_MediaCenterAppSwitcher() {
mockSettingsStringCalls();
mockPackageManagerQueries();
+ when(mMockContext.getResources()).thenReturn(mResources);
+ when(mResources.getStringArray(eq(
+ com.android.car.media.common.R.array.custom_media_packages)))
+ .thenReturn(new String[]{CUSTOM_MEDIA_COMPONENT});
+
+ // Setup custom media component
+ when(mMockLauncherApps.getActivityList(any(), any()))
+ .thenReturn(List.of(mRadioLauncherActivityInfo));
+ when(mRadioLauncherActivityInfo.getComponentName())
+ .thenReturn(new ComponentName(CUSTOM_MEDIA_PACKAGE, CUSTOM_MEDIA_CLASS));
+ when(mRadioLauncherActivityInfo.getName())
+ .thenReturn(CUSTOM_MEDIA_CLASS);
+
AppLauncherUtils.LauncherAppsInfo launcherAppsInfo = AppLauncherUtils.getLauncherApps(
mMockContext, /* appsToHide= */ new ArraySet<>(),
- /* customMediaComponents= */ new ArraySet<>(),
- /* appTypes= */ APP_TYPE_LAUNCHABLES + APP_TYPE_MEDIA_SERVICES,
+ /* appTypes= */ APP_TYPE_MEDIA_SERVICES,
/* openMediaCenter= */ false, mMockLauncherApps, mCarPackageManager,
- mMockPackageManager, MATCH_NO_APP, mCarMediaManager, mMockShortcutsListener,
+ mMockPackageManager, mCarMediaManager, mMockShortcutsListener,
TEST_MIRROR_APP_PKG, /* mirroringAppRedirect= */ null);
List<AppMetaData> appMetaData = launcherAppsInfo.getLaunchableComponentsList();
+ // Only media apps should be present
+ assertEquals(Set.of(
+ TEST_MEDIA_TEMPLATE_MBS,
+ TEST_NDO_MBS_LAUNCHABLE,
+ CUSTOM_MEDIA_PACKAGE),
+ appMetaData.stream()
+ .map(am -> am.getComponentName().getPackageName())
+ .collect(Collectors.toSet()));
+
+ // This should include all MBS discovered
+ assertEquals(5, launcherAppsInfo.getMediaServices().size());
+
+ mockPmGetApplicationEnabledSetting(COMPONENT_ENABLED_STATE_ENABLED, TEST_DISABLED_APP_1,
+ TEST_DISABLED_APP_2);
+
+ launchAllApps(appMetaData);
+
+ // Media apps should do only switching and not launch activity
+ verify(mMockContext, never()).startActivity(any(), any());
+ }
+
+ @Test
+ public void testGetLauncherApps_Launcher() {
+ mockSettingsStringCalls();
+ mockPackageManagerQueries();
+
+ when(mMockContext.getResources()).thenReturn(mResources);
+ when(mResources.getStringArray(eq(
+ com.android.car.media.common.R.array.custom_media_packages)))
+ .thenReturn(new String[]{CUSTOM_MEDIA_COMPONENT});
+
+ // Setup custom media component
+ when(mMockLauncherApps.getActivityList(any(), any()))
+ .thenReturn(List.of(mRadioLauncherActivityInfo));
+ when(mRadioLauncherActivityInfo.getComponentName())
+ .thenReturn(new ComponentName(CUSTOM_MEDIA_PACKAGE, CUSTOM_MEDIA_CLASS));
+ when(mRadioLauncherActivityInfo.getName())
+ .thenReturn(CUSTOM_MEDIA_CLASS);
+
+ AppLauncherUtils.LauncherAppsInfo launcherAppsInfo = AppLauncherUtils.getLauncherApps(
+ mMockContext, /* appsToHide= */ new ArraySet<>(),
+ /* appTypes= */ APP_TYPE_LAUNCHABLES + APP_TYPE_MEDIA_SERVICES,
+ /* openMediaCenter= */ true, mMockLauncherApps, mCarPackageManager,
+ mMockPackageManager, mCarMediaManager, mMockShortcutsListener,
+ TEST_MIRROR_APP_PKG, /* mirroringAppRedirect= */ null);
+
+ List<AppMetaData> appMetaData = launcherAppsInfo.getLaunchableComponentsList();
// mMockLauncherApps is never stubbed, only services & disabled activities are expected.
- assertEquals(3, appMetaData.size());
+
+ assertEquals(Set.of(
+ TEST_MEDIA_TEMPLATE_MBS,
+ TEST_NDO_MBS_LAUNCHABLE,
+ CUSTOM_MEDIA_PACKAGE,
+ TEST_DISABLED_APP_1,
+ TEST_DISABLED_APP_2),
+ appMetaData.stream()
+ .map(am -> am.getComponentName().getPackageName())
+ .collect(Collectors.toSet()));
+
+
+ // This should include all MBS discovered
+ assertEquals(5, launcherAppsInfo.getMediaServices().size());
mockPmGetApplicationEnabledSetting(COMPONENT_ENABLED_STATE_ENABLED, TEST_DISABLED_APP_1,
TEST_DISABLED_APP_2);
@@ -164,20 +265,28 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
verify(mMockPackageManager).setApplicationEnabledSetting(
eq(TEST_DISABLED_APP_2), eq(COMPONENT_ENABLED_STATE_ENABLED), eq(0));
- verify(mMockContext, times(2)).startActivity(any(), any());
+ verify(mMockContext, times(5)).startActivity(any(), any());
+
+ verify(mMockPackageManager, never()).setApplicationEnabledSetting(
+ eq(TEST_ENABLED_APP), anyInt(), eq(0));
}
+
@Test
- public void testGetLauncherAppsWithNotEnablingEnabledApps() {
+ public void testGetLauncherAppsWithEnableAndTosDisabledApps() {
mockSettingsStringCalls();
- mockPackageManagerQueries();
+ mockTosPackageManagerQueries();
+
+ when(mMockContext.getResources()).thenReturn(mResources);
+ when(mResources.getStringArray(eq(
+ com.android.car.media.common.R.array.custom_media_packages)))
+ .thenReturn(new String[]{CUSTOM_MEDIA_COMPONENT});
AppLauncherUtils.LauncherAppsInfo launcherAppsInfo = AppLauncherUtils.getLauncherApps(
mMockContext, /* appsToHide= */ new ArraySet<>(),
- /* customMediaComponents= */ new ArraySet<>(),
/* appTypes= */ APP_TYPE_LAUNCHABLES + APP_TYPE_MEDIA_SERVICES,
/* openMediaCenter= */ false, mMockLauncherApps, mCarPackageManager,
- mMockPackageManager, MATCH_NO_APP, mCarMediaManager, mMockShortcutsListener,
+ mMockPackageManager, mCarMediaManager, mMockShortcutsListener,
TEST_MIRROR_APP_PKG, /* mirroringAppRedirect= */ null);
List<AppMetaData> appMetaData = launcherAppsInfo.getLaunchableComponentsList();
@@ -185,93 +294,64 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
// mMockLauncherApps is never stubbed, only services & disabled activities are expected.
assertEquals(3, appMetaData.size());
- mockPmGetApplicationEnabledSetting(COMPONENT_ENABLED_STATE_ENABLED, TEST_DISABLED_APP_1,
- TEST_DISABLED_APP_2);
+ Resources resources = mock(Resources.class);
+ when(mMockContext.getResources()).thenReturn(resources);
+ when(resources.getString(anyInt())).thenReturn(TOS_INTENT_NAME);
launchAllApps(appMetaData);
- verify(mMockPackageManager, never()).setApplicationEnabledSetting(
- eq(TEST_ENABLED_APP), anyInt(), eq(0));
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mMockContext, times(2)).startActivity(intentCaptor.capture(), any());
+
+ String intentUri = intentCaptor.getAllValues().get(0).toUri(0);
+ assertEquals(TOS_INTENT_VERIFY, intentUri);
}
@Test
- public void testGetLauncherAppsWithEnabledAndVideoApps() {
+ public void testGetLauncherAppsWithEnableAndTosDisabledDistractionOptimizedApps() {
mockSettingsStringCalls();
- mockPackageManagerQueriesForVideo();
+ mockTosPackageManagerQueries();
+
+ when(mMockContext.getResources()).thenReturn(mResources);
+ when(mResources.getStringArray(eq(
+ com.android.car.media.common.R.array.custom_media_packages)))
+ .thenReturn(new String[]{CUSTOM_MEDIA_COMPONENT});
+
+ doReturn(true)
+ .when(mCarPackageManager)
+ .isActivityDistractionOptimized(eq(TEST_TOS_DISABLED_APP_1), any());
+ doReturn(true)
+ .when(mCarPackageManager)
+ .isActivityDistractionOptimized(eq(TEST_TOS_DISABLED_APP_2), any());
AppLauncherUtils.LauncherAppsInfo launcherAppsInfo = AppLauncherUtils.getLauncherApps(
mMockContext, /* appsToHide= */ new ArraySet<>(),
- /* customMediaComponents= */ new ArraySet<>(),
/* appTypes= */ APP_TYPE_LAUNCHABLES + APP_TYPE_MEDIA_SERVICES,
/* openMediaCenter= */ false, mMockLauncherApps, mCarPackageManager,
- mMockPackageManager, new TestVideoAppPredicate(), mCarMediaManager,
- mMockShortcutsListener, TEST_MIRROR_APP_PKG, /* mirroringAppRedirect= */ null);
+ mMockPackageManager, mCarMediaManager, mMockShortcutsListener,
+ TEST_MIRROR_APP_PKG, /* mirroringAppRedirect= */ null);
+ List<AppMetaData> appMetaData = launcherAppsInfo.getLaunchableComponentsList();
// mMockLauncherApps is never stubbed, only services & disabled activities are expected.
- List<AppMetaData> appMetaData = launcherAppsInfo.getLaunchableComponentsList();
+ assertEquals(3, appMetaData.size());
- // TEST_VIDEO_APP should be filtered by TestVideoAppPredicate above.
- assertEquals(1, appMetaData.size());
- assertEquals(TEST_ENABLED_APP, appMetaData.get(0).getPackageName());
- }
+ Resources resources = mock(Resources.class);
+ when(mMockContext.getResources()).thenReturn(resources);
+ when(resources.getString(anyInt())).thenReturn(TOS_INTENT_NAME);
- @Test
- public void getAutomotiveAppTypes() {
- // This test relies on test app's manifest & xml resources.
- Context testContext =
- InstrumentationRegistry.getInstrumentation().getContext();
- assertEquals(
- Arrays.asList("video", "media"),
- AppLauncherUtils.getAutomotiveAppTypes(
- testContext.getPackageManager(),
- testContext.getPackageName()));
- }
+ launchAllApps(appMetaData);
- @Test
- public void videoAppPredicate() {
- // This test relies on test app's manifest & xml resources.
- Context testContext =
- InstrumentationRegistry.getInstrumentation().getContext();
- Predicate<ResolveInfo> predicate =
- new AppLauncherUtils.VideoAppPredicate(testContext.getPackageManager());
-
- assertTrue(predicate.test(constructServiceResolveInfo(testContext.getPackageName())));
- }
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mMockContext, times(2)).startActivity(intentCaptor.capture(), any());
- @Test
- public void invalidAutomotiveXml() {
- StringBuilder hugeInvalidXml = new StringBuilder("<automotiveApp>");
- for (int i = 0; i < 65; i++) {
- hugeInvalidXml.append("<uses name=\"video\"/>");
- }
- hugeInvalidXml.append("</automotiveApp>");
-
- String[] invalidXmls = {
- "NoTagsHere",
- // Unknown tag.
- "<foo/>",
- // Manifest tag not expected.
- "<automotiveApp><manifest/></automotiveApp>",
- // Uses tag has missing name attribute.
- "<automotiveApp><uses/></automotiveApp>",
- // Uses tag has empty name attribute.
- "<automotiveApp><uses name=\"\"/></automotiveApp>",
- // Uses tag nested inside uses tag.
- "<automotiveApp><uses name=\"video\"><uses name=\"media\"/></uses></automotiveApp>",
- // Too many uses tags
- hugeInvalidXml.toString()
- };
-
- for (String invalidXml : invalidXmls) {
- List<String> appTypes =
- AppLauncherUtils.parseAutomotiveAppTypes(createPullParser(invalidXml));
- assertEquals(0, appTypes.size());
- }
+ String intentUri = intentCaptor.getAllValues().get(0).toUri(0);
+ assertEquals(TOS_INTENT_VERIFY, intentUri);
}
private void forceStopInit(ActivityManager activityManager, CarMediaManager carMediaManager,
- ComponentName currentMediaComponentName, ComponentName previousMediaComponentName,
+ ComponentName currentMediaComponentName,
+ ComponentName previousMediaComponentName,
Map<Integer, Boolean> currentModes, boolean isMedia) {
when(mMockContext.getSystemService(
ArgumentMatchers.<Class<ActivityManager>>any())).thenReturn(activityManager);
@@ -352,7 +432,8 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
CarMediaManager carMediaManager = mock(CarMediaManager.class);
ComponentName currentMediaComponentName = new ComponentName(packageName,
"com.example.service");
- ComponentName otherMediaComponentName = new ComponentName("other.package", "other.test");
+ ComponentName otherMediaComponentName = new ComponentName("other.package",
+ "other.test");
Map<Integer, Boolean> currentModes = new HashMap<>();
currentModes.put(CarMediaManager.MEDIA_SOURCE_MODE_PLAYBACK, true);
currentModes.put(CarMediaManager.MEDIA_SOURCE_MODE_BROWSE, true);
@@ -367,7 +448,8 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
verify(activityManager).forceStopPackage(packageName);
verify(mMockShortcutsListener).onStopAppSuccess(nullable(String.class));
- verify(carMediaManager, times(2)).setMediaSource(eq(otherMediaComponentName), anyInt());
+ verify(carMediaManager, times(2))
+ .setMediaSource(eq(otherMediaComponentName), anyInt());
}
@Test
@@ -392,34 +474,170 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
verify(carMediaManager, never()).setMediaSource(any(ComponentName.class), anyInt());
}
- private XmlPullParser createPullParser(String xmlText) {
+ private void mockPackageManagerQueries() {
+ // setup a media template app that uses media service
+ ApplicationInfo mbsAppInfo = new ApplicationInfo();
+ mbsAppInfo.category = CATEGORY_AUDIO;
+ ResolveInfo mbs = constructServiceResolveInfo(TEST_MEDIA_TEMPLATE_MBS);
+
try {
- XmlPullParser parser = mParserFactory.newPullParser();
- parser.setInput(new StringReader(xmlText));
- return parser;
- } catch (XmlPullParserException e) {
- fail("Unexpected failure");
- return null;
+ Intent mbsIntent = new Intent();
+ mbsIntent.setComponent(mbs.getComponentInfo().getComponentName());
+ mbsIntent.setAction(MediaBrowserService.SERVICE_INTERFACE);
+
+ when(mMockPackageManager.getApplicationInfo(mbs.getComponentInfo().packageName, 0))
+ .thenReturn(mbsAppInfo);
+
+ doReturn(Arrays.asList(mbs)).when(mMockPackageManager).queryIntentServices(
+ argThat((Intent i) -> i != null
+ && mbs.getComponentInfo().getComponentName().equals(i.getComponent())),
+ eq(PackageManager.GET_META_DATA));
+
+ when(mMockPackageManager.getLaunchIntentForPackage(mbs.getComponentInfo().packageName))
+ .thenReturn(null);
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException(e);
}
- }
- private void mockPackageManagerQueriesForVideo() {
- when(mMockPackageManager.queryIntentServices(any(), anyInt())).thenAnswer(args -> {
+ // setup a NDO Video app that has MBS but also its own activity, MBS won't be surfaced
+ ApplicationInfo videoAppInfo = new ApplicationInfo();
+ videoAppInfo.category = CATEGORY_VIDEO;
+ ResolveInfo videoApp = constructServiceResolveInfo(TEST_VIDEO_MBS);
+ try {
+ Intent videoMbsIntent = new Intent();
+ videoMbsIntent.setComponent(videoApp.getComponentInfo().getComponentName());
+ videoMbsIntent.setAction(MediaBrowserService.SERVICE_INTERFACE);
+
+ when(mMockPackageManager.getApplicationInfo(videoApp.getComponentInfo().packageName,
+ 0))
+ .thenReturn(videoAppInfo);
+
+ doReturn(Arrays.asList(videoApp)).when(mMockPackageManager).queryIntentServices(
+ argThat((Intent i) -> i != null
+ && videoApp.getComponentInfo().getComponentName()
+ .equals(i.getComponent())),
+ eq(PackageManager.GET_META_DATA));
+
+ when(mMockPackageManager.getLaunchIntentForPackage(
+ videoApp.getComponentInfo().packageName))
+ .thenReturn(new Intent());
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+
+ // setup a NDO app that has MBS opted out of launch in car
+ ApplicationInfo notlaunchableMBSInfo = new ApplicationInfo();
+ notlaunchableMBSInfo.category = CATEGORY_VIDEO;
+ ResolveInfo notlaunchableMBSApp = constructServiceResolveInfo(TEST_NDO_MBS_NOT_LAUNCHABLE);
+
+ try {
+ Intent notlaunachableMbsIntent = new Intent();
+ notlaunachableMbsIntent.setComponent(
+ notlaunchableMBSApp.getComponentInfo().getComponentName());
+ notlaunachableMbsIntent.setAction(MediaBrowserService.SERVICE_INTERFACE);
+
+ when(mMockPackageManager.getApplicationInfo(
+ notlaunchableMBSApp.getComponentInfo().packageName, 0))
+ .thenReturn(notlaunchableMBSInfo);
+
+
+ notlaunchableMBSApp.serviceInfo.metaData = new Bundle();
+ notlaunchableMBSApp.serviceInfo.metaData
+ .putBoolean("androidx.car.app.launchable", false);
+
+ doReturn(Arrays.asList(notlaunchableMBSApp))
+ .when(mMockPackageManager).queryIntentServices(
+ argThat((Intent i) -> i != null
+ && notlaunchableMBSApp.getComponentInfo().getComponentName()
+ .equals(i.getComponent())),
+ eq(PackageManager.GET_META_DATA));
+
+ when(mMockPackageManager.getLaunchIntentForPackage(
+ notlaunchableMBSApp.getComponentInfo().packageName))
+ .thenReturn(new Intent());
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+
+
+ // setup a NDO app that has MBS opted in to launch in car
+ ApplicationInfo launchableMBSInfo = new ApplicationInfo();
+ launchableMBSInfo.category = CATEGORY_VIDEO;
+ ResolveInfo launchableMBSApp = constructServiceResolveInfo(TEST_NDO_MBS_LAUNCHABLE);
+ try {
+ Intent mbsIntent = new Intent();
+ mbsIntent.setComponent(launchableMBSApp.getComponentInfo().getComponentName());
+ mbsIntent.setAction(MediaBrowserService.SERVICE_INTERFACE);
+
+ when(mMockPackageManager.getApplicationInfo(
+ launchableMBSApp.getComponentInfo().packageName,
+ 0))
+ .thenReturn(launchableMBSInfo);
+
+
+ launchableMBSApp.serviceInfo.metaData = new Bundle();
+ launchableMBSApp.serviceInfo.metaData.putBoolean("androidx.car.app.launchable", true);
+
+ doReturn(Arrays.asList(launchableMBSApp)).when(mMockPackageManager).queryIntentServices(
+ argThat((Intent i) -> i != null
+ && launchableMBSApp.getComponentInfo().getComponentName()
+ .equals(i.getComponent())),
+ eq(PackageManager.GET_META_DATA));
+
+ when(mMockPackageManager.getLaunchIntentForPackage(
+ launchableMBSApp.getComponentInfo().packageName))
+ .thenReturn(new Intent());
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+
+ when(mMockPackageManager.queryIntentServices(any(), eq(PackageManager.GET_RESOLVED_FILTER)))
+ .thenAnswer(args -> {
Intent intent = args.getArgument(0);
if (intent.getAction().equals(MediaBrowserService.SERVICE_INTERFACE)) {
- return Arrays.asList(
- constructServiceResolveInfo(TEST_ENABLED_APP),
- constructServiceResolveInfo(TEST_VIDEO_APP));
+ return Arrays.asList(mbs, videoApp, notlaunchableMBSApp, launchableMBSApp,
+ constructServiceResolveInfo(CUSTOM_MEDIA_PACKAGE));
}
return new ArrayList<>();
});
+
+ // setup activities
+ when(mMockPackageManager.queryIntentActivities(any(), any())).thenAnswer(args -> {
+ Intent intent = args.getArgument(0);
+ PackageManager.ResolveInfoFlags flags = args.getArgument(1);
+ List<ResolveInfo> resolveInfoList = new ArrayList<>();
+ if (intent.getAction().equals(Intent.ACTION_MAIN)) {
+ if ((flags.getValue() & MATCH_DISABLED_UNTIL_USED_COMPONENTS) != 0) {
+ resolveInfoList.add(constructActivityResolveInfo(TEST_DISABLED_APP_1));
+ resolveInfoList.add(constructActivityResolveInfo(TEST_DISABLED_APP_2));
+ }
+ // Keep custom media component in both MBS and Activity with Launch Intent
+ resolveInfoList.add(constructActivityResolveInfo(CUSTOM_MEDIA_PACKAGE));
+ // Add apps which will have their own Launcher Activity
+ resolveInfoList.add(constructActivityResolveInfo(TEST_VIDEO_MBS));
+ resolveInfoList.add(constructActivityResolveInfo(TEST_NDO_MBS_LAUNCHABLE));
+ resolveInfoList.add(constructActivityResolveInfo(TEST_NDO_MBS_NOT_LAUNCHABLE));
+ }
+
+ return resolveInfoList;
+ });
}
- private void mockPackageManagerQueries() {
+ private void mockTosPackageManagerQueries() {
+ ResolveInfo resolveInfo = constructServiceResolveInfo(TEST_ENABLED_APP);
+ try {
+ when(mMockPackageManager.getServiceInfo(
+ resolveInfo
+ .getComponentInfo().getComponentName(),
+ PackageManager.GET_META_DATA))
+ .thenReturn(new ServiceInfo());
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException(e);
+ }
when(mMockPackageManager.queryIntentServices(any(), anyInt())).thenAnswer(args -> {
Intent intent = args.getArgument(0);
if (intent.getAction().equals(MediaBrowserService.SERVICE_INTERFACE)) {
- return Collections.singletonList(constructServiceResolveInfo(TEST_ENABLED_APP));
+ return Collections.singletonList(resolveInfo);
}
return new ArrayList<>();
});
@@ -428,9 +646,9 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
PackageManager.ResolveInfoFlags flags = args.getArgument(1);
List<ResolveInfo> resolveInfoList = new ArrayList<>();
if (intent.getAction().equals(Intent.ACTION_MAIN)) {
- if ((flags.getValue() & MATCH_DISABLED_UNTIL_USED_COMPONENTS) != 0) {
- resolveInfoList.add(constructActivityResolveInfo(TEST_DISABLED_APP_1));
- resolveInfoList.add(constructActivityResolveInfo(TEST_DISABLED_APP_2));
+ if ((flags.getValue() & MATCH_DISABLED_COMPONENTS) != 0) {
+ resolveInfoList.add(constructActivityResolveInfo(TEST_TOS_DISABLED_APP_1));
+ resolveInfoList.add(constructActivityResolveInfo(TEST_TOS_DISABLED_APP_2));
}
resolveInfoList.add(constructActivityResolveInfo(TEST_ENABLED_APP));
}
@@ -457,6 +675,11 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
+ TEST_DISABLED_APP_2)
.when(() -> Settings.Secure.getString(any(ContentResolver.class),
eq(KEY_PACKAGES_DISABLED_ON_RESOURCE_OVERUSE)));
+
+ doReturn(TEST_TOS_DISABLED_APP_1 + TOS_DISABLED_APPS_SEPARATOR
+ + TEST_TOS_DISABLED_APP_2)
+ .when(() -> Settings.Secure.getString(any(ContentResolver.class),
+ eq(KEY_UNACCEPTED_TOS_DISABLED_APPS)));
}
private void launchAllApps(List<AppMetaData> appMetaData) {
@@ -483,16 +706,4 @@ public final class AppLauncherUtilsTest extends AbstractExtendedMockitoTestCase
info.serviceInfo.applicationInfo = new ApplicationInfo();
return info;
}
-
- /** Test sub-class of VideoAppPredicate that only matches TEST_VIDEO_APP package-name */
- static class TestVideoAppPredicate extends AppLauncherUtils.VideoAppPredicate {
- TestVideoAppPredicate() {
- super(/* packageManager= */ null);
- }
-
- @Override
- public boolean test(ResolveInfo resolveInfo) {
- return TEST_VIDEO_APP.equals(super.getPackageName(resolveInfo));
- }
- }
}
diff --git a/tests/src/com/android/car/carlauncher/InstantTaskExecutorRule.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/InstantTaskExecutorRule.java
index 734902d5..1309dd8e 100644
--- a/tests/src/com/android/car/carlauncher/InstantTaskExecutorRule.java
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/InstantTaskExecutorRule.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/libs/appgrid/lib/tests/src/com/android/car/carlauncher/LauncherViewModelTest.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/LauncherViewModelTest.java
new file mode 100644
index 00000000..90537c96
--- /dev/null
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/LauncherViewModelTest.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.content.ComponentName;
+import android.graphics.drawable.Drawable;
+
+import androidx.lifecycle.Observer;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+@RunWith(AndroidJUnit4.class)
+public final class LauncherViewModelTest extends AbstractExtendedMockitoTestCase {
+ @Rule
+ public InstantTaskExecutorRule instantTaskExecutorRule =
+ new InstantTaskExecutorRule();
+ private LauncherViewModel mLauncherModel;
+ private AppLauncherUtils.LauncherAppsInfo mLauncherAppsInfo;
+ private Drawable mDrawable = mock(Drawable.class);
+ private Consumer mConsumer = mock(Consumer.class);
+ private List<LauncherItem> mCustomizedApps;
+ private List<LauncherItem> mAlphabetizedApps;
+ private List<AppMetaData> mApps;
+
+ @Before
+ public void setUp() throws Exception {
+ mLauncherModel = new LauncherViewModel(
+ new File("/data/user/10/com.android.car.carlauncher/files"));
+ mCustomizedApps = new ArrayList<>();
+ mAlphabetizedApps = new ArrayList<>();
+ AppMetaData app1 = createTestAppMetaData("App1", "A");
+ AppMetaData app2 = createTestAppMetaData("App2", "B");
+ AppMetaData app3 = createTestAppMetaData("App3", "C");
+ LauncherItem launcherItem1 = new AppItem(app1);
+ LauncherItem launcherItem2 = new AppItem(app2);
+ LauncherItem launcherItem3 = new AppItem(app3);
+ mApps = new ArrayList<>();
+ mApps.add(app1);
+ mApps.add(app2);
+ mApps.add(app3);
+ mAlphabetizedApps = new ArrayList<>();
+ mAlphabetizedApps.add(launcherItem1);
+ mAlphabetizedApps.add(launcherItem2);
+ mAlphabetizedApps.add(launcherItem3);
+ mCustomizedApps = new ArrayList<>();
+ mCustomizedApps.add(launcherItem2);
+ mCustomizedApps.add(launcherItem3);
+ mCustomizedApps.add(launcherItem1);
+
+ mLauncherAppsInfo = mock(AppLauncherUtils.LauncherAppsInfo.class);
+ when(mLauncherAppsInfo.getLaunchableComponentsList()).thenReturn(mApps);
+ }
+
+ private AppMetaData createTestAppMetaData(String displayName, String componentName) {
+ return new AppMetaData(displayName, new ComponentName(componentName, componentName),
+ mDrawable, true, false, true, mConsumer, mConsumer);
+ }
+
+ @Test
+ @Ignore("b/304484141")
+ public void test_concurrentExecution() throws InterruptedException {
+ ExecutorService pool = Executors.newCachedThreadPool();
+ for (int i = 0; i < 100; i++) {
+ pool.execute(() -> {
+ mLauncherModel.loadAppsOrderFromFile();
+ });
+ pool.execute(() -> {
+ mLauncherModel.processAppsInfoFromPlatform(mLauncherAppsInfo);
+ });
+ }
+ pool.shutdown(); // Disable new tasks from being submitted
+ if (!pool.awaitTermination(30, TimeUnit.SECONDS)) {
+ pool.shutdownNow(); // Cancel currently executing tasks
+ }
+ mLauncherModel.getCurrentLauncher().observeForever(new Observer<>() {
+ @Override
+ public void onChanged(List<LauncherItem> launcherItems) {
+ assertEquals(3, launcherItems.size());
+ assertEquals("A", launcherItems.get(0).getPackageName());
+ assertEquals("B", launcherItems.get(1).getPackageName());
+ assertEquals("C", launcherItems.get(2).getPackageName());
+ //remove observer after assertion
+ mLauncherModel.getCurrentLauncher().removeObserver(this);
+ }
+ });
+ }
+
+ @Test
+ public void loadAppsOrderFromFile_first_noOrderFile() throws IOException {
+ mLauncherModel.loadAppsOrderFromFile();
+ mLauncherModel.processAppsInfoFromPlatform(mLauncherAppsInfo);
+ mLauncherModel.getCurrentLauncher().observeForever(launcherItems -> {
+ assertEquals(3, launcherItems.size());
+ assertEquals("A", launcherItems.get(0).getPackageName());
+ assertEquals("B", launcherItems.get(1).getPackageName());
+ assertEquals("C", launcherItems.get(2).getPackageName());
+ });
+ }
+
+ @Test
+ public void loadAppsOrderFromFile_first_existsOrderFile() {
+ mLauncherModel.processAppsInfoFromPlatform(mLauncherAppsInfo);
+ mLauncherModel.loadAppsOrderFromFile();
+
+ mLauncherModel.setAppPosition(0, mApps.get(2));
+ // normally, the observer would make this call
+ mLauncherModel.handleAppListChange();
+
+ mLauncherModel.loadAppsOrderFromFile();
+ mLauncherModel.getCurrentLauncher().observeForever(it -> {
+ assertEquals("C", mApps.get(2).getPackageName());
+ assertEquals(3, it.size());
+ assertEquals("C", it.get(0).getPackageName());
+ });
+ }
+
+ @Test
+ public void processAppsInfoFromPlatform_first_noCustomOrderFile() {
+ mLauncherModel.processAppsInfoFromPlatform(mLauncherAppsInfo);
+ mLauncherModel.loadAppsOrderFromFile();
+ mLauncherModel.getCurrentLauncher().observeForever(it -> {
+ assertEquals(3, it.size());
+ assertEquals("A", it.get(0).getPackageName());
+ });
+ }
+}
diff --git a/tests/src/com/android/car/carlauncher/PageIndexingHelperTest.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/PageIndexingHelperTest.java
index 3f8c2ec2..79fb36d9 100644
--- a/tests/src/com/android/car/carlauncher/PageIndexingHelperTest.java
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/PageIndexingHelperTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,14 +16,14 @@
package com.android.car.carlauncher;
+import static com.android.car.carlauncher.AppGridConstants.PageOrientation;
+
import static org.junit.Assert.assertEquals;
import android.view.View;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import static com.android.car.carlauncher.AppGridConstants.PageOrientation;
-
import com.android.car.carlauncher.pagination.PageIndexingHelper;
import org.junit.Test;
diff --git a/tests/src/com/android/car/carlauncher/TestActivity.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/TestActivity.java
index c465b253..c465b253 100644
--- a/tests/src/com/android/car/carlauncher/TestActivity.java
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/TestActivity.java
diff --git a/libs/appgrid/lib/tests/src/com/android/car/carlauncher/apporder/AppOrderControllerTest.java b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/apporder/AppOrderControllerTest.java
new file mode 100644
index 00000000..da153fd1
--- /dev/null
+++ b/libs/appgrid/lib/tests/src/com/android/car/carlauncher/apporder/AppOrderControllerTest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.carlauncher.apporder;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+
+import androidx.lifecycle.MutableLiveData;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.car.carlauncher.AppItem;
+import com.android.car.carlauncher.AppMetaData;
+import com.android.car.carlauncher.LauncherItem;
+import com.android.car.carlauncher.LauncherItemMessageHelper;
+import com.android.car.carlauncher.LauncherItemProto.LauncherItemMessage;
+import com.android.car.carlauncher.datastore.launcheritem.LauncherItemListSource;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RunWith(AndroidJUnit4.class)
+public class AppOrderControllerTest {
+ private AppOrderController mController;
+ private Map<ComponentName, LauncherItem> mLauncherItemsMap;
+ private List<LauncherItem> mDefaultOrder;
+ private List<LauncherItem> mCustomizedOrder;
+ @Mock
+ private LauncherItemListSource mMockDataSource;
+ private MutableLiveData<List<LauncherItem>> mCurrentAppList;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ when(mMockDataSource.exists()).thenReturn(true);
+
+ mLauncherItemsMap = new HashMap<>();
+ mDefaultOrder = spy(new ArrayList<>());
+ mCustomizedOrder = spy(new ArrayList<>());
+ mCurrentAppList = spy(new MutableLiveData<>());
+ mCustomizedOrder.add(null);
+
+ mController = spy(new AppOrderController(mMockDataSource, mCurrentAppList, mDefaultOrder,
+ mCustomizedOrder));
+ }
+
+ @Test
+ public void maybePublishAppList_loadAppListFromPlatform_noPublishing() {
+ // tests that multiple platform connection does not publish app list
+ mController.loadAppListFromPlatform(mLauncherItemsMap, mDefaultOrder);
+ assertThat(mController.appsDataLoadingCompleted()).isFalse();
+
+ mController.loadAppListFromPlatform(mLauncherItemsMap, mDefaultOrder);
+ assertThat(mController.appsDataLoadingCompleted()).isFalse();
+
+ verify(mController, times(2)).maybePublishAppList();
+ verify(mCurrentAppList, never()).postValue(any());
+ }
+
+ @Test
+ public void maybePublishAppList_loadAppListFromFile_noPublishing() {
+ // tests that multiple file read does not publish app list
+ mController.loadAppOrderFromFile();
+ assertThat(mController.appsDataLoadingCompleted()).isFalse();
+
+ mController.loadAppOrderFromFile();
+ assertThat(mController.appsDataLoadingCompleted()).isFalse();
+
+ verify(mController, times(2)).maybePublishAppList();
+ verify(mCurrentAppList, never()).postValue(any());
+ }
+
+ @Test
+ public void maybePublishAppList_publishing_defaultOrder() {
+ when(mController.checkDataSourceExists()).thenReturn(false);
+
+ mController.loadAppOrderFromFile();
+ assertThat(mController.appsDataLoadingCompleted()).isFalse();
+ assertThat(mController.shouldUseCustomOrder()).isFalse();
+
+ mController.loadAppListFromPlatform(mLauncherItemsMap, mDefaultOrder);
+ verify(mController, times(2)).maybePublishAppList();
+ verify(mCurrentAppList, times(1)).postValue(any());
+ }
+
+ @Test
+ public void maybePublishAppList_publishing_customOrder() {
+ when(mController.checkDataSourceExists()).thenReturn(true);
+ // if the data source exists and the list is non-empty, we expect to use custom oder
+ List<LauncherItemMessage> nonEmptyMessageList = new ArrayList<>();
+ LauncherItemMessage emptyAppItemMessage =
+ (new AppItem("packageName", "className", "displayName", null))
+ .convertToMessage(1, 1);
+ nonEmptyMessageList.add(emptyAppItemMessage);
+ LauncherItemMessageHelper helper = new LauncherItemMessageHelper();
+ when(mMockDataSource.readFromFile()).thenReturn(
+ helper.convertToMessage(nonEmptyMessageList));
+
+ mController.loadAppOrderFromFile();
+ assertThat(mController.appsDataLoadingCompleted()).isFalse();
+ assertThat(mController.shouldUseCustomOrder()).isTrue();
+
+ mController.loadAppListFromPlatform(mLauncherItemsMap, mDefaultOrder);
+ verify(mController, times(2)).maybePublishAppList();
+ verify(mCurrentAppList, times(1)).postValue(any());
+ }
+
+ @Test
+ public void setAppPosition_postValue() {
+ // simulate platform app loading
+ LauncherItem testItem1 = new AppItem("packageName1", "className1", "displayName1", null);
+ LauncherItem testItem2 = new AppItem("packageName2", "className2", "displayName2", null);
+ String packageName3 = "packageName3";
+ LauncherItem testItem3 = new AppItem(packageName3, "className3", "displayName3", null);
+
+ mLauncherItemsMap.put(new ComponentName("componentName1", "componentName1"), testItem1);
+ mLauncherItemsMap.put(new ComponentName("componentName2", "componentName2"), testItem2);
+ ComponentName componentName3 = new ComponentName("componentName3", "componentName3");
+ mLauncherItemsMap.put(componentName3, testItem3);
+ List<LauncherItem> newAppList = new ArrayList<>();
+ newAppList.add(testItem1);
+ newAppList.add(testItem2);
+ newAppList.add(testItem3);
+ when(mCurrentAppList.getValue()).thenReturn(newAppList);
+
+ // simulate launcher cold start - no app list from file
+ mController.loadAppOrderFromFile();
+ assertThat(mController.shouldUseCustomOrder()).isFalse();
+ mController.loadAppListFromPlatform(mLauncherItemsMap, newAppList);
+ verify(mCurrentAppList, times(1)).postValue(any());
+
+ AppMetaData mockApp3MetaData = mock(AppMetaData.class);
+ when(mockApp3MetaData.getComponentName()).thenReturn(componentName3);
+
+ // tests that setAppPosition posts update to the user interface
+ mController.setAppPosition(0, mockApp3MetaData);
+ verify(mCurrentAppList, times(2)).postValue(any());
+
+ // tests that the setAppPosition correctly modifies app position
+ assertThat(mCurrentAppList.getValue()).isNotNull();
+ assertThat(mCurrentAppList.getValue().isEmpty()).isFalse();
+ assertThat(mCurrentAppList.getValue().get(0).getPackageName()).isEqualTo(packageName3);
+ }
+}
diff --git a/libs/car-apps-common/build.gradle b/libs/car-apps-common/build.gradle
new file mode 100644
index 00000000..c60d695a
--- /dev/null
+++ b/libs/car-apps-common/build.gradle
@@ -0,0 +1,17 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+configurations.maybeCreate("default")
+artifacts.add("default", file(gradle.ext.lib_car_apps_common_aar))
diff --git a/libs/car-media-common/build.gradle b/libs/car-media-common/build.gradle
new file mode 100644
index 00000000..8a5f20f4
--- /dev/null
+++ b/libs/car-media-common/build.gradle
@@ -0,0 +1,17 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+configurations.maybeCreate("default")
+artifacts.add("default", file(gradle.ext.lib_car_media_common_aar))
diff --git a/libs/car-ui-lib/build.gradle b/libs/car-ui-lib/build.gradle
new file mode 100644
index 00000000..097d43a7
--- /dev/null
+++ b/libs/car-ui-lib/build.gradle
@@ -0,0 +1,17 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+configurations.maybeCreate("default")
+artifacts.add("default", file(gradle.ext.lib_car_ui_lib_aar))
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
deleted file mode 100644
index 8497941c..00000000
--- a/res/values-af/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Motorlanseerder"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Stel approoster terug na A-Z-rangskikking"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Hierdie funksie sal alle gepasmaakte rangskikking verwyder. Wil jy voortgaan?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Alle programme"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Mediaprogramme"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Stop program"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> is gestop."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Stop program?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"As jy ’n program dwing om te stop, kan dit sleg optree."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"App kan nie gestop word nie."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan nie gebruik word terwyl jy bestuur nie."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Tik op kaart vir meer inligting"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Tik op kaart om te begin"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Oproep aan die gang"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Bel tans …"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Begin Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Kan nie Android Auto begin nie. Geen aktiwiteit gevind nie."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# toestel}other{# toestelle}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weer"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° meestal sonnig"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Bergaansig • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Versteek ontfoutingprogramme"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Wys ontfoutingprogramme"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Geen onlangse items nie"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Vee alles uit"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"App is nie beskikbaar nie"</string>
-</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
deleted file mode 100644
index d2ecb6c9..00000000
--- a/res/values-am/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"የመኪና ማስጀመሪያ"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"የመተግበሪያ ፍርግርግን ወደ ሀ-ፐ ቅደም ተከተል ዳግም አስጀምር"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ይህ ተግባር ሁሉንም ብጁ ቅደም ተከተል ማስያዞችን ያስወግዳል። መቀጠል ይፈልጋሉ?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"ሁሉም መተግበሪያዎች"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"የሚዲያ መተግበሪያዎች"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"መተግበሪያን አቁም"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> እንዲያቆም ተደርጓል።"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"መተግበሪያ ይቁም?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"አንድ መተግበሪያን በኃይል እንዲቆም ካደረጉት በትክክል ላይሰራ ይችላል።"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"መተግበሪያው ሊቆም አይችልም።"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"እየነዱ ሳለ <xliff:g id="APP_NAME">%1$s</xliff:g>ን መጠቀም አይቻልም።"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"ለተጨማሪ መረጃ ካርድን መታ ያድርጉ"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"ለማስጀመር ካርድን መታ ያድርጉ"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"እየተካሄደ ያለ ጥሪ"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"በመደወል ላይ…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Autoን አስጀምር"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Autoን ማስጀመር አልተቻለም። ምንም እንቅስቃሴ አልተገኘም።"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# መሣሪያ}one{# መሣሪያዎች}other{# መሣሪያዎች}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"የአየር ሁኔታ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° በአብዛኛው ጸሐያማ"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"የተራራ እይታ • ከ፦ --° ዝ፦ --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"የአራሚ መተግበሪያዎችን ደብቅ"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"የአራሚ መተግበሪያዎችን አሳይ"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"ምንም የቅርብ ጊዜ ንጥሎች የሉም"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"ሁሉንም አጽዳ"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"መተግበሪያ አይገኝም"</string>
-</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
deleted file mode 100644
index b2ecb13d..00000000
--- a/res/values-ar/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"مشغّل تطبيقات السيارة"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"إعادة ضبط شبكة التطبيقات بالترتيب أ-ي"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ستزيل هذه الدالة أي ترتيب مخصّص. هل تريد المتابعة؟"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"جميع التطبيقات"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"تطبيقات الوسائط"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"إيقاف التطبيق"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"تم إيقاف <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"هل تريد إيقاف التطبيق؟"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"في حال فرض إيقاف التطبيق، قد لا يعمل بشكل صحيح."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"يتعذّر إيقاف التطبيق."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"لا يمكن استخدام <xliff:g id="APP_NAME">%1$s</xliff:g> أثناء القيادة."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"انقر على البطاقة للحصول على مزيد من المعلومات."</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"انقر على البطاقة لتشغيل Android Auto."</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"مكالمة جارية"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"جارٍ طلب الرقم…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"تشغيل Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"يتعذّر تشغيل Android Auto. لم يتم العثور على أي أنشطة."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{جهاز واحد (#)}zero{# جهاز}two{جهازان (#)}few{# أجهزة}many{# جهازًا}other{# جهاز}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"الطقس"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° مشمس في أغلب الأوقات"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"مدينة القاهرة • درجة الحرارة الأعلى: --° الأدنى: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"إخفاء تطبيقات تصحيح الأخطاء"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"إظهار تطبيقات تصحيح الأخطاء"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"ما مِن عناصر تم استخدامها مؤخرًا"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"محو الكل"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"التطبيق غير متاح"</string>
-</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
deleted file mode 100644
index 7bcd915d..00000000
--- a/res/values-as/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"গাড়ী লঞ্চাৰ"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"এপৰ গ্ৰিডটো A-Z ক্ৰমলৈ ৰিছেট কৰক"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"এই ফাংশ্বনটোৱে আটাইবোৰ কাষ্টম অৰ্ডাৰ আঁতৰাব। আপুনি অব্যাহত ৰাখিব বিচাৰেনে?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"আটাইবোৰ এপ্‌"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"মিডিয়া এপ্‌"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"এপ্ বন্ধ কৰক"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> বন্ধ কৰা হৈছে।"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"এপ্ বন্ধ কৰিবনে?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"আপুনি কোনো এপ্‌ বলেৰে বন্ধ কৰিবলৈ চেষ্টা কৰিলে, ই অস্বাভাৱিক আচৰণ কৰিব পাৰে।"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"এপ্‌ বন্ধ কৰিব নোৱাৰি।"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"গাড়ী চলাই থকাৰ সময়ত <xliff:g id="APP_NAME">%1$s</xliff:g> ব্যৱহাৰ কৰিব নোৱাৰি।"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"অধিক তথ্যৰ বাবে কাৰ্ডত টিপক"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"লঞ্চ কৰিবলৈ কাৰ্ডত টিপক"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"চলি থকা কল"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ডায়েল কৰি থকা হৈছে…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto লঞ্চ কৰক"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto লঞ্চ কৰিব পৰা নগ’ল। কোনো কাৰ্যকলাপ পোৱা নগ’ল।"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# টা ডিভাইচ}one{# টা ডিভাইচ}other{# টা ডিভাইচ}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"বতৰ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° অধিক সময় ৰৌদ্ৰোজ্জ্বল"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"মাউণ্টেইন ভিউ • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ডিবাগ এপ্‌সমূহ লুকুৱাওক"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"ডিবাগ এপ্‌সমূহ দেখুৱাওক"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"কোনো শেহতীয়া বস্তু নাই"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"আটাইবোৰ মচক"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"এপ্‌টো উপলব্ধ নহয়"</string>
-</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
deleted file mode 100644
index 918e6248..00000000
--- a/res/values-az/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Avtomobil Başladıcısı"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Tətbiq torunu A-Z-sırası ilə sıfırlayın"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Bu funksiya bütün fərdi sıralamanı siləcək. Davam etmək istəyirsiniz?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Bütün tətbiqlər"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Media tətbiqləri"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Tətbiqi dayandırın"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> dayandırılıb."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Tətbiq dayandırılsın?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Tətbiqi dayanmağa məcbur etsəniz, o, səhv işləyə bilər."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Tətbiqi dayandırmaq olmur."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Avtomobil sürərkən <xliff:g id="APP_NAME">%1$s</xliff:g> istifadə edilə bilməz."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Ətraflı məlumat üçün karta toxunun"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Başlatmaq üçün karta toxunun"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Davam edən zəng"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Nömrə yığılır…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto\'nu başladın"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto\'nu başlatmaq mümkün deyil. Fəaliyyət tapılmadı."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# cihaz}other{# cihaz}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Hava"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Əksərən günəşli"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Dağ Görünüşü • Y: --° U: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Sazlama tətbiqlərini gizlədin"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Sazlama tətbiqlərini göstərin"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Son element yoxdur"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Hamısını silin"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Tətbiq əlçatan deyil"</string>
-</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index 1b23639a..00000000
--- a/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Pokretač za automobile"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Resetuj mrežu aplikacija na raspored A–Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Ova funkcija će uklinite celokupan prilagođen raspored. Želite da nastavite?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Sve aplikacije"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplikacije za medije"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Zaustavi aplikaciju"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je zaustavljena."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Zaustavljate aplikaciju?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ako prinudno zaustavite aplikaciju, možda će se ponašati neočekivano."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Aplikacija ne može da se zaustavi."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne može da se koristi tokom vožnje."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Dodirnite karticu za više informacija"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Dodirnite karticu da biste pokrenuli uslugu"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Poziv je u toku"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Poziva se…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Pokreni Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Pokretanje usluge Android Auto nije uspelo. Nije pronađena nijedna aktivnost."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# uređaj}one{# uređaj}few{# uređaja}other{# uređaja}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Vreme"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° uglavnom sunčano"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Novi Sad • Najviša: --° Najniža: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Sakrij aplikacije za otklanjanje grešaka"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Prikaži aplikacije za otklanjanje grešaka"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nema nedavnih stavki"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Obriši sve"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplikacija nije dostupna"</string>
-</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
deleted file mode 100644
index 2c2fc3d4..00000000
--- a/res/values-be/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Праграма запуску для аўтамабіля"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Сартаванне праграм у сетцы ў алфавітным парадку"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Гэта функцыя скасуе любы карыстальніцкі парадак сартавання. Хочаце працягнуць?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Усе праграмы"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Мультымедыйныя праграмы"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Спыніць праграму"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" спынена."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Спыніць праграму?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Прымусовае спыненне праграмы можа прывесці да збою."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Немагчыма спыніць праграму."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Праграмай \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" нельга карыстацца, калі вы за рулём."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Націсніце на картку, каб атрымаць дадатковую інфармацыю"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Націсніце на картку, каб выканаць запуск"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Выконваецца выклік"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Ідзе набор нумара…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Запусціць Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Не ўдалося запусціць Android Auto. Дзеянні не знойдзены."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# прылада}one{# прылада}few{# прылады}many{# прылад}other{# прылады}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Надвор\'е"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--°, пераважна сонечна"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Маўтын-В\'ю • макс.: --°, мін.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Схаваць праграмы адладкі"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Паказаць праграмы адладкі"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Няма нядаўніх элементаў"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Ачысціць усё"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Праграма недаступная"</string>
-</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
deleted file mode 100644
index bb3e1063..00000000
--- a/res/values-bg/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Стартов панел на автомобила"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Нулиране на решетката с приложения и задаване на нареждане от А до Я"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Тази функция ще премахне персонализираното нареждане. Искате ли да продължите?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Всички приложения"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Медийни приложения"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Спиране на приложението"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Приложението <xliff:g id="APP_NAME">%1$s</xliff:g> е спряно."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Да се спре ли приложението?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ако принудително спрете приложение, то може да не функционира правилно."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Приложението не може да бъде спряно."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се използва при шофиране."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Докоснете картата за още информация"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Докоснете картата за стартиране"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Текущо обаждане"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Набиране…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Стартиране на Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto не може да се стартира. Няма намерена активност."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# устройство}other{# устройства}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Времето"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Предимно слънчево"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Макс: --° Мин: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Скриване на приложенията за отстраняване на грешки"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Показване на приложенията за отстраняв. на грешки"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Няма скорошни елементи"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Изчистване на всичко"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Приложението не е налично"</string>
-</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
deleted file mode 100644
index 7508eed9..00000000
--- a/res/values-bn/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"A-Z অর্ডারে অ্যাপ গ্রিড রিসেট করুন"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"এই ফাংশন সবকটি কাস্টম অর্ডারিং সরিয়ে দেবে। আপনি কি এগিয়ে যেতে চান?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"সব অ্যাপ"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"মিডিয়া অ্যাপ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"অ্যাপ বন্ধ করুন"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> বন্ধ করা হয়েছে।"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"অ্যাপটি বন্ধ করবেন?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"আপনি কোনও অ্যাপকে জোর করে বন্ধ করলে, তা সঠিক ভাবে কাজ নাও করতে পারে।"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"অ্যাপ বন্ধ করা যাচ্ছে না।"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ড্রাইভ করার সময় <xliff:g id="APP_NAME">%1$s</xliff:g> ব্যবহার করা যাবে না।"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"আরও তথ্যের জন্য \'কার্ড\' বিকল্পে ট্যাপ করুন"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"চালু করতে \'কার্ড\' বিকল্পে ট্যাপ করুন"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"চালু থাকা কল"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ডায়াল করা হচ্ছে…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto লঞ্চ করুন"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto লঞ্চ করা যায়নি। কোনও অ্যাক্টিভিটি পাওয়া যায়নি।"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{#টি ডিভাইস}one{#টি ডিভাইস}other{#টি ডিভাইস}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weather"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° সাধারণত রৌদ্রোজ্জ্বল"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"পাহাড়ের দৃশ্য • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ডিবাগ অ্যাপ আড়াল করুন"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"ডিবাগ অ্যাপ দেখুন"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"কোনও সাম্প্রতিক আইটেম নেই"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"সব মুছে দিন"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"অ্যাপ উপলভ্য নেই"</string>
-</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
deleted file mode 100644
index f3a7a961..00000000
--- a/res/values-bs/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Pokretač za automobil"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Vratite postavke mreže aplikacije na zadano u redoslijed A–Ž"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Ova funkcija će ukloniti sve prilagođene narudžbe. Želite li nastaviti?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Sve aplikacije"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Medijske aplikacije"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Zaustavi aplikaciju"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je zaustavljena."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Zaustaviti aplikaciju?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ako prisilno zaustavite aplikaciju, moguće je da će se ponašati nepredviđeno."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Nije moguće zaustaviti aplikaciju."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Nije moguće koristiti aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> tokom vožnje."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Dodirnite karticu za više informacija"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Dodirnite karticu za pokretanje"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Poziv u toku"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Biranje…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Pokreni Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Nije moguće pokrenuti Android Auto. Nije pronađena nijedna aktivnost."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# uređaj}one{# uređaj}few{# uređaja}other{# uređaja}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Vrijeme"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Pretežno sunčano"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • V: --° N: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Sakrij aplikacije za otklanjanje grešaka"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Prikaži aplikacije za otklanjanje grešaka"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nema nedavnih stavki"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Obriši sve"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplikacija nije dostupna"</string>
-</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
deleted file mode 100644
index d3d2fcae..00000000
--- a/res/values-ca/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Menú d\'aplicacions del cotxe"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Restableix la quadrícula d\'aplicacions a l\'ordre alfabètic (A-Z)"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Aquesta funció suprimirà l\'ordre personalitzat. Vols continuar?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Totes les aplicacions"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplicacions multimèdia"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Atura l\'aplicació"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> s\'ha aturat."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Vols aturar l\'aplicació?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Si forces l\'aturada d\'una aplicació, és possible que no funcioni correctament."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"L\'aplicació no es pot aturar."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"No es pot utilitzar <xliff:g id="APP_NAME">%1$s</xliff:g> mentre es condueix."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Toca la targeta per veure més informació"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Toca la targeta per iniciar"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Trucada en curs"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"S\'està marcant…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Inicia Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"No es pot iniciar Android Auto. No s\'ha trobat cap activitat."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# dispositiu}other{# dispositius}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Temps"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Principalment assolellat"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Màx.: --° Mín.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Amaga les aplicacions de depuració"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Mostra les aplicacions de depuració"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"No hi ha cap element recent"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Esborra-ho tot"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"L\'aplicació no està disponible"</string>
-</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
deleted file mode 100644
index fa5c0b22..00000000
--- a/res/values-cs/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Spouštěč v autě"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Resetovat mřížku aplikací do pořadí A–Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Tato funkce zruší veškeré vlastní řazení. Chcete pokračovat?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Všechny aplikace"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Mediální aplikace"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Zastavit aplikaci"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> byla zastavena."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Zastavit aplikaci?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Vynucené zastavení může způsobit nepředvídatelné chování aplikace."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Aplikaci nelze ukončit."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> nelze používat při řízení."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Klepnutím na kartu zobrazíte další informace"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Klepnutím na kartu spustíte"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Probíhající hovor"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Vytáčení…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Spustit Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto se nepodařilo spustit. Nebyla nalezena žádná aktivita."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# zařízení}few{# zařízení}many{# zařízení}other{# zařízení}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Počasí"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Většinou slunečno"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Nejvyšší: --° Nejnižší: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Skrýt ladicí aplikace"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Zobrazit ladicí aplikace"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Žádné nedávné položky"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Vymazat vše"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplikace není k dispozici"</string>
-</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
deleted file mode 100644
index fecd3dcd..00000000
--- a/res/values-da/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Nulstil appgitteret til rækkefølgen A-Å"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Denne funktion fjerner alle tilpassede rækkefølger. Vil du fortsætte?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Alle apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Medieapps"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Stands app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> er blevet standset."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Vil du standse appen?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Hvis du tvinger en app til at standse, kan det medføre, at den ikke fungerer korrekt."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Appen kan ikke stoppes."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan ikke bruges under kørsel."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Tryk på kortet for at få flere oplysninger"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Tryk på kortet for at starte"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Igangværende opkald"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Ringer op…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Start Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto kunne ikke startes. Der blev ikke fundet nogen aktivitet."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# enhed}one{# enhed}other{# enheder}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Vejret"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"-- ° Overvejende solskin"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: -- ° L: -- °"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Skjul apps til fejlretning"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Vis apps til fejlretning"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Ingen nye elementer"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Ryd alt"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Appen er ikke tilgængelig"</string>
-</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
deleted file mode 100644
index c31aa081..00000000
--- a/res/values-de/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Auto-Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"App-Raster auf Sortierung von A–Z zurücksetzen"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Durch diese Funktion wird die gesamte benutzerdefinierte Sortierung entfernt. Möchtest du fortfahren?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Alle Apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Medien-Apps"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"App beenden"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> wurde beendet."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"App beenden?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Das Beenden der App zu erzwingen kann zu unerwünschtem Verhalten führen."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Die App kann nicht beendet werden."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> kann während der Fahrt nicht genutzt werden."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Für weitere Informationen auf die Karte tippen"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Zum Starten auf die Karte tippen"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Aktueller Anruf"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Rufaufbau…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto starten"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto kann nicht gestartet werden. Keine Aktivität gefunden."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# Gerät}other{# Geräte}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Wetter"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Größtenteils sonnig"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° T: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Debug-Apps verbergen"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Debug-Apps anzeigen"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Keine kürzlich verwendeten Elemente"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Alle löschen"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"App nicht verfügbar"</string>
-</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
deleted file mode 100644
index af034e2b..00000000
--- a/res/values-el/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Εφαρμογή εκκίνησης αυτοκινήτου"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Επαναφορά πλέγματος εφαρμογής σε αύξουσα αλφαβητική σειρά"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Αυτή η λειτουργία θα καταργήσει όλες τις προσαρμοσμένες ταξινομήσεις. Θέλετε να συνεχίσετε;"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Όλες οι εφαρμογές"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Εφαρμογές μέσων"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Διακοπή εφαρμογής"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> διακόπηκε."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Διακοπή εφαρμογής;"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Αν κάνετε αναγκαστική διακοπή μιας εφαρμογής, ενδέχεται να μην λειτουργεί σωστά."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Δεν είναι δυνατή η διακοπή εφαρμογής."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Αδύνατη χρήση της εφαρμογής <xliff:g id="APP_NAME">%1$s</xliff:g> κατά την οδήγηση."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Πατήστε την κάρτα για περισσότερες πληροφορίες"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Πατήστε την κάρτα για εκκίνηση"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Κλήση σε εξέλιξη"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Κλήση…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Εκκίνηση του Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Δεν είναι δυνατή η εκκίνηση τη εφαρμογής Android Auto. Δεν βρέθηκαν δραστηριότητες."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# συσκευή}other{# συσκευές}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Καιρός"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Κυρίως ηλιοφάνεια"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Μ: --° Ε: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Απόκρυψη εφαρμογών εντοπισμού σφαλμάτων"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Εμφάνιση εφαρμογών εντοπισμού σφαλμάτων"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Δεν υπάρχουν πρόσφατα στοιχεία"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Διαγραφή όλων"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Η εφαρμογή δεν είναι διαθέσιμη"</string>
-</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
deleted file mode 100644
index c76b6eb5..00000000
--- a/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Reset app grid to A-Z order"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"This function will remove all customised ordering. Do you want to continue?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"All apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Media apps"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Stop app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> has been stopped."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Stop app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"If you force stop an app, it may misbehave."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"App can’t be stopped."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> can\'t be used while driving."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Tap card for more info"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Tap card to launch"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"On-going call"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Dialling…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Launch Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Unable to launch Android Auto. No activity found."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# device}other{# devices}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weather"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"–° Mostly sunny"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: –° L: –°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Hide debug apps"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Show debug apps"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"No recent items"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Clear all"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"App isn\'t available"</string>
-</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
deleted file mode 100644
index f4c9c545..00000000
--- a/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <!-- no translation found for reset_appgrid_title (814562055108028366) -->
- <skip />
- <!-- no translation found for reset_appgrid_dialogue_message (8275758912490987735) -->
- <skip />
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"All apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Media apps"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Stop app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> has been stopped."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Stop app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"If you force stop an app, it may misbehave."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"App can’t be stopped."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> can\'t be used while driving."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Tap card for more info"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Tap card to launch"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"On-going call"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Dialling…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Launch Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Unable to launch Android Auto. No activity found."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# device}other{# devices}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weather"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"–° Mostly sunny"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: –° L: –°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Hide debug apps"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Show debug apps"</string>
- <!-- no translation found for times_separator (6180368193321715816) -->
- <skip />
- <!-- no translation found for recents_empty_state_text (6703106170272215731) -->
- <skip />
- <!-- no translation found for recents_clear_all_text (2088678071417053923) -->
- <skip />
- <!-- no translation found for failure_opening_recent_task_message (9097595793150874357) -->
- <skip />
-</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
deleted file mode 100644
index c76b6eb5..00000000
--- a/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Reset app grid to A-Z order"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"This function will remove all customised ordering. Do you want to continue?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"All apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Media apps"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Stop app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> has been stopped."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Stop app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"If you force stop an app, it may misbehave."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"App can’t be stopped."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> can\'t be used while driving."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Tap card for more info"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Tap card to launch"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"On-going call"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Dialling…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Launch Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Unable to launch Android Auto. No activity found."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# device}other{# devices}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weather"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"–° Mostly sunny"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: –° L: –°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Hide debug apps"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Show debug apps"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"No recent items"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Clear all"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"App isn\'t available"</string>
-</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
deleted file mode 100644
index c76b6eb5..00000000
--- a/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Reset app grid to A-Z order"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"This function will remove all customised ordering. Do you want to continue?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"All apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Media apps"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Stop app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> has been stopped."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Stop app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"If you force stop an app, it may misbehave."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"App can’t be stopped."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> can\'t be used while driving."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Tap card for more info"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Tap card to launch"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"On-going call"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Dialling…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Launch Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Unable to launch Android Auto. No activity found."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# device}other{# devices}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weather"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"–° Mostly sunny"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: –° L: –°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Hide debug apps"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Show debug apps"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"No recent items"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Clear all"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"App isn\'t available"</string>
-</resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
deleted file mode 100644
index 8c0fc2e4..00000000
--- a/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎Car Launcher‎‏‎‎‏‎"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‎‎Reset app grid to A-Z order‎‏‎‎‏‎"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‏‎This function will remove all custom ordering. Do you want to continue?‎‏‎‎‏‎"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‎‎‏‏‎‏‎‎‏‎‎‏‎All apps‎‏‎‎‏‎"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎Media apps‎‏‎‎‏‎"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎Stop app‎‏‎‎‏‎"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ has been stopped.‎‏‎‎‏‎"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎Stop app?‎‏‎‎‏‎"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‎‎If you force stop an app, it may misbehave.‎‏‎‎‏‎"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‎‏‎App can’t be stopped.‎‏‎‎‏‎"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ can\'t be used while driving.‎‏‎‎‏‎"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‎Tap card for more info‎‏‎‎‏‎"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‏‎Tap card to launch‎‏‎‎‏‎"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎ • ‎‏‎‎‏‎"</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‎‎‏‏‎‎Ongoing call‎‏‎‎‏‎"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎Dialing…‎‏‎‎‏‎"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎Launch Android Auto‎‏‎‎‏‎"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎Unable to launch Android Auto. No activity found.‎‏‎‎‏‎"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‏‏‎‎# device‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‏‏‎‎# devices‎‏‎‎‏‎}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎Weather‎‏‎‎‏‎"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎‎‏‏‎‏‎--° Mostly sunny‎‏‎‎‏‎"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‎‏‎‏‎‎‏‏‎‎Mountain View • H: --° L: --°‎‏‎‎‏‎"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‎‏‏‎Hide debug apps‎‏‎‎‏‎"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎Show debug apps‎‏‎‎‏‎"</string>
- <string name="times_separator" msgid="6180368193321715816">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‎‎‎/‎‏‎‎‏‎"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‎No recent items‎‏‎‎‏‎"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‎Clear All‎‏‎‎‏‎"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‎‏‎App isn\'t available‎‏‎‎‏‎"</string>
-</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
deleted file mode 100644
index 945dfb1a..00000000
--- a/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Selector para vehículos"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Restablecer la cuadrícula de apps al orden alfabético"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Esta función quitará todo el orden personalizado. ¿Quieres continuar?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Todas las apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Apps multimedia"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Detener la app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Se detuvo <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"¿Quieres detener la app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Si fuerzas la detención de una app, es posible que funcione incorrectamente."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"No se puede detener la app."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"No puedes usar <xliff:g id="APP_NAME">%1$s</xliff:g> mientras conduces."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Presiona la tarjeta para obtener más información"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Presiona la tarjeta para iniciar"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Llamada en curso"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Marcando…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Iniciar Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"No se puede iniciar Android Auto. No se encontró ninguna actividad."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Tiempo"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Mayormente soleado"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • M: --° M: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ocultar apps de depuración"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Mostrar apps de depuración"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"No hay elementos recientes"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Borrar todo"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"La app no está disponible"</string>
-</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
deleted file mode 100644
index 487dd3cd..00000000
--- a/res/values-es/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Menú de aplicaciones del coche"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Cuadrícula de aplicaciones cambiada a orden alfabético"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Esta función eliminará todo el orden personalizado. ¿Quieres continuar?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Todas las aplicaciones"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplicaciones multimedia"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Detener aplicación"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> se ha detenido."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"¿Detener la aplicación?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Si fuerzas la detención de una aplicación, puede que no funcione correctamente."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"La aplicación no se puede detener."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"No se puede usar <xliff:g id="APP_NAME">%1$s</xliff:g> mientras se conduce."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Toca la tarjeta para ver más información"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Toca la tarjeta para iniciar la aplicación"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Llamada en curso"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Marcando…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Iniciar Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"No se ha podido iniciar Android Auto. No se ha encontrado ninguna actividad."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Tiempo"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--°, mayormente soleado"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Máx.: --° Mín.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ocultar aplicaciones de depuración"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Mostrar aplicaciones de depuración"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"No hay elementos recientes"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Borrar todo"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"La aplicación no está disponible"</string>
-</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
deleted file mode 100644
index ab68532a..00000000
--- a/res/values-et/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Auto käivitusprogramm"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Lähtesta rakenduste ruudustik A–Y järjestuseks"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"See funktsioon eemaldab kogu kohandatud järjestuse. Kas soovite jätkata?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Kõik rakendused"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Meediarakendused"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Peata rakendus"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> peatati."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Kas peatada rakendus?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Kui sundpeatate rakenduse, võib see toimida valesti."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Rakendust ei saa peatada."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Rakendust <xliff:g id="APP_NAME">%1$s</xliff:g> ei saa sõidu ajal kasutada."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Lisateabe saamiseks puudutage kaarti"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Käivitamiseks puudutage kaarti"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Käimasolev kõne"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Valimine …"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto käivitamine"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Autot ei õnnestu käivitada. Ühtegi tegevust ei leitud."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# seade}other{# seadet}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Ilm"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° – enamasti päikeseline"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • K: --° M: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Peida silumisrakendused"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Kuva silumisrakendused"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Hiljutisi üksusi pole"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Kustuta kõik"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Rakendus ei ole saadaval"</string>
-</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
deleted file mode 100644
index cd283ab4..00000000
--- a/res/values-eu/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Berrezarri aplikazioen sareta hurrenkera alfabetikoan"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Hori eginez gero, hurrenkera pertsonalizatua galduko da. Aurrera egin nahi duzu?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Aplikazio guztiak"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Multimedia-aplikazioak"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Gelditu aplikazioa"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Gelditu da <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Aplikazioa gelditu nahi duzu?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Aplikazioak gelditzera behartzen badituzu, baliteke behar bezala ez funtzionatzea."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Ezin da gelditu aplikazioa."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> ezin da erabili gidatu bitartean."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Informazio gehiago lortzeko, sakatu txartela"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Sakatu txartela abiarazteko"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Deia abian da"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Markatzen…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Abiarazi Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Ezin da abiarazi Android Auto. Ez da jarduerarik aurkitu."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# gailu}other{# gailu}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Eguraldia"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"-- ° Gehienbat eguzkitsua"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: -- ° L: -- °"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ezkutatu arazteko aplikazioak"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Erakutsi arazteko aplikazioak"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Ez dago azkenaldi honetako ezer"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Garbitu guztia"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Ez dago erabilgarri aplikazioa"</string>
-</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
deleted file mode 100644
index 75364318..00000000
--- a/res/values-fa/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"راه‌انداز خودرو"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"بازنشانی جدول برنامه به ترتیب الف تا ی"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"این عملکرد همه ترتیب‌های سفارشی را حذف خواهد کرد. می‌خواهید ادامه دهید؟"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"همه برنامه‌ها"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"برنامه‌های رسانه"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"متوقف کردن برنامه"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> متوقف شده است."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"برنامه متوقف شود؟"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"توقف اجباری برنامه ممکن است باعث عملکرد نادرست آن شود."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"برنامه متوقف نمی‌شود."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"هنگام رانندگی نمی‌توان از <xliff:g id="APP_NAME">%1$s</xliff:g> استفاده کرد."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"برای اطلاعات بیشتر، روی کارت ضربه بزنید"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"برای راه‌اندازی، روی کارت ضربه بزنید"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"تماس درحال انجام"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"درحال شماره‌گیری…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"راه‌اندازی Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto راه‌اندازی نشد. فعالیتی پیدا نشد."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# دستگاه}one{# دستگاه}other{# دستگاه}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"آب‌وهوا"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° بیشتر آفتابی"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"مانتین ویو • بیشینه: --° کمینه: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"پنهان کردن برنامه‌های اشکال‌زدایی"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"نمایش برنامه‌های اشکال‌زدایی"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"مورد اخیری وجود ندارد"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"پاک کردن همه"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"برنامه دردسترس نیست"</string>
-</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
deleted file mode 100644
index db6c88b0..00000000
--- a/res/values-fi/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Auton käynnistysohjelma"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Palauta sovellusruudukko A-Ö ‑järjestykseen"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Toiminto poistaa kaikki omat järjestykset. Haluatko jatkaa?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Kaikki sovellukset"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Mediasovellukset"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Sulje sovellus"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> on suljettu."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Suljetaanko sovellus?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Jos pakotat sovelluksen sulkeutumaan, se ei välttämättä toimi oikein."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Sovellusta ei voi keskeyttää."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei voi olla käytössä ajon aikana."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Katso lisätietoja napauttamalla korttia"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Käynnistä napauttamalla korttia"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Käynnissä oleva puhelu"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Soitetaan…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Käynnistä Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Autoa ei voi käynnistää. Tapahtumia ei löytynyt."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# laite}other{# laitetta}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Sää"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Enimmäkseen aurinkoista"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Maks.: --° Min.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Piilota virheenkorjaussovellukset"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Näytä virheenkorjaussovellukset"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Ei viimeaikaisia kohteita"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Tyhjennä kaikki"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Sovellus ei ole käytettävissä"</string>
-</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
deleted file mode 100644
index 328922d1..00000000
--- a/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Lanceur d\'application pour la voiture"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Réinitialiser la grille d\'applications à l\'ordre A à Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Cette fonction va retirer tous les classements personnalisés. Voulez-vous continuer?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Toutes les applications"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Applications multimédias"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Arrêter l\'application"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> s\'est arrêté."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Arrêter l\'application?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Si vous forcez l\'arrêt d\'une application, son fonctionnement peut en être affecté."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Impossible d\'arrêter l\'application."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne peut pas être utilisée en conduisant."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Touchez la carte pour en savoir plus"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Touchez la carte pour lancer"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Appel en cours"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Composition en cours…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Lancez Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Impossible de lancer Android Auto. Aucune activité trouvée."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# appareil}one{# appareil}other{# appareils}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Météo"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° et principalement ensoleillé"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Montréal • Max. : --° Min. : --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Masquer les applications de débogage"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Afficher les applications de débogage"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Aucun élément récent"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Tout effacer"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"L\'application n\'est pas accessible"</string>
-</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
deleted file mode 100644
index d6c799d4..00000000
--- a/res/values-fr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Rétablir l\'ordre A-Z pour la grille d\'applications"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Cette fonction supprimera tous les tris personnalisés. Voulez-vous continuer ?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Toutes les applications"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Applications multimédias"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Arrêter l\'appli"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"L\'appli <xliff:g id="APP_NAME">%1$s</xliff:g> a été arrêtée."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Arrêter l\'appli ?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"L\'arrêt forcé d\'une appli peut provoquer un fonctionnement instable."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Impossible d\'arrêter l\'appli."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Impossible d\'utiliser <xliff:g id="APP_NAME">%1$s</xliff:g> en conduisant."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Appuyer sur la carte pour en savoir plus"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Appuyer sur la carte pour effectuer le lancement"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Appel en cours"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Appel…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Lancer Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Impossible de lancer Android Auto. Aucune activité trouvée."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# appareil}one{# appareil}other{# appareils}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Météo"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"-- ° Ensoleillé dans l\'ensemble"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Max. : -- ° - Min. : -- °"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Masquer les applis de débogage"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Afficher les applis de débogage"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Aucun élément récent"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Tout effacer"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Appli indisponible"</string>
-</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
deleted file mode 100644
index 6e59a5fc..00000000
--- a/res/values-gl/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Launcher do coche"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Restablecer a orde alfabética para a grade de aplicacións"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Esta función quitará toda a orde personalizada. Queres continuar?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Todas as aplicacións"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplicacións multimedia"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Deter aplicación"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Detívose a aplicación <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Queres deter a aplicación?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Se forzas a parada dunha aplicación, é posible que non funcione correctamente."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Non se pode deter a aplicación."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Non se pode utilizar <xliff:g id="APP_NAME">%1$s</xliff:g> mentres se conduce."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Toca a tarxeta para obter máis información"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Toca a tarxeta para iniciar"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Chamada en curso"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Marcando…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Iniciar Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Non se puido iniciar Android Auto. Non se atopou ningunha actividade."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Información meteorolóxica"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--°, principalmente solleiro"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Máxima: --°; mínima: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ocultar aplicacións de depuración"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Mostrar aplicacións de depuración"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Non hai elementos recentes"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Borrar todo"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"A aplicación non está dispoñible"</string>
-</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
deleted file mode 100644
index 8f2e1353..00000000
--- a/res/values-gu/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"કાર લૉન્ચર"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"ઍપ ગ્રિડને A-Z ક્રમ અનુસાર રીસેટ કરો"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"આ સુવિધા, સેટ કરવામાં આવેલા બધા કસ્ટમ ક્રમ કાઢી નાખશે. શું તમે ચાલુ રાખવા માગો છો?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"બધી ઍપ"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"મીડિયા ઍપ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"ઍપ બંધ કરો"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> બંધ કરવામાં આવી છે."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"ઍપ બંધ કરીએ?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"જો તમે કોઈ ઍપને ફરજિયાત બંધ કરો, તો તે અયોગ્ય વર્તન કરી શકે છે."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"ઍપ બંધ કરી શકાતી નથી."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ડ્રાઇવ કરતી વખતે <xliff:g id="APP_NAME">%1$s</xliff:g>નો ઉપયોગ કરી શકાતો નથી."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"વધુ માહિતી માટે કાર્ડ પર ટૅપ કરો"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"લૉન્ચ કરવા માટે કાર્ડ પર ટૅપ કરો"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"કૉલ ચાલુ છે"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ડાયલ કરી રહ્યાં છીએ…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto લૉન્ચ કરો"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto લૉન્ચ કરી શકાતું નથી. કોઈ પ્રવૃત્તિ મળી નથી."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# ડિવાઇસ}one{# ડિવાઇસ}other{# ડિવાઇસ}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weather"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° મોટેભાગે તડકો"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"માઉન્ટેન વ્યૂ • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ડિબગ ઍપ છુપાવો"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"ડિબગ ઍપ બતાવો"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"તાજેતરની કોઈ આઇટમ નથી"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"બધી આઇટમ સાફ કરો"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"ઍપ ઉપલબ્ધ નથી"</string>
-</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
deleted file mode 100644
index ffb7e038..00000000
--- a/res/values-hi/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"ऐप्लिकेशन ग्रिड को A से Z के क्रम में रीसेट करें"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"यह कार्रवाई करने पर, पसंद के मुताबिक सेट किए सभी क्रम हटा दिए जाएंगे. क्या आपको यह कार्रवाई करनी है?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"सभी ऐप्लिकेशन"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"मीडिया ऐप्लिकेशन"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"ऐप्लिकेशन रोकें"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> को रोका गया है."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"क्या आपको ऐप्लिकेशन रोकना है?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"अगर किसी ऐप्लिकेशन को ज़बरदस्ती रोका जाता है, तो हो सकता है कि वह ठीक तरह से काम न करें."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"इस ऐप्लिकेशन को बंद नहीं किया जा सकता."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"गाड़ी चलाते समय <xliff:g id="APP_NAME">%1$s</xliff:g> ऐप्लिकेशन इस्तेमाल नहीं किया जा सकता."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"ज़्यादा जानकारी के लिए कार्ड पर टैप करें"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"लॉन्च करने के लिए कार्ड पर टैप करें"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"ऑनगोइंग कॉल"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"डायल किया जा रहा है…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto लॉन्च करें"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto लॉन्च नहीं किया जा सका. कोई गतिविधि नहीं मिली."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# डिवाइस}one{# डिवाइस}other{# डिवाइस}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weather"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° ज़्यादातर समय धूप रहेगी"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"माउंट आबू • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"डीबग ऐप्लिकेशन छिपाएं"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"डीबग ऐप्लिकेशन दिखाएं"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"हाल ही का कोई आइटम मौजूद नहीं है"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"सभी आइटम मिटाएं"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"ऐप्लिकेशन उपलब्ध नहीं है"</string>
-</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
deleted file mode 100644
index 7af1fe19..00000000
--- a/res/values-hr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Pokretač za automobil"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Vrati rešetku aplikacije na poredak od A do Ž"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Ta će funkcija ukloniti sav prilagođeni poredak. Želite li nastaviti?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Sve aplikacije"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplikacije za medijske sadržaje"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Zaustavi aplikaciju"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je zaustavljena."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Zaustaviti aplikaciju?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ako silom zaustavite aplikaciju, možda će se ponašati nepredviđeno."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Aplikacija se ne može zaustaviti."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne može se koristiti tijekom vožnje."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Dodirnite karticu za više informacija"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Dodirnite karticu za pokretanje"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Poziv u tijeku"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Biranje broja…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Pokrenite Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Pokretanje Android Auta nije uspjelo. Nije pronađena nijedna aktivnost."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# uređaj}one{# uređaj}few{# uređaja}other{# uređaja}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Vrijeme"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° uglavnom sunčano"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • V: --° N: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Sakrij aplikacije za otklanjanje pogrešaka"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Prikaži aplikacije za otklanjanje pogrešaka"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nema nedavnih stavki"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Izbrišite sve"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplikacija nije dostupna"</string>
-</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
deleted file mode 100644
index 06fa6593..00000000
--- a/res/values-hu/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Autóindító"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Alkalmazásrács visszaállítása betűrendbe (A–Z)"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"A funkció bekapcsolásával minden egyéni elrendezést eltávolít. Biztosan folytatja?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Összes alkalmazás"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Médiaalkalmazások"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Alkalmazás leállítása"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> leállítva."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Leállítja az alkalmazást?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ha egy alkalmazást leállásra kényszerít, lehetséges, hogy hibásan fog működni."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Az alkalmazás nem állítható le."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> nem használható vezetés közben."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"További információkért koppintson a kártyára."</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Az indításhoz koppintson a kártyára"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Hívás folyamatban"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Tárcsázás…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto indítása"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Az Android Auto indítása nem sikerült. Nem található tevékenység."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# eszköz}other{# eszköz}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Időjárás"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Túlnyomóan napos"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Max.: --° Min.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Hibakereső alkalmazások elrejtése"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Hibakereső alkalmazások megjelenítése"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nincsenek mostanában használt elemek"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Összes törlése"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Az alkalmazás nem áll rendelkezésre"</string>
-</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
deleted file mode 100644
index 5cfa2d75..00000000
--- a/res/values-hy/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Մեքենայի գործարկիչ"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Հավելվածների ցանցի A–Z դասավորություն"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Այս գործառույթը կհեռացնի հավելվածների հատուկ դասավորությունը։ Շարունակե՞լ։"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Բոլոր հավելվածները"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Մեդիա հավելվածներ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Կանգնեցնել հավելվածը"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը կանգնեցվեց։"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Կանգնեցնե՞լ հավելվածը"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Հավելվածի ստիպողական կանգնեցումը կարող է ազդել դրա աշխատանքի վրա։"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Չհաջողվեց կանգնեցնել հավելվածի աշխատանքը։"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը հնարավոր չէ օգտագործել վարելու ժամանակ։"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Հպեք քարտին՝ ավելին իմանալու համար"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Հպեք քարտին՝ գործարկելու ամար"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Ընթացիկ զանգ"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Համարհավաքում…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Գործարկել Android Auto-ն"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Չհաջողվեց գործարկել Android Auto-ն։ Ոչ մի գործողություն չի գտնվել։"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# սարք}one{# սարք}other{# սարք}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Եղանակ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Հիմնականում արևոտ"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Մաունթին Վյու • Առավ.՝ --° Նվազ.՝ --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Թաքցնել վրիպազերծման հավելվածները"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Ցույց տալ վրիպազերծման հավելվածները"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Այստեղ դեռ ոչինչ չկա"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Ջնջել բոլորը"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Հավելվածը հասանելի չէ"</string>
-</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
deleted file mode 100644
index 2cb7a4f2..00000000
--- a/res/values-in/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Reset petak aplikasi agar sesuai urutan A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Fungsi ini akan menghapus semua pengurutan kustom. Ingin melanjutkan?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Semua aplikasi"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplikasi media"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Hentikan aplikasi"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah dihentikan."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Hentikan aplikasi?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Jika aplikasi dihentikan paksa, fungsinya mungkin akan terganggu."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Aplikasi tidak dapat dihentikan."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat digunakan saat mengemudi."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Ketuk kartu untuk informasi lebih lanjut"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Ketuk kartu untuk meluncurkan"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Panggilan sedang berlangsung"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Memanggil…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Luncurkan Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Tidak dapat meluncurkan Android Auto. Tidak ditemukan aktivitas."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# perangkat}other{# perangkat}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Cuaca"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Sebagian besar cerah"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Sembunyikan aplikasi debug"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Tampilkan aplikasi debug"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Tidak ada item baru"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Hapus Semua"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplikasi tidak tersedia"</string>
-</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
deleted file mode 100644
index 9153c505..00000000
--- a/res/values-is/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Ræsiforrit bíls"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Endurstilla forritatöflu á A–Ö röðun"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Þessi eiginleiki fjarlægir alla sérsniðna röðun. Viltu halda áfram?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Öll forrit"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Margmiðlunarforrit"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Stöðva forrit"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> var stöðvað."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Stöðva forritið?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ef þú þvingar fram lokun forrits gæti það látið illa."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Ekki er hægt að stöðva forrit."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Ekki er hægt að nota <xliff:g id="APP_NAME">%1$s</xliff:g> við akstur."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Ýttu á spjaldið til að fá meiri upplýsingar"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Ýttu á spjaldið til að ræsa"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Símtal í gangi"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Hringir…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Ræsa Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Ekki er hægt að ræsa Android Auto. Engin virkni fannst."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# tæki}one{# tæki}other{# tæki}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Veður"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Sólskin að mestu"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Fjallasýn • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Fela villuleitarforrit"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Sýna villuleitarforrit"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Engin nýleg atriði"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Hreinsa allt"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Forritið er ekki í boði"</string>
-</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
deleted file mode 100644
index 9ac3d520..00000000
--- a/res/values-it/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Avvio app dell\'auto"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Reimposta la griglia delle app in ordine alfabetico"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Questa funzione rimuove tutti gli ordini personalizzati. Vuoi continuare?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Tutte le app"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"App multimediali"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Interrompi l\'app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"L\'app <xliff:g id="APP_NAME">%1$s</xliff:g> è stata interrotta."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Interrompere l\'app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Se forzi l\'interruzione di un\'app, questa potrebbe funzionare in modo anomalo."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Impossibile interrompere l\'app."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Non è possibile usare l\'app <xliff:g id="APP_NAME">%1$s</xliff:g> durante la guida."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Tocca la scheda per avere ulteriori informazioni"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Tocca la scheda per avviare"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Chiamata in corso"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Chiamata in corso…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Avvia Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Impossibile avviare Android Auto. Non è stata trovata alcuna attività."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# dispositivo}other{# dispositivi}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Meteo"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--°, prevalentemente soleggiato"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Max: --° Min: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Nascondi app di debug"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Mostra app di debug"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nessun elemento recente"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Cancella tutto"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"App non disponibile"</string>
-</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
deleted file mode 100644
index 0f711d19..00000000
--- a/res/values-iw/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"מרכז האפליקציות ברכב"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"איפוס תצוגת האפליקציות לסידור מ-א\' עד ת\'"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"הפונקציה הזו תסיר את כל סידורי התצוגה שהותאמו אישית. רוצה להמשיך?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"כל האפליקציות"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"אפליקציות מדיה"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"עצירת האפליקציה"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"עצרת את האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"לעצור את האפליקציה?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"אם סוגרים אפליקציה באופן ידני, ייתכן שהיא לא תפעל כהלכה."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"לא ניתן להפסיק את פעולת האפליקציה."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"לא ניתן להשתמש באפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> במהלך הנהיגה."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"יש להקיש על הכרטיס למידע נוסף"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"יש להקיש על הכרטיס להפעלה"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"שיחה פעילה"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"החיוג מתבצע…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"הפעלה של Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"לא ניתן להפעיל את Android Auto. לא נמצאה פעילות."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{מכשיר אחד}one{# מכשירים}two{# מכשירים}other{# מכשירים}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"מזג אוויר"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° שמשי"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° L: --°‎"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"הסתרת אפליקציות לניפוי באגים"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"הצגת אפליקציות לניפוי באגים"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"אין פריטים אחרונים"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"ניקוי הכול"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"האפליקציה לא זמינה"</string>
-</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
deleted file mode 100644
index 1266df8e..00000000
--- a/res/values-ja/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"車用ランチャー"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"アプリグリッドをアルファベットの昇順にリセット"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"この機能を実行すると、カスタムの並べ替えがすべて削除されます。続行しますか?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"すべてのアプリ"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"メディアアプリ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"アプリを停止"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g>を停止しました。"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"アプリを停止しますか?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"アプリを強制停止すると、アプリが正常に機能しないことがあります。"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"アプリを停止できません。"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"運転中は <xliff:g id="APP_NAME">%1$s</xliff:g> を使用できません。"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"カードをタップして詳細を確認"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"カードをタップして起動"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"通話中"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"発信中…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto の起動"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto を起動できません。アクティビティが見つかりません。"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# 台のデバイス}other{# 台のデバイス}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"天気情報"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° 晴れ"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"デバッグアプリを表示しない"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"デバッグアプリを表示する"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"最近のアイテムはありません"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"すべて消去"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"このアプリは使用できません"</string>
-</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
deleted file mode 100644
index 52428365..00000000
--- a/res/values-ka/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"მანქანის გამშვები"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"აპლიკაციის ბადის გადატვირთვა A-Z შეკვეთაზე"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ეს ფუნქცია წაშლის ყველა მორგებულ შეკვეთას. გსურთ გაგრძელება?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"ყველა აპი"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"მედია აპები"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"აპის შეჩერება"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> შეჩერებულია."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"გსურთ აპის შეჩერება?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"თუ აპს შეწყვეტას აიძულებთ, შესაძლოა, მან ცუდად განაგრძოს მუშაობა."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"აპის შეჩერება შეუძლებელია."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"მანქანის მართვისას <xliff:g id="APP_NAME">%1$s</xliff:g>-ს ვერ გამოიყენებთ."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"შეეხეთ ბარათს მეტი ინფორმაციისთვის"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"შეეხეთ ბარათს გასაშვებად"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"მიმდინარე ზარი"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"მიმდინარეობს აკრეფა…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"გაუშვით Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto-ს გაშვება შეუძლებელია. აქტივობა ვერ მოიძებნა."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# მოწყობილობა}other{# მოწყობილობა}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"ამინდი"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° უმეტესად მზიანი"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"მთების ხედი • მაქს.: --° მინ.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"გამართვის აპების დამალვა"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"გამართვის აპების ჩვენება"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"ბოლოდროინდელი ერთეულები არ არის"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"ყველას გასუფთავება"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"აპი მიუწვდომელია"</string>
-</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
deleted file mode 100644
index c99cec29..00000000
--- a/res/values-kk/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Қолданбалар торын A-Z ретіне қайтару"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Функция пайдаланушының барлық тапсырысын өшіреді Жалғастырғыңыз келе ме?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Барлық қолданба"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Мультимедиа қолданбалары"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Қолданбаны тоқтату"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> тоқтатылды."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Қолданба тоқтатылсын ба?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Қолданбаны қолмен тоқтату оның жұмысына кері әсерін тигізуі мүмкін."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Қолданба тоқтатылмады."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Көлік жүргізгенде <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасын пайдалануға болмайды."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Қосымша ақпарат алу үшін картаны түртіңіз."</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Іске қосу үшін картаны түртіңіз."</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Ағымдағы қоңырау"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Терілуде…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto қолданбасын іске қосу"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto қолданбасы іске қосылмады. Ешқандай әрекет табылмады."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# құрылғы}other{# құрылғы}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Ауа райы"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° көбінесе күн ашық"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Түзету қолданбаларын жасыру"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Түзету қолданбаларын көрсету"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Cоңғы қосылған элемент жоқ"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Барлығын өшіру"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Қолданба қолжетімді емес"</string>
-</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
deleted file mode 100644
index b80c44a0..00000000
--- a/res/values-km/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"កំណត់ក្រឡាកម្មវិធីឡើងវិញទៅជាលំដាប់ A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"មុខងារនេះនឹងដកការបញ្ជាទិញផ្ទាល់ខ្លួនទាំងអស់ចេញ។ តើ​អ្នក​ចង់​បន្ត​ដែរ​ឬ​ទេ?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"កម្មវិធី​ទាំងអស់"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"កម្មវិធីមេឌៀ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"បញ្ឈប់កម្មវិធី"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> ត្រូវបានបញ្ឈប់។"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"បញ្ឈប់កម្មវិធីឬ?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"ប្រសិនបើអ្នក​បង្ខំឱ្យបញ្ឈប់​កម្មវិធី​ កម្មវិធីអាចនឹង​ដំណើរការ​មិនត្រឹមត្រូវ។"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"មិនអាច​បញ្ឈប់កម្មវិធី​បានទេ។"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"មិនអាចប្រើ​ <xliff:g id="APP_NAME">%1$s</xliff:g> នៅពេលបើកបរបានទេ។"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"ចុចកាត ដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"ចុចកាត ដើម្បីចាប់ផ្ដើម"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"កំពុង​បន្ត​ការ​ហៅ"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"កំពុងហៅ…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"ចាប់ផ្ដើម Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"មិនអាចចាប់ផ្ដើម Android Auto បានទេ។ រកមិនឃើញសកម្មភាពទេ។"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{ឧបករណ៍ #}other{ឧបករណ៍ #}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"អាកាសធាតុ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° ភាគច្រើន​បើកថ្ងៃ"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"លាក់កម្មវិធីជួសជុល"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"បង្ហាញកម្មវិធីជួសជុល"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"មិនមានធាតុថ្មីៗទេ"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"សម្អាតទាំងអស់"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"មិន​មាន​កម្មវិធី"</string>
-</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
deleted file mode 100644
index 97bc3fc8..00000000
--- a/res/values-kn/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"ಕಾರ್ ಲಾಂಚರ್"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"ಆ್ಯಪ್ ಗ್ರಿಡ್ ಅನ್ನು A-Z ಆರ್ಡರ್‌ಗೆ ರೀಸೆಟ್ ಮಾಡಿ"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ಈ ಕಾರ್ಯವು ಎಲ್ಲಾ ಕಸ್ಟಮ್ ಆರ್ಡರ್ ಮಾಡುವಿಕೆಯನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ. ನೀವು ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳು"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"ಮಾಧ್ಯಮ ಆ್ಯಪ್‌ಗಳು"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"ಆ್ಯಪ್ ಅನ್ನು ನಿಲ್ಲಿಸಿ"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ನಿಲ್ಲಿಸಲಾಗಿದೆ."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"ಆ್ಯಪ್ ಅನ್ನು ನಿಲ್ಲಿಸಬೇಕೆ?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಬಲವಂತವಾಗಿ ನಿಲ್ಲಿಸಿದರೆ, ಅದು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"ಆ್ಯಪ್ ನಿಲ್ಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ಡ್ರೈವ್ ಮಾಡುವಾಗ <xliff:g id="APP_NAME">%1$s</xliff:g> ಬಳಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಕಾರ್ಡ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"ಪ್ರಾರಂಭಿಸಲು ಕಾರ್ಡ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ಡಯಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto ಪ್ರಾರಂಭಿಸಿ"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto ಪ್ರಾರಂಭಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಯಾವುದೇ ಚಟುವಟಿಕೆ ಕಂಡುಬಂದಿಲ್ಲ."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# ಸಾಧನ}one{# ಸಾಧನಗಳು}other{# ಸಾಧನಗಳು}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"ಹವಾಮಾನ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° ಬಹುತೇಕ ಬಿಸಿಲಿನ ವಾತಾವರಣ"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"ಮೌಂಟೇನ್ ವ್ಯೂ • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ಡೀಬಗ್ ಆ್ಯಪ್‌ಗಳನ್ನು ಮರೆಮಾಡಿ"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"ಡೀಬಗ್ ಆ್ಯಪ್‌ಗಳನ್ನು ತೋರಿಸಿ"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"ಎಲ್ಲವನ್ನೂ ಅಳಿಸಿ"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"ಆ್ಯಪ್ ಲಭ್ಯವಿಲ್ಲ"</string>
-</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
deleted file mode 100644
index 43b11ea8..00000000
--- a/res/values-ko/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"차량 런처"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"앱 그리드를 가나다순으로 재설정하기"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"이 기능은 모든 맞춤설정 정렬을 삭제합니다. 계속하시겠습니까?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"모든 앱"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"미디어 앱"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"앱 종료"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱이 종료되었습니다."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"앱을 종료하시겠습니까?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"강제로 앱을 종료하면 예기치 않은 오류가 발생할 수 있습니다."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"앱을 닫을 수 없습니다."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"운전 중에는 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 사용할 수 없습니다."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"자세히 보려면 카드를 탭하세요."</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"시작하려면 카드를 탭하세요."</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"진행 중인 통화"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"전화 거는 중…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto 시작"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto를 시작할 수 없습니다. 활동이 없습니다."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{기기 1개}other{기기 #개}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"날씨"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° 대체로 맑음"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"마운틴 뷰 • 최고: --° 최저: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"디버그 앱 숨기기"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"디버그 앱 표시"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"최근 항목 없음"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"모두 지우기"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"앱을 사용할 수 없음"</string>
-</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
deleted file mode 100644
index ea02405d..00000000
--- a/res/values-ky/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Автоунааны жүргүзгүч"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Колдонмолор торчосун A-Я тартибинде кайра иреттөө"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Бул функция бардык ыңгайлаштырылган иреттерди өчүрөт. Улантасызбы?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Бардык колдонмолор"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Медиа колдонмолору"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Колдонмону токтотуу"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> токтотулду."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Колдонмону токтотосузбу?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Колдонмону токтотсоңуз, ал туура эмес иштеп калышы мүмкүн."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Колдонмону токтотууга болбойт."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Айдап баратканда <xliff:g id="APP_NAME">%1$s</xliff:g> колдонулбайт."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Кеңири маалымат алуу үчүн картаны таптап коюңуз"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Иштетүү үчүн картаны таптап коюңуз"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Учурдагы чалуу"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Терилүүдө…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto\'ну ишке киргизүү"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto иштетилген жок. Аракеттер табылган жок."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# түзмөк}other{# түзмөк}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Аба ырайы"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Көбүнесе күн чайыттай ачык болот"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Маунтин-Вью • Ж: --° Т: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Мүчүлүштүктөрдү аныктоочу колдонмолорду жашыруу"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Мүчүлүштүктөрдү аныктоочу колдонмолорду көрсөтүү"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Акыркы колдонмолор жок"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Баарын тазалоо"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Колдонмо жеткиликтүү эмес"</string>
-</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
deleted file mode 100644
index ed0ba724..00000000
--- a/res/values-lo/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"ລັນເຊີລົດ"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"ຣີເຊັດຕາຕະລາງແອັບເປັນລຳດັບ A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ຟັງຊັນນີ້ຈະລຶບການຈັດລຳດັບທີ່ກຳນົດເອງອອກທັງໝົດ. ທ່ານຕ້ອງການສືບຕໍ່ບໍ?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"ແອັບທັງໝົດ"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"ແອັບມີເດຍ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"ຢຸດແອັບ"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"ຢຸດ <xliff:g id="APP_NAME">%1$s</xliff:g> ແລ້ວ."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"ຢຸດແອັບໄວ້ບໍ?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"ຫານທ່ານບັງຄັບປິດແອັບໃດໜຶ່ງ, ມັນອາດເຮັດວຽກຜິດປົກກະຕິໄດ້."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"ບໍ່ສາມາດຢຸດແອັບໄດ້."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ່ສາມາດໃຊ້ແປ້ນພິມໃນຂະນະຂັບຂີ່ໄດ້."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"ແຕະບັດສຳລັບຂໍ້ມູນເພີ່ມເຕີມ"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"ແຕະບັດເພື່ອເປີດໃຊ້"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"ສາຍໂທອອກ"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ກຳລັງໂທ…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"ເປີດໃຊ້ Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"ບໍ່ສາມາດເປີດໃຊ້ Android Auto ໄດ້. ບໍ່ພົບການເຄື່ອນໄຫວໃດໆ."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{ອຸປະກອນ # ເຄື່ອງ}other{ອຸປະກອນ # ເຄື່ອງ}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"ສະພາບອາກາດ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° ແດດອອກເປັນສ່ວນໃຫຍ່"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"ວິວພູເຂົາ • ສູງສຸດ: --° ຕໍ່າສຸດ: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ເຊື່ອງແອັບດີບັກ"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"ສະແດງແອັບດີບັກ"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"ບໍ່ມີລາຍການຫຼ້າສຸດ"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"ລຶບລ້າງທັງໝົດ"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"ແອັບບໍ່ພ້ອມໃຫ້ນຳໃຊ້"</string>
-</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
deleted file mode 100644
index 2b051663..00000000
--- a/res/values-lt/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Automobilio paleidimo priemonė"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Programų tinklelio nustatymas iš naujo į A–Z tvarką"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Ši funkcija pašalins visą tinkintą tvarką. Ar norite tęsti?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Visos programos"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Medijos programos"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Sustabdyti programą"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ sustabdyta."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Sustabdyti programą?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Jei priverstinai sustabdysite programą, ji gali neveikti tinkamai."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Programos negalima sustabdyti."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Vairuojant negalima naudoti „<xliff:g id="APP_NAME">%1$s</xliff:g>“."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Palieskite kortelę, kad sužinotumėte daugiau informacijos"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Palieskite kortelę, kad paleistumėte"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Vykstantis skambutis"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Renkamas numeris…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Paleisti „Android Auto“"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Nepavyko paleisti „Android Auto“. Nerasta jokios veiklos."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# įrenginys}one{# įrenginys}few{# įrenginiai}many{# įrenginio}other{# įrenginių}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Orai"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Daugiausia saulėta"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mauntin Vju • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Slėpti derinimo programas"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Rodyti derinimo programas"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nėra jokių naujausių elementų"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Išvalyti viską"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Programa nepasiekiama"</string>
-</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
deleted file mode 100644
index 234a49b8..00000000
--- a/res/values-lv/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Lietotņu režģa atiestatīšana uz secību A–Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Ar šo funkciju tiks mainīta pielāgotā lietotņu secība. Vai vēlaties turpināt?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Visas lietotnes"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Multivides lietotnes"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Apturēt lietotnes darbību"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> darbība ir apturēta."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Vai apturēt lietotnes darbību?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Piespiedu kārtā apturot lietotnes darbību, var rasties šīs lietotnes darbības traucējumi."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Lietotnes darbību nevar apturēt."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Lietotni <xliff:g id="APP_NAME">%1$s</xliff:g> nevar izmantot braukšanas laikā."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Pieskarieties kartītei, lai iegūtu plašāku informāciju"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Pieskarieties kartītei, lai palaistu"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Pašreizējais zvans"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Notiek numura sastādīšana…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Palaist Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Nevar palaist Android Auto. Netika atrasta neviena darbība."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# ierīce}zero{# ierīču}one{# ierīce}other{# ierīces}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Laikapstākļi"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--°; galvenokārt saulains laiks"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mauntinvjū • Augstākā: --°; zemākā: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Slēpt atkļūdošanas lietotnes"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Rādīt atkļūdošanas lietotnes"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nav nesenu vienumu"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Notīrīt visu"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Lietotne nav pieejama"</string>
-</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
deleted file mode 100644
index f12230ce..00000000
--- a/res/values-mk/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Стартер на автомобил"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Ресетирај ја мрежата со апликации во редослед А-Ш"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Оваа функција ќе ги отстрани сите приспособени подредувања. Дали сакате да продолжите?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Сите апликации"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Апликации за аудиовизуелни содржини"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Запри ја апликацијата"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> е запрена."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Да се запре апликацијата?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ако присилно запрете апликација, таа може да не се однесува правилно."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Апликацијата не може да се запре."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се користи при возењето."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Допрете ја картичката за повеќе информации"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Допрете ја картичката за да стартува"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Тековен повик"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Бирање…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Стартувајте ја Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Не може да се стартува Android Auto. Не е најдена активност."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# уред}one{# уред}other{# уреди}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Временска прогноза"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"-- ° Претежно сончево"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Маунтин Вју • В: -- ° Н: -- °"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Сокриј апликации за отстранување грешки"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Прикажи апликации за отстранување грешки"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Нема неодамнешни ставки"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Избриши ги сите"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Апликацијата не е достапна"</string>
-</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
deleted file mode 100644
index 2235e7e0..00000000
--- a/res/values-ml/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"കാർ ലോഞ്ചർ"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"A-Z ക്രമത്തിൽ ആപ്പ് ഗ്രിഡ് റീസെറ്റ് ചെയ്യുക"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ഈ ഫംഗ്ഷൻ, എല്ലാ ഇഷ്‌ടാനുസൃത ക്രമപ്പെടുത്തലുകളും നീക്കം ചെയ്യും. നിങ്ങൾക്ക് തുടരണമെന്നുണ്ടോ?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"എല്ലാ ആപ്പുകളും"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"മീഡിയ ആപ്പുകൾ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"ആപ്പിന്റെ പ്രവർത്തനം നിർത്തുക"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന്റെ പ്രവർത്തനം നിർത്തി."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"ആപ്പിന്റെ പ്രവർത്തനം നിർത്തണോ?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"ഒരു ആപ്പിന്റെ പ്രവർത്തനം നിർബന്ധിതമായി നിർത്തിയാൽ, അത് ശരിയായി പ്രവർത്തിക്കാനിടയില്ല."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"ആപ്പ് നിർത്താനാകില്ല."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ഡ്രൈവിംഗിനിടെ <xliff:g id="APP_NAME">%1$s</xliff:g> ഉപയോഗിക്കാനാകില്ല."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"കൂടുതൽ വിവരങ്ങൾക്ക് കാർഡ് ടാപ്പ് ചെയ്യുക"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"ലോഞ്ച് ചെയ്യാൻ കാർഡ് ടാപ്പ് ചെയ്യുക"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"സജീവമായ കോൾ"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ഡയൽ ചെയ്യുന്നു…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto ലോഞ്ച് ചെയ്യുക"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto ലോഞ്ച് ചെയ്യാനാകുന്നില്ല. ആക്റ്റിവിറ്റിയൊന്നും കണ്ടെത്തിയില്ല."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# ഉപകരണം}other{# ഉപകരണങ്ങൾ}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"കാലാവസ്ഥ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° കൂടുതലും തെളിഞ്ഞ ആകാശം"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • കൂടിയത്: --° കുറഞ്ഞത്: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ഡീബഗ് ആപ്പുകൾ മറയ്ക്കുക"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"ഡീബഗ് ആപ്പുകൾ കാണിക്കുക"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"എല്ലാം മായ്‌ക്കുക"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"ആപ്പ് ലഭ്യമല്ല"</string>
-</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
deleted file mode 100644
index 3636c27b..00000000
--- a/res/values-mn/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Машины эхлүүлэгч"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Аппын хүснэгтийг А-Я дараалалтай болгож шинэчлэх"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Энэ функц нь бүх захиалгат дарааллыг хасна. Та үргэлжлүүлэхийг хүсэж байна уу?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Бүх апп"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Медиа аппууд"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Аппыг зогсоох"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> зогссон."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Аппыг зогсоох уу?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Хэрэв аппыг хүчээр зогсоовол буруу ажиллаж магадгүй."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Аппыг зогсоох боломжгүй."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г жолоо барьж байх үед ашиглах боломжгүй."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Дэлгэрэнгүй мэдээлэл авах бол картыг товшино уу"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Эхлүүлэхийн тулд картыг товшино уу"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Үргэлжилж буй дуудлага"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Залгаж байна…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Аuto-г эхлүүлэх"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto-г эхлүүлэх боломжгүй. Үйл ажиллагаа олдсонгүй."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# Төхөөрөмж}other{# Төхөөрөмжүүд}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Цаг агаар"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Ихэвчлэн нартай"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Дээд: --° Доод: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Дебаг хийх аппуудыг нуух"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Дебаг хийх аппуудыг харуулах"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Ямар ч саяхны зүйл байхгүй"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Бүгдийг арилгах"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Апп боломжгүй байна"</string>
-</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
deleted file mode 100644
index 2751acad..00000000
--- a/res/values-mr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"कार लाँचर"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"अ‍ॅप ग्रिडला A-Z या क्रमाने रीसेट करा"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"हे फंक्शन सर्व कस्टम ऑर्डरिंग काढून टाकेल. तुम्हाला पुढे सुरू ठेवायचे आहे का?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"सर्व अ‍ॅप्स"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"मीडिया अ‍ॅप्स"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"अ‍ॅप थांबवा"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> थांबवले आहे."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"अ‍ॅप थांबवायचे आहे का?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"तुम्ही अ‍ॅप सक्तीने थांबवल्यास, ते गैरवर्तन करू शकते."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"अ‍ॅप थांबवू शकत नाही."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ड्राइव्ह करताना <xliff:g id="APP_NAME">%1$s</xliff:g> वापरता येऊ शकत नाही."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"अधिक माहितीसाठी कार्डवर टॅप करा"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"लाँच करण्यासाठी कार्डवर टॅप करा"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"सुरू असलेला कॉल"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"डायल करत आहे…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto लाँच करा"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto लाँच करता आले नाही. कोणतीही अ‍ॅक्टिव्हिटी आढळली नाही."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# डिव्हाइस}other{# डिव्हाइस}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"हवामान"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° बहुतांशी सुर्यप्रकाशित"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"महाबळेश्वर • कमाल: --° किमान: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"डीबग केलेली ॲप्स लपवा"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"डीबग केलेली ॲप्स दाखवा"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"कोणतेही अलीकडील आयटम नाहीत"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"सर्व साफ करा"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"अ‍ॅप उपलब्ध नाही"</string>
-</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
deleted file mode 100644
index 1ebb30cf..00000000
--- a/res/values-ms/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Pelancar Kereta"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Tetapkan semula grid apl mengikut susunan A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Fungsi ini akan mengalih keluar semua susunan tersuai. Adakah anda mahu meneruskan tindakan?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Semua apl"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Apl media"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Hentikan apl"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah dihentikan."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Hentikan apl?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Jika anda menghentikan apl secara paksa, mungkin fungsi apl akan terganggu."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Apl tidak dapat dihentikan."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak boleh digunakan semasa memandu."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Ketik kad untuk mendapatkan maklumat lanjut"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Ketik kad untuk lancarkan"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Panggilan sedang berjalan"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Mendail…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Lancarkan Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Tidak dapat melancarkan Android Auto. Tiada aktiviti ditemukan."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# peranti}other{# peranti}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Cuaca"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Kebanyakannya cerah"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Pemandangan Gunung • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Sembunyikan apl nyahpepijat"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Tunjukkan apl nyahpepijat"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Tiada item terbaharu"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Kosongkan Semua"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Apl tidak tersedia"</string>
-</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
deleted file mode 100644
index e9a10a80..00000000
--- a/res/values-my/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"ကား၏ ဖွင့်စနစ်"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"အက်ပ်ဇယားကို A-Z အစီအစဉ်သို့ ပြင်ဆင်သတ်မှတ်ရန်"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ဤလုပ်ဆောင်ချက်သည် စိတ်ကြိုက်စီစဉ်မှုအားလုံးကို ဖယ်ရှားမည်။ ရှေ့ဆက်လိုပါသလား။"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"အက်ပ်အားလုံး"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"မီဒီယာ အက်ပ်များ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"အက်ပ်ကို ရပ်ဆိုင်းရန်"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> ရပ်ဆိုင်းသွားပြီ။"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"အက်ပ်ကို ရပ်ဆိုင်းမလား။"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"အက်ပ်ကို မဖြစ်မနေ ရပ်ခိုင်းလျှင် အမှားအယွင်းဖြစ်နိုင်သည်။"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"အက်ပ်ကို ရပ်၍မရပါ။"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ကားမောင်းနေစဉ် <xliff:g id="APP_NAME">%1$s</xliff:g> ကို သုံး၍မရပါ။"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"နောက်ထပ် အချက်အလက်များအတွက် ကတ်ကိုတို့ပါ"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"ဖွင့်ရန် ကတ်ကိုတို့ပါ"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"လက်ရှိခေါ်ဆိုမှု"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ခေါ်ဆိုနေသည်…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto ဖွင့်ပါ"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto ဖွင့်၍မရပါ။ လုပ်ဆောင်ချက် မရှိပါ။"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{စက် # ခု}other{စက် # ခု}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"မိုးလေဝသ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° အများအားဖြင့် နေသာသည်"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • မြင့်- --° နိမ့်- --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"အမှားရှာပြင်သည့်အက်ပ်များ ဖျောက်ထားရန်"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"အမှားရှာပြင်သည့်အက်ပ်များ ပြရန်"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"မကြာသေးမီက သုံးထားသည်များ မရှိပါ"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"အားလုံးရှင်းရန်"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"အက်ပ် မရနိုင်ပါ"</string>
-</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
deleted file mode 100644
index 7b0dcd7d..00000000
--- a/res/values-nb/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Tilbakestill apprutenettet til A–Å-rekkefølge"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Denne funksjonen fjerner alle tilpassede rekkefølger. Vil du fortsette?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Alle apper"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Medieapper"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Stopp appen"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> er stoppet."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Vil du stoppe appen?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Hvis du tvinger en app til å avslutte, kan det oppstå problemer."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Appen kan ikke stoppes."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Du kan ikke bruke <xliff:g id="APP_NAME">%1$s</xliff:g> mens du kjører."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Trykk på kortet for mer informasjon"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Trykk på kortet for å åpne det"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Pågående samtale"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Slår nummeret …"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Start Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Kan ikke starte Android Auto. Fant ingen aktiviteter."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# enhet}other{# enheter}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Været"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° For det meste sol"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Høyeste temp.: --° Laveste temp.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Skjul feilsøkingsapper"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Vis feilsøkingsapper"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Ingen nylige elementer"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Fjern alt"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Appen er ikke tilgjengelig"</string>
-</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
deleted file mode 100644
index a992df81..00000000
--- a/res/values-ne/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"कार लन्चर"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"एप ग्रिड A देखि Z को क्रममा रिसेट गर्नुहोस्"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"यो फङ्सनले रोजाइअनुसार सेट गरिएका सबै क्रम हटाउने छ। तपाईं जारी राख्न चाहनुहुन्छ?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"सबै एपहरू"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"मिडिया एपहरू"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"एपलाई रोक्नुहोस्"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> रोकिएको छ।"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"एपलाई रोक्ने हो?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"तपाईंले कुनै एपलाई जबरजस्ती रोक्नुभयो भने त्यसले सही तरिकाले काम नगर्न सक्छ।"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"एप बन्द गर्न सकिँदैन।"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ड्राइभ गर्दा <xliff:g id="APP_NAME">%1$s</xliff:g> प्रयोग गर्न सकिँदैन।"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"थप जानकारी प्राप्त गर्न कार्डमा ट्याप गर्नुहोस्"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"लन्च गर्न कार्डमा ट्याप गर्नुहोस्"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"भइरहेको कल"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"डायल गरिँदै छ"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto लन्च गर्नुहोस्"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto लन्च गर्न सकिएन। कुनै गतिविधि भेट्टिएन।"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# डिभाइस}other{# वटा डिभाइस}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"मौसम"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° अधिकांश घमाइलो"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"माउन्टेन भ्यू • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"डिबग एपहरू लुकाइयोस्"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"डिबग एपहरू देखाइयोस्"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"हालसालैको कुनै पनि सामग्री छैन"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"सबै सामग्री मेटाउनुहोस्"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"एप उपलब्ध छैन"</string>
-</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
deleted file mode 100644
index 62886daf..00000000
--- a/res/values-nl/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"App-raster resetten naar de volgorde A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Met deze functie wordt de aangepaste volgorde helemaal verwijderd. Wil je doorgaan?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Alle apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Media-apps"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"App stoppen"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> is gestopt."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"App stoppen?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Als je een app gedwongen stopt, kan deze onverwacht gedrag vertonen."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"De app kan niet worden gestopt."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Je kunt <xliff:g id="APP_NAME">%1$s</xliff:g> niet gebruiken tijdens het rijden"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Tik op de kaart voor meer informatie"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Tik op de kaart om te starten"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Actief gesprek"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Kiezen…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto starten"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Kan Android Auto niet starten. Geen activiteit gevonden."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# apparaat}other{# apparaten}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weer"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"-- ° Grotendeels zonnig"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Max: -- ° Min: -- °"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Foutopsporingsapps verbergen"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Foutopsporingsapps tonen"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Geen recente items"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Alles wissen"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"App is niet beschikbaar"</string>
-</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
deleted file mode 100644
index b4d85e03..00000000
--- a/res/values-or/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"କାର୍ ଲଞ୍ଚର୍"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"A-Z କ୍ରମରେ ଆପ ଗ୍ରିଡକୁ ରିସେଟ କରନ୍ତୁ"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ଏହି ଫଙ୍କସନ ସମସ୍ତ କଷ୍ଟମ ଅର୍ଡରିଂକୁ କାଢ଼ି ଦେବ। ଆପଣ ଜାରି ରଖିବାକୁ ଚାହାଁନ୍ତି?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"ସମସ୍ତ ଆପ୍"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"ମିଡିଆ ଆପ୍ସ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"ଆପକୁ ବନ୍ଦ କରନ୍ତୁ"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ବନ୍ଦ କରାଯାଇଛି।"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"ଆପକୁ ବନ୍ଦ କରିବେ?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"ଯଦି ଆପଣ ଏକ ଆପକୁ ବାଧ୍ୟତାର ସହ ବନ୍ଦ କରନ୍ତି, ତେବେ ଏହା ଠିକ୍ ଭାବେ କାମ ନକରିପାରେ।"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"ଆପ ବନ୍ଦ କରାଯାଇପାରିବ ନାହିଁ।"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ଡ୍ରାଇଭ୍ କରିବା ସମୟରେ <xliff:g id="APP_NAME">%1$s</xliff:g> ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ।"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"ଅଧିକ ସୂଚନା ପାଇଁ କାର୍ଡକୁ ଟାପ୍ କରନ୍ତୁ"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"ଲଞ୍ଚ କରିବା ପାଇଁ କାର୍ଡକୁ ଟାପ୍ କରନ୍ତୁ"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"ଚାଲୁ ରହିଥିବା କଲ୍"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ଡାଏଲ କରାଯାଉଛି…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Autoକୁ ଲଞ୍ଚ କରନ୍ତୁ"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Autoକୁ ଲଞ୍ଚ କରିବା ପାଇଁ ଅସମର୍ଥ। କୌଣସି କାର୍ଯ୍ୟକଳାପ ମିଳୁ ନାହିଁ।"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{#ଟି ଡିଭାଇସ}other{#ଟି ଡିଭାଇସ}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"ପାଣିପାଗ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° ପ୍ରାୟତଃ ଖରା"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"ମାଉଣ୍ଟେନ୍ ଭ୍ୟୁ • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ଡିବଗ୍ ଆପଗୁଡ଼ିକୁ ଲୁଚାନ୍ତୁ"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"ଡିବଗ୍ ଆପଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ ନାହିଁ"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"ସବୁ ଖାଲି କରନ୍ତୁ"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"ଆପ ଉପଲବ୍ଧ ନାହିଁ"</string>
-</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
deleted file mode 100644
index bb2e14d8..00000000
--- a/res/values-pa/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"ਕਾਰ ਲਾਂਚਰ"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"ਐਪ ਗਰਿੱਡ ਨੂੰ A-Z ਕ੍ਰਮ ਵਿੱਚ ਰੀਸੈੱਟ ਕਰੋ"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ਇਸ ਫੰਕਸ਼ਨ ਨਾਲ ਸਾਰਾ ਵਿਉਂਤਿਆ ਕ੍ਰਮ ਹਟ ਜਾਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"ਸਾਰੀਆਂ ਐਪਾਂ"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"ਮੀਡੀਆ ਐਪਾਂ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"ਐਪ ਬੰਦ ਕਰੋ"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਬੰਦ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ।"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"ਕੀ ਐਪ ਬੰਦ ਕਰਨੀ ਹੈ?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਨੂੰ ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰਦੇ ਹੋ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਾ ਕਰੇ।"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"ਐਪ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ਗੱਡੀ ਚਲਾਉਣ ਵੇਲੇ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਕਾਰਡ \'ਤੇ ਟੈਪ ਕਰੋ"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"ਲਾਂਚ ਕਰਨ ਲਈ ਕਾਰਡ \'ਤੇ ਟੈਪ ਕਰੋ"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"ਜਾਰੀ ਕਾਲ"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ਡਾਇਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto ਲਾਂਚ ਕਰੋ"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto ਲਾਂਚ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕੋਈ ਸਰਗਰਮੀ ਨਹੀਂ ਮਿਲੀ।"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# ਡੀਵਾਈਸ}one{# ਡੀਵਾਈਸ}other{# ਡੀਵਾਈਸ}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"ਮੌਸਮ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° ਜ਼ਿਆਦਾਤਰ ਧੁੱਪ"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"ਅੰਮ੍ਰਿਤਸਰ • ਉੱਚ: --° ਨਿਮਨ: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ਡੀਬੱਗ ਐਪਾਂ ਲੁਕਾਓ"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"ਡੀਬੱਗ ਐਪਾਂ ਦਿਖਾਓ"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"ਕੋਈ ਹਾਲੀਆ ਆਈਟਮ ਨਹੀਂ"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
-</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
deleted file mode 100644
index d596e815..00000000
--- a/res/values-pl/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Program uruchamiający w samochodzie"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Zresetuj siatkę aplikacji do kolejności alfabetycznej"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Ta funkcja usuwa wszystkie niestandardowe ustawienia kolejności. Czy chcesz kontynuować?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Wszystkie aplikacje"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplikacje multimedialne"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Zatrzymaj aplikację"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> została zatrzymana."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Zatrzymać aplikację?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Jeśli wymusisz zatrzymanie aplikacji, może ona zadziałać nieprawidłowo."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Aplikacji nie można zatrzymać."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Podczas jazdy nie można korzystać z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Kliknij kartę, by uzyskać więcej informacji"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Kliknij kartę, by uruchomić"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Trwa połączenie"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Wybieram numer…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Uruchom Androida Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Nie można uruchomić Androida Auto. Nie znaleziono żadnych działań."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# urządzenie}few{# urządzenia}many{# urządzeń}other{# urządzenia}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Pogoda"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--°, liczne przejaśnienia"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • maks.: --° min.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ukryj aplikacje do debugowania"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Pokaż aplikacje do debugowania"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Brak ostatnich elementów"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Wyczyść wszystko"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplikacja niedostępna"</string>
-</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
deleted file mode 100644
index a7041845..00000000
--- a/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Launcher do carro"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Reponha a grelha de apps para a ordem A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Esta função vai remover toda a ordenação personalizada. Quer continuar?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Todas as apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Apps de multimédia"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Parar a app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> foi parada."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Parar a app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Se forçar a paragem de uma app, esta pode apresentar um comportamento anormal."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Não é possível parar a app."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Não é possível utilizar a app <xliff:g id="APP_NAME">%1$s</xliff:g> durante a condução."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Toque no cartão para obter mais informações"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Toque no cartão para iniciar"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">"•"</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Chamada em curso"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"A marcar…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Iniciar o Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Não é possível iniciar o Android Auto. Não foram encontradas atividades."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Meteorologia"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Céu maioritariamente limpo"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Máx.: --° Mín.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ocultar apps de depuração"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Mostrar apps de depuração"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nenhum item recente"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Limpar tudo"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"A app não está disponível"</string>
-</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
deleted file mode 100644
index 606d31e9..00000000
--- a/res/values-pt/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Tela de início do carro"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Redefinir a grade de apps para a ordem de A a Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Esta função vai remover a ordem personalizada. Você quer continuar?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Todos os apps"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Apps de mídia"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Parar o app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> foi parado."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Parar o app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Se você forçar o fechamento de um app, ele pode apresentar mau funcionamento."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Não é possível interromper o app."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não pode ser usado ao dirigir."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Toque no card para mais informações"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Toque no card para iniciar"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Chamada em andamento"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Chamando…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Iniciar o Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Não foi possível iniciar o Android Auto. Nenhuma atividade foi encontrada."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# dispositivo}one{# dispositivo}other{# dispositivos}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Clima"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Predominantemente ensolarado"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Mínima: --° Máxima: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ocultar apps de depuração"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Mostrar apps de depuração"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nenhum item recente"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Limpar tudo"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"O app não está disponível"</string>
-</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
deleted file mode 100644
index 2d2fd39f..00000000
--- a/res/values-ro/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Lansator de aplicații pentru mașină"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Resetează grila de aplicații la ordinea A – Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Această funcție va elimina orice ordonare personalizată. Continui?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Toate aplicațiile"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplicații media"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Oprește aplicația"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> a fost oprită."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Oprești aplicația?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Dacă forțezi oprirea unei aplicații, aceasta se poate comporta necorespunzător."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Aplicația nu poate fi oprită."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Nu poți folosi <xliff:g id="APP_NAME">%1$s</xliff:g> în timp ce conduci."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Pentru mai multe informații, atinge cardul"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Pentru a lansa, atinge cardul"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Apel în desfășurare"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Se apelează…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Lansează Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Nu se poate lansa Android Auto. Nu a fost găsită nicio activitate."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# dispozitiv}few{# dispozitive}other{# de dispozitive}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Meteo"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° În mare parte însorit"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Max: --° Min: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ascunde aplicațiile de remediere a erorilor"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Afișează aplicațiile de remediere a erorilor"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Niciun element recent"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Șterge tot"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplicația nu este disponibilă"</string>
-</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
deleted file mode 100644
index 9b435732..00000000
--- a/res/values-ru/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Панель запуска для автомобиля"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Изменение порядка в сетке приложений"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Текущий порядок приложений будет изменен на алфавитный. Продолжить?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Все приложения"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Мультимедийные приложения"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Остановить"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" остановлено."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Остановить приложение?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Принудительное закрытие приложения может отразиться на его функциональности."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Невозможно остановить приложение."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" нельзя использовать за рулем."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Нажмите на карточку, чтобы узнать больше."</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Нажмите на карточку, чтобы запустить."</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Текущий вызов"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Набор номера…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Запустить Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Не удается запустить Android Auto. Ничего не найдено."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# устройство}one{# устройство}few{# устройства}many{# устройств}other{# устройства}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Погода"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Преим. солнечно"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Маунтин-Вью • Макс. --°, мин. --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Скрыть приложения для отладки"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Показать приложения для отладки"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Нет недавних объектов"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Очистить"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Приложение недоступно"</string>
-</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
deleted file mode 100644
index 503eb206..00000000
--- a/res/values-si/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"මෝටර් රථ දියත්කරණය"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"යෙදුම් ජාලකය A-Z අනුපිළිවෙලට යළි සකසන්න"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"මෙම කාර්යය සියලු අභිරුචි අනුපිළිවෙලක් ඉවත් කරනු ඇත. ඔබට ඉදිරියට යාමට අවශ්‍ය ද?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"සියලු යෙදුම්"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"මාධ්‍ය යෙදුම්"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"යෙදුම නවත්වන්න"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> නතර කර ඇත."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"යෙදුම නවත්වන්න ද?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"ඔබ යෙදුමක් බලෙන් නැවත වුවහොත්, එය වැරදි ලෙස ක්‍රියා කරනු ඇත."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"යෙදුම නැවැත්විය නොහැක."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට රිය පදවන අතරේ යතුරු පුවරුව භාවිතා කළ නොහැක."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"වැඩි විස්තර සඳහා කාඩ්පත තට්ටු කරන්න"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"දියත් කිරීමට කාඩ්පත තට්ටු කරන්න"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"කරගෙන යන ඇමතුම"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"අමතමින්…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto දියත් කරන්න"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto දියත් කිරීමට නොහැකිය. ක්‍රියාකාරකම් නොමැත."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{උපාංග #ක්}one{උපාංග #ක්}other{උපාංග #ක්}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"කාලගුණය"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° බොහෝ විට අව්ව"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"කඳුකර දර්ශනය • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"නිදොස් කිරීමේ යෙදුම් සඟවන්න"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"නිදොස් කිරීමේ යෙදුම් පෙන්වන්න"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"මෑත අයිතම නැත"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"සියල්ල හිස් කරන්න"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"යෙදුම නොතිබේ"</string>
-</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
deleted file mode 100644
index a1b7285f..00000000
--- a/res/values-sk/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Spúšťač v aute"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Resetovať mriežku aplikácií do poradia A – Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Táto funkcia zruší všetko vlastné poradie. Chcete pokračovať?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Všetky aplikácie"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Mediálne aplikácie"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Zastaviť aplikáciu"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> bola zastavená."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Chcete zastaviť aplikáciu?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ak vynútite zastavenie aplikácie, môže sa správať zvláštne."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Aplikáciu nie je možné ukončiť."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Pri šoférovaní nie je možné používať aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Ďalšie informácie získate klepnutím na kartu"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Spustíte klepnutím na kartu"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Prebiehajúci hovor"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Vytáča sa…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Spustiť Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto sa nepodarilo spustiť. Nebola nájdená sa žiadna aktivita."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# zariadenie}few{# zariadenia}many{# devices}other{# zariadení}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Počasie"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Väčšinou slnečno"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Skryť aplikácie na ladenie"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Zobraziť aplikácie ladenia"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Žiadne nedávne položky"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Vymazať všetko"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplikácia nie je k dispozícii"</string>
-</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
deleted file mode 100644
index 7a6fea12..00000000
--- a/res/values-sl/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Zaganjalnik za avtomobil"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Ponastavi mrežo aplikacij na vrstni red od A do Ž"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Ta funkcija bo odstranila vse razvrščanje po meri. Ali želite nadaljevati?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Vse aplikacije"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplikacije za predstavnost"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Ustavi aplikacijo"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je ustavljena."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Želite ustaviti aplikacijo?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Če boste vsilili zaustavitev aplikacije, morda ne bo pravilno delovala."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Aplikacije ni mogoče ustaviti."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Med vožnjo ni mogoče uporabljati aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Dotaknite se kartice za več informacij"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Dotaknite se kartice za zagon"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Aktivni klic"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Klicanje …"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Zaženite storitev Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Ni mogoče zagnati Androida Auto. Najdena ni bila nobena dejavnost."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# naprava}one{# naprava}two{# napravi}few{# naprave}other{# naprav}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Vreme"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° pretežno sončno"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • V: --° N: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Skrij aplikacije za odpravljanje napak"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Prikaži aplikacije za odpravljanje napak"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Ni nedavnih elementov"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Izbriši vse"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplikacija ni na voljo"</string>
-</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
deleted file mode 100644
index f03d6fb5..00000000
--- a/res/values-sq/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Rivendos rrjetën e aplikacioneve sipas radhës A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Ky funksion do të heqë të gjitha porositjet e personalizuara. Dëshiron të vazhdosh?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Të gjitha aplikacionet"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Aplikacionet e medias"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Ndalo aplikacionin"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> është ndaluar."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Të ndalohet aplikacioni?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Nëse e ndalon me forcë një aplikacion, ai mund të përjetojë çrregullime në funksionim."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Aplikacioni nuk mund të ndalohet."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk mund të përdoret gjatë drejtimit të makinës."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Trokit te karta për më shumë informacion"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Trokit te karta për ta nisur"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Telefonatë në vazhdim"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Po formon numrin…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Hap Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto nuk mund të niset. Nuk u gjet asnjë aktivitet."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# pajisje}other{# pajisje}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Moti"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Kryesisht me diell"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • L: --° U: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Fshih aplikacionet e korrigjimit"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Shfaq aplikacionet e korrigjimit"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Nuk ka asnjë artikull të fundit"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Pastro të gjitha"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Aplikacioni nuk ofrohet"</string>
-</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
deleted file mode 100644
index dd7ddc24..00000000
--- a/res/values-sr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Покретач за аутомобиле"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Ресетуј мрежу апликација на распоред A–Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Ова функција ће уклините целокупан прилагођен распоред. Желите да наставите?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Све апликације"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Апликације за медије"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Заустави апликацију"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> је заустављена."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Заустављате апликацију?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ако принудно зауставите апликацију, можда ће се понашати неочекивано."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Апликација не може да се заустави."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се користи током вожње."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Додирните картицу за више информација"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Додирните картицу да бисте покренули услугу"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Позив је у току"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Позива се…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Покрени Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Покретање услуге Android Auto није успело. Није пронађена ниједна активност."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# уређај}one{# уређај}few{# уређаја}other{# уређаја}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Време"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° углавном сунчано"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Нови Сад • Највиша: --° Најнижа: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Сакриј апликације за отклањање грешака"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Прикажи апликације за отклањање грешака"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Нема недавних ставки"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Обриши све"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Апликација није доступна"</string>
-</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
deleted file mode 100644
index 28bbb1c4..00000000
--- a/res/values-sv/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Återställ rutnätet för appar till ordningen A–Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Funktionen tar bort alla anpassade ordningar. Vill du fortsätta?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Alla appar"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Medieappar"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Avsluta appen"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> har avslutats."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Vill du avsluta appen?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Om du tvingar appen att avsluta kanske den inte fungerar som den ska."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Appen går inte att stoppa."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g> går inte att använda under körning."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Tryck på kortet för mer information"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Tryck på kortet för att starta"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Pågående samtal"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Ringer upp …"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Starta Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Det gick inte att starta Android Auto. Ingen aktivitet hittades."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# enhet}other{# enheter}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Väder"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Mestadels soligt"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • max: --° min: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Dölj felsökningsappar"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Visa felsökningsappar"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Listan är tom"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Rensa allt"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Appen är inte tillgänglig"</string>
-</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
deleted file mode 100644
index 659b644e..00000000
--- a/res/values-sw/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Kifungua Programu cha Gari"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Weka upya gridi ya programu kwa mpango wa A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Utendaji huu utaondoa mipangilio yote maalum ya upangaji. Ungependa kuendelea?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Programu zote"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Programu za muziki"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Zima programu"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Umezima programu ya <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Ungependa kuzima programu?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Huenda programu isifanye kazi ipasavyo, iwapo utalazimisha kuizima."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Progarmu haiwezi kusitishwa"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Huwezi kutumia <xliff:g id="APP_NAME">%1$s</xliff:g> wakati unaendesha gari."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Gusa kadi ili upate maelezo zaidi"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Gusa kadi ili ufungue"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Simu inayoendelea"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Inapiga…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Fungua Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Imeshindwa kufungua Android Auto. Hamna shughuli iliyopatikana."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{Kifaa #}other{Vifaa #}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Hali ya Hewa"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Jua mara nyingi"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mwonekano wa Mlima • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ficha programu za kutatua"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Onyesha programu za kutatua"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Hakuna vipengee vya hivi karibuni"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Futa Zote"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Programu haipatikani"</string>
-</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
deleted file mode 100644
index 54d57bed..00000000
--- a/res/values-ta/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"ஆப்ஸ் கட்டக் காட்சியை A-Z வரிசைப்படி மீட்டமைத்தல்"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"இது அனைத்துப் பிரத்தியேக வரிசைகளையும் அகற்றும். தொடர விரும்புகிறீர்களா?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"அனைத்து ஆப்ஸும்"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"மீடியா ஆப்ஸ்"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"ஆப்ஸை நிறுத்து"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் நிறுத்தப்பட்டது."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"ஆப்ஸை நிறுத்தவா?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"ஆப்ஸை உடனே நிறுத்தினால் அது சரியாகச் செயல்படாமல் போகக்கூடும்."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"ஆப்ஸை நிறுத்த முடியாது."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"காரை ஓட்டும்போது <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸைப் பயன்படுத்த இயலாது."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"மேலும் தகவல்களுக்கு கார்டைத் தட்டவும்"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"தொடங்குவதற்கு கார்டைத் தட்டவும்"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"செயலில் இருக்கும் அழைப்பு"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"டயல் செய்கிறது…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Autoவைத் தொடங்கு"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Autoவைத் தொடங்க முடியவில்லை. செயல்பாடு எதுவுமில்லை."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# சாதனம்}other{# சாதனங்கள்}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Weather"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° உடன் பெரும்பாலும் வெயிலடிக்கும்"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"மவுண்டன் வியூ • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"பிழைதிருத்தும் ஆப்ஸை மறை"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"பிழைதிருத்தும் ஆப்ஸைக் காட்டு"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"சமீபத்தியவை எதுவுமில்லை"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"அனைத்தையும் அழி"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"ஆப்ஸ் கிடைக்கவில்லை"</string>
-</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
deleted file mode 100644
index 181eb9bf..00000000
--- a/res/values-te/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"కార్ లాంచర్"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"యాప్ గ్రిడ్‌ను A-Z ఆర్డర్‌కు రీసెట్ చేయండి"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ఈ ఫంక్షన్ అన్ని అనుకూల ఆర్డరింగ్‌ను తీసివేస్తుంది. మీరు కొనసాగాలనుకుంటున్నారా?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"అన్ని యాప్‌లు"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"మీడియా యాప్‌లు"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"యాప్‌ను ఆపివేయండి"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఆపివేయబడింది."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"యాప్‌ను ఆపివేయాలా?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"మీరు యాప్‌ను ఫోర్స్ ఆపివేస్తే, అది సరిగ్గా పని చేయకపోవచ్చు."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"యాప్‌ను ఆపడం సాధ్యం కాదు."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"డ్రైవింగ్ చేస్తున్నపుడు <xliff:g id="APP_NAME">%1$s</xliff:g> ఉపయోగించలేరు."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"మరింత సమాచారం కోసం కార్డ్‌ను ట్యాప్ చేయండి"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"లాంచ్ చేయడానికి కార్డ్‌ను ట్యాప్ చేయండి"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"ఇప్పుడు కొనసాగుతున్న కాల్"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"డయల్ చేస్తోంది…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Autoను లాంచ్ చేయండి"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Autoను లాంచ్ చేయడం సాధ్యం కాలేదు. ఏ యాక్టివిటీ కనుగొనబడలేదు."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# పరికరం}other{# పరికరాలు}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"వాతావరణం"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"చాలావరకు --° ఎండగా ఉంటుంది"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"మౌంటెయిన్ వ్యూ • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"డీబగ్ యాప్‌లను దాచండి"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"డీబగ్ యాప్‌లను చూపించండి"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"ఇటీవలి ఐటెమ్‌లు ఏవీ లేవు"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"అన్నీ తీసివేయండి"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"యాప్ అందుబాటులో లేదు"</string>
-</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
deleted file mode 100644
index 251bc134..00000000
--- a/res/values-th/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"รีเซ็ตตารางกริดสำหรับแอปเป็นลำดับ A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"ฟังก์ชันนี้จะนำการจัดลำดับที่กำหนดเองออกทั้งหมด ต้องการทำต่อไหม"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"แอปทั้งหมด"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"แอปสื่อ"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"หยุดแอป"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"หยุด <xliff:g id="APP_NAME">%1$s</xliff:g> แล้ว"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"หยุดแอปไหม"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"หากคุณบังคับปิดแอปพลิเคชัน อาจทำให้การทำงานผิดพลาดได้"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"หยุดแอปไม่ได้"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"ใช้ <xliff:g id="APP_NAME">%1$s</xliff:g> ขณะขับรถไม่ได้"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"แตะการ์ดเพื่อดูข้อมูลเพิ่มเติม"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"แตะการ์ดเพื่อเปิด"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"สายที่สนทนาอยู่"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"กำลังโทรออก…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"เปิด Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"เปิด Android Auto ไม่ได้ ไม่พบกิจกรรม"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{อุปกรณ์ # เครื่อง}other{อุปกรณ์ # เครื่อง}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"สภาพอากาศ"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° แดดจัดเป็นส่วนใหญ่"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"เมาน์เทนวิว • สูงสุด: --° ต่ำสุด: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ซ่อนแอปแก้ไขข้อบกพร่อง"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"แสดงแอปแก้ไขข้อบกพร่อง"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"ไม่มีรายการล่าสุด"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"ล้างทั้งหมด"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"แอปไม่พร้อมใช้งาน"</string>
-</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
deleted file mode 100644
index a77a06a5..00000000
--- a/res/values-tl/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"I-reset ang grid ng app sa A-Z na pagkakasunod-sunod"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Aalisin ng function na ito ang lahat ng custom na pagkakasunod-sunod Gusto mo bang magpatuloy?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Lahat ng app"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Mga media app"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Ihinto ang app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Ihininto ang <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Ihinto ang app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Kung sapilitan mong ihihinto ang isang app, posible itong kumilos nang hindi tama."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Hindi puwedeng ihinto ang app."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Hindi magagamit ang <xliff:g id="APP_NAME">%1$s</xliff:g> habang nagmamaneho."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"I-tap ang card para sa higit pang impormasyon"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"I-tap ang card na ilulunsad"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Kasalukuyang tawag"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Dina-dial…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Ilunsad ang Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Hindi mailunsad ang Android Auto. Walang nakitang aktibidad."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# device}one{# device}other{# na device}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Lagay ng Panahon"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Maaraw sa pangkalahatan"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Itago ang mga debug app"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Ipakita ang mga debug app"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Walang kamakailang item"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"I-clear Lahat"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Hindi available ang app"</string>
-</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
deleted file mode 100644
index 0d9965a1..00000000
--- a/res/values-tr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Uygulama tablosunu A\'dan Z\'ye sıfırla"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Bu işlev tüm özel sıralamayı kaldıracaktır. Devam etmek istiyor musunuz?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Tüm uygulamalar"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Medya uygulamaları"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Uygulamayı durdur"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> durduruldu."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Uygulama durdurulsun mu?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Uygulamayı zorla durdurursanız hatalı davranabilir."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Uygulama durdurulamıyor."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"<xliff:g id="APP_NAME">%1$s</xliff:g>, sürüş sırasında kullanılamaz."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Daha fazla bilgi için karta dokunun"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Başlatmak için karta dokunun"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Devam eden çağrı"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Aranıyor…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto\'yu başlatın"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto başlatılamadı. Hiçbir etkinlik bulunamadı."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# cihaz}other{# cihaz}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Hava durumu"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Çoğunlukla güneşli"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • E.Y.: --° E.D.: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Hata ayıklama uygulamalarını gizle"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Hata ayıklama uygulamalarını göster"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Yeni öğe yok"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Tümünü Temizle"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Uygulama kullanılamıyor"</string>
-</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
deleted file mode 100644
index f5c67fde..00000000
--- a/res/values-uk/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Панель запуску для автомобіля"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Скинути сітку додатків і повернути розташування в алфавітному порядку (A-Я)"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Якщо застосувати цю функцію, визначений користувачем порядок розташування додатків зміниться. Продовжити?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Усі додатки"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Мультимедійні додатки"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Припинити роботу додатка"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"Роботу додатка <xliff:g id="APP_NAME">%1$s</xliff:g> припинено."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Припинити роботу додатка?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Примусове вимкнення додатка може призвести до збою в його роботі."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Не вдалося припинити роботу додатка."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Додатком <xliff:g id="APP_NAME">%1$s</xliff:g> не можна користуватися під час руху."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Натисніть картку, щоб дізнатися більше"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Натисніть картку, щоб запустити"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Активний виклик"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Набір номера…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Запустити Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Не вдається запустити Android Auto. Не знайдено жодних дій."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# пристрій}one{# пристрій}few{# пристрої}many{# пристроїв}other{# пристрою}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Погода"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--°, в основному сонячно"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Маунтін-В\'ю • Макс. --°, мін. --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Сховати додатки для налагодження"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Показати додатки для налагодження"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Немає нещодавніх додатків"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Очистити все"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Додаток недоступний"</string>
-</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
deleted file mode 100644
index cc8aa77e..00000000
--- a/res/values-ur/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"کار لانچر"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"ایپ گرڈ کو A-Z آرڈر پر ری سیٹ کریں"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"یہ فنکشن تمام حسب ضرورت ترتیب کو ہٹا دے گا۔ کیا آپ جاری رکھنا چاہتے ہیں؟"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"سبھی ایپس"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"میڈیا ایپس"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"ایپ بند کریں"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو بند کر دیا گیا ہے۔"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"ایپ بند کریں؟"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"اگر آپ کسی ایپ کو زبردستی روک دیتے ہیں تو یہ غلط برتاؤ کر سکتی ہے۔"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"ایپ کو روک نہیں سکتے۔"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"گاڑی چلاتے وقت <xliff:g id="APP_NAME">%1$s</xliff:g> کا استعمال نہیں کیا جاسکتا۔"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"مزید معلومات کے لیے کارڈ تھپتھپائیں"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"شروع کرنے کے لیے کارڈ تھپتھپائیں"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"جاری کال"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"ڈائل ہو رہی ہے…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto شروع کریں"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto شروع کرنے سے قاصر۔ کوئی سرگرمی نہیں ملی۔"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# آلہ}other{# آلات}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"موسم"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° زیادہ تر دھوپ"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° L: --°‎"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"ڈیبگ ایپس چھپائیں"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"ڈیبگ ایپس دکھائیں"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"کوئی حالیہ آئٹم نہیں"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"تمام صاف کریں"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"ایپ دستیاب نہیں ہے"</string>
-</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
deleted file mode 100644
index 2ea50ba8..00000000
--- a/res/values-uz/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Avtomobil uchun launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Ilova jadvalini alifbo tartibiga qaytarish"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Bu funksiya barcha maxsus buyurtmalarni bekor qiladi. Davom etasizmi?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Barcha ilovalar"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Media ilovalari"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Ilovani toʻxtatish"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi toʻxtatildi."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Ilova toʻxtatilsinmi?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Ilovani majburan toʻxtatish uning ishlashiga taʼsir koʻrsatishi mumkin."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Ilovani toʻxtatish imkonsiz."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Avtomobil rejimida <xliff:g id="APP_NAME">%1$s</xliff:g> ishlamaydi."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Batafsil axborot olish uchun bildirgi ustiga bosing"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Ishga tushirish uchun bildirgi ustiga bosing"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Joriy chaqiruv"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Raqam terilmoqda…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Android Auto xizmatini ishga tushirish"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Android Auto ishga tushmadi. Hech qanday harakat topilmadi."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# ta qurilma}other{# ta qurilma}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Ob-havo"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Asosan quyoshli"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • Maks: --° Min: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Nosozliklarni aniqlash ilovalarini berkitish"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Nosozliklarni aniqlash ilovalarini chiqarish"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Yaqinda ishlatilgan ilovalar yoʻq"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Hammasini yopish"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Ilova mavjud emas"</string>
-</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
deleted file mode 100644
index d500b30c..00000000
--- a/res/values-vi/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Trình chạy cho ô tô"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Đặt lại lưới ứng dụng theo thứ tự A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Chức năng này sẽ xoá mọi thứ tự tuỳ chỉnh. Bạn có muốn tiếp tục không?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Tất cả ứng dụng"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Ứng dụng đa phương tiện"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Dừng ứng dụng"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"<xliff:g id="APP_NAME">%1$s</xliff:g> đã bị dừng."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Dừng ứng dụng?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Nếu bạn buộc một ứng dụng dừng lại, ứng dụng đó có thể hoạt động không đúng cách."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"Không dừng được ứng dụng."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"Không thể dùng <xliff:g id="APP_NAME">%1$s</xliff:g> trong khi lái xe."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Nhấn vào thẻ để xem thêm thông tin"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Nhấn vào thẻ để mở trình chạy"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Cuộc gọi đang thực hiện"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Đang gọi…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Chạy Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Không thể chạy Android Auto. Không tìm thấy hoạt động nào."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# thiết bị}other{# thiết bị}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Thời tiết"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Nhiều nắng"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Mountain View • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Ẩn các ứng dụng gỡ lỗi"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Hiển thị các ứng dụng gỡ lỗi"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Không có mục nào gần đây"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Xoá tất cả"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"Hiện không có ứng dụng"</string>
-</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 1ccee542..00000000
--- a/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"车用启动器"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"将应用网格排序重置为按名称首字母升序 (A-Z) 排列"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"此功能会撤消所有自定义排序。要继续吗?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"所有应用"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"媒体应用"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"停止应用"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"已停止“<xliff:g id="APP_NAME">%1$s</xliff:g>”。"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"要停止应用吗?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"强行停止某个应用可能会导致其出现异常。"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"无法停止应用。"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"驾车时无法使用<xliff:g id="APP_NAME">%1$s</xliff:g>。"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"点按卡片即可了解详情"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"点按卡片即可启动"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">"•"</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"正在通话"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"正在拨号…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"启动 Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"无法启动 Android Auto。未找到任何活动。"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# 个设备}other{# 个设备}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"天气"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° 以晴为主"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"山景城 • 高:--° 低:--°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"隐藏调试应用"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"显示调试应用"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"近期没有任何内容"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"全部清除"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"应用无法使用"</string>
-</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
deleted file mode 100644
index 1db6cab0..00000000
--- a/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Car Launcher"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"將應用程式網格重設為按字母排序"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"此功能會移除所有自訂順序。您要繼續嗎?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"所有應用程式"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"媒體應用程式"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"停止應用程式"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"已停止「<xliff:g id="APP_NAME">%1$s</xliff:g>」。"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"要停止應用程式嗎?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"強制停止應用程式,可能會導致操作不正常。"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"無法停止應用程式。"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"駕駛時無法使用「<xliff:g id="APP_NAME">%1$s</xliff:g>」。"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"輕按資訊卡以瞭解詳情"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"輕按資訊卡以啟動"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"通話中"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"正在撥號…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"啟動 Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"無法啟動 Android Auto。找不到活動。"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# 部裝置}other{# 部裝置}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"天氣"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° 大致晴朗"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"山景城 • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"隱藏偵錯應用程式"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"顯示偵錯應用程式"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"最近沒有任何項目"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"全部清除"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"目前無法使用這個應用程式"</string>
-</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 48ba2ba1..00000000
--- a/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"車用啟動器"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"將應用程式排列顯示重設為按英文字母順序排列"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"這項功能會移除所有自訂排序,確定要繼續嗎?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"所有應用程式"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"媒體應用程式"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"停止應用程式"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」已停止。"</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"要停止應用程式嗎?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"如果你強制停止應用程式,應用程式可能出現異常行為。"</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"無法停止應用程式。"</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"開車時無法使用「<xliff:g id="APP_NAME">%1$s</xliff:g>」。"</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"輕觸資訊卡即可瞭解詳情"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"輕觸資訊卡即可啟動"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"通話中"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"撥號中…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"啟動 Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"無法啟動 Android Auto。找不到任何活動。"</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{# 部裝置}other{# 部裝置}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"天氣"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° 晴時多雲"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"山景城 • 高:--° 低:--°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"隱藏偵錯應用程式"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"顯示偵錯應用程式"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"沒有最近使用的項目"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"全部清除"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"應用程式目前無法使用"</string>
-</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
deleted file mode 100644
index 75c90c0c..00000000
--- a/res/values-zu/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title" msgid="1995858460392177468">"Isiqalisi Semoto"</string>
- <string name="reset_appgrid_title" msgid="814562055108028366">"Setha kabusha igridi ye-app ku-oda le-A-Z"</string>
- <string name="reset_appgrid_dialogue_message" msgid="8275758912490987735">"Lo msebenzi uzosusa konke uku-oda ngokwezifiso. Ingabe ufuna ukuqhubeka?"</string>
- <string name="app_launcher_title_all_apps" msgid="3215107396036838217">"Zonke izinhlelo zokusebenza"</string>
- <string name="app_launcher_title_media_only" msgid="4400886555907422816">"Izinhlelo zokusebenza zemidiya"</string>
- <string name="app_launcher_stop_app_action" msgid="1081680842410279692">"Misa i-app"</string>
- <string name="app_launcher_stop_app_success_toast_text" msgid="2117271772351005349">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> imisiwe."</string>
- <string name="app_launcher_stop_app_dialog_title" msgid="8276889322638001144">"Misa i-app?"</string>
- <string name="app_launcher_stop_app_dialog_text" msgid="3264059639436254372">"Uma uphoqelela ukumisa i-app, kungenzeka ukuthi ingasebenzi kahle."</string>
- <string name="app_launcher_stop_app_cant_stop_text" msgid="4766841417948746773">"I-App ayikwazi ukumiswa."</string>
- <string name="default_media_song_title" msgid="2970305231647817808"></string>
- <string name="driving_toast_text" msgid="149483091947120092">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayikwazi ukusetshenziswa ngenkathi ushayela."</string>
- <string name="tap_for_more_info_text" msgid="2043549383814415585">"Thepha ikhadi ngolwazi olungeziwe"</string>
- <string name="tap_to_launch_text" msgid="6910695705119260847">"Thepha ikhadi ukuqalisa"</string>
- <string name="ongoing_call_duration_text_separator" msgid="6019453854809413561">" • "</string>
- <string name="ongoing_call_text" msgid="2394626676478708070">"Ikholi eqhubekayo"</string>
- <string name="dialing_call_text" msgid="415326503409745490">"Iyadayela…"</string>
- <string name="projected_launch_text" msgid="5809132353957907500">"Qalisa i-Android Auto"</string>
- <string name="projected_onclick_launch_error_toast_text" msgid="7462478007773137082">"Ayikwazi ukuqalisa i-Android Auto. Awukho umsebenzi otholakalayo."</string>
- <string name="projection_devices" msgid="916314090031116598">"{count,plural, =1{idivayisi #}one{amadivayisi #}other{amadivayisi #}}"</string>
- <string name="weather_app_name" msgid="8048146303519139993">"Isimo sezulu"</string>
- <string name="fake_weather_main_text" msgid="8117240999340284429">"--° Kuzoshisa isikhathi esiningi"</string>
- <string name="fake_weather_footer_text" msgid="4570172025869749926">"Ukubuka Kwentaba • H: --° L: --°"</string>
- <string name="hide_debug_apps" msgid="6128313544379622475">"Fihla izinhlelo zokusebenza zokususa iphutha"</string>
- <string name="show_debug_apps" msgid="4521073121286325786">"Bonisa izinhlelo zokusebenza zokususa iphutha"</string>
- <string name="times_separator" msgid="6180368193321715816">"/"</string>
- <string name="recents_empty_state_text" msgid="6703106170272215731">"Azikho izinto zakamuva"</string>
- <string name="recents_clear_all_text" msgid="2088678071417053923">"Sula konke"</string>
- <string name="failure_opening_recent_task_message" msgid="9097595793150874357">"I-app ayitholakali"</string>
-</resources>
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 00000000..195d14dd
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+pluginManagement {
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+rootProject.name = "CarLauncher"
+include ':libs:appgrid:app'
+include ':libs:appgrid:lib'
+include ':libs:car-apps-common'
+include ':libs:car-media-common'
+include ':libs:car-ui-lib'
diff --git a/src/com/android/car/carlauncher/LauncherViewModel.java b/src/com/android/car/carlauncher/LauncherViewModel.java
deleted file mode 100644
index e4cf5a03..00000000
--- a/src/com/android/car/carlauncher/LauncherViewModel.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.carlauncher;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-import androidx.lifecycle.ViewModel;
-
-import com.android.car.carlauncher.LauncherItemProto.LauncherItemListMessage;
-import com.android.car.carlauncher.LauncherItemProto.LauncherItemMessage;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.stream.Collectors;
-
-/**
- * A launcher model decides how the apps are displayed.
- */
-public class LauncherViewModel extends ViewModel {
- private static final String TAG = "LauncherModel";
- private boolean mIsCustomized;
- private boolean mIsAlphabetized;
- private boolean mAppOrderRead;
- public static final String ORDER_FILE_NAME = "order.data";
- private Map<ComponentName, LauncherItem> mLauncherItemMap = new HashMap<>();
- private final MutableLiveData<List<LauncherItem>> mCurrentLauncher =
- new MutableLiveData<>(new ArrayList<>());
- private List<LauncherItemMessage> mItemsFromProto = new ArrayList<>();
- private List<LauncherItem> mItemsFromPlatform = new ArrayList<>();
- private List<LauncherItem> mFinalItems = new ArrayList<>();
- private OutputStream mOutputStream;
- private InputStream mInputStream;
- private LauncherItemHelper mLauncherItemHelper;
- private File mFileDir;
-
- public LauncherViewModel(File fileDir) {
- mLauncherItemHelper = new LauncherItemHelper();
- mFileDir = fileDir;
- }
-
- public static final Comparator<LauncherItem> ALPHABETICAL_COMPARATOR = Comparator.comparing(
- LauncherItem::getDisplayName, String::compareToIgnoreCase);
-
- public boolean isCustomized() {
- return mIsCustomized;
- }
-
- public LiveData<List<LauncherItem>> getCurrentLauncher() {
- return mCurrentLauncher;
- }
-
- public Map<ComponentName, LauncherItem> getLauncherItemMap() {
- return mLauncherItemMap;
- }
-
- @VisibleForTesting
- OutputStream getOutputStream() {
- return mOutputStream;
- }
-
- @VisibleForTesting
- void setOutputStream(OutputStream outputStream) {
- mOutputStream = outputStream;
- }
-
- @VisibleForTesting
- void setInputStream(InputStream inputStream) {
- mInputStream = inputStream;
- }
-
- @VisibleForTesting
- void setLauncherItemHelper(LauncherItemHelper helper) {
- mLauncherItemHelper = helper;
- }
-
- /**
- * Populate the apps based on alphabetical order and create mapping from packageName to
- * LauncherItem. Each item in the current launcher is AppItem.
- */
- public void generateAlphabetizedAppOrder(AppLauncherUtils.LauncherAppsInfo launcherAppsInfo) {
- List<LauncherItem> tempList = new ArrayList<>();
- mLauncherItemMap.clear();
- List<AppMetaData> apps = launcherAppsInfo.getLaunchableComponentsList();
- for (AppMetaData app : apps) {
- LauncherItem launcherItem = new AppItem(app.getPackageName(), app.getClassName(),
- app.getDisplayName(), app);
- tempList.add(launcherItem);
- mLauncherItemMap.put(app.getComponentName(), launcherItem);
- }
- Collections.sort(tempList, LauncherViewModel.ALPHABETICAL_COMPARATOR);
- mItemsFromPlatform = tempList;
- mIsAlphabetized = true;
- createAppList();
- }
-
- /**
- * Populate the current launcher in the correct order if there are any order
- * recorded and update the mapping
- */
-
- public void updateAppsOrder() {
- mItemsFromProto.clear();
- try {
- File order = new File(mFileDir, ORDER_FILE_NAME);
- if (order.exists()) {
- if (mInputStream == null) {
- mInputStream = new FileInputStream(order);
- }
- LauncherItemListMessage launcherItemListMsg =
- LauncherItemListMessage.parseDelimitedFrom(mInputStream);
- if (launcherItemListMsg != null
- && launcherItemListMsg.getLauncherItemMessageCount() != 0) {
- mIsCustomized = true;
- mItemsFromProto = mLauncherItemHelper.sortLauncherItemListMsg(
- launcherItemListMsg);
- }
- }
- } catch (IOException e) {
- Log.e(TAG, "Read from input stream not successfully");
- } finally {
- if (mInputStream != null) {
- try {
- mInputStream.close();
- mInputStream = null;
- } catch (IOException e) {
- Log.e(TAG, "Unable to close input stream");
- }
- }
- mAppOrderRead = true;
- createAppList();
- }
- }
-
- private void createAppList() {
- Set<ComponentName> componentNames = new HashSet<>();
- if (mIsAlphabetized && mAppOrderRead) {
- mFinalItems.clear();
- if (!mItemsFromProto.isEmpty()) {
- for (LauncherItemMessage item : mItemsFromProto) {
- LauncherItem itemFromMap = mLauncherItemMap.get(
- new ComponentName(item.getPackageName(), item.getClassName()));
- // If item exists in proto but not in map, (e.g, when app
- // is disabled from Settings), it can be ignored
- if (itemFromMap != null) {
- mFinalItems.add(itemFromMap);
- componentNames.add(new
- ComponentName(itemFromMap.getPackageName(),
- itemFromMap.getClassName()));
- }
- }
- // If item exists in map but not in proto (e.g, when app
- // is enabled from Settings), app must be added to the current list
- List<ComponentName> componentNamesNotInProto = mLauncherItemMap.keySet()
- .stream()
- .filter(element -> !componentNames.contains(element))
- .collect(Collectors.toList());
- if (!componentNamesNotInProto.isEmpty()) {
- Collections.sort(componentNamesNotInProto);
- for (ComponentName componentName: componentNamesNotInProto) {
- mFinalItems.add(mLauncherItemMap.get(componentName));
- }
- }
- mCurrentLauncher.postValue(mFinalItems);
- } else {
- mCurrentLauncher.postValue(mItemsFromPlatform);
- }
- mIsAlphabetized = false;
- mAppOrderRead = false;
- }
- }
-
- /**
- * Update an AppItem's AppMetaData isMirroring state and its launchCallback
- * Then, post the updated live data object
- */
- // TODO (b/272796126): refactor to data model and move deep copying to inside DiffUtil
- public void updateMirroringItem(String packageName, Intent mirroringIntent) {
- List<LauncherItem> launcherList = mCurrentLauncher.getValue();
- if (launcherList == null) {
- return;
- }
- List<LauncherItem> launcherListCopy = new ArrayList<>();
- for (LauncherItem item : launcherList) {
- if (item instanceof AppItem) {
- AppMetaData metaData = ((AppItem) item).getAppMetaData();
- if (item.getPackageName().equals(packageName)) {
- launcherListCopy.add(new AppItem(item.getPackageName(), item.getClassName(),
- item.getDisplayName(), new AppMetaData(metaData.getDisplayName(),
- metaData.getComponentName(), metaData.getIcon(),
- metaData.getIsDistractionOptimized(), /* isMirroring= */ true,
- contextArg -> AppLauncherUtils.launchApp(contextArg, mirroringIntent),
- metaData.getAlternateLaunchCallback())));
- } else if (metaData.getIsMirroring()) {
- Intent intent = new Intent(Intent.ACTION_MAIN)
- .setComponent(metaData.getComponentName())
- .addCategory(Intent.CATEGORY_LAUNCHER)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- launcherListCopy.add(new AppItem(item.getPackageName(), item.getClassName(),
- item.getDisplayName(), new AppMetaData(metaData.getDisplayName(),
- metaData.getComponentName(), metaData.getIcon(),
- metaData.getIsDistractionOptimized(), /* isMirroring= */ false,
- contextArg -> AppLauncherUtils.launchApp(contextArg, intent),
- metaData.getAlternateLaunchCallback())));
- } else {
- launcherListCopy.add(item);
- }
- } else {
- launcherListCopy.add(item);
- }
- }
- mCurrentLauncher.postValue(launcherListCopy);
- }
-
- /**
- * Record the current apps' order to a file if needed
- */
- public void maybeSaveAppsOrder() {
- if (isCustomized()) {
- ExecutorService executorService = Executors.newSingleThreadExecutor();
- executorService.execute(() -> {
- writeToFile();
- executorService.shutdown();
- });
- }
- }
-
- protected void writeToFile() {
- LauncherItemListMessage launcherItemListMessage = mLauncherItemHelper.launcherList2Msg(
- mCurrentLauncher.getValue());
- try {
- if (mOutputStream == null) {
- mOutputStream = new FileOutputStream(new File(mFileDir, ORDER_FILE_NAME), false);
- }
- launcherItemListMessage.writeDelimitedTo(mOutputStream);
- } catch (IOException e) {
- Log.e(TAG, "Order not written to file successfully");
- } finally {
- try {
- if (mOutputStream != null) {
- mOutputStream.flush();
- if (mOutputStream instanceof FileOutputStream) {
- ((FileOutputStream) mOutputStream).getFD().sync();
- }
- mOutputStream.close();
- mOutputStream = null;
- }
- } catch (IOException e) {
- Log.e(TAG, "Unable to close output stream");
- }
- }
- }
-
- /**
- * Move an app to a specified index
- */
- public void movePackage(int index, AppMetaData app) {
- List<LauncherItem> current = mCurrentLauncher.getValue();
- LauncherItem item = mLauncherItemMap.get(app.getComponentName());
- if (current != null && current.size() != 0 && index < current.size() && item != null) {
- current.remove(item);
- current.add(index, item);
- mIsCustomized = true;
- mCurrentLauncher.postValue(current);
- }
- }
-
- /**
- * Add a new app to the current list
- */
- public void addPackage(AppMetaData app) {
- if (app != null && !mLauncherItemMap.containsKey(app.getComponentName())) {
- List<LauncherItem> current = mCurrentLauncher.getValue();
- LauncherItem launcherItem = new AppItem(app.getPackageName(), app.getClassName(),
- app.getDisplayName(), app);
- current.add(launcherItem);
- mLauncherItemMap.put(app.getComponentName(), launcherItem);
- if (!mIsCustomized) {
- Collections.sort(current, LauncherViewModel.ALPHABETICAL_COMPARATOR);
- }
- mCurrentLauncher.postValue(current);
- }
- }
-
- /**
- * Remove an app from the current launcher
- */
- public void removePackage(AppMetaData app) {
- if (app != null && mLauncherItemMap.containsKey(app.getComponentName())) {
- List<LauncherItem> current = mCurrentLauncher.getValue();
- LauncherItem launcherItem = mLauncherItemMap.get(app.getComponentName());
- if (current != null && current.size() != 0) {
- current.remove(launcherItem);
- mCurrentLauncher.postValue(current);
- mLauncherItemMap.remove(app.getComponentName());
- }
- }
- }
-
- /**
- * Check if the order file exists
- */
- public boolean doesFileExist() {
- File order = new File(mFileDir, ORDER_FILE_NAME);
- return order.exists();
- }
-
- public void setCustomized(boolean customized) {
- mIsCustomized = customized;
- }
-
- public void setAppOrderRead(boolean appOrderRead) {
- mAppOrderRead = appOrderRead;
- }
-}
diff --git a/tests/src/com/android/car/carlauncher/AppGridActivityTest.java b/tests/src/com/android/car/carlauncher/AppGridActivityTest.java
deleted file mode 100644
index 1dfa969b..00000000
--- a/tests/src/com/android/car/carlauncher/AppGridActivityTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.carlauncher;
-
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.car.drivingstate.CarUxRestrictionsManager;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-
-/**
- * Programmatic tests for AppGridActivity and AppGridScrollBar
- */
-@RunWith(AndroidJUnit4.class)
-public class AppGridActivityTest {
- private ActivityScenario<AppGridActivity> mActivityScenario;
- private CarUxRestrictionsManager mCarUxRestrictionsManager;
- private PageIndicator mPageIndicator;
-
- @After
- public void tearDown() {
- if (mActivityScenario != null) {
- mActivityScenario.close();
- }
- }
-
- @Test
- public void onCreate_appGridRecyclerView_isVisible() {
- mActivityScenario = ActivityScenario.launch(AppGridActivity.class);
- onView(withId(R.id.apps_grid)).check(matches(isDisplayed()));
- onView(withId(R.id.page_indicator_container)).check(matches(isDisplayed()));
- }
-
- @Test
- public void onResume_ScrollStateIsUpdated() {
- mActivityScenario = ActivityScenario.launch(AppGridActivity.class);
- mActivityScenario.onActivity(activity -> {
- mPageIndicator = mock(PageIndicator.class);
- activity.setPageIndicator(mPageIndicator);
- });
- mActivityScenario.moveToState(Lifecycle.State.RESUMED);
- onView(withId(R.id.apps_grid)).check(matches(isDisplayed()));
- onView(withId(R.id.page_indicator_container)).check(matches(isDisplayed()));
- verify(mPageIndicator, times(1)).updatePageCount(anyInt());
-
- }
-
- @Test
- public void onStop_CarUxRestrictionsManager_unregisterListener() {
- mActivityScenario = ActivityScenario.launch(AppGridActivity.class);
- mActivityScenario.onActivity(activity -> {
- mCarUxRestrictionsManager = mock(CarUxRestrictionsManager.class);
- activity.setCarUxRestrictionsManager(mCarUxRestrictionsManager);
- });
- mActivityScenario.moveToState(Lifecycle.State.DESTROYED);
- verify(mCarUxRestrictionsManager, times(1)).unregisterListener();
- }
-}
diff --git a/tests/src/com/android/car/carlauncher/CarLauncherTest.java b/tests/src/com/android/car/carlauncher/CarLauncherTest.java
deleted file mode 100644
index a3e47666..00000000
--- a/tests/src/com/android/car/carlauncher/CarLauncherTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2020 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.carlauncher;
-
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.verify;
-
-import android.car.user.CarUserManager;
-import android.car.user.CarUserManager.UserLifecycleListener;
-import android.testing.TestableContext;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.test.InstrumentationRegistry;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-import androidx.test.filters.Suppress;
-
-
-import org.junit.After;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-@Suppress // To be ignored until b/224978827 is fixed
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class CarLauncherTest {
-
- @Rule
- public final MockitoRule rule = MockitoJUnit.rule();
-
- @Rule
- public TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
- private ActivityScenario<CarLauncher> mActivityScenario;
-
- @Mock
- private CarUserManager mMockCarUserManager;
-
- @After
- public void tearDown() {
- if (mActivityScenario != null) {
- mActivityScenario.close();
- }
- }
-
- @Test
- public void onResume_mapsCard_isVisible() {
- mActivityScenario = ActivityScenario.launch(CarLauncher.class);
- mActivityScenario.moveToState(Lifecycle.State.RESUMED);
-
- onView(withId(R.id.maps_card)).check(matches(isDisplayed()));
- }
-
- @Test
- public void onResume_assistiveCard_isVisible() {
- mActivityScenario = ActivityScenario.launch(CarLauncher.class);
- mActivityScenario.moveToState(Lifecycle.State.RESUMED);
-
- onView(withId(R.id.top_card)).check(matches(isDisplayed()));
- }
-
- @Test
- public void onResume_audioCard_isVisible() {
- mActivityScenario = ActivityScenario.launch(CarLauncher.class);
- mActivityScenario.moveToState(Lifecycle.State.RESUMED);
-
- onView(withId(R.id.bottom_card)).check(matches(isDisplayed()));
- }
-
- @Test
- public void onDestroy_unregistersUserLifecycleListener() {
- mActivityScenario = ActivityScenario.launch(CarLauncher.class);
- mActivityScenario.onActivity(activity -> activity.setCarUserManager(mMockCarUserManager));
-
- mActivityScenario.moveToState(Lifecycle.State.DESTROYED);
-
- verify(mMockCarUserManager).removeListener(any(UserLifecycleListener.class));
- }
-}
diff --git a/tests/src/com/android/car/carlauncher/LauncherViewModelTest.java b/tests/src/com/android/car/carlauncher/LauncherViewModelTest.java
deleted file mode 100644
index a5d8c145..00000000
--- a/tests/src/com/android/car/carlauncher/LauncherViewModelTest.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.carlauncher;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.car.test.mocks.AbstractExtendedMockitoTestCase;
-import android.content.ComponentName;
-import android.graphics.drawable.Drawable;
-
-import androidx.lifecycle.Observer;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
-
-@RunWith(AndroidJUnit4.class)
-public final class LauncherViewModelTest extends AbstractExtendedMockitoTestCase {
- @Rule
- public InstantTaskExecutorRule instantTaskExecutorRule =
- new InstantTaskExecutorRule();
- private LauncherViewModel mLauncherModel;
- @Mock
- private AppLauncherUtils.LauncherAppsInfo mLauncherAppsInfo;
- private Drawable mDrawable;
- private Consumer mConsumer;
- private List<LauncherItem> mCustomizedApps;
- private List<LauncherItem> mAlphabetizedApps;
- private List<AppMetaData> mApps;
-
- @Before
- public void setUp() throws Exception {
- mLauncherModel = new LauncherViewModel(
- new File("/data/user/10/com.android.car.carlauncher/files"));
- mCustomizedApps = new ArrayList<>();
- mAlphabetizedApps = new ArrayList<>();
- mLauncherAppsInfo = mock(AppLauncherUtils.LauncherAppsInfo.class);
- mDrawable = mock(Drawable.class);
- mConsumer = mock(Consumer.class);
- mApps = new ArrayList<>();
- AppMetaData app1 = new AppMetaData(
- "App1",
- new ComponentName("A", "A"),
- mDrawable,
- true,
- false,
- mConsumer,
- mConsumer);
- AppMetaData app2 = new AppMetaData(
- "App2",
- new ComponentName("B", "B"),
- mDrawable,
- true,
- false,
- mConsumer,
- mConsumer);
- AppMetaData app3 = new AppMetaData(
- "App3",
- new ComponentName("C", "C"),
- mDrawable,
- true,
- false,
- mConsumer,
- mConsumer);
- mApps.add(app1);
- mApps.add(app2);
- mApps.add(app3);
- LauncherItem launcherItem1 = new AppItem(
- app1.getPackageName(),
- app1.getClassName(),
- app1.getDisplayName(),
- app1);
- LauncherItem launcherItem2 = new AppItem(
- app2.getPackageName(),
- app2.getClassName(),
- app2.getDisplayName(),
- app2);
- LauncherItem launcherItem3 = new AppItem(
- app3.getPackageName(),
- app3.getClassName(),
- app3.getDisplayName(),
- app3);
- mAlphabetizedApps.add(launcherItem1);
- mAlphabetizedApps.add(launcherItem2);
- mAlphabetizedApps.add(launcherItem3);
- mCustomizedApps.add(launcherItem2);
- mCustomizedApps.add(launcherItem3);
- mCustomizedApps.add(launcherItem1);
- when(mLauncherAppsInfo.getLaunchableComponentsList()).thenReturn(mApps);
- }
-
- @Test
- public void test_concurrentExecution() throws InterruptedException {
- ExecutorService pool = Executors.newCachedThreadPool();
- for (int i = 0; i < 100; i++) {
- pool.execute(() -> {
- mLauncherModel.updateAppsOrder();
- });
- pool.execute(() -> {
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- });
-
- }
- pool.shutdown(); // Disable new tasks from being submitted
- if (!pool.awaitTermination(30, TimeUnit.SECONDS)) {
- pool.shutdownNow(); // Cancel currently executing tasks
- }
- mLauncherModel.getCurrentLauncher().observeForever(new Observer<>() {
- @Override
- public void onChanged(List<LauncherItem> launcherItems) {
- assertEquals(3, launcherItems.size());
- assertEquals("A", launcherItems.get(0).getPackageName());
- assertEquals("B", launcherItems.get(1).getPackageName());
- assertEquals("C", launcherItems.get(2).getPackageName());
- //remove observer after assertion
- mLauncherModel.getCurrentLauncher().removeObserver(this);
- }
- });
- }
-
- @Test
- public void testGenerateWithAlphabetizedApps() throws IOException {
- LauncherItemHelper helper = mock(LauncherItemHelper.class);
- mLauncherModel.setLauncherItemHelper(helper);
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- mLauncherModel.updateAppsOrder();
- mLauncherModel.getCurrentLauncher().observeForever(launcherItems -> {
- assertEquals(3, launcherItems.size());
- assertEquals("A", launcherItems.get(0).getPackageName());
- assertEquals("B", launcherItems.get(1).getPackageName());
- assertEquals("C", launcherItems.get(2).getPackageName());
- });
- }
-
- @Test
- public void testUpdateAppsOrderWithExistingOrder() {
- LauncherItemHelper helper = new LauncherItemHelper();
- mLauncherModel.setLauncherItemHelper(helper);
- InputStream inputStream = new ByteArrayInputStream(new byte[0]);
- mLauncherModel.setInputStream(inputStream);
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- mLauncherModel.updateAppsOrder();
- mLauncherModel.movePackage(0, mApps.get(2));
- ByteArrayOutputStream testOutputStream = new ByteArrayOutputStream();
- mLauncherModel.setOutputStream(testOutputStream);
- mLauncherModel.maybeSaveAppsOrder();
- InputStream newInputStream = new ByteArrayInputStream(
- testOutputStream.toByteArray());
- mLauncherModel.setInputStream(newInputStream);
- mLauncherModel.updateAppsOrder();
- mLauncherModel.getCurrentLauncher().observeForever(it -> {
- assertEquals("C", mApps.get(2).getPackageName());
- assertTrue(mLauncherModel.isCustomized());
- assertEquals(3, it.size());
- assertEquals("C", it.get(0).getPackageName());
- });
- }
-
- @Test
- public void testUpdateAppsOrderWithNoExistingOrder() {
- LauncherItemHelper helper = new LauncherItemHelper();
- mLauncherModel.setLauncherItemHelper(helper);
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- mLauncherModel.updateAppsOrder();
- mLauncherModel.getCurrentLauncher().observeForever(it -> {
- assertEquals(3, it.size());
- assertEquals("A", it.get(0).getPackageName());
- });
- }
-
- @Test
- public void testSaveAppsOrder() {
- mLauncherModel.setOutputStream(new ByteArrayOutputStream());
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- mLauncherModel.updateAppsOrder();
- mLauncherModel.getCurrentLauncher().observeForever(it -> {
- mLauncherModel.maybeSaveAppsOrder();
- assertNotNull(mLauncherModel.getOutputStream());
- assertTrue(
- mLauncherModel.getOutputStream().toString().getBytes().length == 0);
- });
- }
-
- @Test
- public void testMovePackage() {
- mLauncherModel.setOutputStream(new ByteArrayOutputStream());
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- mLauncherModel.updateAppsOrder();
- mLauncherModel.movePackage(0, mApps.get(2));
- mLauncherModel.getCurrentLauncher().observeForever(it -> {
- assertEquals("C", mApps.get(2).getPackageName());
- assertEquals(3, it.size());
- assertEquals("C", it.get(0).getPackageName());
- });
- }
-
- @Test
- public void testAddPackageWithAlphabetizedApps() {
- mLauncherModel.setOutputStream(new ByteArrayOutputStream());
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- mLauncherModel.updateAppsOrder();
- AppMetaData app4 = new AppMetaData(
- "App12",
- new ComponentName("D", "D"),
- mDrawable,
- true,
- false,
- mConsumer,
- mConsumer);
- mLauncherModel.addPackage(app4);
- mLauncherModel.getCurrentLauncher().observeForever(it -> {
- assertEquals(4, it.size());
- assertEquals("A", it.get(0).getPackageName());
- assertEquals("D", it.get(1).getPackageName());
- assertEquals("B", it.get(2).getPackageName());
- assertEquals("C", it.get(3).getPackageName());
- });
- }
-
- @Test
- public void testAddPackageWithCustomizedApps() {
- LauncherItemHelper helper = new LauncherItemHelper();
- mLauncherModel.setLauncherItemHelper(helper);
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- mLauncherModel.updateAppsOrder();
- mLauncherModel.movePackage(0, mApps.get(2));
- ByteArrayOutputStream testOutputStream = new ByteArrayOutputStream();
- mLauncherModel.setOutputStream(testOutputStream);
- mLauncherModel.maybeSaveAppsOrder();
- InputStream newInputStream = new ByteArrayInputStream(
- testOutputStream.toByteArray());
- mLauncherModel.setInputStream(newInputStream);
- mLauncherModel.updateAppsOrder();
- AppMetaData app4 = new AppMetaData(
- "App12",
- new ComponentName("A1", "D"),
- mDrawable,
- true,
- false,
- mConsumer,
- mConsumer);
- mLauncherModel.addPackage(app4);
- mLauncherModel.getCurrentLauncher().observeForever(it -> {
- assertEquals(4, it.size());
- assertEquals("C", it.get(0).getPackageName());
- assertEquals("A", it.get(1).getPackageName());
- assertEquals("B", it.get(2).getPackageName());
- assertEquals("A1", it.get(3).getPackageName());
- });
- }
-
- @Test
- public void testRemovePackageWithAlphabetizedApps() {
- mLauncherModel.setOutputStream(new ByteArrayOutputStream());
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- mLauncherModel.updateAppsOrder();
- AppMetaData app4 = new AppMetaData("App12",
- new ComponentName("A1", "D"),
- mDrawable,
- true,
- false,
- mConsumer,
- mConsumer);
- mLauncherModel.addPackage(app4);
- mLauncherModel.removePackage(app4);
- mLauncherModel.getCurrentLauncher().observeForever(it -> {
- assertEquals(3, it.size());
- assertEquals("A", it.get(0).getPackageName());
- assertEquals("B", it.get(1).getPackageName());
- assertEquals("C", it.get(2).getPackageName());
- });
- }
-
- @Test
- public void testRemovePackageWithCustomizedApps() {
- LauncherItemHelper helper = new LauncherItemHelper();
- mLauncherModel.setLauncherItemHelper(helper);
- mLauncherModel.generateAlphabetizedAppOrder(mLauncherAppsInfo);
- mLauncherModel.updateAppsOrder();
- mLauncherModel.movePackage(0, mApps.get(2));
- ByteArrayOutputStream testOutputStream = new ByteArrayOutputStream();
- mLauncherModel.setOutputStream(testOutputStream);
- mLauncherModel.maybeSaveAppsOrder();
- InputStream newInputStream = new ByteArrayInputStream(
- testOutputStream.toByteArray());
- mLauncherModel.setInputStream(newInputStream);
- mLauncherModel.updateAppsOrder();
- AppMetaData app4 = new AppMetaData(
- "App12",
- new ComponentName("A1", "D"),
- mDrawable,
- true,
- false,
- mConsumer,
- mConsumer);
- mLauncherModel.addPackage(app4);
- mLauncherModel.removePackage(app4);
- mLauncherModel.getCurrentLauncher().observeForever(it -> {
- assertEquals(3, it.size());
- assertEquals("C", it.get(0).getPackageName());
- assertEquals("A", it.get(1).getPackageName());
- assertEquals("B", it.get(2).getPackageName());
- });
- }
-}
diff --git a/tools/generate-overlayable.sh b/tools/generate-overlayable.sh
index 82be1b5c..af663a2f 100755
--- a/tools/generate-overlayable.sh
+++ b/tools/generate-overlayable.sh
@@ -1,17 +1,19 @@
#!/bin/bash
-# Copyright (C) 2021 The Android Open Source Project
#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
+# Copyright (C) 2023 The Android Open Source Project
#
-# http://www.apache.org/licenses/LICENSE-2.0
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
# Run this script to regenerate the overlayable.xml file.
@@ -20,10 +22,22 @@ if [[ -z "$ANDROID_BUILD_TOP" ]]; then
exit 1
fi
-PROJECT_TOP=$ANDROID_BUILD_TOP/packages/apps/Car/Launcher
+# CarLauncher overlayable
+
+PROJECT_TOP=$ANDROID_BUILD_TOP/packages/apps/Car/Launcher/app
python3 $ANDROID_BUILD_TOP/packages/apps/Car/systemlibs/tools/rro/generate-overlayable.py \
-n CarLauncher \
-r $PROJECT_TOP/res \
-e $PROJECT_TOP/res/values/overlayable.xml \
-o $PROJECT_TOP/res/values/overlayable.xml
+
+# CarAppGrid-lib overlayable
+
+PROJECT_TOP=$ANDROID_BUILD_TOP/packages/apps/Car/Launcher/libs/appgrid/lib
+
+python3 $ANDROID_BUILD_TOP/packages/apps/Car/systemlibs/tools/rro/generate-overlayable.py \
+ -n CarAppGrid-lib \
+ -r $PROJECT_TOP/res \
+ -e $PROJECT_TOP/res/values/overlayable.xml \
+ -o $PROJECT_TOP/res/values/overlayable.xml