aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Roos <roosa@google.com>2017-05-05 20:16:08 +0000
committerAdrian Roos <roosa@google.com>2017-05-05 20:16:08 +0000
commit721bd0da688cd552737fbb753a00597f95103b95 (patch)
tree36da88c2d4365be7ee0a4dd0c732b9399d1c55ad
parent3dfa929b24f38ac7836450176d88ceab41dc6ac5 (diff)
downloadTV-721bd0da688cd552737fbb753a00597f95103b95.tar.gz
Revert "Sync to ub-tv-dev at f0024d79653da8c8999a91f995431a645a6ff4a2"
This reverts commit 3dfa929b24f38ac7836450176d88ceab41dc6ac5. Change-Id: I1c76f626d966b8d4793a19677a8840ed0424d3a7
-rw-r--r--Android.mk9
-rw-r--r--AndroidManifest.xml14
-rw-r--r--assets/licenses.html1018
-rw-r--r--common/res/drawable/setup_selector_background.xml3
-rw-r--r--common/res/layout/fragment_setup_multi_pane.xml25
-rw-r--r--common/res/values-af/strings.xml1
-rw-r--r--common/res/values-am/strings.xml1
-rw-r--r--common/res/values-ar/strings.xml1
-rw-r--r--common/res/values-az/strings.xml (renamed from common/res/values-az-rAZ/strings.xml)1
-rw-r--r--common/res/values-bg/strings.xml1
-rw-r--r--common/res/values-bn/strings.xml (renamed from common/res/values-bn-rBD/strings.xml)1
-rw-r--r--common/res/values-ca/strings.xml1
-rw-r--r--common/res/values-cs/strings.xml1
-rw-r--r--common/res/values-da/strings.xml1
-rw-r--r--common/res/values-de/strings.xml1
-rw-r--r--common/res/values-el/strings.xml1
-rw-r--r--common/res/values-en-rAU/strings.xml1
-rw-r--r--common/res/values-en-rGB/strings.xml1
-rw-r--r--common/res/values-en-rIN/strings.xml1
-rw-r--r--common/res/values-es-rUS/strings.xml1
-rw-r--r--common/res/values-es/strings.xml1
-rw-r--r--common/res/values-et/strings.xml (renamed from common/res/values-et-rEE/strings.xml)1
-rw-r--r--common/res/values-eu/strings.xml (renamed from common/res/values-eu-rES/strings.xml)1
-rw-r--r--common/res/values-fa/strings.xml1
-rw-r--r--common/res/values-fi/strings.xml1
-rw-r--r--common/res/values-fr-rCA/strings.xml1
-rw-r--r--common/res/values-fr/strings.xml1
-rw-r--r--common/res/values-gl/strings.xml (renamed from common/res/values-gl-rES/strings.xml)1
-rw-r--r--common/res/values-hi/strings.xml1
-rw-r--r--common/res/values-hr/strings.xml1
-rw-r--r--common/res/values-hu/strings.xml1
-rw-r--r--common/res/values-hy/strings.xml (renamed from common/res/values-hy-rAM/strings.xml)1
-rw-r--r--common/res/values-in/strings.xml1
-rw-r--r--common/res/values-is/strings.xml (renamed from common/res/values-is-rIS/strings.xml)1
-rw-r--r--common/res/values-it/strings.xml1
-rw-r--r--common/res/values-iw/strings.xml1
-rw-r--r--common/res/values-ja/strings.xml1
-rw-r--r--common/res/values-ka/strings.xml (renamed from common/res/values-ka-rGE/strings.xml)1
-rw-r--r--common/res/values-kk/strings.xml (renamed from common/res/values-kk-rKZ/strings.xml)1
-rw-r--r--common/res/values-km/strings.xml (renamed from common/res/values-km-rKH/strings.xml)1
-rw-r--r--common/res/values-kn/strings.xml (renamed from common/res/values-kn-rIN/strings.xml)1
-rw-r--r--common/res/values-ko/strings.xml1
-rw-r--r--common/res/values-ky/strings.xml (renamed from common/res/values-ky-rKG/strings.xml)1
-rw-r--r--common/res/values-lo/strings.xml (renamed from common/res/values-lo-rLA/strings.xml)1
-rw-r--r--common/res/values-lt/strings.xml1
-rw-r--r--common/res/values-lv/strings.xml1
-rw-r--r--common/res/values-mk/strings.xml (renamed from common/res/values-mk-rMK/strings.xml)1
-rw-r--r--common/res/values-ml/strings.xml (renamed from common/res/values-ml-rIN/strings.xml)1
-rw-r--r--common/res/values-mn/strings.xml (renamed from common/res/values-mn-rMN/strings.xml)1
-rw-r--r--common/res/values-mr/strings.xml (renamed from common/res/values-mr-rIN/strings.xml)1
-rw-r--r--common/res/values-ms/strings.xml (renamed from common/res/values-ms-rMY/strings.xml)1
-rw-r--r--common/res/values-my/strings.xml (renamed from common/res/values-my-rMM/strings.xml)1
-rw-r--r--common/res/values-nb/strings.xml1
-rw-r--r--common/res/values-ne/strings.xml (renamed from common/res/values-ne-rNP/strings.xml)1
-rw-r--r--common/res/values-nl/strings.xml1
-rw-r--r--common/res/values-pl/strings.xml1
-rw-r--r--common/res/values-pt-rPT/strings.xml1
-rw-r--r--common/res/values-pt/strings.xml1
-rw-r--r--common/res/values-ro/strings.xml1
-rw-r--r--common/res/values-ru/strings.xml1
-rw-r--r--common/res/values-si/strings.xml (renamed from common/res/values-si-rLK/strings.xml)1
-rw-r--r--common/res/values-sk/strings.xml1
-rw-r--r--common/res/values-sl/strings.xml1
-rw-r--r--common/res/values-sr/strings.xml1
-rw-r--r--common/res/values-sv/strings.xml1
-rw-r--r--common/res/values-sw/strings.xml1
-rw-r--r--common/res/values-ta/strings.xml (renamed from common/res/values-ta-rIN/strings.xml)1
-rw-r--r--common/res/values-te/strings.xml (renamed from common/res/values-te-rIN/strings.xml)1
-rw-r--r--common/res/values-th/strings.xml1
-rw-r--r--common/res/values-tl/strings.xml1
-rw-r--r--common/res/values-tr/strings.xml1
-rw-r--r--common/res/values-uk/strings.xml1
-rw-r--r--common/res/values-ur/strings.xml (renamed from common/res/values-ur-rPK/strings.xml)1
-rw-r--r--common/res/values-uz/strings.xml (renamed from common/res/values-uz-rUZ/strings.xml)1
-rw-r--r--common/res/values-vi/strings.xml1
-rw-r--r--common/res/values-zh-rCN/strings.xml1
-rw-r--r--common/res/values-zh-rHK/strings.xml1
-rw-r--r--common/res/values-zh-rTW/strings.xml1
-rw-r--r--common/res/values-zu/strings.xml1
-rw-r--r--common/res/values/dimens.xml5
-rw-r--r--common/res/values/strings.xml1
-rw-r--r--common/res/values/styles.xml6
-rw-r--r--common/res/values/themes.xml1
-rw-r--r--common/src/com/android/tv/common/SharedPreferencesUtils.java1
-rw-r--r--common/src/com/android/tv/common/TvCommonUtils.java17
-rw-r--r--common/src/com/android/tv/common/TvContentRatingCache.java5
-rw-r--r--common/src/com/android/tv/common/feature/SharedPreferencesFeature.java1
-rw-r--r--common/src/com/android/tv/common/feature/TestableFeature.java15
-rw-r--r--common/src/com/android/tv/common/ui/setup/SetupMultiPaneFragment.java14
-rw-r--r--jni/Android.mk20
-rw-r--r--libs/exoplayer_v2.jarbin1077775 -> 0 bytes
-rw-r--r--libs/exoplayer_v2_ext_ffmpeg.jarbin7271 -> 0 bytes
-rw-r--r--proguard.flags3
-rw-r--r--proto/channel.proto2
-rw-r--r--res/animator/tuning_block_view_fade_out.xml25
-rw-r--r--res/drawable-xhdpi/dvr_default_poster.pngbin861 -> 766 bytes
-rw-r--r--res/drawable-xhdpi/dvr_default_program_art.pngbin0 -> 11562 bytes
-rw-r--r--res/drawable-xhdpi/ic_error_recording.pngbin0 -> 729 bytes
-rw-r--r--res/drawable-xhdpi/ic_fresh.pngbin0 -> 13892 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_input.pngbin0 -> 270 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout1.pngbin0 -> 175 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout2.pngbin0 -> 176 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout3.pngbin0 -> 176 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout4.pngbin0 -> 175 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout5.pngbin0 -> 178 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_size.pngbin0 -> 155 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_swap.pngbin0 -> 241 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_swap_audio.pngbin0 -> 479 bytes
-rw-r--r--res/drawable-xhdpi/ic_recorded_program.pngbin0 -> 612 bytes
-rw-r--r--res/drawable-xhdpi/ic_related_actor.pngbin0 -> 1275 bytes
-rw-r--r--res/drawable-xhdpi/ic_related_search.pngbin0 -> 2707 bytes
-rw-r--r--res/drawable-xhdpi/ic_setup_antenna.pngbin0 -> 1264 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvoption_pip.pngbin176 -> 192 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvoption_pip_off.pngbin0 -> 261 bytes
-rw-r--r--res/drawable-xhdpi/tv_3a_00.pngbin0 -> 106 bytes
-rw-r--r--res/drawable-xhdpi/tv_error.pngbin0 -> 2846 bytes
-rw-r--r--res/drawable-xhdpi/tv_usb_antenna.pngbin0 -> 21390 bytes
-rw-r--r--res/drawable/play_controls_time_indicator.xml2
-rw-r--r--res/drawable/playback_progress_bar.xml33
-rw-r--r--res/drawable/priority_settings_action_item_selected.xml12
-rw-r--r--res/drawable/setup_item_background.xml28
-rw-r--r--res/layout/activity_dvr_playback.xml6
-rw-r--r--res/layout/activity_tv.xml19
-rw-r--r--res/layout/dvr_main.xml2
-rw-r--r--res/layout/dvr_play.xml28
-rw-r--r--res/layout/dvr_recording_card_view.xml37
-rw-r--r--res/layout/dvr_schedules_item.xml12
-rw-r--r--res/layout/guided_action_editable.xml41
-rw-r--r--res/layout/input_banner.xml2
-rw-r--r--res/layout/list_item_dvr_history.xml59
-rw-r--r--res/layout/menu_card_action.xml57
-rw-r--r--res/layout/menu_card_app_link.xml7
-rw-r--r--res/layout/menu_card_channel.xml7
-rw-r--r--res/layout/menu_card_dvr.xml16
-rw-r--r--res/layout/menu_card_guide.xml16
-rw-r--r--res/layout/menu_card_setup.xml16
-rw-r--r--res/layout/menu_card_text.xml1
-rw-r--r--res/layout/play_controls_contents.xml218
-rw-r--r--res/layout/select_input_item.xml2
-rw-r--r--res/transition/dvr_details_shared_element_enter_transition.xml46
-rw-r--r--res/transition/dvr_details_shared_element_return_transition.xml45
-rw-r--r--res/values-af/strings.xml84
-rw-r--r--res/values-am/strings.xml84
-rw-r--r--res/values-ar/strings.xml104
-rw-r--r--res/values-az/arrays.xml (renamed from res/values-az-rAZ/arrays.xml)0
-rw-r--r--res/values-az/rating_system_strings.xml (renamed from res/values-az-rAZ/rating_system_strings.xml)0
-rw-r--r--res/values-az/strings.xml (renamed from res/values-az-rAZ/strings.xml)84
-rw-r--r--res/values-bg/strings.xml84
-rw-r--r--res/values-bn-v23/strings.xml (renamed from res/values-bn-rBD-v23/strings.xml)0
-rw-r--r--res/values-bn/arrays.xml (renamed from res/values-bn-rBD/arrays.xml)0
-rw-r--r--res/values-bn/rating_system_strings.xml (renamed from res/values-bn-rBD/rating_system_strings.xml)0
-rw-r--r--res/values-bn/strings.xml (renamed from res/values-bn-rBD/strings.xml)88
-rw-r--r--res/values-ca/strings.xml84
-rw-r--r--res/values-cs/strings.xml94
-rw-r--r--res/values-da/strings.xml84
-rw-r--r--res/values-de/strings.xml84
-rw-r--r--res/values-el/strings.xml84
-rw-r--r--res/values-en-rAU/strings.xml84
-rw-r--r--res/values-en-rGB/strings.xml84
-rw-r--r--res/values-en-rIN/strings.xml84
-rw-r--r--res/values-es-rUS/strings.xml84
-rw-r--r--res/values-es/strings.xml88
-rw-r--r--res/values-et-v23/strings.xml (renamed from res/values-et-rEE-v23/strings.xml)0
-rw-r--r--res/values-et/arrays.xml (renamed from res/values-et-rEE/arrays.xml)0
-rw-r--r--res/values-et/rating_system_strings.xml (renamed from res/values-et-rEE/rating_system_strings.xml)0
-rw-r--r--res/values-et/strings.xml (renamed from res/values-et-rEE/strings.xml)84
-rw-r--r--res/values-eu-v23/strings.xml (renamed from res/values-eu-rES-v23/strings.xml)0
-rw-r--r--res/values-eu/arrays.xml (renamed from res/values-eu-rES/arrays.xml)0
-rw-r--r--res/values-eu/rating_system_strings.xml (renamed from res/values-eu-rES/rating_system_strings.xml)0
-rw-r--r--res/values-eu/strings.xml (renamed from res/values-eu-rES/strings.xml)88
-rw-r--r--res/values-fa/strings.xml84
-rw-r--r--res/values-fi/strings.xml84
-rw-r--r--res/values-fr-rCA/strings.xml84
-rw-r--r--res/values-fr/strings.xml84
-rw-r--r--res/values-gl-v23/strings.xml (renamed from res/values-gl-rES-v23/strings.xml)0
-rw-r--r--res/values-gl/arrays.xml (renamed from res/values-gl-rES/arrays.xml)0
-rw-r--r--res/values-gl/rating_system_strings.xml (renamed from res/values-gl-rES/rating_system_strings.xml)0
-rw-r--r--res/values-gl/strings.xml (renamed from res/values-gl-rES/strings.xml)84
-rw-r--r--res/values-hi/strings.xml84
-rw-r--r--res/values-hr/strings.xml89
-rw-r--r--res/values-hu/strings.xml84
-rw-r--r--res/values-hy-v23/strings.xml (renamed from res/values-hy-rAM-v23/strings.xml)0
-rw-r--r--res/values-hy/arrays.xml (renamed from res/values-hy-rAM/arrays.xml)0
-rw-r--r--res/values-hy/rating_system_strings.xml (renamed from res/values-hy-rAM/rating_system_strings.xml)0
-rw-r--r--res/values-hy/strings.xml (renamed from res/values-hy-rAM/strings.xml)84
-rw-r--r--res/values-in/strings.xml84
-rw-r--r--res/values-is-v23/strings.xml (renamed from res/values-is-rIS-v23/strings.xml)0
-rw-r--r--res/values-is/arrays.xml (renamed from res/values-is-rIS/arrays.xml)0
-rw-r--r--res/values-is/rating_system_strings.xml (renamed from res/values-is-rIS/rating_system_strings.xml)0
-rw-r--r--res/values-is/strings.xml (renamed from res/values-is-rIS/strings.xml)84
-rw-r--r--res/values-it/strings.xml84
-rw-r--r--res/values-iw/strings.xml94
-rw-r--r--res/values-ja/strings.xml84
-rw-r--r--res/values-ka-v23/strings.xml (renamed from res/values-ka-rGE-v23/strings.xml)0
-rw-r--r--res/values-ka/arrays.xml (renamed from res/values-ka-rGE/arrays.xml)0
-rw-r--r--res/values-ka/rating_system_strings.xml (renamed from res/values-ka-rGE/rating_system_strings.xml)0
-rw-r--r--res/values-ka/strings.xml (renamed from res/values-ka-rGE/strings.xml)84
-rw-r--r--res/values-kk-v23/strings.xml (renamed from res/values-kk-rKZ-v23/strings.xml)0
-rw-r--r--res/values-kk/arrays.xml (renamed from res/values-kk-rKZ/arrays.xml)0
-rw-r--r--res/values-kk/rating_system_strings.xml (renamed from res/values-kk-rKZ/rating_system_strings.xml)0
-rw-r--r--res/values-kk/strings.xml (renamed from res/values-kk-rKZ/strings.xml)84
-rw-r--r--res/values-km-v23/strings.xml (renamed from res/values-km-rKH-v23/strings.xml)0
-rw-r--r--res/values-km/arrays.xml (renamed from res/values-km-rKH/arrays.xml)0
-rw-r--r--res/values-km/rating_system_strings.xml (renamed from res/values-km-rKH/rating_system_strings.xml)0
-rw-r--r--res/values-km/strings.xml (renamed from res/values-km-rKH/strings.xml)84
-rw-r--r--res/values-kn-v23/strings.xml (renamed from res/values-kn-rIN-v23/strings.xml)0
-rw-r--r--res/values-kn/arrays.xml (renamed from res/values-kn-rIN/arrays.xml)0
-rw-r--r--res/values-kn/rating_system_strings.xml (renamed from res/values-kn-rIN/rating_system_strings.xml)0
-rw-r--r--res/values-kn/strings.xml (renamed from res/values-kn-rIN/strings.xml)98
-rw-r--r--res/values-ko/strings.xml84
-rw-r--r--res/values-ky-v23/strings.xml (renamed from res/values-ky-rKG-v23/strings.xml)0
-rw-r--r--res/values-ky/arrays.xml (renamed from res/values-ky-rKG/arrays.xml)0
-rw-r--r--res/values-ky/rating_system_strings.xml (renamed from res/values-ky-rKG/rating_system_strings.xml)0
-rw-r--r--res/values-ky/strings.xml (renamed from res/values-ky-rKG/strings.xml)84
-rw-r--r--res/values-lo-v23/strings.xml (renamed from res/values-lo-rLA-v23/strings.xml)0
-rw-r--r--res/values-lo/arrays.xml (renamed from res/values-lo-rLA/arrays.xml)0
-rw-r--r--res/values-lo/rating_system_strings.xml (renamed from res/values-lo-rLA/rating_system_strings.xml)0
-rw-r--r--res/values-lo/strings.xml (renamed from res/values-lo-rLA/strings.xml)84
-rw-r--r--res/values-lt/strings.xml94
-rw-r--r--res/values-lv/strings.xml89
-rw-r--r--res/values-mk-v23/strings.xml (renamed from res/values-mk-rMK-v23/strings.xml)0
-rw-r--r--res/values-mk/arrays.xml (renamed from res/values-mk-rMK/arrays.xml)0
-rw-r--r--res/values-mk/rating_system_strings.xml (renamed from res/values-mk-rMK/rating_system_strings.xml)0
-rw-r--r--res/values-mk/strings.xml (renamed from res/values-mk-rMK/strings.xml)84
-rw-r--r--res/values-ml-v23/strings.xml (renamed from res/values-ml-rIN-v23/strings.xml)0
-rw-r--r--res/values-ml/arrays.xml (renamed from res/values-ml-rIN/arrays.xml)0
-rw-r--r--res/values-ml/rating_system_strings.xml (renamed from res/values-ml-rIN/rating_system_strings.xml)0
-rw-r--r--res/values-ml/strings.xml (renamed from res/values-ml-rIN/strings.xml)84
-rw-r--r--res/values-mn-v23/strings.xml (renamed from res/values-mn-rMN-v23/strings.xml)0
-rw-r--r--res/values-mn/arrays.xml (renamed from res/values-mn-rMN/arrays.xml)0
-rw-r--r--res/values-mn/rating_system_strings.xml (renamed from res/values-mn-rMN/rating_system_strings.xml)0
-rw-r--r--res/values-mn/strings.xml (renamed from res/values-mn-rMN/strings.xml)84
-rw-r--r--res/values-mr-v23/strings.xml (renamed from res/values-mr-rIN-v23/strings.xml)0
-rw-r--r--res/values-mr/arrays.xml (renamed from res/values-mr-rIN/arrays.xml)0
-rw-r--r--res/values-mr/rating_system_strings.xml (renamed from res/values-mr-rIN/rating_system_strings.xml)0
-rw-r--r--res/values-mr/strings.xml (renamed from res/values-mr-rIN/strings.xml)86
-rw-r--r--res/values-ms-v23/strings.xml (renamed from res/values-ms-rMY-v23/strings.xml)0
-rw-r--r--res/values-ms/arrays.xml (renamed from res/values-ms-rMY/arrays.xml)0
-rw-r--r--res/values-ms/rating_system_strings.xml (renamed from res/values-ms-rMY/rating_system_strings.xml)0
-rw-r--r--res/values-ms/strings.xml (renamed from res/values-ms-rMY/strings.xml)84
-rw-r--r--res/values-my-v23/strings.xml (renamed from res/values-my-rMM-v23/strings.xml)0
-rw-r--r--res/values-my/arrays.xml (renamed from res/values-my-rMM/arrays.xml)0
-rw-r--r--res/values-my/rating_system_strings.xml (renamed from res/values-my-rMM/rating_system_strings.xml)0
-rw-r--r--res/values-my/strings.xml (renamed from res/values-my-rMM/strings.xml)84
-rw-r--r--res/values-nb/strings.xml84
-rw-r--r--res/values-ne-v23/strings.xml (renamed from res/values-ne-rNP-v23/strings.xml)0
-rw-r--r--res/values-ne/arrays.xml (renamed from res/values-ne-rNP/arrays.xml)0
-rw-r--r--res/values-ne/rating_system_strings.xml (renamed from res/values-ne-rNP/rating_system_strings.xml)0
-rw-r--r--res/values-ne/strings.xml (renamed from res/values-ne-rNP/strings.xml)92
-rw-r--r--res/values-nl/strings.xml90
-rw-r--r--res/values-pl/strings.xml94
-rw-r--r--res/values-pt-rPT/strings.xml84
-rw-r--r--res/values-pt/strings.xml84
-rw-r--r--res/values-ro/strings.xml89
-rw-r--r--res/values-ru/strings.xml94
-rw-r--r--res/values-si-v23/strings.xml (renamed from res/values-si-rLK-v23/strings.xml)0
-rw-r--r--res/values-si/arrays.xml (renamed from res/values-si-rLK/arrays.xml)0
-rw-r--r--res/values-si/rating_system_strings.xml (renamed from res/values-si-rLK/rating_system_strings.xml)0
-rw-r--r--res/values-si/strings.xml (renamed from res/values-si-rLK/strings.xml)84
-rw-r--r--res/values-sk/strings.xml94
-rw-r--r--res/values-sl/strings.xml94
-rw-r--r--res/values-sr/strings.xml89
-rw-r--r--res/values-sv/strings.xml88
-rw-r--r--res/values-sw/strings.xml84
-rw-r--r--res/values-ta-v23/strings.xml (renamed from res/values-ta-rIN-v23/strings.xml)0
-rw-r--r--res/values-ta/arrays.xml (renamed from res/values-ta-rIN/arrays.xml)0
-rw-r--r--res/values-ta/rating_system_strings.xml (renamed from res/values-ta-rIN/rating_system_strings.xml)0
-rw-r--r--res/values-ta/strings.xml (renamed from res/values-ta-rIN/strings.xml)84
-rw-r--r--res/values-te-v23/strings.xml (renamed from res/values-te-rIN-v23/strings.xml)0
-rw-r--r--res/values-te/arrays.xml (renamed from res/values-te-rIN/arrays.xml)0
-rw-r--r--res/values-te/rating_system_strings.xml (renamed from res/values-te-rIN/rating_system_strings.xml)0
-rw-r--r--res/values-te/strings.xml (renamed from res/values-te-rIN/strings.xml)84
-rw-r--r--res/values-th/strings.xml84
-rw-r--r--res/values-tl/strings.xml84
-rw-r--r--res/values-tr/strings.xml84
-rw-r--r--res/values-uk/strings.xml94
-rw-r--r--res/values-ur-v23/strings.xml (renamed from res/values-ur-rPK-v23/strings.xml)0
-rw-r--r--res/values-ur/arrays.xml (renamed from res/values-ur-rPK/arrays.xml)0
-rw-r--r--res/values-ur/rating_system_strings.xml (renamed from res/values-ur-rPK/rating_system_strings.xml)0
-rw-r--r--res/values-ur/strings.xml (renamed from res/values-ur-rPK/strings.xml)84
-rw-r--r--res/values-uz-v23/strings.xml (renamed from res/values-uz-rUZ-v23/strings.xml)0
-rw-r--r--res/values-uz/arrays.xml (renamed from res/values-uz-rUZ/arrays.xml)0
-rw-r--r--res/values-uz/rating_system_strings.xml (renamed from res/values-uz-rUZ/rating_system_strings.xml)0
-rw-r--r--res/values-uz/strings.xml (renamed from res/values-uz-rUZ/strings.xml)86
-rw-r--r--res/values-v23/strings.xml21
-rw-r--r--res/values-vi/strings.xml84
-rw-r--r--res/values-zh-rCN/strings.xml84
-rw-r--r--res/values-zh-rHK/strings.xml84
-rw-r--r--res/values-zh-rTW/strings.xml84
-rw-r--r--res/values-zu/strings.xml84
-rw-r--r--res/values/attr.xml25
-rw-r--r--res/values/attrs.xml48
-rw-r--r--res/values/colors.xml1
-rw-r--r--res/values/dimens.xml48
-rwxr-xr-xres/values/google-services.xml8
-rw-r--r--res/values/integers.xml2
-rw-r--r--res/values/strings.xml222
-rw-r--r--res/values/styles.xml7
-rw-r--r--res/values/themes.xml2
-rw-r--r--src/com/android/tv/Features.java64
-rw-r--r--src/com/android/tv/InputSessionManager.java28
-rw-r--r--src/com/android/tv/MainActivity.java764
-rw-r--r--src/com/android/tv/SetupPassthroughActivity.java90
-rw-r--r--src/com/android/tv/TimeShiftManager.java9
-rw-r--r--src/com/android/tv/TvApplication.java19
-rw-r--r--src/com/android/tv/TvOptionsManager.java133
-rw-r--r--src/com/android/tv/analytics/DurationTimer.java (renamed from src/com/android/tv/util/DurationTimer.java)24
-rw-r--r--src/com/android/tv/data/Channel.java97
-rw-r--r--src/com/android/tv/data/ChannelDataManager.java42
-rw-r--r--src/com/android/tv/data/ChannelLogoFetcher.java307
-rw-r--r--src/com/android/tv/data/ChannelNumber.java71
-rw-r--r--src/com/android/tv/data/InternalDataUtils.java2
-rw-r--r--src/com/android/tv/data/StreamInfo.java4
-rw-r--r--src/com/android/tv/data/epg/EpgFetcher.java327
-rw-r--r--src/com/android/tv/data/epg/EpgReader.java29
-rw-r--r--src/com/android/tv/data/epg/StubEpgReader.java17
-rw-r--r--src/com/android/tv/dialog/DvrHistoryDialogFragment.java129
-rw-r--r--src/com/android/tv/dialog/FullscreenDialogFragment.java2
-rw-r--r--src/com/android/tv/dialog/SafeDismissDialogFragment.java26
-rw-r--r--src/com/android/tv/dialog/WebDialogFragment.java17
-rw-r--r--src/com/android/tv/dvr/BaseDvrDataManager.java41
-rw-r--r--src/com/android/tv/dvr/ConflictChecker.java (renamed from src/com/android/tv/dvr/recorder/ConflictChecker.java)5
-rw-r--r--src/com/android/tv/dvr/DvrDataManager.java12
-rw-r--r--src/com/android/tv/dvr/DvrDataManagerImpl.java143
-rw-r--r--src/com/android/tv/dvr/DvrDbSync.java (renamed from src/com/android/tv/dvr/provider/DvrDbSync.java)34
-rw-r--r--src/com/android/tv/dvr/DvrManager.java81
-rw-r--r--src/com/android/tv/dvr/DvrPlaybackActivity.java (renamed from src/com/android/tv/dvr/ui/playback/DvrPlaybackActivity.java)4
-rw-r--r--src/com/android/tv/dvr/DvrPlaybackMediaSessionHelper.java (renamed from src/com/android/tv/dvr/ui/playback/DvrPlaybackMediaSessionHelper.java)104
-rw-r--r--src/com/android/tv/dvr/DvrPlayer.java (renamed from src/com/android/tv/dvr/ui/playback/DvrPlayer.java)220
-rw-r--r--src/com/android/tv/dvr/DvrRecordingService.java (renamed from src/com/android/tv/dvr/recorder/DvrRecordingService.java)36
-rw-r--r--src/com/android/tv/dvr/DvrScheduleManager.java139
-rw-r--r--src/com/android/tv/dvr/DvrStartRecordingReceiver.java (renamed from src/com/android/tv/dvr/recorder/DvrStartRecordingReceiver.java)2
-rw-r--r--src/com/android/tv/dvr/DvrStorageStatusManager.java35
-rw-r--r--src/com/android/tv/dvr/DvrUiHelper.java (renamed from src/com/android/tv/dvr/ui/DvrUiHelper.java)311
-rw-r--r--src/com/android/tv/dvr/DvrWatchedPositionManager.java1
-rw-r--r--src/com/android/tv/dvr/EpisodicProgramLoadTask.java (renamed from src/com/android/tv/dvr/provider/EpisodicProgramLoadTask.java)73
-rw-r--r--src/com/android/tv/dvr/IdGenerator.java (renamed from src/com/android/tv/dvr/data/IdGenerator.java)2
-rw-r--r--src/com/android/tv/dvr/InputTaskScheduler.java (renamed from src/com/android/tv/dvr/recorder/InputTaskScheduler.java)6
-rw-r--r--src/com/android/tv/dvr/RecordedProgram.java (renamed from src/com/android/tv/dvr/data/RecordedProgram.java)2
-rw-r--r--src/com/android/tv/dvr/RecordingTask.java (renamed from src/com/android/tv/dvr/recorder/RecordingTask.java)23
-rw-r--r--src/com/android/tv/dvr/ScheduledProgramReaper.java (renamed from src/com/android/tv/dvr/recorder/ScheduledProgramReaper.java)5
-rw-r--r--src/com/android/tv/dvr/ScheduledRecording.java (renamed from src/com/android/tv/dvr/data/ScheduledRecording.java)17
-rw-r--r--src/com/android/tv/dvr/Scheduler.java (renamed from src/com/android/tv/dvr/recorder/Scheduler.java)6
-rw-r--r--src/com/android/tv/dvr/SeriesInfo.java (renamed from src/com/android/tv/dvr/data/SeriesInfo.java)2
-rw-r--r--src/com/android/tv/dvr/SeriesRecording.java (renamed from src/com/android/tv/dvr/data/SeriesRecording.java)3
-rw-r--r--src/com/android/tv/dvr/SeriesRecordingScheduler.java (renamed from src/com/android/tv/dvr/recorder/SeriesRecordingScheduler.java)81
-rw-r--r--src/com/android/tv/dvr/WritableDvrDataManager.java6
-rw-r--r--src/com/android/tv/dvr/data/SeasonEpisodeNumber.java72
-rw-r--r--src/com/android/tv/dvr/provider/AsyncDvrDbTask.java4
-rw-r--r--src/com/android/tv/dvr/provider/DvrDatabaseHelper.java4
-rw-r--r--src/com/android/tv/dvr/ui/ActionPresenterSelector.java (renamed from src/com/android/tv/dvr/ui/browse/ActionPresenterSelector.java)10
-rw-r--r--src/com/android/tv/dvr/ui/BigArguments.java54
-rw-r--r--src/com/android/tv/dvr/ui/ChangeImageTransformWithScaledParent.java79
-rw-r--r--src/com/android/tv/dvr/ui/CurrentRecordingDetailsFragment.java59
-rw-r--r--src/com/android/tv/dvr/ui/DetailsContent.java (renamed from src/com/android/tv/dvr/ui/browse/DetailsContent.java)4
-rw-r--r--src/com/android/tv/dvr/ui/DetailsContentPresenter.java (renamed from src/com/android/tv/dvr/ui/browse/DetailsContentPresenter.java)37
-rw-r--r--src/com/android/tv/dvr/ui/DetailsViewBackgroundHelper.java (renamed from src/com/android/tv/dvr/ui/browse/DetailsViewBackgroundHelper.java)4
-rw-r--r--src/com/android/tv/dvr/ui/DvrActivity.java (renamed from src/com/android/tv/dvr/ui/browse/DvrBrowseActivity.java)6
-rw-r--r--src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java4
-rw-r--r--src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java5
-rw-r--r--src/com/android/tv/dvr/ui/DvrBrowseFragment.java (renamed from src/com/android/tv/dvr/ui/browse/DvrBrowseFragment.java)159
-rw-r--r--src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java2
-rw-r--r--src/com/android/tv/dvr/ui/DvrConflictFragment.java7
-rw-r--r--src/com/android/tv/dvr/ui/DvrDetailsActivity.java (renamed from src/com/android/tv/dvr/ui/browse/DvrDetailsActivity.java)2
-rw-r--r--src/com/android/tv/dvr/ui/DvrDetailsFragment.java (renamed from src/com/android/tv/dvr/ui/browse/DvrDetailsFragment.java)6
-rw-r--r--src/com/android/tv/dvr/ui/DvrForgetStorageErrorFragment.java87
-rw-r--r--src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java50
-rw-r--r--src/com/android/tv/dvr/ui/DvrHalfSizedDialogFragment.java12
-rw-r--r--src/com/android/tv/dvr/ui/DvrInsufficientSpaceErrorFragment.java84
-rw-r--r--src/com/android/tv/dvr/ui/DvrItemPresenter.java (renamed from src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java)13
-rw-r--r--src/com/android/tv/dvr/ui/DvrMissingStorageErrorFragment.java50
-rw-r--r--src/com/android/tv/dvr/ui/DvrPlaybackCardPresenter.java (renamed from src/com/android/tv/dvr/ui/playback/DvrPlaybackCardPresenter.java)31
-rw-r--r--src/com/android/tv/dvr/ui/DvrPlaybackControlHelper.java (renamed from src/com/android/tv/dvr/ui/playback/DvrPlaybackControlHelper.java)106
-rw-r--r--src/com/android/tv/dvr/ui/DvrPlaybackOverlayFragment.java (renamed from src/com/android/tv/dvr/ui/playback/DvrPlaybackOverlayFragment.java)181
-rw-r--r--src/com/android/tv/dvr/ui/DvrScheduleFragment.java17
-rw-r--r--src/com/android/tv/dvr/ui/DvrSchedulesActivity.java (renamed from src/com/android/tv/dvr/ui/list/DvrSchedulesActivity.java)76
-rw-r--r--src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java5
-rw-r--r--src/com/android/tv/dvr/ui/DvrSeriesScheduledFragment.java45
-rw-r--r--src/com/android/tv/dvr/ui/DvrSeriesSettingsActivity.java20
-rw-r--r--src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java11
-rw-r--r--src/com/android/tv/dvr/ui/DvrStopSeriesRecordingFragment.java4
-rw-r--r--src/com/android/tv/dvr/ui/FadeBackground.java70
-rw-r--r--src/com/android/tv/dvr/ui/FullScheduleCardHolder.java (renamed from src/com/android/tv/dvr/ui/browse/FullScheduleCardHolder.java)2
-rw-r--r--src/com/android/tv/dvr/ui/FullSchedulesCardPresenter.java (renamed from src/com/android/tv/dvr/ui/browse/FullSchedulesCardPresenter.java)66
-rw-r--r--src/com/android/tv/dvr/ui/HalfSizedDialogFragment.java (renamed from src/com/android/tv/dialog/HalfSizedDialogFragment.java)24
-rw-r--r--src/com/android/tv/dvr/ui/PrioritySettingsFragment.java (renamed from src/com/android/tv/dvr/ui/DvrPrioritySettingsFragment.java)7
-rw-r--r--src/com/android/tv/dvr/ui/RecordedProgramDetailsFragment.java (renamed from src/com/android/tv/dvr/ui/browse/RecordedProgramDetailsFragment.java)6
-rw-r--r--src/com/android/tv/dvr/ui/RecordedProgramPresenter.java (renamed from src/com/android/tv/dvr/ui/browse/RecordedProgramPresenter.java)31
-rw-r--r--src/com/android/tv/dvr/ui/RecordingCardView.java (renamed from src/com/android/tv/dvr/ui/browse/RecordingCardView.java)113
-rw-r--r--src/com/android/tv/dvr/ui/RecordingDetailsFragment.java (renamed from src/com/android/tv/dvr/ui/browse/RecordingDetailsFragment.java)4
-rw-r--r--src/com/android/tv/dvr/ui/ScheduledRecordingDetailsFragment.java (renamed from src/com/android/tv/dvr/ui/browse/ScheduledRecordingDetailsFragment.java)4
-rw-r--r--src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java (renamed from src/com/android/tv/dvr/ui/browse/ScheduledRecordingPresenter.java)21
-rw-r--r--src/com/android/tv/dvr/ui/SeriesDeletionFragment.java (renamed from src/com/android/tv/dvr/ui/DvrSeriesDeletionFragment.java)11
-rw-r--r--src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java (renamed from src/com/android/tv/dvr/ui/browse/SeriesRecordingDetailsFragment.java)24
-rw-r--r--src/com/android/tv/dvr/ui/SeriesRecordingPresenter.java (renamed from src/com/android/tv/dvr/ui/browse/SeriesRecordingPresenter.java)11
-rw-r--r--src/com/android/tv/dvr/ui/SeriesSettingsFragment.java (renamed from src/com/android/tv/dvr/ui/DvrSeriesSettingsFragment.java)209
-rw-r--r--src/com/android/tv/dvr/ui/SortedArrayAdapter.java90
-rw-r--r--src/com/android/tv/dvr/ui/browse/CurrentRecordingDetailsFragment.java120
-rw-r--r--src/com/android/tv/dvr/ui/browse/DvrListRowPresenter.java34
-rw-r--r--src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java2
-rw-r--r--src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java5
-rw-r--r--src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java72
-rw-r--r--src/com/android/tv/dvr/ui/list/EpisodicProgramRow.java6
-rw-r--r--src/com/android/tv/dvr/ui/list/ScheduleRow.java4
-rw-r--r--src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java4
-rw-r--r--src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java50
-rw-r--r--src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java20
-rw-r--r--src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java26
-rw-r--r--src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java24
-rw-r--r--src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java17
-rw-r--r--src/com/android/tv/dvr/ui/playback/DvrPlaybackSideFragment.java154
-rw-r--r--src/com/android/tv/experiments/ExperimentFlag.java32
-rw-r--r--src/com/android/tv/experiments/Experiments.java9
-rw-r--r--src/com/android/tv/guide/ProgramGuide.java2
-rw-r--r--src/com/android/tv/guide/ProgramItemView.java21
-rw-r--r--src/com/android/tv/guide/ProgramManager.java20
-rw-r--r--src/com/android/tv/guide/ProgramTableAdapter.java68
-rw-r--r--src/com/android/tv/guide/TimeListAdapter.java27
-rw-r--r--src/com/android/tv/menu/ActionCardView.java6
-rw-r--r--src/com/android/tv/menu/AppLinkCardView.java198
-rw-r--r--src/com/android/tv/menu/BaseCardView.java50
-rw-r--r--src/com/android/tv/menu/ChannelCardView.java8
-rw-r--r--src/com/android/tv/menu/ChannelsRow.java10
-rw-r--r--src/com/android/tv/menu/ChannelsRowAdapter.java4
-rw-r--r--src/com/android/tv/menu/ItemListRowView.java14
-rw-r--r--src/com/android/tv/menu/Menu.java49
-rw-r--r--src/com/android/tv/menu/MenuAction.java69
-rw-r--r--src/com/android/tv/menu/MenuLayoutManager.java20
-rw-r--r--src/com/android/tv/menu/MenuRowFactory.java24
-rw-r--r--src/com/android/tv/menu/MenuUpdater.java41
-rw-r--r--src/com/android/tv/menu/OptionsRowAdapter.java50
-rw-r--r--src/com/android/tv/menu/PartnerOptionsRowAdapter.java3
-rw-r--r--src/com/android/tv/menu/PipOptionsRowAdapter.java137
-rw-r--r--src/com/android/tv/menu/PlayControlsButton.java24
-rw-r--r--src/com/android/tv/menu/PlayControlsRowView.java194
-rw-r--r--src/com/android/tv/menu/PlaybackProgressBar.java168
-rw-r--r--src/com/android/tv/menu/TvOptionsRowAdapter.java128
-rw-r--r--src/com/android/tv/onboarding/SetupSourcesFragment.java2
-rw-r--r--src/com/android/tv/receiver/BootCompletedReceiver.java2
-rw-r--r--src/com/android/tv/receiver/GlobalKeyReceiver.java40
-rw-r--r--src/com/android/tv/receiver/PackageIntentsReceiver.java6
-rw-r--r--src/com/android/tv/recommendation/NotificationService.java1
-rw-r--r--src/com/android/tv/search/DataManagerSearch.java4
-rw-r--r--src/com/android/tv/search/SearchInterface.java2
-rw-r--r--src/com/android/tv/search/TvProviderSearch.java14
-rw-r--r--src/com/android/tv/tuner/ChannelScanFileParser.java2
-rw-r--r--src/com/android/tv/tuner/TunerHal.java43
-rw-r--r--src/com/android/tv/tuner/TunerInputController.java195
-rw-r--r--src/com/android/tv/tuner/TunerPreferences.java97
-rw-r--r--src/com/android/tv/tuner/UsbTunerHal.java6
-rw-r--r--src/com/android/tv/tuner/cc/CaptionLayout.java2
-rw-r--r--src/com/android/tv/tuner/cc/CaptionTrackRenderer.java2
-rw-r--r--src/com/android/tv/tuner/cc/Cea708Parser.java5
-rw-r--r--src/com/android/tv/tuner/data/PsiData.java4
-rw-r--r--src/com/android/tv/tuner/data/PsipData.java6
-rw-r--r--src/com/android/tv/tuner/data/TunerChannel.java130
-rw-r--r--src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java378
-rw-r--r--src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java14
-rw-r--r--src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java62
-rw-r--r--src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java13
-rw-r--r--src/com/android/tv/tuner/exoplayer/ac3/Ac3PassthroughTrackRenderer.java (renamed from src/com/android/tv/tuner/exoplayer/ac3/Ac3DefaultTrackRenderer.java)114
-rw-r--r--src/com/android/tv/tuner/exoplayer/ac3/Ac3TrackRenderer.java (renamed from src/com/android/tv/tuner/exoplayer/ac3/Ac3MediaCodecTrackRenderer.java)21
-rw-r--r--src/com/android/tv/tuner/exoplayer/ac3/AudioTrackMonitor.java4
-rw-r--r--src/com/android/tv/tuner/exoplayer/ac3/AudioTrackWrapper.java20
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java280
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java209
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java23
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/SampleChunk.java23
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java115
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/SampleQueue.java1
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/SimpleSampleBuffer.java1
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java85
-rw-r--r--src/com/android/tv/tuner/setup/ConnectionTypeFragment.java18
-rw-r--r--src/com/android/tv/tuner/setup/PostalCodeFragment.java184
-rw-r--r--src/com/android/tv/tuner/setup/ScanFragment.java58
-rw-r--r--src/com/android/tv/tuner/setup/ScanResultFragment.java17
-rw-r--r--src/com/android/tv/tuner/setup/TunerSetupActivity.java238
-rw-r--r--src/com/android/tv/tuner/setup/WelcomeFragment.java38
-rw-r--r--src/com/android/tv/tuner/source/FileTsStreamer.java2
-rw-r--r--src/com/android/tv/tuner/source/TsDataSourceManager.java12
-rw-r--r--src/com/android/tv/tuner/source/TunerTsStreamer.java58
-rw-r--r--src/com/android/tv/tuner/source/TunerTsStreamerManager.java26
-rw-r--r--src/com/android/tv/tuner/ts/SectionParser.java20
-rw-r--r--src/com/android/tv/tuner/ts/TsParser.java18
-rw-r--r--src/com/android/tv/tuner/tvinput/ChannelDataManager.java54
-rw-r--r--src/com/android/tv/tuner/tvinput/EventDetector.java52
-rw-r--r--src/com/android/tv/tuner/tvinput/FileSourceEventDetector.java4
-rw-r--r--src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java116
-rw-r--r--src/com/android/tv/tuner/tvinput/TunerSession.java17
-rw-r--r--src/com/android/tv/tuner/tvinput/TunerSessionWorker.java300
-rw-r--r--src/com/android/tv/tuner/tvinput/TunerTvInputService.java30
-rw-r--r--src/com/android/tv/tuner/util/PostalCodeUtils.java89
-rw-r--r--src/com/android/tv/tuner/util/StringUtils.java (renamed from src/com/android/tv/util/StringUtils.java)2
-rw-r--r--src/com/android/tv/tuner/util/SystemPropertiesProxy.java16
-rw-r--r--src/com/android/tv/tuner/util/TunerInputInfoUtils.java46
-rw-r--r--src/com/android/tv/ui/AppLayerTvView.java10
-rw-r--r--src/com/android/tv/ui/ChannelBannerView.java137
-rw-r--r--src/com/android/tv/ui/KeypadChannelSwitchView.java2
-rw-r--r--src/com/android/tv/ui/SelectInputView.java73
-rw-r--r--src/com/android/tv/ui/TunableTvView.java336
-rw-r--r--src/com/android/tv/ui/TuningBlockView.java113
-rw-r--r--src/com/android/tv/ui/TvOverlayManager.java30
-rw-r--r--src/com/android/tv/ui/TvViewUiManager.java265
-rw-r--r--src/com/android/tv/ui/sidepanel/ClosedCaptionFragment.java9
-rw-r--r--src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java23
-rw-r--r--src/com/android/tv/ui/sidepanel/Item.java12
-rw-r--r--src/com/android/tv/ui/sidepanel/PipInputSelectorFragment.java170
-rw-r--r--src/com/android/tv/ui/sidepanel/SettingsFragment.java20
-rw-r--r--src/com/android/tv/ui/sidepanel/SideFragment.java47
-rw-r--r--src/com/android/tv/ui/sidepanel/SideFragmentManager.java2
-rw-r--r--src/com/android/tv/ui/sidepanel/SimpleItem.java (renamed from src/com/android/tv/ui/sidepanel/SimpleActionItem.java)6
-rw-r--r--src/com/android/tv/util/AsyncDbTask.java2
-rw-r--r--src/com/android/tv/util/Debug.java60
-rw-r--r--src/com/android/tv/util/LocationUtils.java24
-rw-r--r--src/com/android/tv/util/Partner.java181
-rw-r--r--src/com/android/tv/util/PipInputManager.java432
-rw-r--r--src/com/android/tv/util/RecurringRunner.java9
-rw-r--r--src/com/android/tv/util/SearchManagerHelper.java61
-rw-r--r--src/com/android/tv/util/SetupUtils.java20
-rw-r--r--src/com/android/tv/util/TvInputManagerHelper.java332
-rw-r--r--src/com/android/tv/util/TvSettings.java148
-rw-r--r--src/com/android/tv/util/TvTrackInfoUtils.java37
-rw-r--r--src/com/android/tv/util/Utils.java65
-rw-r--r--src/com/android/tv/util/ViewCache.java70
-rw-r--r--tests/common/src/com/android/tv/testing/dvr/RecordingTestUtils.java2
-rw-r--r--tests/func/src/com/android/tv/tests/ui/LiveChannelsTestCase.java2
-rw-r--r--tests/func/src/com/android/tv/tests/ui/PlayControlsRowViewTest.java54
-rw-r--r--tests/input/res/values/strings.xml1
-rw-r--r--tests/jank/src/com/android/tv/tests/jank/ProgramGuideJankTest.java13
-rw-r--r--tests/unit/src/com/android/tv/MainActivityTest.java1
-rw-r--r--tests/unit/src/com/android/tv/data/ChannelNumberTest.java12
-rw-r--r--tests/unit/src/com/android/tv/data/ChannelTest.java24
-rw-r--r--tests/unit/src/com/android/tv/data/ProgramTest.java2
-rw-r--r--tests/unit/src/com/android/tv/dvr/BaseDvrDataManagerTest.java1
-rw-r--r--tests/unit/src/com/android/tv/dvr/DvrDataManagerImplTest.java1
-rw-r--r--tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java7
-rw-r--r--tests/unit/src/com/android/tv/dvr/DvrDbSyncTest.java (renamed from tests/unit/src/com/android/tv/dvr/provider/DvrDbSyncTest.java)28
-rw-r--r--tests/unit/src/com/android/tv/dvr/DvrRecordingServiceTest.java (renamed from tests/unit/src/com/android/tv/dvr/recorder/DvrRecordingServiceTest.java)2
-rw-r--r--tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java122
-rw-r--r--tests/unit/src/com/android/tv/dvr/EpisodicProgramLoadTaskTest.java76
-rw-r--r--tests/unit/src/com/android/tv/dvr/InputTaskSchedulerTest.java (renamed from tests/unit/src/com/android/tv/dvr/recorder/InputTaskSchedulerTest.java)18
-rw-r--r--tests/unit/src/com/android/tv/dvr/RecordingTaskTest.java (renamed from tests/unit/src/com/android/tv/dvr/recorder/RecordingTaskTest.java)15
-rw-r--r--tests/unit/src/com/android/tv/dvr/ScheduledProgramReaperTest.java (renamed from tests/unit/src/com/android/tv/dvr/recorder/ScheduledProgramReaperTest.java)18
-rw-r--r--tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java1
-rw-r--r--tests/unit/src/com/android/tv/dvr/SchedulerTest.java (renamed from tests/unit/src/com/android/tv/dvr/recorder/SchedulerTest.java)9
-rw-r--r--tests/unit/src/com/android/tv/dvr/SeriesRecordingSchedulerTest.java (renamed from tests/unit/src/com/android/tv/dvr/recorder/SeriesRecordingSchedulerTest.java)4
-rw-r--r--tests/unit/src/com/android/tv/dvr/SeriesRecordingTest.java (renamed from tests/unit/src/com/android/tv/dvr/data/SeriesRecordingTest.java)2
-rw-r--r--tests/unit/src/com/android/tv/dvr/provider/EpisodicProgramLoadTaskTest.java76
-rw-r--r--tests/unit/src/com/android/tv/dvr/ui/SortedArrayAdapterTest.java47
-rw-r--r--tests/unit/src/com/android/tv/experiments/ExperimentsTest.java50
-rw-r--r--usbtuner-res/animator/setup_before_entry.xml32
-rw-r--r--usbtuner-res/animator/setup_before_exit.xml34
-rw-r--r--usbtuner-res/animator/setup_entry.xml35
-rw-r--r--usbtuner-res/animator/setup_exit.xml35
-rw-r--r--usbtuner-res/drawable-xhdpi/ic_setup_antenna.pngbin0 -> 1264 bytes
-rw-r--r--usbtuner-res/drawable/ut_selector_background.xml28
-rw-r--r--usbtuner-res/layout/ut_activity_playback.xml (renamed from res/layout/tuning_block.xml)23
-rw-r--r--usbtuner-res/layout/ut_guidance.xml48
-rw-r--r--usbtuner-res/layout/ut_guidedactions.xml41
-rw-r--r--usbtuner-res/values-af/strings.xml17
-rw-r--r--usbtuner-res/values-am/strings.xml17
-rw-r--r--usbtuner-res/values-ar/strings.xml17
-rw-r--r--usbtuner-res/values-az/strings.xml (renamed from usbtuner-res/values-az-rAZ/strings.xml)17
-rw-r--r--usbtuner-res/values-bg/strings.xml17
-rw-r--r--usbtuner-res/values-bn/strings.xml (renamed from usbtuner-res/values-bn-rBD/strings.xml)21
-rw-r--r--usbtuner-res/values-ca/strings.xml17
-rw-r--r--usbtuner-res/values-cs/strings.xml17
-rw-r--r--usbtuner-res/values-da/strings.xml17
-rw-r--r--usbtuner-res/values-de/strings.xml17
-rw-r--r--usbtuner-res/values-el/strings.xml17
-rw-r--r--usbtuner-res/values-en-rAU/strings.xml17
-rw-r--r--usbtuner-res/values-en-rGB/strings.xml17
-rw-r--r--usbtuner-res/values-en-rIN/strings.xml17
-rw-r--r--usbtuner-res/values-es-rUS/strings.xml17
-rw-r--r--usbtuner-res/values-es/strings.xml17
-rw-r--r--usbtuner-res/values-et/strings.xml (renamed from usbtuner-res/values-et-rEE/strings.xml)17
-rw-r--r--usbtuner-res/values-eu/strings.xml (renamed from usbtuner-res/values-eu-rES/strings.xml)17
-rw-r--r--usbtuner-res/values-fa/strings.xml17
-rw-r--r--usbtuner-res/values-fi/strings.xml17
-rw-r--r--usbtuner-res/values-fr-rCA/strings.xml17
-rw-r--r--usbtuner-res/values-fr/strings.xml17
-rw-r--r--usbtuner-res/values-gl/strings.xml (renamed from usbtuner-res/values-gl-rES/strings.xml)17
-rw-r--r--usbtuner-res/values-hi/strings.xml19
-rw-r--r--usbtuner-res/values-hr/strings.xml17
-rw-r--r--usbtuner-res/values-hu/strings.xml17
-rw-r--r--usbtuner-res/values-hy/strings.xml (renamed from usbtuner-res/values-hy-rAM/strings.xml)17
-rw-r--r--usbtuner-res/values-in/strings.xml17
-rw-r--r--usbtuner-res/values-is/strings.xml (renamed from usbtuner-res/values-is-rIS/strings.xml)17
-rw-r--r--usbtuner-res/values-it/strings.xml17
-rw-r--r--usbtuner-res/values-iw/strings.xml17
-rw-r--r--usbtuner-res/values-ja/strings.xml17
-rw-r--r--usbtuner-res/values-ka/strings.xml (renamed from usbtuner-res/values-ka-rGE/strings.xml)17
-rw-r--r--usbtuner-res/values-kk/strings.xml (renamed from usbtuner-res/values-kk-rKZ/strings.xml)19
-rw-r--r--usbtuner-res/values-km/strings.xml (renamed from usbtuner-res/values-km-rKH/strings.xml)17
-rw-r--r--usbtuner-res/values-kn/strings.xml (renamed from usbtuner-res/values-kn-rIN/strings.xml)17
-rw-r--r--usbtuner-res/values-ko/strings.xml19
-rw-r--r--usbtuner-res/values-ky/strings.xml (renamed from usbtuner-res/values-ky-rKG/strings.xml)17
-rw-r--r--usbtuner-res/values-lo/strings.xml (renamed from usbtuner-res/values-lo-rLA/strings.xml)17
-rw-r--r--usbtuner-res/values-lt/strings.xml17
-rw-r--r--usbtuner-res/values-lv/strings.xml17
-rw-r--r--usbtuner-res/values-mk/strings.xml (renamed from usbtuner-res/values-mk-rMK/strings.xml)17
-rw-r--r--usbtuner-res/values-ml/strings.xml (renamed from usbtuner-res/values-ml-rIN/strings.xml)17
-rw-r--r--usbtuner-res/values-mn/strings.xml (renamed from usbtuner-res/values-mn-rMN/strings.xml)17
-rw-r--r--usbtuner-res/values-mr/strings.xml (renamed from usbtuner-res/values-mr-rIN/strings.xml)17
-rw-r--r--usbtuner-res/values-ms/strings.xml (renamed from usbtuner-res/values-ms-rMY/strings.xml)17
-rw-r--r--usbtuner-res/values-my/strings.xml (renamed from usbtuner-res/values-my-rMM/strings.xml)17
-rw-r--r--usbtuner-res/values-nb/strings.xml17
-rw-r--r--usbtuner-res/values-ne/strings.xml (renamed from usbtuner-res/values-ne-rNP/strings.xml)19
-rw-r--r--usbtuner-res/values-nl/strings.xml17
-rw-r--r--usbtuner-res/values-pl/strings.xml17
-rw-r--r--usbtuner-res/values-pt-rPT/strings.xml17
-rw-r--r--usbtuner-res/values-pt/strings.xml17
-rw-r--r--usbtuner-res/values-ro/strings.xml17
-rw-r--r--usbtuner-res/values-ru/strings.xml17
-rw-r--r--usbtuner-res/values-si/strings.xml (renamed from usbtuner-res/values-si-rLK/strings.xml)17
-rw-r--r--usbtuner-res/values-sk/strings.xml17
-rw-r--r--usbtuner-res/values-sl/strings.xml17
-rw-r--r--usbtuner-res/values-sr/strings.xml17
-rw-r--r--usbtuner-res/values-sv/strings.xml17
-rw-r--r--usbtuner-res/values-sw/strings.xml17
-rw-r--r--usbtuner-res/values-ta/strings.xml (renamed from usbtuner-res/values-ta-rIN/strings.xml)17
-rw-r--r--usbtuner-res/values-te/strings.xml (renamed from usbtuner-res/values-te-rIN/strings.xml)17
-rw-r--r--usbtuner-res/values-th/strings.xml17
-rw-r--r--usbtuner-res/values-tl/strings.xml17
-rw-r--r--usbtuner-res/values-tr/strings.xml17
-rw-r--r--usbtuner-res/values-uk/strings.xml17
-rw-r--r--usbtuner-res/values-ur/strings.xml (renamed from usbtuner-res/values-ur-rPK/strings.xml)17
-rw-r--r--usbtuner-res/values-uz/strings.xml (renamed from usbtuner-res/values-uz-rUZ/strings.xml)17
-rw-r--r--usbtuner-res/values-vi/strings.xml17
-rw-r--r--usbtuner-res/values-zh-rCN/strings.xml17
-rw-r--r--usbtuner-res/values-zh-rHK/strings.xml17
-rw-r--r--usbtuner-res/values-zh-rTW/strings.xml17
-rw-r--r--usbtuner-res/values-zu/strings.xml17
-rw-r--r--usbtuner-res/values/colors.xml6
-rw-r--r--usbtuner-res/values/dimens.xml34
-rw-r--r--usbtuner-res/values/integers.xml5
-rw-r--r--usbtuner-res/values/strings.xml53
-rw-r--r--usbtuner-res/values/styles.xml120
-rw-r--r--version.mk4
639 files changed, 10088 insertions, 14556 deletions
diff --git a/Android.mk b/Android.mk
index 5884c5c3..5a5479b6 100644
--- a/Android.mk
+++ b/Android.mk
@@ -56,10 +56,9 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-v17-leanback \
icu4j-usbtuner \
lib-exoplayer \
- lib-exoplayer-v2 \
- lib-exoplayer-v2-ext-ffmpeg \
tv-common \
-
+ legacy-android-test \
+ junit
LOCAL_JAVACFLAGS := -Xlint:deprecation -Xlint:unchecked
@@ -97,18 +96,16 @@ LOCAL_SDK_VERSION := system_current
include $(BUILD_STATIC_JAVA_LIBRARY)
-
#############################################################
# Pre-built dependency jars
#############################################################
+
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
lib-exoplayer:libs/exoplayer.jar \
- lib-exoplayer-v2:libs/exoplayer_v2.jar \
- lib-exoplayer-v2-ext-ffmpeg:libs/exoplayer_v2_ext_ffmpeg.jar \
include $(BUILD_MULTI_PREBUILT)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b74fdd4d..1faa2ae3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -113,17 +113,17 @@
android:launchMode="singleTop"
android:theme="@style/Theme.Setup.GuidedStep" />
- <activity android:name=".dvr.ui.browse.DvrBrowseActivity"
+ <activity android:name=".dvr.ui.DvrActivity"
android:configChanges="keyboard|keyboardHidden"
android:launchMode="singleTask"
android:theme="@style/Theme.Leanback.Browse" />
- <activity android:name=".dvr.ui.playback.DvrPlaybackActivity"
+ <activity android:name=".dvr.DvrPlaybackActivity"
android:configChanges="keyboard|keyboardHidden|screenSize|smallestScreenSize|screenLayout|orientation"
android:launchMode="singleTask"
android:theme="@style/Theme.Leanback" />
- <activity android:name=".dvr.ui.browse.DvrDetailsActivity"
+ <activity android:name=".dvr.ui.DvrDetailsActivity"
android:configChanges="keyboard|keyboardHidden"
android:theme="@style/Theme.TV.Dvr.Browse.Details" />
@@ -138,7 +138,7 @@
<activity android:name=".dvr.ui.DvrSeriesScheduledDialogActivity"
android:theme="@style/Theme.TV.dialog.HalfSizedDialog"/>
- <activity android:name=".dvr.ui.list.DvrSchedulesActivity"
+ <activity android:name=".dvr.ui.DvrSchedulesActivity"
android:configChanges="keyboard|keyboardHidden"
android:theme="@style/Theme.Leanback.Details" />
@@ -229,14 +229,12 @@
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
<action android:name="com.android.tv.action.APPLICATION_FIRST_LAUNCHED" />
- <action android:name="com.android.tv.action.NETWORK_TUNER_ATTACHED" />
- <action android:name="com.android.tv.action.NETWORK_TUNER_DETACHED" />
</intent-filter>
</receiver>
<!-- DVR -->
- <service android:name=".dvr.recorder.DvrRecordingService" android:label="@string/dvr_service_name"/>
- <receiver android:name=".dvr.recorder.DvrStartRecordingReceiver"/>
+ <service android:name=".dvr.DvrRecordingService" android:label="@string/dvr_service_name"/>
+ <receiver android:name=".dvr.DvrStartRecordingReceiver"/>
<service android:name=".tuner.tvinput.TunerStorageCleanUpService"
android:permission="android.permission.BIND_JOB_SERVICE"
diff --git a/assets/licenses.html b/assets/licenses.html
index 1142976f..000aacf6 100644
--- a/assets/licenses.html
+++ b/assets/licenses.html
@@ -293,1022 +293,6 @@ this Software without prior written authorization of the copyright holder.
See the License for the specific language governing permissions and
limitations under the License.
</pre>
-<h3>Notices for files:</h3>
-<ul>
- <li>libhdhomerun</li>
-</ul>
-<pre> GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-(This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.)
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- {description}
- Copyright (C) {year} {fullname}
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
- USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random
- Hacker.
-
- {signature of Ty Coon}, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-</pre>
-<h3>Notices for files:</h3>
-<ul>
- <li>FFmpeg</li>
-</ul>
-<pre> GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-</pre>
<!-- END USB Tuner licenses -->
-</body></html>
+</body></html> \ No newline at end of file
diff --git a/common/res/drawable/setup_selector_background.xml b/common/res/drawable/setup_selector_background.xml
index b73c5813..7351270b 100644
--- a/common/res/drawable/setup_selector_background.xml
+++ b/common/res/drawable/setup_selector_background.xml
@@ -17,7 +17,8 @@
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorControlHighlight">
- <item android:id="@android:id/mask">
+ <!-- Note that android:start and android:end is not supported in L platform. -->
+ <item android:id="@android:id/mask" android:left="24dp" android:right="24dp">
<shape>
<solid android:color="@android:color/white"/>
<corners android:radius="2dp" />
diff --git a/common/res/layout/fragment_setup_multi_pane.xml b/common/res/layout/fragment_setup_multi_pane.xml
index e3ff8d83..45aff132 100644
--- a/common/res/layout/fragment_setup_multi_pane.xml
+++ b/common/res/layout/fragment_setup_multi_pane.xml
@@ -40,13 +40,11 @@
android:clipChildren="false"
android:clipToPadding="false" />
<!-- TODO: Use button action list in GuidedStepFragment -->
- <LinearLayout
+ <FrameLayout
android:id="@+id/done_button_container"
android:layout_width="@dimen/setup_done_button_container_width"
android:layout_height="match_parent"
android:layout_gravity="end"
- android:orientation="vertical"
- android:paddingTop="190dp"
style="?attr/doneButtonContainerStyle"
android:transitionGroup="true"
android:transitionName="buttonDoneTransition">
@@ -56,6 +54,7 @@
android:layout_height="45dp"
android:layout_marginStart="24dp"
android:layout_marginEnd="40dp"
+ android:layout_marginTop="190dp"
android:elevation="0dp"
android:focusable="true"
android:fontFamily="sans-serif-condensed"
@@ -66,23 +65,5 @@
android:text="@string/action_text_done"
android:textColor="#EEEEEE"
android:textSize="14sp" />
- <TextView
- android:id="@+id/button_skip"
- android:layout_width="match_parent"
- android:layout_height="45dp"
- android:layout_marginStart="24dp"
- android:layout_marginEnd="40dp"
- android:layout_marginTop="8dp"
- android:elevation="0dp"
- android:focusable="true"
- android:fontFamily="sans-serif-condensed"
- android:paddingEnd="12dp"
- android:paddingStart="12dp"
- android:background="@drawable/setup_action_button_done"
- android:gravity="center_vertical|start"
- android:visibility="gone"
- android:text="@string/action_text_skip"
- android:textColor="#EEEEEE"
- android:textSize="14sp" />
- </LinearLayout>
+ </FrameLayout>
</FrameLayout>
diff --git a/common/res/values-af/strings.xml b/common/res/values-af/strings.xml
index 4320af5c..7a114849 100644
--- a/common/res/values-af/strings.xml
+++ b/common/res/values-af/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Klaar"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Slaan oor"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S.<xliff:g id="SEASON_NUMBER">%1$s</xliff:g> Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S.<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-am/strings.xml b/common/res/values-am/strings.xml
index 9a2ae701..45a1b7cb 100644
--- a/common/res/values-am/strings.xml
+++ b/common/res/values-am/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"ተከናውኗል"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"ዝለል"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"ም<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>፦ ክ.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"ክ.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"ም<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>፦ ክፍል <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ar/strings.xml b/common/res/values-ar/strings.xml
index 816af76b..bedd137b 100644
--- a/common/res/values-ar/strings.xml
+++ b/common/res/values-ar/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"تم"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"تخطٍ"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"الموسم <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: الحلقة <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"الحلقة <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"الموسم <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: الحلقة <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-az-rAZ/strings.xml b/common/res/values-az/strings.xml
index 47cdb9e8..c844cd60 100644
--- a/common/res/values-az-rAZ/strings.xml
+++ b/common/res/values-az/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Hazırdır"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Keçin"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Epizod<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-bg/strings.xml b/common/res/values-bg/strings.xml
index 6a709576..264a1118 100644
--- a/common/res/values-bg/strings.xml
+++ b/common/res/values-bg/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Готово"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Пропускане"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Сезон <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: епизод <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Епизод <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Сезон <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Еп. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> – „<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>“"</string>
diff --git a/common/res/values-bn-rBD/strings.xml b/common/res/values-bn/strings.xml
index a4ae1b00..836a62a5 100644
--- a/common/res/values-bn-rBD/strings.xml
+++ b/common/res/values-bn/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"সম্পন্ন"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"এড়িয়ে যান"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"সিজন <xliff:g id="SEASON_NUMBER">%1$s</xliff:g> , পর্ব <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"পর্ব<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"সিঃ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: এপিঃ <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ca/strings.xml b/common/res/values-ca/strings.xml
index 42b2899f..6382648e 100644
--- a/common/res/values-ca/strings.xml
+++ b/common/res/values-ca/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Fet"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Omet"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, episodi <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Episodi <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, episodi <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-cs/strings.xml b/common/res/values-cs/strings.xml
index 6cae0a06..0be8026c 100644
--- a/common/res/values-cs/strings.xml
+++ b/common/res/values-cs/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Hotovo"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Přeskočit"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>E<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"E<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> – <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-da/strings.xml b/common/res/values-da/strings.xml
index b5cab122..4685b818 100644
--- a/common/res/values-da/strings.xml
+++ b/common/res/values-da/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Udført"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Spring over"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, afsn. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Afsn. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Afsnit <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>, <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-de/strings.xml b/common/res/values-de/strings.xml
index 30edbbd9..a487ff8a 100644
--- a/common/res/values-de/strings.xml
+++ b/common/res/values-de/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Fertig"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Überspringen"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: F<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Folge <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Staffel <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Folge <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>, <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-el/strings.xml b/common/res/values-el/strings.xml
index fda2792e..dba894cb 100644
--- a/common/res/values-el/strings.xml
+++ b/common/res/values-el/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Τέλος"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Παράβλεψη"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Σεζ. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Επ.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Επ.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Σεζ.<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Επ. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-en-rAU/strings.xml b/common/res/values-en-rAU/strings.xml
index caff8bd7..0ea27edc 100644
--- a/common/res/values-en-rAU/strings.xml
+++ b/common/res/values-en-rAU/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Finished"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Skip"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-en-rGB/strings.xml b/common/res/values-en-rGB/strings.xml
index caff8bd7..0ea27edc 100644
--- a/common/res/values-en-rGB/strings.xml
+++ b/common/res/values-en-rGB/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Finished"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Skip"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-en-rIN/strings.xml b/common/res/values-en-rIN/strings.xml
index caff8bd7..0ea27edc 100644
--- a/common/res/values-en-rIN/strings.xml
+++ b/common/res/values-en-rIN/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Finished"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Skip"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-es-rUS/strings.xml b/common/res/values-es-rUS/strings.xml
index d9b3d403..87c881b8 100644
--- a/common/res/values-es-rUS/strings.xml
+++ b/common/res/values-es-rUS/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Listo"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Omitir"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: episodio <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Episodio <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, episodio <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-es/strings.xml b/common/res/values-es/strings.xml
index 9f1cae91..32536d93 100644
--- a/common/res/values-es/strings.xml
+++ b/common/res/values-es/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Listo"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Saltar"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: episodio <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Episodio <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: episodio <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-et-rEE/strings.xml b/common/res/values-et/strings.xml
index 974a8a86..9052178a 100644
--- a/common/res/values-et-rEE/strings.xml
+++ b/common/res/values-et/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Valmis"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Jäta vahele"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. hooaeg: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. jagu"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. jagu"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. hooaeg: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. jagu – <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-eu-rES/strings.xml b/common/res/values-eu/strings.xml
index 3d4e1618..d7ab52a8 100644
--- a/common/res/values-eu-rES/strings.xml
+++ b/common/res/values-eu/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Eginda"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Saltatu"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. denboraldiko <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. atala"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. atala"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. denboraldiko <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. atala: <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-fa/strings.xml b/common/res/values-fa/strings.xml
index dfa221f9..67e9c4e6 100644
--- a/common/res/values-fa/strings.xml
+++ b/common/res/values-fa/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"تمام"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"رد شدن"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"فصل<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: قسمت<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"اپیزود <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"ف.<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ق. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-fi/strings.xml b/common/res/values-fi/strings.xml
index f498a8e4..8c6b99bf 100644
--- a/common/res/values-fi/strings.xml
+++ b/common/res/values-fi/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Valmis"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Ohita"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Kausi <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, jakso <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Jakso <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Kausi <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, jakso <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-fr-rCA/strings.xml b/common/res/values-fr-rCA/strings.xml
index cc5eb003..ed5678e2 100644
--- a/common/res/values-fr-rCA/strings.xml
+++ b/common/res/values-fr-rCA/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Terminé"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Ignorer"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Saison <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, ép. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ép. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Saison <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, épisode <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>, « <xliff:g id="EPISODE_TITLE">%3$s</xliff:g> »"</string>
diff --git a/common/res/values-fr/strings.xml b/common/res/values-fr/strings.xml
index 4c965508..b5b28104 100644
--- a/common/res/values-fr/strings.xml
+++ b/common/res/values-fr/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"OK"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Passer"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Saison <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, épisode <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Épisode <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, ép. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> : <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-gl-rES/strings.xml b/common/res/values-gl/strings.xml
index 4efcc838..356ac562 100644
--- a/common/res/values-gl-rES/strings.xml
+++ b/common/res/values-gl/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Feito"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Omitir"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"T <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"T<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-hi/strings.xml b/common/res/values-hi/strings.xml
index 71e273c9..27cae84d 100644
--- a/common/res/values-hi/strings.xml
+++ b/common/res/values-hi/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"हो गया"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"अभी नहीं"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"सीज़न<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: एपिसोड<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"एपिसोड <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"सीज़न<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: एपिसोड <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-hr/strings.xml b/common/res/values-hr/strings.xml
index 8239b247..66127784 100644
--- a/common/res/values-hr/strings.xml
+++ b/common/res/values-hr/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Gotovo"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Preskoči"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-hu/strings.xml b/common/res/values-hu/strings.xml
index 778d9fa2..138ad857 100644
--- a/common/res/values-hu/strings.xml
+++ b/common/res/values-hu/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Kész"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Kihagyás"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. évad, <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. rész"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. rész"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. évad, <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. rész: <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-hy-rAM/strings.xml b/common/res/values-hy/strings.xml
index 2af99e03..aaa7470f 100644
--- a/common/res/values-hy-rAM/strings.xml
+++ b/common/res/values-hy/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Պատրաստ է"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Բաց թողնել"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Ե <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>՝ դրվ. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Դրվ. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Ե<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>՝ դրվ. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-in/strings.xml b/common/res/values-in/strings.xml
index ae16a0e5..da4b8203 100644
--- a/common/res/values-in/strings.xml
+++ b/common/res/values-in/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Selesai"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Lewati"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-is-rIS/strings.xml b/common/res/values-is/strings.xml
index 9f402529..47529403 100644
--- a/common/res/values-is-rIS/strings.xml
+++ b/common/res/values-is/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Lokið"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Sleppa"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S.<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Þ.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. þáttur"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S.<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Þ. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-it/strings.xml b/common/res/values-it/strings.xml
index ce6543dd..f61e02f7 100644
--- a/common/res/values-it/strings.xml
+++ b/common/res/values-it/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Fine"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Ignora"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Stagione <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, puntata <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Stag. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: punt. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-iw/strings.xml b/common/res/values-iw/strings.xml
index b4b3b191..7ad220ad 100644
--- a/common/res/values-iw/strings.xml
+++ b/common/res/values-iw/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"סיום"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"דלג"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"עונה <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: פרק <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"פרק <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"עונה<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: פרק <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ja/strings.xml b/common/res/values-ja/strings.xml
index 82853c92..682fd0d8 100644
--- a/common/res/values-ja/strings.xml
+++ b/common/res/values-ja/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"完了"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"スキップ"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"シーズン <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: エピソード <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"エピソード <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"シーズン <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: エピソード <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>「<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>」"</string>
diff --git a/common/res/values-ka-rGE/strings.xml b/common/res/values-ka/strings.xml
index 03db3fa9..3c7062ff 100644
--- a/common/res/values-ka-rGE/strings.xml
+++ b/common/res/values-ka/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"მზადაა"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"გამოტოვება"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"სეზ. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ეპ. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"ეპ. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"სეზ. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, ეპ. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> — <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-kk-rKZ/strings.xml b/common/res/values-kk/strings.xml
index bfb4ef19..12de7d34 100644
--- a/common/res/values-kk-rKZ/strings.xml
+++ b/common/res/values-kk/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Орындалды"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Өткізіп жіберу"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>-маусым, <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>-серия"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>-серия"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>-маусым: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>-серия, \"<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>\""</string>
diff --git a/common/res/values-km-rKH/strings.xml b/common/res/values-km/strings.xml
index c084ef39..b8353897 100644
--- a/common/res/values-km-rKH/strings.xml
+++ b/common/res/values-km/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"រួចរាល់"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"រំលង"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"រដូវកាល<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>៖ ភាគ<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"ភាគ៖ <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"រដូវកាលទី <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>៖ វគ្គ <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-kn-rIN/strings.xml b/common/res/values-kn/strings.xml
index 1b414300..7cb096b7 100644
--- a/common/res/values-kn-rIN/strings.xml
+++ b/common/res/values-kn/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"ಮುಗಿದಿದೆ"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"ಸ್ಕಿಪ್‌ ಮಾಡಿ"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"ಕಾಲ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>ಭಾಗ<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"ಭಾಗ<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"ಸೀ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ಸಂ. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ko/strings.xml b/common/res/values-ko/strings.xml
index af5286ff..923831f3 100644
--- a/common/res/values-ko/strings.xml
+++ b/common/res/values-ko/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"완료"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"건너뛰기"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"시즌 <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: 에피소드 <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"에피소드 <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"시즌 <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: 에피소드 <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> \'<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>\'"</string>
diff --git a/common/res/values-ky-rKG/strings.xml b/common/res/values-ky/strings.xml
index 8be45528..8bdfadde 100644
--- a/common/res/values-ky-rKG/strings.xml
+++ b/common/res/values-ky/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Бүттү"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Өткөрүп жиберүү"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>-мезгил: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>-серия"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>-серия"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"С<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%3$s</xliff:g> <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>-серия"</string>
diff --git a/common/res/values-lo-rLA/strings.xml b/common/res/values-lo/strings.xml
index b6badeb0..a6dad515 100644
--- a/common/res/values-lo-rLA/strings.xml
+++ b/common/res/values-lo/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"ສຳເລັດແລ້ວ"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"ຂ້າມ"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-lt/strings.xml b/common/res/values-lt/strings.xml
index 434a7a6e..6d6c0ee8 100644
--- a/common/res/values-lt/strings.xml
+++ b/common/res/values-lt/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Atlikta"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Praleisti"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g> sezonas: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> serija"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> serija"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g> sezonas: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> serija „<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>“"</string>
diff --git a/common/res/values-lv/strings.xml b/common/res/values-lv/strings.xml
index e6466138..f0366a48 100644
--- a/common/res/values-lv/strings.xml
+++ b/common/res/values-lv/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Gatavs"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Izlaist"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. sez., <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. sēr."</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. sēr."</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. sezona: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. sērija “<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>”"</string>
diff --git a/common/res/values-mk-rMK/strings.xml b/common/res/values-mk/strings.xml
index 673b17e2..73045d3d 100644
--- a/common/res/values-mk-rMK/strings.xml
+++ b/common/res/values-mk/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Готово"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Прескокни"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Сез.<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Еп.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Еп.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Сез. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Еп. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ml-rIN/strings.xml b/common/res/values-ml/strings.xml
index 217fa52c..07727684 100644
--- a/common/res/values-ml-rIN/strings.xml
+++ b/common/res/values-ml/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"പൂർത്തിയായി"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"ഒഴിവാക്കുക"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"സീസൺ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: എപ്പി.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"എപ്പി.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"സീസൺ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: എപ്പിസോഡ് <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-mn-rMN/strings.xml b/common/res/values-mn/strings.xml
index 20d4de81..ff1552e0 100644
--- a/common/res/values-mn-rMN/strings.xml
+++ b/common/res/values-mn/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Дууссан"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Алгасах"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Бүлэг<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Цуврал.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Анги.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Бүлэг<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Анги. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-mr-rIN/strings.xml b/common/res/values-mr/strings.xml
index 873b955c..adc669ae 100644
--- a/common/res/values-mr-rIN/strings.xml
+++ b/common/res/values-mr/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"पूर्ण झाले"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"वगळा"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"हंगाम<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: भाग<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"भाग<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"हंगाम<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: भाग. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ms-rMY/strings.xml b/common/res/values-ms/strings.xml
index 7b19eeb4..06eb6173 100644
--- a/common/res/values-ms-rMY/strings.xml
+++ b/common/res/values-ms/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Selesai"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Langkau"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"M<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"M<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-my-rMM/strings.xml b/common/res/values-my/strings.xml
index 53503d51..977c4315 100644
--- a/common/res/values-my-rMM/strings.xml
+++ b/common/res/values-my/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"ပြီးပါပြီ"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"ကျော်ရန်"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"အတွဲ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>− အပိုင်း<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"အပိုင်း <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"အတွဲ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>− အပိုင်း <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-nb/strings.xml b/common/res/values-nb/strings.xml
index 7716d086..8344a76b 100644
--- a/common/res/values-nb/strings.xml
+++ b/common/res/values-nb/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Ferdig"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Hopp over"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Sesong <xliff:g id="SEASON_NUMBER">%1$s</xliff:g> episode <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Episode <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Sesong <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: episode <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> – <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ne-rNP/strings.xml b/common/res/values-ne/strings.xml
index 37489a5d..4f3d24c1 100644
--- a/common/res/values-ne-rNP/strings.xml
+++ b/common/res/values-ne/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"सम्पन्न भयो"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"छाड्नुहोस्"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"सिजन <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: एपिसोड <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"एपिसोड <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"सिजन <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: एपिसोड <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-nl/strings.xml b/common/res/values-nl/strings.xml
index e7cab5c7..4e5a1011 100644
--- a/common/res/values-nl/strings.xml
+++ b/common/res/values-nl/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Gereed"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Overslaan"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S <xliff:g id="SEASON_NUMBER">%1$s</xliff:g> afl. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Afl. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: afl. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-pl/strings.xml b/common/res/values-pl/strings.xml
index 74a7dd89..5161e3ba 100644
--- a/common/res/values-pl/strings.xml
+++ b/common/res/values-pl/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Gotowe"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Pomiń"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Sez. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: odc. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Odc. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Sez. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, odc. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-pt-rPT/strings.xml b/common/res/values-pt-rPT/strings.xml
index cd370aeb..badaae27 100644
--- a/common/res/values-pt-rPT/strings.xml
+++ b/common/res/values-pt-rPT/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Concluído"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Ignorar"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"T. <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"T<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-pt/strings.xml b/common/res/values-pt/strings.xml
index 2cdde289..0fc3e097 100644
--- a/common/res/values-pt/strings.xml
+++ b/common/res/values-pt/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Concluído"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Pular"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"T<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"T<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ro/strings.xml b/common/res/values-ro/strings.xml
index 4b7cd74f..ae6fc497 100644
--- a/common/res/values-ro/strings.xml
+++ b/common/res/values-ro/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Terminat"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Omiteți"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Sezonul <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, episodul <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Episodul <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Sezonul <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, episodul <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ru/strings.xml b/common/res/values-ru/strings.xml
index d44ccaa7..53c341aa 100644
--- a/common/res/values-ru/strings.xml
+++ b/common/res/values-ru/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Готово"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Пропустить"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Сезон <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, серия <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Серия <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Сезон <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: серия <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>, \"<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>\""</string>
diff --git a/common/res/values-si-rLK/strings.xml b/common/res/values-si/strings.xml
index ecaf24fd..85fc1f94 100644
--- a/common/res/values-si-rLK/strings.xml
+++ b/common/res/values-si/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"නිමයි"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"මඟ හරින්න"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"වාරය<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>කථාංගය<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"කථාංගය <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"වාරය<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: කථාංගය <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-sk/strings.xml b/common/res/values-sk/strings.xml
index e917306d..1d1a673f 100644
--- a/common/res/values-sk/strings.xml
+++ b/common/res/values-sk/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Hotovo"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Preskočiť"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"E<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> – <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-sl/strings.xml b/common/res/values-sl/strings.xml
index 061b416d..26ec614d 100644
--- a/common/res/values-sl/strings.xml
+++ b/common/res/values-sl/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Končano"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Preskoči"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. sezona: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. epizoda"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. epizoda"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. sezona – <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. epizoda: <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-sr/strings.xml b/common/res/values-sr/strings.xml
index 3617a3d9..ef7f9ee5 100644
--- a/common/res/values-sr/strings.xml
+++ b/common/res/values-sr/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Готово"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Прескочи"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Серијал: <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Епизода: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. епизода"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. серијал: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. епизода, <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-sv/strings.xml b/common/res/values-sv/strings.xml
index 6394a107..9911a0de 100644
--- a/common/res/values-sv/strings.xml
+++ b/common/res/values-sv/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Klar"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Hoppa över"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Säsong <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>, avsnitt <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Avsnitt <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Säsong <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: avsnitt <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> – <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-sw/strings.xml b/common/res/values-sw/strings.xml
index 3416b95a..7d44cedf 100644
--- a/common/res/values-sw/strings.xml
+++ b/common/res/values-sw/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Nimemaliza"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Ruka"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Msimu wa <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Kipindi cha <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Kipindi cha <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Msimu wa <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Kipindi cha <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ta-rIN/strings.xml b/common/res/values-ta/strings.xml
index 558bd66f..bc2eed62 100644
--- a/common/res/values-ta-rIN/strings.xml
+++ b/common/res/values-ta/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"முடிந்தது"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"தவிர்"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"சீ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: எபி.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"எபி.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"சீ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: எபி. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-te-rIN/strings.xml b/common/res/values-te/strings.xml
index ac7e3987..80df229d 100644
--- a/common/res/values-te-rIN/strings.xml
+++ b/common/res/values-te/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"పూర్తయింది"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"దాటవేయి"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"సీ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ఎపి.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"ఎపి.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"సీ<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ఎపి. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-th/strings.xml b/common/res/values-th/strings.xml
index 584c2703..5ff9f1ff 100644
--- a/common/res/values-th/strings.xml
+++ b/common/res/values-th/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"เสร็จสิ้น"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"ข้าม"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"ซีซัน <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ตอนที่ <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"ตอนที่ <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"ซีซัน <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ตอนที่ <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-tl/strings.xml b/common/res/values-tl/strings.xml
index 230c3448..e6b8bbbc 100644
--- a/common/res/values-tl/strings.xml
+++ b/common/res/values-tl/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Tapos Na"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Laktawan"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-tr/strings.xml b/common/res/values-tr/strings.xml
index 1356a1b8..c25c834f 100644
--- a/common/res/values-tr/strings.xml
+++ b/common/res/values-tr/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Bitti"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Atla"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Böl.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Böl.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>. Bölüm <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-uk/strings.xml b/common/res/values-uk/strings.xml
index b8de0ee1..9b67cf4a 100644
--- a/common/res/values-uk/strings.xml
+++ b/common/res/values-uk/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Готово"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Пропустити"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Сезон <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: серія <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Серія <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Сезон <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: серія <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> \"<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>\""</string>
diff --git a/common/res/values-ur-rPK/strings.xml b/common/res/values-ur/strings.xml
index 0cfa3b5e..b04fb3c3 100644
--- a/common/res/values-ur-rPK/strings.xml
+++ b/common/res/values-ur/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"ہو گیا"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"نظر انداز کریں"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"سیزن<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ایپی سوڈ۔<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"ایپی سوڈ <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"سیزن <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: ایپی سوڈ <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-uz-rUZ/strings.xml b/common/res/values-uz/strings.xml
index 241e15a4..ffa1cf9c 100644
--- a/common/res/values-uz-rUZ/strings.xml
+++ b/common/res/values-uz/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Tayyor"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Tashlab ketish"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>-fasl: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>-qism"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>-qism"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>-fasl: <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>-qism – “<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>”"</string>
diff --git a/common/res/values-vi/strings.xml b/common/res/values-vi/strings.xml
index dcc25f00..2852bb10 100644
--- a/common/res/values-vi/strings.xml
+++ b/common/res/values-vi/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Xong"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Bỏ qua"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"Phần<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Tập<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Tập<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"Phần <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Tập <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-zh-rCN/strings.xml b/common/res/values-zh-rCN/strings.xml
index 519a1ef8..25e13379 100644
--- a/common/res/values-zh-rCN/strings.xml
+++ b/common/res/values-zh-rCN/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"完成"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"跳过"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"第 <xliff:g id="SEASON_NUMBER">%1$s</xliff:g> 季:第 <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> 集"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"第 <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> 集"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"第 <xliff:g id="SEASON_NUMBER">%1$s</xliff:g> 季第 <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> 集:<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-zh-rHK/strings.xml b/common/res/values-zh-rHK/strings.xml
index 56249edb..ed323c6a 100644
--- a/common/res/values-zh-rHK/strings.xml
+++ b/common/res/values-zh-rHK/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"完成"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"略過"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"第 <xliff:g id="SEASON_NUMBER">%1$s</xliff:g> 季:第 <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> 集"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"第 <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> 集"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"第 <xliff:g id="SEASON_NUMBER">%1$s</xliff:g> 季:第 <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> 集 <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-zh-rTW/strings.xml b/common/res/values-zh-rTW/strings.xml
index 7bbb81fa..25e13379 100644
--- a/common/res/values-zh-rTW/strings.xml
+++ b/common/res/values-zh-rTW/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"完成"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"略過"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"第 <xliff:g id="SEASON_NUMBER">%1$s</xliff:g> 季:第 <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> 集"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"第 <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> 集"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"第 <xliff:g id="SEASON_NUMBER">%1$s</xliff:g> 季第 <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> 集:<xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values-zu/strings.xml b/common/res/values-zu/strings.xml
index c8e6653d..4574ac01 100644
--- a/common/res/values-zu/strings.xml
+++ b/common/res/values-zu/strings.xml
@@ -18,7 +18,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done" msgid="298287050387266501">"Kwenziwe"</string>
- <string name="action_text_skip" msgid="9158414021827546309">"Yeqa"</string>
<string name="display_episode_number_format" msgid="6040735693510854344">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep.<xliff:g id="EPISODE_NUMBER">%2$s</xliff:g>"</string>
<string name="display_episode_number_format_no_season_number" msgid="8393554269654325741">"Ep.<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>"</string>
<string name="display_episode_title_format" msgid="5041103178918130554">"S<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>: Ep. <xliff:g id="EPISODE_NUMBER">%2$s</xliff:g> <xliff:g id="EPISODE_TITLE">%3$s</xliff:g>"</string>
diff --git a/common/res/values/dimens.xml b/common/res/values/dimens.xml
index 746b12c9..9d6e0e67 100644
--- a/common/res/values/dimens.xml
+++ b/common/res/values/dimens.xml
@@ -16,6 +16,10 @@
-->
<resources>
+ <!-- Setup screen -->
+ <dimen name="setup_fragment_enter_from">300dp</dimen>
+ <dimen name="setup_fragment_enter_to">-300dp</dimen>
+
<!-- Guided step fragment -->
<dimen name="setup_guidedstep_guidance_section_width_2pane">600dp</dimen>
<dimen name="setup_guidedstep_guidance_section_width_3pane">476dp</dimen>
@@ -26,6 +30,7 @@
<dimen name="setup_guidedactions_item_container_padding_start">40dp</dimen>
<dimen name="setup_guidedactions_item_container_padding_end">40dp</dimen>
<dimen name="setup_guidedactions_vertical_padding">12dp</dimen>
+ <dimen name="setup_guidedactions_vertical_spacing">5dp</dimen>
<item name="setup_guidedactions_width_weight" format="float" type="string">1</item>
<dimen name="setup_guidedactions_item_delimiter_padding">10dp</dimen>
diff --git a/common/res/values/strings.xml b/common/res/values/strings.xml
index 97fbea97..e5b9b625 100644
--- a/common/res/values/strings.xml
+++ b/common/res/values/strings.xml
@@ -17,7 +17,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done">Done</string>
- <string name="action_text_skip">Skip</string>
<!-- The episode display format with season and episode number used in series details view. -->
<string name="display_episode_number_format">S<xliff:g id="season_number" example="1">%1$s</xliff:g>: Ep.<xliff:g id="episode_number" example="1">%2$s</xliff:g></string>
<!-- The episode display format with episode number used in series details view. -->
diff --git a/common/res/values/styles.xml b/common/res/values/styles.xml
index 50ef08f1..3c3c71c9 100644
--- a/common/res/values/styles.xml
+++ b/common/res/values/styles.xml
@@ -57,9 +57,15 @@
<item name="android:textSize">16sp</item>
</style>
+ <style name="Widget.Setup.GuidedActionsListStyle" parent="Widget.Leanback.GuidedActionsListStyle">
+ <item name="android:elevation">0dp</item>
+ </style>
+
<style name="Widget.Setup.GuidedActionItemContainerStyle" parent="Widget.Leanback.GuidedActionItemContainerStyle">
<item name="android:layout_height">64dp</item>
<item name="android:paddingBottom">@dimen/setup_guidedactions_vertical_padding</item>
+ <item name="android:paddingEnd">@dimen/setup_guidedactions_item_container_padding_end</item>
+ <item name="android:paddingStart">@dimen/setup_guidedactions_item_container_padding_start</item>
<item name="android:paddingTop">@dimen/setup_guidedactions_vertical_padding</item>
<item name="android:transitionGroup">true</item>
</style>
diff --git a/common/res/values/themes.xml b/common/res/values/themes.xml
index 6016daf9..598ae9a5 100644
--- a/common/res/values/themes.xml
+++ b/common/res/values/themes.xml
@@ -31,6 +31,7 @@
<item name="guidedActionItemDescriptionStyle">@style/Widget.Setup.GuidedActionItemDescriptionStyle</item>
<item name="guidedActionsBackground">@color/common_setup_action_background</item>
<item name="guidedActionsElevation">0dp</item>
+ <item name="guidedActionsListStyle">@style/Widget.Setup.GuidedActionsListStyle</item>
<item name="guidedActionsSelectorDrawable">@drawable/setup_selector_background</item>
<item name="guidedStepBackground">@android:color/transparent</item>
<item name="setupCommonGuidanceBackground">@android:color/transparent</item>
diff --git a/common/src/com/android/tv/common/SharedPreferencesUtils.java b/common/src/com/android/tv/common/SharedPreferencesUtils.java
index 1b929d3b..fb3d9b56 100644
--- a/common/src/com/android/tv/common/SharedPreferencesUtils.java
+++ b/common/src/com/android/tv/common/SharedPreferencesUtils.java
@@ -35,7 +35,6 @@ public final class SharedPreferencesUtils {
public static final String SHARED_PREF_RECURRING_RUNNER = "sharedPreferencesRecurringRunner";
public static final String SHARED_PREF_EPG = "epg_preferences";
public static final String SHARED_PREF_SERIES_RECORDINGS = "seriesRecordings";
- public static final String SHARED_PREF_CHANNEL_LOGO_URIS = "channelLogoUris";
private static boolean sInitializeCalled;
diff --git a/common/src/com/android/tv/common/TvCommonUtils.java b/common/src/com/android/tv/common/TvCommonUtils.java
index c391ad24..a88dd3a8 100644
--- a/common/src/com/android/tv/common/TvCommonUtils.java
+++ b/common/src/com/android/tv/common/TvCommonUtils.java
@@ -23,8 +23,6 @@ import android.media.tv.TvInputInfo;
* Util class for common use in TV app and inputs.
*/
public final class TvCommonUtils {
- private static Boolean sRunningInTest;
-
private TvCommonUtils() { }
/**
@@ -60,15 +58,12 @@ public final class TvCommonUtils {
* the usual devices even the application is running in tests. We need to figure it out by
* checking whether the class in tv-tests-common module can be loaded or not.
*/
- public static synchronized boolean isRunningInTest() {
- if (sRunningInTest == null) {
- try {
- Class.forName("com.android.tv.testing.Utils");
- sRunningInTest = true;
- } catch (ClassNotFoundException e) {
- sRunningInTest = false;
- }
+ public static boolean isRunningInTest() {
+ try {
+ Class.forName("com.android.tv.testing.Utils");
+ return true;
+ } catch (ClassNotFoundException e) {
+ return false;
}
- return sRunningInTest;
}
}
diff --git a/common/src/com/android/tv/common/TvContentRatingCache.java b/common/src/com/android/tv/common/TvContentRatingCache.java
index 8b3c06f1..5694cda7 100644
--- a/common/src/com/android/tv/common/TvContentRatingCache.java
+++ b/common/src/com/android/tv/common/TvContentRatingCache.java
@@ -43,7 +43,6 @@ public final class TvContentRatingCache implements MemoryManageable {
return INSTANCE;
}
- // @GuardedBy("TvContentRatingCache.this")
private final Map<String, TvContentRating[]> mRatingsMultiMap = new ArrayMap<>();
/**
@@ -52,7 +51,7 @@ public final class TvContentRatingCache implements MemoryManageable {
* Returns {@code null} if the string is empty or contains no valid ratings.
*/
@Nullable
- public synchronized TvContentRating[] getRatings(String commaSeparatedRatings) {
+ public TvContentRating[] getRatings(String commaSeparatedRatings) {
if (TextUtils.isEmpty(commaSeparatedRatings)) {
return null;
}
@@ -137,7 +136,7 @@ public final class TvContentRatingCache implements MemoryManageable {
}
@Override
- public synchronized void performTrimMemory(int level) {
+ public void performTrimMemory(int level) {
mRatingsMultiMap.clear();
}
diff --git a/common/src/com/android/tv/common/feature/SharedPreferencesFeature.java b/common/src/com/android/tv/common/feature/SharedPreferencesFeature.java
index 881f53d6..a4a79b38 100644
--- a/common/src/com/android/tv/common/feature/SharedPreferencesFeature.java
+++ b/common/src/com/android/tv/common/feature/SharedPreferencesFeature.java
@@ -19,6 +19,7 @@ package com.android.tv.common.feature;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
+
import com.android.tv.common.SharedPreferencesUtils;
/**
diff --git a/common/src/com/android/tv/common/feature/TestableFeature.java b/common/src/com/android/tv/common/feature/TestableFeature.java
index d7e707a1..a02877ec 100644
--- a/common/src/com/android/tv/common/feature/TestableFeature.java
+++ b/common/src/com/android/tv/common/feature/TestableFeature.java
@@ -36,29 +36,14 @@ public class TestableFeature implements Feature {
private final Feature mDelegate;
private Boolean mTestValue = null;
- /**
- * Creates testable feature.
- */
public static TestableFeature createTestableFeature(Feature delegate) {
return new TestableFeature(delegate);
}
- /**
- * Creates testable feature with initial value.
- */
- public static TestableFeature createTestableFeature(Feature delegate, Boolean initialValue) {
- return new TestableFeature(delegate, initialValue);
- }
-
private TestableFeature(Feature delegate) {
mDelegate = delegate;
}
- private TestableFeature(Feature delegate, Boolean initialValue) {
- mDelegate = delegate;
- mTestValue = initialValue;
- }
-
@VisibleForTesting
public void enableForTest() {
if (!TvCommonUtils.isRunningInTest()) {
diff --git a/common/src/com/android/tv/common/ui/setup/SetupMultiPaneFragment.java b/common/src/com/android/tv/common/ui/setup/SetupMultiPaneFragment.java
index b9ad4657..63247481 100644
--- a/common/src/com/android/tv/common/ui/setup/SetupMultiPaneFragment.java
+++ b/common/src/com/android/tv/common/ui/setup/SetupMultiPaneFragment.java
@@ -34,7 +34,6 @@ public abstract class SetupMultiPaneFragment extends SetupFragment {
private static final boolean DEBUG = false;
public static final int ACTION_DONE = Integer.MAX_VALUE;
- public static final int ACTION_SKIP = ACTION_DONE - 1;
private static final String CONTENT_FRAGMENT_TAG = "content_fragment";
@@ -54,12 +53,7 @@ public abstract class SetupMultiPaneFragment extends SetupFragment {
}
if (needsDoneButton()) {
setOnClickAction(view.findViewById(R.id.button_done), getActionCategory(), ACTION_DONE);
- }
- if (needsSkipButton()) {
- view.findViewById(R.id.button_skip).setVisibility(View.VISIBLE);
- setOnClickAction(view.findViewById(R.id.button_skip), getActionCategory(), ACTION_SKIP);
- }
- if (!needsDoneButton() && !needsSkipButton()) {
+ } else {
View doneButtonContainer = view.findViewById(R.id.done_button_container);
// Use content view to check layout direction while view is being created.
if (getResources().getConfiguration().getLayoutDirection()
@@ -96,10 +90,6 @@ public abstract class SetupMultiPaneFragment extends SetupFragment {
return true;
}
- protected boolean needsSkipButton() {
- return false;
- }
-
@Override
protected int[] getParentIdsForDelay() {
return new int[] {R.id.content_fragment, R.id.guidedactions_list};
@@ -109,4 +99,4 @@ public abstract class SetupMultiPaneFragment extends SetupFragment {
public int[] getSharedElementIds() {
return new int[] {R.id.action_fragment_background, R.id.done_button_container};
}
-} \ No newline at end of file
+}
diff --git a/jni/Android.mk b/jni/Android.mk
index 9cb3d42e..684830c9 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -1,30 +1,12 @@
-#
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
LOCAL_PATH := $(call my-dir)
# --------------------------------------------------------------
include $(CLEAR_VARS)
-LOCAL_MODULE := libtunertvinput_jni
+LOCAL_MODULE := libtunertvinput_jni
LOCAL_SRC_FILES += tunertvinput_jni.cpp DvbManager.cpp
LOCAL_SDK_VERSION := 21
LOCAL_NDK_STL_VARIANT := stlport_static
LOCAL_LDLIBS := -llog
-
include $(BUILD_SHARED_LIBRARY)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/libs/exoplayer_v2.jar b/libs/exoplayer_v2.jar
deleted file mode 100644
index 6cfcde9c..00000000
--- a/libs/exoplayer_v2.jar
+++ /dev/null
Binary files differ
diff --git a/libs/exoplayer_v2_ext_ffmpeg.jar b/libs/exoplayer_v2_ext_ffmpeg.jar
deleted file mode 100644
index 65117267..00000000
--- a/libs/exoplayer_v2_ext_ffmpeg.jar
+++ /dev/null
Binary files differ
diff --git a/proguard.flags b/proguard.flags
index 272f21a1..6ffed3e2 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -38,9 +38,6 @@
long getSize();
void close();
}
--keepclasseswithmembers class com.google.android.exoplayer2.ext.ffmpeg {
- native <methods>;
-}
# Keep method which is used for reflection.
-keep @com.android.tv.common.annotation.UsedByReflection class * {*;}
diff --git a/proto/channel.proto b/proto/channel.proto
index 67e415de..982a1aa1 100644
--- a/proto/channel.proto
+++ b/proto/channel.proto
@@ -45,8 +45,6 @@ message TunerChannelProto {
repeated AtscCaptionTrack caption_tracks = 20;
optional bool has_caption_track = 21;
optional AtscServiceType service_type = 22 [default = SERVICE_TYPE_ATSC_DIGITAL_TELEVISION];
- optional bool recording_prohibited = 23;
- optional string video_format = 24;
}
// Enum describing the types of tuner.
diff --git a/res/animator/tuning_block_view_fade_out.xml b/res/animator/tuning_block_view_fade_out.xml
deleted file mode 100644
index eb40a7b5..00000000
--- a/res/animator/tuning_block_view_fade_out.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
- <objectAnimator
- android:propertyName="alpha"
- android:valueFrom="1.0"
- android:valueTo="0.0"
- android:duration="@integer/tvview_block_icon_anim_duration"
- android:interpolator="@android:interpolator/fast_out_linear_in" />
-</set>
diff --git a/res/drawable-xhdpi/dvr_default_poster.png b/res/drawable-xhdpi/dvr_default_poster.png
index f42c08dd..683a693d 100644
--- a/res/drawable-xhdpi/dvr_default_poster.png
+++ b/res/drawable-xhdpi/dvr_default_poster.png
Binary files differ
diff --git a/res/drawable-xhdpi/dvr_default_program_art.png b/res/drawable-xhdpi/dvr_default_program_art.png
new file mode 100644
index 00000000..6a8d68ee
--- /dev/null
+++ b/res/drawable-xhdpi/dvr_default_program_art.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_error_recording.png b/res/drawable-xhdpi/ic_error_recording.png
new file mode 100644
index 00000000..5878c3b3
--- /dev/null
+++ b/res/drawable-xhdpi/ic_error_recording.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_fresh.png b/res/drawable-xhdpi/ic_fresh.png
new file mode 100644
index 00000000..c1bc9583
--- /dev/null
+++ b/res/drawable-xhdpi/ic_fresh.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_input.png b/res/drawable-xhdpi/ic_pip_option_input.png
new file mode 100644
index 00000000..47c5006f
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pip_option_input.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_layout1.png b/res/drawable-xhdpi/ic_pip_option_layout1.png
new file mode 100644
index 00000000..14b2602a
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pip_option_layout1.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_layout2.png b/res/drawable-xhdpi/ic_pip_option_layout2.png
new file mode 100644
index 00000000..e5d77278
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pip_option_layout2.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_layout3.png b/res/drawable-xhdpi/ic_pip_option_layout3.png
new file mode 100644
index 00000000..dfe110d0
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pip_option_layout3.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_layout4.png b/res/drawable-xhdpi/ic_pip_option_layout4.png
new file mode 100644
index 00000000..8ab5fa45
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pip_option_layout4.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_layout5.png b/res/drawable-xhdpi/ic_pip_option_layout5.png
new file mode 100644
index 00000000..d6b53641
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pip_option_layout5.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_size.png b/res/drawable-xhdpi/ic_pip_option_size.png
new file mode 100644
index 00000000..96fb0b0c
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pip_option_size.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_swap.png b/res/drawable-xhdpi/ic_pip_option_swap.png
new file mode 100644
index 00000000..fa2088ed
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pip_option_swap.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_swap_audio.png b/res/drawable-xhdpi/ic_pip_option_swap_audio.png
new file mode 100644
index 00000000..a5f5431b
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pip_option_swap_audio.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_recorded_program.png b/res/drawable-xhdpi/ic_recorded_program.png
new file mode 100644
index 00000000..fe22714e
--- /dev/null
+++ b/res/drawable-xhdpi/ic_recorded_program.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_related_actor.png b/res/drawable-xhdpi/ic_related_actor.png
new file mode 100644
index 00000000..9b726b93
--- /dev/null
+++ b/res/drawable-xhdpi/ic_related_actor.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_related_search.png b/res/drawable-xhdpi/ic_related_search.png
new file mode 100644
index 00000000..aa5cd0d2
--- /dev/null
+++ b/res/drawable-xhdpi/ic_related_search.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_setup_antenna.png b/res/drawable-xhdpi/ic_setup_antenna.png
new file mode 100644
index 00000000..bb6d416e
--- /dev/null
+++ b/res/drawable-xhdpi/ic_setup_antenna.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvoption_pip.png b/res/drawable-xhdpi/ic_tvoption_pip.png
index e5d77278..0f78d834 100644
--- a/res/drawable-xhdpi/ic_tvoption_pip.png
+++ b/res/drawable-xhdpi/ic_tvoption_pip.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvoption_pip_off.png b/res/drawable-xhdpi/ic_tvoption_pip_off.png
new file mode 100644
index 00000000..6001677b
--- /dev/null
+++ b/res/drawable-xhdpi/ic_tvoption_pip_off.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3a_00.png b/res/drawable-xhdpi/tv_3a_00.png
new file mode 100644
index 00000000..ad8f256d
--- /dev/null
+++ b/res/drawable-xhdpi/tv_3a_00.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_error.png b/res/drawable-xhdpi/tv_error.png
new file mode 100644
index 00000000..718f203b
--- /dev/null
+++ b/res/drawable-xhdpi/tv_error.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_usb_antenna.png b/res/drawable-xhdpi/tv_usb_antenna.png
new file mode 100644
index 00000000..ff6c5cc1
--- /dev/null
+++ b/res/drawable-xhdpi/tv_usb_antenna.png
Binary files differ
diff --git a/res/drawable/play_controls_time_indicator.xml b/res/drawable/play_controls_time_indicator.xml
index 85fee1fb..16acb107 100644
--- a/res/drawable/play_controls_time_indicator.xml
+++ b/res/drawable/play_controls_time_indicator.xml
@@ -17,5 +17,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
+ <size android:width="@dimen/play_controls_time_indicator_width"
+ android:height="@dimen/play_controls_time_indicator_height" />
<solid android:color="@color/play_controls_progress_time_indicator_color" />
</shape>
diff --git a/res/drawable/playback_progress_bar.xml b/res/drawable/playback_progress_bar.xml
deleted file mode 100644
index 2a70ec82..00000000
--- a/res/drawable/playback_progress_bar.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2017 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@android:id/background">
- <shape>
- <solid android:color="@color/play_controls_progress_bar_background" />
- </shape>
- </item>
- <item android:id="@android:id/secondaryProgress">
- <shape>
- <solid android:color="@color/play_controls_progress_bar_buffered" />
- </shape>
- </item>
- <item android:id="@android:id/progress">
- <shape>
- <solid android:color="@color/play_controls_progress_bar_watched" />
- </shape>
- </item>
-</layer-list> \ No newline at end of file
diff --git a/res/drawable/priority_settings_action_item_selected.xml b/res/drawable/priority_settings_action_item_selected.xml
index 3e017313..a1ab18ae 100644
--- a/res/drawable/priority_settings_action_item_selected.xml
+++ b/res/drawable/priority_settings_action_item_selected.xml
@@ -15,8 +15,12 @@
~ limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="#EEEEEE"/>
- <corners android:radius="2dp" />
-</shape>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:left="24dp" android:right="24dp">
+ <shape>
+ <solid android:color="#EEEEEE"/>
+ <corners android:radius="2dp" />
+ </shape>
+ </item>
+</layer-list>
diff --git a/res/drawable/setup_item_background.xml b/res/drawable/setup_item_background.xml
new file mode 100644
index 00000000..fb3899aa
--- /dev/null
+++ b/res/drawable/setup_item_background.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:enterFadeDuration="@android:integer/config_shortAnimTime"
+ android:exitFadeDuration="@android:integer/config_shortAnimTime"
+ android:color="?android:attr/colorControlHighlight">
+ <item android:id="@android:id/mask">
+ <shape android:shape="rectangle" >
+ <solid android:color="@android:color/white" />
+ <corners android:radius="2dp" />
+ </shape>
+ </item>
+</ripple>
diff --git a/res/layout/activity_dvr_playback.xml b/res/layout/activity_dvr_playback.xml
index 02641d84..204001c7 100644
--- a/res/layout/activity_dvr_playback.xml
+++ b/res/layout/activity_dvr_playback.xml
@@ -34,11 +34,7 @@
</FrameLayout>
<fragment android:id="@+id/dvr_playback_controls_fragment"
- android:name="com.android.tv.dvr.ui.playback.DvrPlaybackOverlayFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-
- <FrameLayout android:id="@+id/dvr_playback_side_fragment"
+ android:name="com.android.tv.dvr.ui.DvrPlaybackOverlayFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
diff --git a/res/layout/activity_tv.xml b/res/layout/activity_tv.xml
index 4e8afbb7..f766ae00 100644
--- a/res/layout/activity_tv.xml
+++ b/res/layout/activity_tv.xml
@@ -28,13 +28,28 @@
android:layout_height="match_parent"
android:layout_gravity="start|center_vertical" />
- <include layout="@layout/tuning_block" />
-
<com.android.tv.ui.TunableTvView android:id="@+id/main_tunable_tv_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start|center_vertical" />
+ <com.android.tv.ui.AppLayerTvView android:id="@+id/pip_tv_view"
+ android:layout_marginLeft="@dimen/pipview_margin_horizontal"
+ android:layout_marginRight="@dimen/pipview_margin_horizontal"
+ android:layout_marginTop="@dimen/pipview_margin_top"
+ android:layout_marginBottom="@dimen/pipview_margin_bottom"
+ android:layout_width="@dimen/pipview_small_size_width"
+ android:layout_height="@dimen/pipview_small_size_height" />
+
+ <com.android.tv.ui.TunableTvView android:id="@+id/pip_tunable_tv_view"
+ android:visibility="gone"
+ android:layout_marginLeft="@dimen/pipview_margin_horizontal"
+ android:layout_marginRight="@dimen/pipview_margin_horizontal"
+ android:layout_marginTop="@dimen/pipview_margin_top"
+ android:layout_marginBottom="@dimen/pipview_margin_bottom"
+ android:layout_width="@dimen/pipview_small_size_width"
+ android:layout_height="@dimen/pipview_small_size_height" />
+
<FrameLayout
android:id="@+id/scene_container"
android:layout_height="match_parent"
diff --git a/res/layout/dvr_main.xml b/res/layout/dvr_main.xml
index 6e18a834..bac1cc91 100644
--- a/res/layout/dvr_main.xml
+++ b/res/layout/dvr_main.xml
@@ -16,6 +16,6 @@
-->
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dvr_frame"
- android:name="com.android.tv.dvr.ui.browse.DvrBrowseFragment"
+ android:name="com.android.tv.dvr.ui.DvrBrowseFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" /> \ No newline at end of file
diff --git a/res/layout/dvr_play.xml b/res/layout/dvr_play.xml
new file mode 100644
index 00000000..4df13686
--- /dev/null
+++ b/res/layout/dvr_play.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT 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:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/no_program_information"
+ android:id="@+id/placeHolderText" android:layout_gravity="center"/>
+</FrameLayout> \ No newline at end of file
diff --git a/res/layout/dvr_recording_card_view.xml b/res/layout/dvr_recording_card_view.xml
index 53a7cf3d..d3808a31 100644
--- a/res/layout/dvr_recording_card_view.xml
+++ b/res/layout/dvr_recording_card_view.xml
@@ -16,12 +16,12 @@
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tv="http://schemas.android.com/apk/res/com.android.tv"
- android:layout_width="wrap_content"
+ android:layout_width="@dimen/dvr_card_layout_width"
android:layout_height="wrap_content">
<FrameLayout
- android:layout_width="@dimen/dvr_library_card_image_layout_width"
- android:layout_height="@dimen/dvr_library_card_image_layout_height"
+ android:layout_width="@dimen/dvr_card_image_layout_width"
+ android:layout_height="@dimen/dvr_card_image_layout_height"
android:layout_margin="2dp">
<ImageView android:id="@+id/image"
@@ -35,7 +35,7 @@
<ProgressBar android:id="@+id/recording_progress"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
- android:layout_height="@dimen/dvr_library_card_progress_height"
+ android:layout_height="@dimen/dvr_card_progress_height"
android:mirrorForRtl="false"
android:progressTint="@color/play_controls_progress_bar_watched"
android:progressDrawable="@drawable/progress_horizontal"
@@ -70,30 +70,13 @@
android:background="@color/dvr_card_info"
tv:layout_viewType="info">
- <FrameLayout android:id="@+id/title_area"
+ <TextView android:id="@+id/title"
android:layout_width="match_parent"
- android:layout_height="@dimen/dvr_library_card_folded_title_height">
-
- <TextView android:id="@+id/title_one_line"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="1dp"
- android:gravity="start"
- android:maxLines="1"
- style="@style/dvr_card_view_title_text"
- tv:layout_viewType="main"/>
-
- <TextView android:id="@+id/title_two_lines"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="1dp"
- android:gravity="start"
- android:maxLines="2"
- android:alpha="0"
- style="@style/dvr_card_view_title_text"
- tv:layout_viewType="main"/>
-
- </FrameLayout>
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="1dp"
+ android:gravity="start"
+ style="@style/dvr_card_view_title_text"
+ tv:layout_viewType="main"/>
<RelativeLayout
android:layout_width="match_parent"
diff --git a/res/layout/dvr_schedules_item.xml b/res/layout/dvr_schedules_item.xml
index 90e1123d..1d97cb98 100644
--- a/res/layout/dvr_schedules_item.xml
+++ b/res/layout/dvr_schedules_item.xml
@@ -44,23 +44,19 @@
android:layout_height="match_parent"
android:alpha="0"/>
- <!-- Make parent focusable in case when the info_container is not focusable.
- As the actions are GONE when the row is not selected, if info_container is not
- focusable, there are no focusable views in the row, which causes that the row can't be
- selected by the DPAD. To avoid this case, the parent should be focusable. -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:focusable="true"
- android:descendantFocusability="afterDescendants">
+ android:layout_height="match_parent">
<LinearLayout android:id="@+id/info_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/dvr_schedules_item_section_margin"
android:layout_weight="1"
- android:clickable="true">
+ android:clickable="true"
+ android:focusableInTouchMode="true"
+ android:focusable="true">
<TextView android:id="@+id/time"
android:layout_width="@dimen/dvr_schedules_item_time_width"
diff --git a/res/layout/guided_action_editable.xml b/res/layout/guided_action_editable.xml
deleted file mode 100644
index 84f56f8d..00000000
--- a/res/layout/guided_action_editable.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2017 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<android.support.v17.leanback.widget.GuidedActionItemContainer
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/guidedactions_editable"
- style="?attr/guidedActionItemContainerStyle"
- android:layout_height="88dp">
-
- <android.support.v17.leanback.widget.NonOverlappingLinearLayout
- android:id="@+id/guidedactions_item_content"
- style="?attr/guidedActionItemContentStyle" >
-
- <EditText
- android:id="@+id/guidedactions_item_title"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:textColor="@color/lb_guidedactions_item_unselected_text_color"
- android:textSize="16sp" />
-
- <android.support.v17.leanback.widget.GuidedActionEditText
- android:id="@+id/guidedactions_item_description"
- style="?attr/guidedActionItemDescriptionStyle" />
-
- </android.support.v17.leanback.widget.NonOverlappingLinearLayout>
-
-</android.support.v17.leanback.widget.GuidedActionItemContainer> \ No newline at end of file
diff --git a/res/layout/input_banner.xml b/res/layout/input_banner.xml
index f4035fcb..cd8770c8 100644
--- a/res/layout/input_banner.xml
+++ b/res/layout/input_banner.xml
@@ -34,7 +34,6 @@
<TextView android:id="@+id/input_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:maxWidth="@dimen/input_banner_item_label_max_width"
android:fontFamily="@string/condensed_font"
android:textColor="@color/select_input_text_color_primary"
android:singleLine="true"
@@ -45,7 +44,6 @@
android:layout_marginStart="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:maxWidth="@dimen/input_banner_item_label_max_width"
android:fontFamily="@string/condensed_font"
android:textColor="@color/select_input_text_color_secondary"
android:singleLine="true"
diff --git a/res/layout/list_item_dvr_history.xml b/res/layout/list_item_dvr_history.xml
deleted file mode 100644
index a9eb4c02..00000000
--- a/res/layout/list_item_dvr_history.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:padding="2dp" >
-
- <TextView
- android:id="@+id/state"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingStart="4dp"
- android:paddingEnd="0dp" />
-
- <TextView
- android:id="@+id/schedule_time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingStart="4dp"
- android:paddingEnd="0dp" />
-
- <TextView
- android:id="@+id/program_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingStart="4dp"
- android:paddingEnd="0dp" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingStart="4dp"
- android:paddingEnd="0dp"
- android:text="@string/dvr_schedules_information_separator" />
-
- <TextView
- android:id="@+id/channel_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingStart="4dp"
- android:paddingEnd="0dp" />
-
-</LinearLayout>
diff --git a/res/layout/menu_card_action.xml b/res/layout/menu_card_action.xml
index e8114b52..f17c5b6a 100644
--- a/res/layout/menu_card_action.xml
+++ b/res/layout/menu_card_action.xml
@@ -19,43 +19,50 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/action_card_width"
android:layout_height="@dimen/action_card_height"
+ android:orientation="vertical"
android:focusable="true"
android:background="@drawable/action_card_background">
- <TextView
- android:id="@+id/action_card_label"
+ <LinearLayout
+ android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_marginStart="12dp"
- android:layout_marginEnd="12dp"
- android:layout_marginTop="6dp"
- android:fontFamily="@string/condensed_font"
- android:maxLines="1"
- android:textColor="@color/action_card_label_color"
- android:textSize="@dimen/action_card_label_font_size" />
+ android:padding="@dimen/action_card_padding"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:layout_gravity="top">
- <TextView
- android:id="@+id/action_card_state"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/action_card_label"
- android:layout_marginStart="12dp"
- android:layout_marginEnd="12dp"
- android:paddingTop="4dp"
- android:fontFamily="@string/condensed_font"
- android:maxLines="1"
- android:textColor="@color/action_card_state_color"
- android:textSize="@dimen/action_card_state_font_size" />
+ <TextView
+ android:id="@+id/action_card_label"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="-6dp"
+ android:singleLine="true"
+ android:fontFamily="@string/condensed_font"
+ android:textColor="@color/action_card_label_color"
+ android:textSize="@dimen/action_card_label_font_size" />
+
+ <TextView
+ android:id="@+id/action_card_state"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="4dp"
+ android:singleLine="true"
+ android:fontFamily="@string/condensed_font"
+ android:textColor="@color/action_card_state_color"
+ android:textSize="@dimen/action_card_state_font_size" />
+
+ </LinearLayout>
<ImageView
android:id="@+id/action_card_icon"
android:layout_width="@dimen/action_card_icon_width"
android:layout_height="@dimen/action_card_icon_height"
android:layout_margin="@dimen/action_card_icon_padding"
- android:layout_alignParentBottom="true"
- android:layout_alignParentEnd="true"
+ android:layout_gravity="end|bottom"
android:contentDescription="@null"
- android:scaleType="fitCenter" />
+ android:scaleType="fitCenter"
+ android:src="@drawable/ic_tvoption_aspect"
+ android:duplicateParentState="true" />
</com.android.tv.menu.ActionCardView>
diff --git a/res/layout/menu_card_app_link.xml b/res/layout/menu_card_app_link.xml
index a7e3bd4a..918cb788 100644
--- a/res/layout/menu_card_app_link.xml
+++ b/res/layout/menu_card_app_link.xml
@@ -33,6 +33,13 @@
android:layout_gravity="top"
android:scaleType="centerCrop"/>
+ <View android:id="@+id/image_gradient"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_horizontal"
+ android:background="@drawable/card_image_gradient"
+ android:visibility="gone" />
+
<TextView android:id="@+id/app_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/res/layout/menu_card_channel.xml b/res/layout/menu_card_channel.xml
index ed7b8273..4e49636f 100644
--- a/res/layout/menu_card_channel.xml
+++ b/res/layout/menu_card_channel.xml
@@ -32,6 +32,13 @@
android:layout_gravity="top"
android:scaleType="centerCrop"/>
+ <View android:id="@+id/image_gradient"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_horizontal"
+ android:background="@drawable/card_image_gradient"
+ android:visibility="gone" />
+
<!-- The bottom margin specified in the redline is 8dp, but the redline doesn't consider
the descenders. So actually, if the bottom margin is set to 8dp, the bottom line of
the text lies 11dp above the bottom of the poster art due to the descenders.
diff --git a/res/layout/menu_card_dvr.xml b/res/layout/menu_card_dvr.xml
index 4f159083..cc589775 100644
--- a/res/layout/menu_card_dvr.xml
+++ b/res/layout/menu_card_dvr.xml
@@ -23,15 +23,17 @@
android:focusable="true"
android:clickable="true">
- <ImageView
+ <FrameLayout
android:layout_width="@dimen/card_image_layout_width"
android:layout_height="@dimen/card_image_layout_height"
- android:background="@color/channel_card_guide"
- android:paddingBottom="16dp"
- android:paddingEnd="30dp"
- android:paddingStart="30dp"
- android:paddingTop="16dp"
- android:src="@drawable/ic_dvr" />
+ android:background="@color/channel_card_guide">
+ <ImageView
+ android:layout_width="82dp"
+ android:layout_height="48dp"
+ android:layout_marginTop="16dp"
+ android:src="@drawable/ic_dvr"
+ android:layout_gravity="center_horizontal" />
+ </FrameLayout>
<FrameLayout
android:layout_width="match_parent"
diff --git a/res/layout/menu_card_guide.xml b/res/layout/menu_card_guide.xml
index c36b7df5..6b724b12 100644
--- a/res/layout/menu_card_guide.xml
+++ b/res/layout/menu_card_guide.xml
@@ -23,15 +23,17 @@
android:focusable="true"
android:clickable="true">
- <ImageView
+ <FrameLayout
android:layout_width="@dimen/card_image_layout_width"
android:layout_height="@dimen/card_image_layout_height"
- android:background="@color/channel_card_guide"
- android:paddingBottom="16dp"
- android:paddingEnd="30dp"
- android:paddingStart="30dp"
- android:paddingTop="16dp"
- android:src="@drawable/ic_channel_guide" />
+ android:background="@color/channel_card_guide">
+ <ImageView
+ android:layout_width="82dp"
+ android:layout_height="48dp"
+ android:layout_marginTop="16dp"
+ android:src="@drawable/ic_channel_guide"
+ android:layout_gravity="center_horizontal" />
+ </FrameLayout>
<TextView
android:layout_width="match_parent"
diff --git a/res/layout/menu_card_setup.xml b/res/layout/menu_card_setup.xml
index 520cb4e5..38abd4e5 100644
--- a/res/layout/menu_card_setup.xml
+++ b/res/layout/menu_card_setup.xml
@@ -22,15 +22,17 @@
android:focusable="true"
android:clickable="true">
- <ImageView
+ <FrameLayout
android:layout_width="@dimen/card_image_layout_width"
android:layout_height="@dimen/card_image_layout_height"
- android:background="@color/channel_card_guide"
- android:paddingBottom="16dp"
- android:paddingEnd="30dp"
- android:paddingStart="30dp"
- android:paddingTop="16dp"
- android:src="@drawable/ic_setup_channels" />
+ android:background="@color/channel_card_guide">
+ <ImageView
+ android:layout_width="82dp"
+ android:layout_height="48dp"
+ android:layout_marginTop="16dp"
+ android:src="@drawable/ic_setup_channels"
+ android:layout_gravity="center_horizontal" />
+ </FrameLayout>
<TextView
android:layout_width="match_parent"
diff --git a/res/layout/menu_card_text.xml b/res/layout/menu_card_text.xml
index 7674f816..777b100f 100644
--- a/res/layout/menu_card_text.xml
+++ b/res/layout/menu_card_text.xml
@@ -16,6 +16,7 @@
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tv="http://schemas.android.com/apk/res/com.android.tv"
android:layout_width="match_parent"
android:layout_height="wrap_content">
diff --git a/res/layout/play_controls_contents.xml b/res/layout/play_controls_contents.xml
index 9afc5f3d..ac61a2d4 100644
--- a/res/layout/play_controls_contents.xml
+++ b/res/layout/play_controls_contents.xml
@@ -16,7 +16,6 @@
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tv="http://schemas.android.com/apk/res-auto"
android:id="@+id/play_controls"
style="@style/menu_row_contents_view"
android:layoutDirection="ltr">
@@ -29,118 +28,153 @@
android:layout_alignStart="@+id/body"
android:layout_marginBottom="@dimen/play_controls_time_bottom_margin"
android:gravity="center"
- android:maxLines="1"
+ android:singleLine="true"
android:textColor="@color/play_controls_time_text_color"
android:textSize="@dimen/play_controls_time_text_size"
android:fontFamily="@string/font" />
- <RelativeLayout
+ <LinearLayout
android:id="@id/body"
+ android:orientation="vertical"
android:layout_width="@dimen/play_controls_width"
android:layout_height="wrap_content"
android:layout_below="@id/time_text"
android:layout_centerHorizontal="true"
android:background="@drawable/play_controls_body_shape">
- <com.android.tv.menu.PlaybackProgressBar
- android:id="@+id/progress"
+ <RelativeLayout
android:layout_width="match_parent"
- android:layout_height="@dimen/play_controls_progress_height"
- android:layout_alignParentTop="true"
- tv:progressDrawable="@drawable/playback_progress_bar" />
- <TextView
+ android:layout_height="@dimen/play_controls_progress_height">
+
+ <ImageView
+ android:id="@+id/timeline_bg_start"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentStart="true"
+ android:src="@color/play_controls_progress_bar_background" />
+ <ImageView
+ android:id="@+id/watched"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_toEndOf="@id/timeline_bg_start"
+ android:src="@color/play_controls_progress_bar_watched" />
+ <ImageView
+ android:id="@+id/buffered"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_toEndOf="@id/watched"
+ android:src="@color/play_controls_progress_bar_buffered" />
+ <ImageView
+ android:id="@+id/timeline_bg_end"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentEnd="true"
+ android:layout_toEndOf="@id/buffered"
+ android:src="@color/play_controls_progress_bar_background" />
+
+ </RelativeLayout>
+
+ <FrameLayout
android:id="@+id/background"
android:layout_width="match_parent"
- android:layout_height="@dimen/play_controls_button_height"
- android:layout_below="@id/progress"
- android:background="@drawable/play_controls_body_background"
- android:gravity="center"
- android:maxLines="1"
- android:textColor="@color/play_controls_unavailable_message_text_color"
- android:textSize="@dimen/play_controls_unavailable_message_text_size"
- android:fontFamily="@string/font" />
- <TextView
- android:id="@+id/program_start_time"
- android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentStart="true"
- android:layout_below="@id/progress"
- android:layout_marginStart="@dimen/play_controls_program_time_margin_start"
- android:layout_marginTop="@dimen/play_controls_program_time_margin_top"
- android:maxLines="1"
- android:textColor="@color/play_controls_rec_time_text_color"
- android:textSize="@dimen/play_controls_rec_time_text_size"
- android:fontFamily="@string/font" />
- <TextView
- android:id="@+id/program_end_time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_below="@id/progress"
- android:layout_marginEnd="@dimen/play_controls_program_time_margin_end"
- android:layout_marginTop="@dimen/play_controls_program_time_margin_top"
- android:maxLines="1"
- android:textColor="@color/play_controls_rec_time_text_color"
- android:textSize="@dimen/play_controls_rec_time_text_size"
- android:fontFamily="@string/font" />
+ android:background="@drawable/play_controls_body_background">
+
+ <TextView
+ android:id="@+id/program_start_time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/play_controls_program_time_margin_start"
+ android:layout_marginTop="@dimen/play_controls_program_time_margin_top"
+ android:singleLine="true"
+ android:textColor="@color/play_controls_rec_time_text_color"
+ android:textSize="@dimen/play_controls_rec_time_text_size"
+ android:fontFamily="@string/font" />
+ <TextView
+ android:id="@+id/program_end_time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/play_controls_program_time_margin_end"
+ android:layout_marginTop="@dimen/play_controls_program_time_margin_top"
+ android:layout_gravity="end"
+ android:singleLine="true"
+ android:textColor="@color/play_controls_rec_time_text_color"
+ android:textSize="@dimen/play_controls_rec_time_text_size"
+ android:fontFamily="@string/font" />
- <com.android.tv.menu.PlayControlsButton
- android:id="@+id/play_pause"
- android:layout_width="@dimen/play_controls_button_width"
- android:layout_height="@dimen/play_controls_button_height"
- android:layout_below="@id/progress"
- android:layout_marginLeft="@dimen/play_controls_button_compact_margin"
- android:layout_marginRight="@dimen/play_controls_button_compact_margin"
- android:layout_centerHorizontal="true" />
- <com.android.tv.menu.PlayControlsButton
- android:id="@+id/rewind"
- android:layout_width="@dimen/play_controls_button_width"
- android:layout_height="@dimen/play_controls_button_height"
- android:layout_below="@id/progress"
- android:layout_marginLeft="@dimen/play_controls_button_compact_margin"
- android:layout_marginRight="@dimen/play_controls_button_compact_margin"
- android:layout_toStartOf="@id/play_pause" />
- <com.android.tv.menu.PlayControlsButton
- android:id="@+id/jump_previous"
- android:layout_width="@dimen/play_controls_button_width"
- android:layout_height="@dimen/play_controls_button_height"
- android:layout_below="@id/progress"
- android:layout_marginLeft="@dimen/play_controls_button_compact_margin"
- android:layout_marginRight="@dimen/play_controls_button_compact_margin"
- android:layout_toStartOf="@id/rewind" />
- <com.android.tv.menu.PlayControlsButton
- android:id="@+id/fast_forward"
- android:layout_width="@dimen/play_controls_button_width"
- android:layout_height="@dimen/play_controls_button_height"
- android:layout_below="@id/progress"
- android:layout_marginLeft="@dimen/play_controls_button_compact_margin"
- android:layout_marginRight="@dimen/play_controls_button_compact_margin"
- android:layout_toEndOf="@id/play_pause" />
- <com.android.tv.menu.PlayControlsButton
- android:id="@+id/jump_next"
- android:layout_width="@dimen/play_controls_button_width"
- android:layout_height="@dimen/play_controls_button_height"
- android:layout_below="@id/progress"
- android:layout_marginLeft="@dimen/play_controls_button_compact_margin"
- android:layout_marginRight="@dimen/play_controls_button_compact_margin"
- android:layout_toEndOf="@id/fast_forward" />
- <com.android.tv.menu.PlayControlsButton
- android:id="@+id/record"
- android:layout_width="@dimen/play_controls_button_width"
- android:layout_height="@dimen/play_controls_button_height"
- android:layout_below="@id/progress"
- android:layout_marginLeft="@dimen/play_controls_button_compact_margin"
- android:layout_marginRight="@dimen/play_controls_button_compact_margin"
- android:layout_toEndOf="@id/jump_next" />
- </RelativeLayout>
+ <RelativeLayout
+ android:id="@+id/play_control_bar"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/play_controls_button_height">
- <View
+ <com.android.tv.menu.PlayControlsButton
+ android:id="@+id/play_pause"
+ android:layout_width="@dimen/play_controls_button_width"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="@dimen/play_controls_button_normal_margin"
+ android:layout_marginRight="@dimen/play_controls_button_normal_margin"
+ android:layout_centerHorizontal="true" />
+ <com.android.tv.menu.PlayControlsButton
+ android:id="@+id/rewind"
+ android:layout_width="@dimen/play_controls_button_width"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="@dimen/play_controls_button_normal_margin"
+ android:layout_marginRight="@dimen/play_controls_button_normal_margin"
+ android:layout_toLeftOf="@id/play_pause" />
+ <com.android.tv.menu.PlayControlsButton
+ android:id="@+id/jump_previous"
+ android:layout_width="@dimen/play_controls_button_width"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="@dimen/play_controls_button_normal_margin"
+ android:layout_marginRight="@dimen/play_controls_button_normal_margin"
+ android:layout_toLeftOf="@id/rewind" />
+ <com.android.tv.menu.PlayControlsButton
+ android:id="@+id/fast_forward"
+ android:layout_width="@dimen/play_controls_button_width"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="@dimen/play_controls_button_normal_margin"
+ android:layout_marginRight="@dimen/play_controls_button_normal_margin"
+ android:layout_toRightOf="@id/play_pause" />
+ <com.android.tv.menu.PlayControlsButton
+ android:id="@+id/jump_next"
+ android:layout_width="@dimen/play_controls_button_width"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="@dimen/play_controls_button_normal_margin"
+ android:layout_marginRight="@dimen/play_controls_button_normal_margin"
+ android:layout_toRightOf="@id/fast_forward" />
+ <com.android.tv.menu.PlayControlsButton
+ android:id="@+id/record"
+ android:layout_width="@dimen/play_controls_button_width"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="@dimen/play_controls_button_normal_margin"
+ android:layout_marginRight="@dimen/play_controls_button_normal_margin"
+ android:layout_toRightOf="@id/jump_next"
+ android:visibility="gone" />
+
+ </RelativeLayout>
+
+ <TextView
+ android:id="@+id/unavailable_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:singleLine="true"
+ android:textColor="@color/play_controls_unavailable_message_text_color"
+ android:textSize="@dimen/play_controls_unavailable_message_text_size"
+ android:fontFamily="@string/font"
+ android:visibility="gone"
+ android:text="@string/play_controls_unavailable" />
+ </FrameLayout>
+ </LinearLayout>
+
+ <ImageView
android:id="@+id/time_indicator"
- android:layout_width="@dimen/play_controls_time_indicator_width"
- android:layout_height="@dimen/play_controls_time_indicator_height"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
android:layout_marginTop="@dimen/play_controls_time_indicator_top_margin"
android:layout_alignTop="@id/body"
android:layout_alignStart="@id/body"
android:background="@drawable/play_controls_time_indicator"
+ android:visibility="invisible"
android:elevation="1dp" />
</RelativeLayout>
diff --git a/res/layout/select_input_item.xml b/res/layout/select_input_item.xml
index 12fedca6..1ff6df29 100644
--- a/res/layout/select_input_item.xml
+++ b/res/layout/select_input_item.xml
@@ -28,7 +28,6 @@
<TextView android:id="@+id/input_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:maxWidth="@dimen/input_banner_item_label_max_width"
android:fontFamily="@string/condensed_font"
android:singleLine="true"
android:ellipsize="end"
@@ -38,7 +37,6 @@
android:layout_marginStart="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:maxWidth="@dimen/input_banner_item_label_max_width"
android:fontFamily="@string/condensed_font"
android:singleLine="true"
android:ellipsize="end"
diff --git a/res/transition/dvr_details_shared_element_enter_transition.xml b/res/transition/dvr_details_shared_element_enter_transition.xml
deleted file mode 100644
index d3fc0651..00000000
--- a/res/transition/dvr_details_shared_element_enter_transition.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tv="http://schemas.android.com/apk/res-auto">
- <transition class="com.android.tv.dvr.ui.FadeBackground"
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:duration="500"
- tv:fadingMode="fade_in">
- <targets>
- <target android:targetId="@id/details_frame" />
- <target android:targetId="@id/details_overview_image" />
- <target android:targetId="@id/details_overview_right_panel" />
- </targets>
- </transition>
- <!-- The followings are copied from lb_shared_element_enter_transiton.xml -->
- <fade
- android:fadingMode="fade_in"
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:startDelay="325"
- android:duration="150"/>
- <changeBounds
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:duration="500"/>
- <changeTransform
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:duration="500"/>
- <!-- TODO: Change this to changeImageTransform once b/32405620 is fixed. -->
- <transition class="com.android.tv.dvr.ui.ChangeImageTransformWithScaledParent"
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:duration="500"/>
-</transitionSet> \ No newline at end of file
diff --git a/res/transition/dvr_details_shared_element_return_transition.xml b/res/transition/dvr_details_shared_element_return_transition.xml
deleted file mode 100644
index ceabca46..00000000
--- a/res/transition/dvr_details_shared_element_return_transition.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tv="http://schemas.android.com/apk/res-auto">
- <transition class="com.android.tv.dvr.ui.FadeBackground"
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:duration="325"
- tv:fadingMode="fade_out">
- <targets>
- <target android:targetId="@id/details_frame" />
- <target android:targetId="@id/details_overview_image" />
- <target android:targetId="@id/details_overview_right_panel" />
- </targets>
- </transition>
- <!-- The followings are copied from lb_shared_element_return_transiton.xml -->
- <fade
- android:fadingMode="fade_out"
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:duration="75"/>
- <changeBounds
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:duration="325"/>
- <changeTransform
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:duration="325"/>
- <!-- TODO: Change this to changeImageTransofrm once b/32405620 is fixed. -->
- <transition class="com.android.tv.dvr.ui.ChangeImageTransformWithScaledParent"
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:duration="325"/>
-</transitionSet> \ No newline at end of file
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index ebcafa99..7778e751 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Speelkontroles"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanale"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Onlangse kanale"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV-opsies"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP-opsies"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Speelkontroles onbeskikbaar vir hierdie kanaal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Speel of laat wag"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Vinnig vorentoe"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Onderskrifte"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Vertoonmodus"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Aan"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Af"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-oudio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Kry meer kanale"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Instellings"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Bron"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Ruil"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Aan"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Af"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Klank"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Hoof"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP-venster"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Uitleg"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Regs onder"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Regs bo"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Links bo"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Links onder"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Langs mekaar"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Grootte"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Groot"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Klein"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Invoerbron"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antenna/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Geen programinligting nie"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Geen inligting nie"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Geblokkeerde kanaal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Onbekende taal"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Onderskrifte %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Onbekende taal"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Onderskrifte"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Af"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Pasmaak formatering"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Die PIN is verkeerd. Probeer weer."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Probeer weer. PIN stem nie ooreen nie"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Voer jou poskode in."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Regstreekse kanale-program sal die poskode gebruik om \'n volledige programgids vir die TV-kanale te voorsien."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Voer jou poskode in"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Ongeldige poskode"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Instellings"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Pasmaak kanaallys"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Kies kanale vir jou programgids"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Ouerkontroles"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Oopbronlisensies"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Oopbronlisensies"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Stuur terugvoer"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Weergawe"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Druk Regs en voer jou PIN in om hierdie kanaal te kyk"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Druk Regs en voer jou PIN in om hierdie program te kyk"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Druk KIES"</b>" om na die TV-kieslys te gaan."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Geen TV-invoer gevind nie"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Kan nie die TV-invoer vind nie"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP word nie gesteun nie"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Daar is geen beskikbare invoer om met PIP te wys nie"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Instemmertipe is nie geskik nie. Begin asseblief die Live TV-program vir instemmertipe-TV-invoer."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Kon nie instel nie"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Geen program is gevind om hierdie handeling te behartig nie."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Stoor"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Eenmalige opnames het die hoogste prioriteit"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Kanselleer"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Kanselleer"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Vergeet"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Stop"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Bekyk opnameskedule"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Net hierdie een program"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Neem eerder hierdie een op"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Kanselleer hierdie opname"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Kyk nou"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Vee opnames uit …"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Kan opgeneem word"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Opname geskeduleer"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Opneemkonflik"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Neem tans op"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Kon nie opneem nie"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Lees tans programme om opneemskedules te skep"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Leesprogramme"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Bekyk onlangse opnames"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Die opname van <xliff:g id="PROGRAMNAME">%1$s</xliff:g> is nie volledig nie."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Die opnames van <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> en <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> is onvolledig."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Die opnames van <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> en <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> is onvolledig."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Die opname van <xliff:g id="PROGRAMNAME">%1$s</xliff:g> het nie klaargemaak nie weens onvoldoende bergingspasie."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Die opnames van <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> en <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> het nie klaargemaak nie weens onvoldoende bergingspasie."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Die opnames van <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> en <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> het nie klaargemaak nie weens onvoldoende bergingspasie."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Leesprogramme"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR het meer berging nodig"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Jy sal programme met DVR kan opneem. DVR werk egter nie op die oomblik nie omdat daar nie genoeg berging op jou toestel beskikbaar is nie. Koppel asseblief \'n eksterne hardeskryf wat <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB of groter is en volg die stappe om dit as toestelberging te formateer."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Te min bergingspasie"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Hierdie program sal nie opgeneem word nie omdat daar te min bergingspasie is. Probeer \'n paar bestaande opnames uitvee."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Berging ontbreek"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Van die berging wat DVR gebruik, ontbreek. Koppel asseblief die eksterne skyf wat jy vroeër gebruik het om DVR te heraktiveer. Andersins kan jy kies om die berging te vergeet as dit nie meer beskikbaar is nie."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Vergeet berging?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Al jou opgeneemde inhoud en skedules sal verloor word."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Stop opname?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Die opgeneemde inhoud sal gestoor word."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Die opname van <xliff:g id="PROGRAMNAME">%1$s</xliff:g> sal gestaak word omdat dit met hierdie program bots. Die inhoud wat opgeneem is, sal gestoor word."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Opname is geskeduleer, maar daar is botsings"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Opname het begin, maar daar is konflikte"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> sal opgeneem word."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Dieselfde program is reeds geskeduleer om om <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> opgeneem te word."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Reeds opgeneem"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Hierdie program is reeds opgeneem. Dit is in die DVR-biblioteek beskikbaar."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Reeksopname geskeduleer"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> opnames is geskeduleer vir <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname is geskeduleer vir <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> opnames is geskeduleer vir <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> van hulle sal weens oorvleueling nie opgeneem word nie.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname is geskeduleer vir <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Dit sal weens oorvleueling nie opgeneem word nie.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> opnames is geskeduleer vir <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes van hierdie reeks en ander reekse sal weens oorvleueling nie opgeneem word nie.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname is geskeduleer vir <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodes van hierdie reeks en ander reekse sal weens oorvleueling nie opgeneem word nie.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> opnames is geskeduleer vir <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 episode van \'n ander reeks sal weens oorvleueling nie opgeneem word nie.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname is geskeduleer vir <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 episode van \'n ander reeks sal weens oorvleueling nie opgeneem word nie.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> opnames is geskeduleer vir <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes van \'n ander reeks sal weens oorvleueling nie opgeneem word nie.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname is geskeduleer vir <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodes van \'n ander reeks sal weens oorvleueling nie opgeneem word nie.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Kon nie opgeneemde program vind nie."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Verwante opnames"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Geen programbeskrywing nie)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Stop om reeks op te neem?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Opgeneemde episodes sal in die DVR-biblioteek beskikbaar bly."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Stop"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Geen episodes is tans op die lug nie."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Geen episodes is beskikbaar nie.\nHulle sal opgeneem word sodra hulle beskikbaar is."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minute)</item>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 19950ce0..bd63879b 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"ሞኖ"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"ስቲሪዮ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"የማጫወቻ መቆጣጠሪያዎች"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"ሰርጦች"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"የቅርብ ጊዜ ሰርጦች"</string>
<string name="menu_title_options" msgid="7184594626814914022">"የቴሌቪዥን አማራጮች"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"የፒአይፒ አማራጮች"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"ለዚህ ሰርጥ የማጫወቻ መቆጣጠሪያዎች አይገኝም"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"አጫውት ወይም ለአፍታ አቁም"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"በፍጥነት አሳልፍ"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"የተዘጉ የስዕል መግለጫዎች"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"የማሳያ ሁኔታ"</string>
<string name="options_item_pip" msgid="3951350386626879645">"ፒአይፒ"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"በርቷል"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"ጠፍቷል"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"ባለብዙ ተሰሚ"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"ተጨማሪ ሰርጦችን ያግኙ"</string>
<string name="options_item_settings" msgid="7623205838542400074">"ቅንብሮች"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"ምንጭ"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"ማገላበጥ"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"በርቷል"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"ጠፍቷል"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ድምፅ"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"ዋና"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"የፒአይፒ መስኮት"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"አቀማመጥ"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"ከታች በስተቀኝ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ከላይ በስተቀኝ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ከላይ በስተግራ"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"ከታች በስተግራ"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"ጎን ለጎን"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"መጠን"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"ትልቅ"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"ትንሽ"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"የግብዓት ምንጭ"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"ቴሌቪዥን (አንቴና/ገመድ)"</string>
<string name="no_program_information" msgid="1049844207745145132">"ምንም የፕሮግራም መረጃ የለም"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"ምንም መረጃ የለም"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"የታገደ ሰርጥ"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"ያልታወቀ ቋንቋ"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"ዝግ መግለጫ ጽሑፎች %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"ያልታወቀ ቋንቋ"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"የተዘጉ መግለጫ ጽሑፎች"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"ጠፍቷል"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"ቅርጸትን አብጅ"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"ይህ ፒን የተሳሳተ ነበር። እንደገና ይሞክሩ።"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"እንደገና ይሞክሩ፣ ፒኑ አይዛመድም"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"ዚፕ ኮድዎን ያስገቡ።"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"የLive TV መተግበሪያ ለቴሌቪዥን ሰርጦቹ ሙሉ የፕሮግራም ዝርዝር ለማቅረብ ዚፕ ኮዱን ይጠቀማል።"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"ዚፕ ኮድዎን ያስገቡ"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"ልክ ያልኾነ ዚፕ ኮድ"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"ቅንብሮች"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"የሰርጥ ዝርዝር አብጅ"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"ለፕሮግራሙ መመሪያዎ ሰርጦችን ይምረጡ"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"የወላጅ መቆጣጠሪያዎች"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"የክፍት ምንጭ ፍቃዶች"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"የክፍት ምንጭ ፍቃዶች"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"ግብረ ምላሽ ይላኩ"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"ስሪት"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"ይህን ሰርጥ ለመመልከት ቀኝን ይጫኑ እና የእርስዎን ፒን ያስገቡ"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"ይህን ፕሮግራም ለመመልከት ቀኝን ይጫኑ እና የእርስዎን ፒን ያስገቡ"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"የቴሌቪዥን ምናሌውን ለመድረስ "<b>"ምረጥን ይጫኑ"</b>"።"</string>
<string name="msg_no_input" msgid="3897674146985427865">"ምንም የቴሌቪዥን ግብዓት አልተገኘም"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"የቴሌቪዥን ግብዓቱን ማግኘት አልተቻለም"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"ፒአይፒ አይደገፍም"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"ከፒአይፒው ጋር አብሮ ሊታይ የሚችል ግቤት አይገኝም"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"የቃኚ አይነት ተገቢ አይደለም። እባክዎ የቃኚ አይነት ቴሌቪዥን ግብዓት ለማግኘት የቀጥተኛ ሰርጦች መተግበሪያውን ያስጀምሩት።"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"መቃኘት አልተሳካም"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"ይህን እርምጃ የሚያከናውን ምንም መተግበሪያ አልተገኘም።"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"አስቀምጥ"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"የአንድ-ጊዜ ቀረጻዎች ከፍተኛ ቅድሚያ ተሰጭነት አላቸው"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"ይቅር"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"ተወው"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"እርሳ"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"አቁም"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"የምዝገባ መርሐግብርን ይመልከቱ"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"ይህ ነጠላ ፕሮግራም"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"በምትኩ ይሄኛውን ቅረጽ"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"ይህን ቀረጻ ተወው"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"አሁን ይመልከቱ"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"ቀረጻዎችን ሰርዝ…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"ሊቀረጽ የሚችል"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"ቀረጻ መርሐግብር ተይዞለታል"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"የቀረጻ ግጭት"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"መቅዳት"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"መቅረጽ አልተሳካም"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"የቀረጻ መርሐግብሮችን ለመፍጠር ፕሮግራሞችን በማንበብ ላይ"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"ፕሮግራሞችን በማንበብ ላይ"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"የቅርብ ጊዜ ቅጂዎችን አሳይ"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"የ<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ቅጂ አልተጠናቀቀም።"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"የ<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> እና <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ቅጂዎች አልተጠናቀቁም።"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"የ<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>፣ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> እና <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ቅጂዎች አልተጠናቀቁም።"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"የ<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ቅጂ ባለው በቂ ያልሆነ ማከማቻ ምክንያት አልተጠናቀቀም።"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"የ<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> እና <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ቅጂዎች ባለው በቂ ያልሆነ ማከማቻ ምክንያት አልተጠናቀቁም።"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"የ<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>፣ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> እና <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ቅጂዎች ባለው በቂ ያልሆነ ማከማቻ ምክንያት አልተጠናቀቁም።"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"ፕሮግራሞችን በማንበብ ላይ"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"ዲቪአር ተጨማሪ ማከማቻ ያስፈልገዋል"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"ፕሮግራሞችን በዲቪአር መቅረጽ ይችላሉ። ይሁንና አሁን ዲቪአር እንዲሰራ በመሣሪያዎ ላይ በቂ የማከማቻ ቦታ የለም። እባክዎ <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> ጊባ ወይም ከዚያ በላይ የሆነ ውጫዊ አንጻፊ ይሰኩና እንደ የመሣሪያ ማከማቻ ቅርጸት ለመስራት ያሉትን ደረጃዎች ይከተሉ።"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"በቂ ማከማቻ የለም"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"በቂ ማከማቻ ስለሌለ ይህ ፕሮግራም አይቀረጽም። አሁን ያሉ አንዳንድ ቀረጻዎችን ለመሰረዝ ይሞክሩ።"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"የሚጎድል ማከማቻ"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"በDVR ጥቅም ላይ የዋለ አንዳንድ ማከማቻ ይጎድላል። DVRን ዳግም ለማንቃት ከዚህ በፊት የሚጠቀሙበትን ውጫዊ አንጻፊ እባክዎ ያገናኙ። በአማራጭነት፣ ከእንግዲህ የማይገኝ ከሆነ ማከማቻውን ለመርሳት መምረጥ ይችላሉ።"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"ማከማቻ ይረሳ?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"ሁሉም የእርስዎ የተቀዳ ይዘት እና መርሐግብሮች ይጠፋሉ።"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"መቅረጽ ይቁም?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"የተቀረጸው ይዘት ይቀመጣል።"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"የ<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ቀረጻ ከዚህ ፕሮግራም ጋር ስለሚጋጭ ይቆማል። የተቀረጸው ይዘት ይቀመጣል።"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ምዝገባ መርሐግብር ተይዞለታል፣ ነገር ግን ግጭቶች አሉ"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ቀረጻ ተጀምሯል፣ ነገር ግን ግጭቶች አሉት"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ይቀረጻል።"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"ተመሳሳዩ ፕሮግራም አስቀድሞ በ<xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> ላይ እንዲቀረጽ መርሐግብር ተይዞለታል።"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"አስቀድሞ ተቀርጿል"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"ይህ ፕሮግራም አስቀድሞ ተቀርጿል። በዲቪአር ቤተ-መጽሐፍት ውስጥ ይገኛል።"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"የተከታታዮች ቀረጻ መርሐግብር ተይዞለታል"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_3">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል።</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_3">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል።</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_3">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል። ከእነሱ ውስጥ <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> በግጭቶች ምክንያት አይቀረጹም።</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_3">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል። ከእነሱ ውስጥ <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> በግጭቶች ምክንያት አይቀረጹም።</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_4">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል። <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> የዚህ ተከታታይ እና የሌሎች ተከታታዮች ትርዒት ክፍሎች በግጭቶች ምክንያት አይቀረጹም።</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_4">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል። <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> የዚህ ተከታታይ እና የሌሎች ተከታታዮች ትርዒት ክፍሎች በግጭቶች ምክንያት አይቀረጹም።</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_3">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል። 1 የሌሎች ተከታታዮች የትርዒት ክፍል በግጭት ምክንያት አይቀረጽም።</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_3">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል። 1 የሌሎች ተከታታዮች የትርዒት ክፍል በግጭት ምክንያት አይቀረጽም።</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_4">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል። <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> የሌላ ተከታታይ የትዕይንት ክፍሎች በግጭቶች ምክንያት አይቀረጹም።</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ቀረጻዎች ለ<xliff:g id="SERIESNAME_4">%2$s</xliff:g> የጊዜ መርሐግብር ተይዞላቸዋል። <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> የሌላ ተከታታይ የትዕይንት ክፍሎች በግጭቶች ምክንያት አይቀረጹም።</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"የተቀረጸ ፕሮግራም አልተገኘም።"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"ተዛማጅ ቀረጻዎች"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(ምንም የፕሮግራም መግለጫ የለም)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"የተከታታይ ቀረጻ ይቆም?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"የተቀረጹ ክፍሎች በዲቪአር ቤተ-መጽሐፍቱ ላይ የሚገኙ እንደሆኑ ይቆያሉ።"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"አቁም"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ምንም ተከታታይ የትዕይንት ክፍሎች የሉም።"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"ምንም ክፍሎች አይገኙም።\nልክ የሚገኙ ሲሆኑ ይቀረጻሉ።"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d ደቂቃዎች)</item>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 2b380242..f91139b9 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"أحادية"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"ستيريو"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"عناصر التحكم في التشغيل"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"القنوات"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"أحدث القنوات"</string>
<string name="menu_title_options" msgid="7184594626814914022">"خيارات التلفزيون"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"‏خيارات PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"عناصر تحكم التشغيل غير متاحة لهذه القناة"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"تشغيل الفيديو أو إيقافه مؤقتًا"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"تقديم سريع"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"التسميات التوضيحية المغلقة"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"وضع العرض"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"تشغيل"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"إيقاف"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"إعدادات صوتية متعددة"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"جلب قنوات أخرى"</string>
<string name="options_item_settings" msgid="7623205838542400074">"الإعدادات"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"المصدر"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"تبديل"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"تشغيل"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"إيقاف"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"الصوت"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"الرئيسي"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"‏نافذة PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"التنسيق"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"أسفل اليمين"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"أعلى اليمين"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"أعلى اليسار"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"أسفل اليسار"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"جنبًا إلى جنب"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"الحجم"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"كبيرة"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"صغيرة"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"مصدر الإدخال"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"تلفزيون (هوائي/كابل)"</string>
<string name="no_program_information" msgid="1049844207745145132">"لا تتوفّر معلومات عن البرنامج"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"لا توجد معلومات"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"القناة المحظورة"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"لغة غير معروفة"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"‏مقاطع ترجمة وشرح %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"لغة غير معروفة"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"التسميات التوضيحية المغلقة"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"إيقاف"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"تخصيص التنسيق"</string>
@@ -124,10 +143,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"رقم التعريف الشخصي هذا خاطئ. أعد المحاولة."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"أعد المحاولة، رقم التعريف الشخصي غير مطابق"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"أدخل الرمز البريدي."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"‏سيستخدم تطبيق Live TV الرمز البريدي لتوفير دليل برامج كامل لقنوات التلفزيون."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"أدخل الرمز البريدي"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"الرمز البريدي غير صالح"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"الإعدادات"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"تخصيص قائمة قنوات"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"اختر القنوات الخاصة بدليل البرامج."</string>
@@ -136,7 +151,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"أدوات الرقابة الأبوية"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"تراخيص البرامج المفتوحة المصدر"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"تراخيص البرامج المفتوحة المصدر"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"إرسال تعليقات"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"الإصدار"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"لمشاهدة هذه القناة، اضغط على اليمين وأدخل رقم التعريف الشخصي"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"لمشاهدة هذا البرنامج، اضغط على اليمين وأدخل رقم التعريف الشخصي"</string>
@@ -183,6 +197,8 @@
<string name="intro_description" msgid="7806473686446937307">"‏"<b>"اضغط على \"تحديد\""</b>" للوصول إلى قائمة TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"لم يتم العثور على إدخال تلفزيون"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"لا يمكن العثور على إدخال تلفزيون"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"‏خدمة PIP ليست متوافقة"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"‏ليس هناك إدخال متاح يمكن عرضه باستخدام PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"نوع الموالف غير مناسب، لذلك يُرجى تشغيل تطبيق القنوات المباشرة لنوع الموالف إدخال التلفزيون."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"أخفق التوليف"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"لم يتم العثور على تطبيق يمكنه مباشرة هذا الإجراء."</string>
@@ -283,6 +299,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"حفظ"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"تسجيلات المرة الواحدة لها الأولوية القصوى"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"إلغاء"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"إلغاء"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"حذف"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"إيقاف"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"عرض جدول عمليات التسجيل الزمني"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"هذا البرنامج وحده"</string>
@@ -292,29 +310,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"تسجيل هذا بدلاً من ذلك"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"إلغاء هذا التسجيل"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"المشاهدة الآن"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"حذف التسجيلات…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"قابل للتسجيل"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"تمتّ جدولة التسجيل"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"تعارض في التسجيل"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"جارٍ التسجيل"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"أخفق التسجيل"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"جارٍ قراءة البرامج لإنشاء جداول زمنية للتسجيل"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"جارٍ قراءة البرامج"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"عرض التسجيلات الأخيرة"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"لم يكتمل تسجيل <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"لم يكتمل تسجيل كل من <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> و<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"لم يكتمل تسجيل كل من <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> و<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> و<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"لم يكتمل تسجيل <xliff:g id="PROGRAMNAME">%1$s</xliff:g> نظرًا لأن سعة التخزين غير كافية."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"لم يكتمل تسجيل كل من <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> و<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> نظرًا لأن سعة التخزين غير كافية."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"لم يكتمل تسجيل كل من <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> و<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> و<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> نظرًا لأن سعة التخزين غير كافية."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"جارٍ قراءة البرامج"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"يحتاج مسجِّل الفيديو الرقمي إلى المزيد من السعة التخزينية"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"ستتمكن من تسجيل البرامج باستخدام مسجّل الفيديو الرقمي؛ ولكن ليست هناك سعة تخزينية كافية على جهازك الآن ليعمل مسجِّل الفيديو الرقمي. يُرجى توصيل محرك أقراص خارجي بسعة تخزين <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>غيغابايت أو أكبر واتباع الخطوات لتهيئته كوحدة تخزين للجهاز."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"السعة التخزينية غير كافية"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"لن يتم تسجيل هذا البرنامج لأنه ليست هناك سعة تخزين كافية. جرِّب حذف بعض التسجيلات الحالية."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"سعة التخزين المفقودة"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"‏بعض سعة التخزين المستخدمة في جهاز DVR مفقود. يُرجى توصيل محرك الأقراص الخارجي الذي سبق لك استخدامه لإعادة تمكين جهاز DVR. بدلاً من ذلك، يمكنك اختيار حذف سعة التخزين إذا لم تعد متاحة."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"هل تريد حذف سعة التخزين؟"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"سيتم فقد جميع المحتويات والجداول الزمنية المسجَّلة."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"هل تريد إيقاف التسجيل؟"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"سيتم حفظ المحتوى الذي تم تسجيله."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"سيتم إيقاف تسجيل <xliff:g id="PROGRAMNAME">%1$s</xliff:g> لأنه يتعارض مع هذا البرنامج. وسيتم حفظ المحتوى الذي تم تسجيله."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"تمت إضافة جدول زمني لإجراء التسجيل ولكنه يتعارض مع جداول زمنية أخرى"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"تم بدء التسجيل ولكنه يتعارض مع جداول زمنية أخرى"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"لن يتم تسجيل <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -336,47 +350,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"تم إعداد جدول زمني من قبل لتسجيل البرنامج نفسه في <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"تم التسجيل من قبل"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"‏تم تسجيل هذا البرنامج من قبل. وسيكون متاحًا في مكتبة DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"تمت جدولة تسجيل المسلسل"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="zero">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="two">تمت جدولة تسجيلين (<xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="few">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيلات لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="many">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيلاً لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">تمت جدولة تسجيل واحد (<xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="zero">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> من الحلقات بسبب تعارض المواعيد.</item>
- <item quantity="two">تمت جدولة تسجيلين (<xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> من الحلقات بسبب تعارض المواعيد.</item>
- <item quantity="few">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيلات لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> من الحلقات بسبب تعارض المواعيد.</item>
- <item quantity="many">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيلاً لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> من الحلقات بسبب تعارض المواعيد.</item>
- <item quantity="other">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> من الحلقات بسبب تعارض المواعيد.</item>
- <item quantity="one">تمت جدولة تسجيل واحد (<xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. ولن يتم إجراء هذا التسجيل بسبب تعارض المواعيد.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="zero">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات هذا المسلسل والمسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="two">تمت جدولة تسجيلين (<xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات هذا المسلسل والمسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="few">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> تسجيلات لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات هذا المسلسل والمسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="many">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> تسجيلاً لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات هذا المسلسل والمسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="other">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات هذا المسلسل والمسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="one">تمت جدولة تسجيل واحد (<xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> من حلقات هذا المسلسل والمسلسل الآخر بسبب تعارض المواعيد.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="zero">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل حلقة واحدة من المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="two">تمت جدولة تسجيلين (<xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل حلقة واحدة من المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="few">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيلات لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل حلقة واحدة من المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="many">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيلاً لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل حلقة واحدة من المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="other">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. ولن يتم تسجيل حلقة واحدة من المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="one">تمت جدولة تسجيل واحد (<xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. ولن يتم تسجيل حلقة واحدة من المسلسل الآخر بسبب تعارض المواعيد.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="zero">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="two">تمت جدولة تسجيلين (<xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="few">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> تسجيلات لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="many">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> تسجيلاً لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="other">تمت جدولة <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> تسجيل لمسلسل <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> من حلقات المسلسل الآخر بسبب تعارض المواعيد.</item>
- <item quantity="one">تمت جدولة تسجيل واحد (<xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>) لمسلسل <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. ولن يتم تسجيل <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> من حلقات المسلسل الآخر بسبب تعارض المواعيد.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"لم يتم العثور على البرنامج المُسّجل"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"تسجيلات ذات صلة"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(لا يتوفر وصف للبرنامج)"</string>
@@ -407,7 +388,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"هل تريد إيقاف تسجيل السلسلة؟"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"‏ستظل الحلقات المسجّلة متاحة في مكتبة DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"إيقاف"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ليست هناك حلقات يتم بثها على الهواء حاليًا."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"لا تتوفر أي حلقات.\nسيتم تسجيلها بعد توفرها."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="zero">‏(%1$d دقيقة)</item>
diff --git a/res/values-az-rAZ/arrays.xml b/res/values-az/arrays.xml
index 7f891617..7f891617 100644
--- a/res/values-az-rAZ/arrays.xml
+++ b/res/values-az/arrays.xml
diff --git a/res/values-az-rAZ/rating_system_strings.xml b/res/values-az/rating_system_strings.xml
index bd28a4e8..bd28a4e8 100644
--- a/res/values-az-rAZ/rating_system_strings.xml
+++ b/res/values-az/rating_system_strings.xml
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az/strings.xml
index 7fef1469..6ccb6d24 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Oyun kontrolu"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanallar"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Son kanallar"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV seçənəkləri"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP seçənəklər"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Oxutma idarə elementləri bu kanal üçün əlçatan deyil"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Oxudun və ya durdurun"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Sürətlə irəli"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Qapalı başlıqlar"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Ekran rejimi"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Aktiv"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Qeyri-aktiv"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Daha çox kanal əldə edin"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Ayarlar"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Mənbə"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Dəyişdirin"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Aktiv"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Qeyri-aktiv"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Səs"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Əsas"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP pəncərəsi"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Etiket"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Aşağı sağ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Yuxarı sağ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Yuxarı sol"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Aşağı sol"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Yan-yana"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Ölçü"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Böyük"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Kiçik"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Mənbəni daxil edin"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"No proqram informasiya"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Məlumat yoxdur"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"bloklanmış kanallar"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Naməlum dil"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Subtitr %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Naməlum dil"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Qapalı başlıqlar"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Deaktiv"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Formatı fərdiləşdirin"</string>
@@ -118,10 +137,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Həmin PİN kod səhv idi. Yenidən cəhd edin."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Yenidən cəhd edin, PİN uyğun deyil"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Poçt İndeksi daxil edin."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Canlı Kanal tətbiqi TV kanallarını tam proqram təlimatı ilə təmin etmək üçün Poçt İndeksi istifadə edəcək."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Poçt İndeksi daxil edin"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Yanlış Poçt İndeksi"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Ayarlar"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Kanal siyahısını fərdiləşdirin"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Proqram təlimatınız üçün kanal seçin"</string>
@@ -130,7 +145,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Valideyn nəzarəti"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Açıq mənbə lisenziyaları"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Açıq mənbə lisenziyaları"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Cavab rəyi göndərin"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versiya"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Bu kanalı izləmək üçün Sağa basın və PİN kodunuzu daxil edin"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Bu proqramı izləmək üçün Sağa basın və PİN kodunuzu daxil edin"</string>
@@ -169,6 +183,8 @@
<string name="intro_description" msgid="7806473686446937307">"TV menyusuna giriş üçün "<b>"SEÇİN basın"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"TV daxiletmə tapılmadı"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV daxiletmə tapılmır"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP dəstəklənmir"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP ilə göstərilə biləcək əlçatan daxiletmə yoxdur"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Sazlama növü uyğun deyil. TV daxiletmə sazlama növü üçün Canlı Kanallar tətbiqini işə salın."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Sazlama alınmadı"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Bu əməliyyatı idarə etmək üçün heç bir tətbiq tapılmadı."</string>
@@ -245,6 +261,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Yadda saxlayın"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Bir dəfəlik qeydiyyatlar yüksək prioritetlidir"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Ləğv edin"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Ləğv edin"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Unudun"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Dayandırın"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Qeydiyyat cədvəlinə baxın"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Tək bu proqram"</string>
@@ -254,29 +272,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Əvəzinə bunu qeydə alın"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Bu qeydə almanı ləğv edin"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"İndi baxın"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Qeydə almaları silin..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Qeydə alınabilən"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Qeydiyyat planlaşdırılıb"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Qeydiyyat münaqişəsi"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Qeydə alınır"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Qeydə alma uğursuz oldu"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Qeyd etmə cədvəli yaratmaq üçün proqramlar oxunur"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Oxuma proqramları"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Son yazılara baxın"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> qeydə alınması tamamlanmadı."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> və <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> qeydə alınması tamamlanmadı."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> və <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> qeydə alınması tamamlanmadı."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Yetərsiz yaddaş səbəbi ilə <xliff:g id="PROGRAMNAME">%1$s</xliff:g> qeydə alınması tamamlanmadı."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Yetərsiz yaddaş səbəbi ilə <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> və <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> qeydə alınması tamamlanmadı."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Yetərsiz yaddaş səbəbi ilə <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> və <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> qeydə alınması tamamlanmadı."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Oxuma proqramları"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR üçün əlavə yaddaş tələb olunur"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"DVR ilə proqram qeydə ala biləcəksiniz. Hazırda DVR-ın işləməsi üçün cihazda kifayət qədər yaddaş yoxdur. <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB və ya daha böyük həcmli xarici yaddaşı qoşun və cihaz yaddaşı olaraq format etmək üçün mərhələlərə riayət edin."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Kifayət qədər yer yoxdur"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Kifayət qədər boş yer olmadığı üçün bu proqram qeydə alınmayacaq. Bəzi mövcud qeydə almaları silməyə çalışın."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Yaddaş catışmır"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR tərəfindən istifadə olunan yaddaşın bir hissəsi əlçatan deyil. DVR\'ı yenidən aktiv etməmişdən əvvəl istifadə etdiyiniz xarici diskə qoşulun. Bundan başqa, artıq əlçatan deyilsə, yaddaşı unutmağı seçə bilərsiniz."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Yaddaş ehtiyyatını unutmusunuz?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Qeydə alınmış bütün məzmun və cədvəlləriniz itəcək."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Qeydetmə dayandırılsın?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Qeydə alınan məzmun yadda saxlanacaq."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Bu proqram ilə ziddiyyəti olduğu üçün <xliff:g id="PROGRAMNAME">%1$s</xliff:g> proqramının qeydə alınması dayandırılacaq. Qeydə alınmış məzmun yadda saxlanacaq."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Qeydiyyat vaxtı təyin edilib lakin ziddiyətlər var"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Qeydə alma başladı, lakin ziddiyətlər var."</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> qeydə alınacaq."</string>
@@ -294,27 +308,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Eyni proqramın qeydə alınması üçün artıq <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> radələrində vaxt təyin edilib."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Artıq qeydə alınıb"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Bu proqram artıq qeydə alınıb. O, DVR kitabxanasında əlçatandır."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Seriyaların qeydiyyatı planlaşdırıldı"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_3">%2$s</xliff:g> üçün təyin edildi.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_1">%2$s</xliff:g> üçün təyin edildi.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_3">%2$s</xliff:g> üçün təyin edildi. Onlardan <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> ədədi ziddiyyət səbəbilə qəydə alınmayacaq.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_1">%2$s</xliff:g> üçün təyin edildi. Bu, ziddiyyət səbəbilə qəydə alınmayacaq.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_4">%2$s</xliff:g> üçün təyin edildi. Bu seriyaların <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizodu və digər seriyalar ziddiyyət səbəbilə qeydə alınmayacaq.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_1">%2$s</xliff:g> üçün təyin edildi. Bu seriyaların <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> epizodu və digər seriyalar ziddiyyət səbəbilə qeydə alınmayacaq.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_3">%2$s</xliff:g> üçün təyin edildi. Digər seriyaların 1 epizodu ziddiyyət səbəbilə qeydə alınmayacaq.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_1">%2$s</xliff:g> üçün təyin edildi. Digər seriyaların 1 epizodu ziddiyyət səbəbilə qeydə alınmayacaq.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_4">%2$s</xliff:g> üçün təyin edildi. Digər seriyaların <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizodu ziddiyyət səbəbilə qeydə alınmayacaq.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> qeydə alma <xliff:g id="SERIESNAME_1">%2$s</xliff:g> üçün təyin edildi. Digər seriyaların <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> epizodu ziddiyyət səbəbilə qeydə alınmayacaq.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Qeyd edilmiş proqram tapılmadı."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Əlaqədar qeydetmələr"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Proqramın təsviri yoxdur)"</string>
@@ -337,7 +338,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Ardıcıl qeydə alma dayandırılsın?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Qeydə alınmış epizodlar DVR kitabxanasında əlçatan olacaq."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Dayandırın"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Heç bir epizod indi canlı yayımda deyil."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Heç bir epizod əlçatan deyil.\nOnlar, əlçatan olduqda qeydə alınacaq."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d dəqiqə)</item>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 01364be3..ab202fe2 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"моно"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"стерео"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Контроли за пускане"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Канали"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Скорошни канали"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Опции за TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Опции за PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"За този канал няма налични контроли за възпроизвеждане"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Пускане или поставяне на пауза"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Превъртане напред"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Надписи"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Показв.: Режим"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Вкл."</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Изкл."</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Много записи"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Още канали"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Настройки"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Източник"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Размяна"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Вкл."</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Изкл."</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Звук"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Основен"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Прозорец на PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Оформление"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Долу вдясно"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Горе вдясно"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Горе вляво"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Долу вляво"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Редом"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Размер"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Голям"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Малък"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Вход"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Телевизор (антена/кабел)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Няма информация за програмите"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Няма информация"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Блокиран канал"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Неизвестен език"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Надписи: %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Неизвестен език"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Надписи"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Изключване"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Форматиране: Персон."</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Този ПИН код бе грешен. Опитайте отново."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Опитайте отново, ПИН кодът не е идентичен"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Въведете пощенския си код."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Приложението Телевизия онлайн ще използва пощенския код, за да предоставя пълния програмен справочник за телевизионните канали."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Въведете пощенския си код"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Пощенският код е невалиден"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Настройки"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Персон. на списъка с канали"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Изберете канали за програмния си справочник"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Родителски контроли"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Лицензи за отворен код"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Лицензи за отворен код"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Изпращане на отзиви"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Версия"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"За да гледате този канал, натиснете стрелката за надясно и въведете ПИН кода си"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"За да гледате тази програма, натиснете стрелката за надясно и въведете ПИН кода си"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Натиснете „ИЗБИРАНЕ“"</b>" за достъп до менюто на телевизора."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Няма намерен вход на телевизора"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Входът на телевизора не може да бъде намерен"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Функцията „Картина в картината“ не се поддържа"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Няма наличен вход, който да може да се показва с PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Типът тунер не е подходящ. Моля, стартирайте приложението Live TV за телевизионен вход от типа „тунер“."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Настройването не бе успешно"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Не бе намерено приложение за извършване на това действие."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Запазване"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Най-висок приоритет имат еднократните записи"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Отказ"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Отказ"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Забравяне"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Спиране"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Вижте графика за записване"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Само тази програма"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Записване на тази програма"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Анулиране на този запис"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Гледайте сега"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Изтриване на записи…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"С възможност за запис"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Записът е насрочен"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Конфликт със записа"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Записва се"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Записването не бе успешно"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Програмите се четат с цел създаване на графици за записване"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Програмите се четат"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Преглед на скорошните записи"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Записът на „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ е непълен."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Записите на „<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>“ и „<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>“ са непълни."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Записите на „<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>“, „<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>“ и „<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>“ са непълни."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Записването на „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ не завърши поради недостатъчно място в хранилището."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Записването на „<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>“ и „<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>“ не завърши поради недостатъчно място в хранилището."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Записването на „<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>“, „<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>“ и „<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>“ не завърши поради недостатъчно място в хранилището."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Програмите се четат"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Дигиталният видеорекордер се нуждае от още място за съхранение"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Ще сте в състояние да записвате програми посредством дигиталния видеорекордер. В момента обаче той не може да работи, тъй като няма достатъчно място в хранилището на устройството ви. Моля, свържете външен диск с размер от поне <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> ГБ и изпълнете стъпките, за да го форматирате като хранилище на устройството."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Няма достатъчно място в хранилището"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Тази програма няма да бъде записана, защото няма достатъчно място в хранилището. Пробвайте да изтриете някои съществуващи записи."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Хранилището липсва"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Част от използваното от цифровия видеорекордер хранилище липсва. Моля, свържете по-рано ползвания от вас външен диск, за да активирате отново видеорекордера. Друга възможност е да изберете хранилището да се забрави, ако вече не е налично."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Да се забрави ли хранилището?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Цялото ви записано съдържание и графици ще бъдат изгубени."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Да се спре ли записването?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Записаното съдържание ще бъде запазено."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Записването на „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ ще бъде спряно, защото е в конфликт с тази програма. Записаното съдържание ще бъде запазено."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Записът е насрочен, но има конфликти"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Записването започна, но има конфликти"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"„<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ ще се запише."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Същата програма вече е насрочена за записване в <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Вече записахте"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Тази програма вече е записана. Тя е налична в библиотеката на устройството за дигитален видеозапис."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Записването на поредицата е насрочено"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">За „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ са насрочени <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записа.</item>
- <item quantity="one">За „<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“ е насрочен <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> запис.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">За „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ са насрочени <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записа. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> епизода няма да бъдат записани поради конфликти.</item>
- <item quantity="one">За „<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“ е насрочен <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> запис. Епизодът няма да бъде записан поради конфликти.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">За „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ са насрочени <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записа. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизода от тази и от друга поредица няма да бъдат записани поради конфликти.</item>
- <item quantity="one">За „<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“ е насрочен <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> запис. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> епизода от тази и от друга поредица няма да бъдат записани поради конфликти.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">За „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ са насрочени <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записа. 1 епизод от друга поредица няма да бъде записан поради конфликти.</item>
- <item quantity="one">За „<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“ е насрочен <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> запис. 1 епизод от друга поредица няма да бъде записан поради конфликти.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">За „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ са насрочени <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записа. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизода от друга поредица няма да бъдат записани поради конфликти.</item>
- <item quantity="one">За „<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“ е насрочен <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> запис. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> епизода от друга поредица няма да бъдат записани поради конфликти.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Записаната програма не е намерена."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Сродни записи"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Няма описание на програмата)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Да се спре ли записването на поредицата?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Записаните епизоди ще останат налице в библиотеката на устройството за дигитален видеозапис."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Спиране"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"В момента не се излъчва нито един епизод."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Няма налични епизоди.\nТе ще бъдат записани, когато са налице."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d минути)</item>
diff --git a/res/values-bn-rBD-v23/strings.xml b/res/values-bn-v23/strings.xml
index b3134242..b3134242 100644
--- a/res/values-bn-rBD-v23/strings.xml
+++ b/res/values-bn-v23/strings.xml
diff --git a/res/values-bn-rBD/arrays.xml b/res/values-bn/arrays.xml
index 76a0792a..76a0792a 100644
--- a/res/values-bn-rBD/arrays.xml
+++ b/res/values-bn/arrays.xml
diff --git a/res/values-bn-rBD/rating_system_strings.xml b/res/values-bn/rating_system_strings.xml
index 81c9593b..81c9593b 100644
--- a/res/values-bn-rBD/rating_system_strings.xml
+++ b/res/values-bn/rating_system_strings.xml
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn/strings.xml
index d9dcf01e..52938ab2 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"মোনো"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"স্টিরিও"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"খেলার নিয়ন্ত্রণগুলি"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"চ্যানেলগুলি"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"সাম্প্রতিক চ্যানেলগুলি"</string>
<string name="menu_title_options" msgid="7184594626814914022">"টিভি বিকল্পগুলি"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP বিকল্পগুলি"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"এই চ্যানেলটির জন্য প্লে নিয়ন্ত্রণগুলি অনুপলব্ধ"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"প্লে করুন বা বিরাম দিন"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"দ্রুত ফরওয়ার্ড"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"সাবটাইটেলগুলি"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"প্রদর্শন মোড"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"চালু"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"বন্ধ"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"একাধিক-অডিও"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"আরো চ্যানেল পান"</string>
<string name="options_item_settings" msgid="7623205838542400074">"সেটিংস"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"উৎস"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"সোয়াইপ করুন"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"চালু"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"বন্ধ"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"আওয়াজ"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"প্রধান"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP উইন্ডো"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"লেআউট"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"ডানদিকে নীচে"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ডানদিকে শীর্ষে"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"বামদিকে শীর্ষে"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"বামদিকে নীচে"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"পাশাপাশি"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"আকার"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"বড়"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"ক্ষুদ্র"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"ইনপুট উৎস"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (অ্যান্টেনা/কেবল)"</string>
<string name="no_program_information" msgid="1049844207745145132">"কোনো প্রোগ্রাম তথ্য নেই"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"কোনো তথ্য নেই"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"অবরুদ্ধ চ্যানেল"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"অজানা ভাষা"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"সাবটাইটেল %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"অজানা ভাষা"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"সাবটাইটেলগুলি"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"বন্ধ করুন"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"ফর্ম্যাটিং কাস্টমাইজ করুন"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"এই PINটি ভুল ছিল৷ আবার চেষ্টা করুন৷"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"আবার চেষ্টা করুন, পিন মেলেনি"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"আপনার ডাক পিন কোড লিখুন৷"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Live TV অ্যাপটি টিভি চ্যানেলগুলির প্রোগ্রামের সম্পূর্ণ নির্দেশিকা প্রদান করার জন্য ডাক পিন কোড ব্যবহার করবে৷"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"আপনার ডাক পিন কোড লিখুন"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"অবৈধ ডাক পিন কোড"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"সেটিংস"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"চ্যানেল তালিকা কাস্টমাইজ করুন"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"আপনার প্রোগ্রাম গাইডের জন্য চ্যানেলগুলি নির্বাচন করুন"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"অভিভাবকীয় নিয়ন্ত্রণগুলি"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"মুক্ত উৎস লাইসেন্সগুলি"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"মুক্ত উৎস লাইসেন্সগুলি"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"প্রতিক্রিয়া পাঠান"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"সংস্করণ"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"এই চ্যানেলটিকে দেখতে, ডানদিকে চাপুন এবং আপনার পিন লিখুন"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"এই প্রোগ্রামটি দেখতে, ডানদিকে চাপুন এবং আপনার পিন লিখুন"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"টিভি মেনু অ্যাক্সেস করতে "<b>"নির্বাচন করুন টিপুন"</b>"৷"</string>
<string name="msg_no_input" msgid="3897674146985427865">"কোনো TV ইনপুট খুঁজে পাওয়া যায়নি"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV ইনপুট খুঁজে পাওয়া যায়নি"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP সমর্থিত নয়"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP এর সাথে দেখানো যেতে পারে এমন কোনো উপলব্ধ ইনপুট নেই"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"টিউনারের প্রকারটি উপযুক্ত নয়; টিউনার প্রকারের টিভি ইনপুটের জন্য দয়া করে লইভ চ্যানেলগুলি অ্যাপ্লিকেশানটি লঞ্চ করুন৷"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"টিউন করা ব্যর্থ হয়েছে"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"এই ক্রিয়াটিকে চালনা করার জন্য কোনো অ্যাপ্লিকেশান পাওয়া যায়নি৷"</string>
@@ -212,10 +228,10 @@
</plurals>
<string name="dvr_detail_watch" msgid="7085694764364338215">"দেখুন"</string>
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"শুরু থেকে প্লে করুন"</string>
- <string name="dvr_detail_resume_play" msgid="875591300274416373">"আবার প্লে করুন"</string>
+ <string name="dvr_detail_resume_play" msgid="875591300274416373">"পুনরায় প্লে করুন"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"মুছুন"</string>
<string name="dvr_detail_series_delete" msgid="4831926831670312674">"রেকডিংগুলি মুছুন"</string>
- <string name="dvr_detail_series_resume" msgid="6935136228671386246">"আবার শুরু করুন"</string>
+ <string name="dvr_detail_series_resume" msgid="6935136228671386246">"পুনরায় শুরু করুন"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"সিজন <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"সময়সূচী দেখুন"</string>
<string name="dvr_detail_read_more" msgid="2588920758094498544">"আরো পড়ুন"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"সংরক্ষণ করুন"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"একবার করা রেকর্ডিংগুলিতে সর্বোচ্চ অগ্রাধিকার রয়েছে"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"বাতিল করুন"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"বাতিল করুন"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"মুছে দিন"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"থামান"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"রেকডিং এর সময়সূচী দেখুন"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"শুধুমাত্র এই প্রোগ্রামটি"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"বরং এটি রেকর্ড করুন"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"এই রেকর্ডিং বাতিল করুন"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"এখনই দেখুন"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"রেকডিংগুলি মুছুন..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"রেকর্ড করা যাবে"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"রেকর্ডিংএর সময় নির্ধারিত হয়েছে"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"রেকর্ডিং দ্বন্দ্ব"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"রেকর্ড করা হচ্ছে"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"রেকডিং করা গেল না"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"রেকর্ডিংয়ের সময়সূচীগুলি তৈরি করতে প্রোগ্রামগুলি পড়া হচ্ছে"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"প্রোগ্রামগুলি পড়া হচ্ছে"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"সাম্প্রতিক রেকর্ডিংগুলি দেখুন"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> এর রেকর্ডিং অসম্পূর্ণ।"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> এবং <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> এর রেকর্ডিং সম্পূর্ণ।"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> এবং <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> এর রেকর্ডিং অসম্পূর্ণ।"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"অপর্যাপ্ত সঞ্চয়স্থান থাকার কারণে <xliff:g id="PROGRAMNAME">%1$s</xliff:g> এর রেকর্ডিং সম্পূর্ণ হয়নি।"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"অপর্যাপ্ত সঞ্চয়স্থান থাকার কারণে <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> এবং <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> এর রেকর্ডিং সম্পূর্ণ হয়নি।"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"অপর্যাপ্ত সঞ্চয়স্থান থাকার কারণে <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> এবং <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> এর রেকর্ডিং সম্পূর্ণ হয়নি।"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"প্রোগ্রামগুলি পড়া হচ্ছে"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR এর আরো সঞ্চয়স্থান দরকার"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"আপনি DVR এর মাধ্যমে প্রোগ্রাম রেকর্ড করতে পারবেন৷ তবে DVR কাজ করার জন্য আপনার ডিভাইসে এখন যথেষ্ঠ সঞ্চয়স্থান নেই৷ অনুগ্রহ করে <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB বা তার থেকে বড় আকারের কোনো বাহ্যিক ডিভাইসের সাথে সংযোগ করুন এবং ডিভাইসের সঞ্চয়স্থান হিসাবে ফর্ম্যাট করতে পদক্ষেপগুলি অনুসরণ করুন৷"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"পর্যাপ্ত সঞ্চয়স্থান নেই"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"এখানে পর্যাপ্ত সঞ্চয়স্থান না থাকার কারণে এই প্রোগ্রামটিকে রেকর্ড করা যাবে না৷ বিদ্যমান কিছু রেকর্ডিং মোছার চেষ্টা করুন৷"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"সঞ্চয়স্থান অনুপস্থিত"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR দ্বারা ব্যবহৃত কিছু সঞ্চয়স্থান অনুপস্থিত৷ DVR পুনরায় সক্ষম করার আগে অনুগ্রহ করে আপনার আগে ব্যবহার করা বাহ্যিক ড্রাইভ সংযোগ করুন৷ অথবা, যদি সঞ্চয়স্থানটি আর উপলব্ধ না থাকে তবে আপনি সেটিকে মুছে দিতে পারবেন৷"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"সঞ্চয়স্থান মুছতে চান?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"আপনার রেকর্ড করা সমস্ত সামগ্রী এবং সময়সূচী মুছে যাবে৷"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"রেকর্ড করা থামাবেন?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"রেকর্ড করা সামগ্রী সংরক্ষণ করা হবে৷"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"এই প্রোগ্রামের সাথে রেকডিং দ্বন্দ্ব থাকায় <xliff:g id="PROGRAMNAME">%1$s</xliff:g> এর রেকর্ডিং বন্ধ হবে। রেকর্ড করা সামগ্রী সংরক্ষিত হবে।"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"রেকর্ডিংয়ের যে সময় নির্ধারিত করা হয়েছে তাতে অন্যদের সমসয়ের সাথে বিরোধ ঘটাতে পারে।"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"রেকর্ডিং শুরু হয়েছে কিন্তু দ্বন্দ্বগুলি রয়েছে"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> রেকর্ড করা হবে৷"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"একই প্রোগ্রাম ইতিমধ্যেই <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> এ রেকর্ড করার জন্য নির্ধারণ করা হয়েছে।"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"ইতিমধ্যে রেকর্ড করা হয়েছে"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"এই প্রোগ্রামটি ইতিমধ্যে রেকর্ড করা হয়েছে। এটি DVR লাইব্রেরিতে উপলব্ধ।"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"সিরিজ রেকর্ডিংয়ের সময় নির্ধারিত হয়েছে"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে।</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে।</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে। বিরোধগুলির কারণে এগুলির মধ্যে <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>টি পর্ব রেকর্ড করা যাবে না৷</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে। বিরোধগুলির কারণে এগুলির মধ্যে <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>টি পর্ব রেকর্ড করা যাবে না৷</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে। বিরোধগুলির কারণে এটি এবং অন্য সিরিজের <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>টি পর্ব রেকর্ড করা যাবে না৷</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে। বিরোধগুলির কারণে এটি এবং অন্য সিরিজের <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>টি পর্ব রেকর্ড করা যাবে না৷</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে৷ বিরোধগুলির কারণে অন্য সিরিজের ১টি পর্ব রেকর্ড করা যাবে না৷</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে৷ বিরোধগুলির কারণে অন্য সিরিজের ১টি পর্ব রেকর্ড করা যাবে না৷</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে। বিরোধগুলির কারণে অন্য সিরিজের <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>টি পর্ব রেকর্ড করা যাবে না৷</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>টি রেকর্ডিংয়ের সময়সূচি নির্ধারণ করা হয়েছে। বিরোধগুলির কারণে অন্য সিরিজের <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>টি পর্ব রেকর্ড করা যাবে না৷</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"রেকর্ড করা প্রোগ্রাম খুঁজে পাওয়া যায়নি৷"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"সম্পর্কিত রেকর্ডিং"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(প্রোগ্রামের কোনো বিবরণ নেই)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"সিরিজি রেকর্ড করা বন্ধ করতে চান?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"রেকর্ড করা পর্বগুলি DVR লাইব্রেরিতে উপলব্ধ থাকবে৷"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"বন্ধ করুন"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"এখন কোনো পর্বের সম্প্রচার করা হচ্ছে না।"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"কোনো পর্ব উপলব্ধ নেই।\nএকবার উপলব্ধ হলে সেগুলিকে রেকর্ড করা হবে।"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d মিনিট)</item>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 0c74c8ec..3ab61ffb 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"estèreo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Controls de reproducció"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Canals"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Canals recents"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opcions de TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opcions de PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Els controls de reproducció no estan disponibles en aquest canal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Reprodueix o atura"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Avança ràpidament"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Subtítols"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Mode visualitz."</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Activada"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Desactivada"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multiàudio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Obtén més canals"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Configuració"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Font"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Canvia"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Activada"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Desactivada"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"So"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principal"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Finestra PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Disseny"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"A baix a dreta"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"A dalt a dreta"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"A dalt a esq."</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"A baix a esq."</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"En paral·lel"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Mida"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Gran"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Petita"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Font d\'entrada"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Televisió (antena/cable)"</string>
<string name="no_program_information" msgid="1049844207745145132">"No hi ha informació del programa"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"No hi ha informació"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Canal bloquejat"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Idioma desconegut"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Subtítols en %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Idioma desconegut"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Subtítols ocults"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Desactivat"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Personalitza format"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"El PIN era incorrecte. Torna-ho a provar."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Torna-ho a provar. El PIN no coincideix."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Introdueix el codi postal."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"L\'aplicació TV en directe farà servir el codi postal per oferir una programació completa dels canals de televisió."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Introdueix el codi postal"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"El codi postal no és vàlid"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Configuració"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personalitza la llista de canals"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Tria canals per a la programació"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Controls parentals"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Llicències de programari lliure"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Llicències de programari lliure"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Envia suggeriments"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versió"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Per veure aquest canal, prem el botó dret i introdueix el PIN."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Per veure aquest programa, prem el botó dret i introdueix el PIN."</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Prem SELECCIONA"</b>" per accedir al menú de TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"No s\'ha trobat cap entrada de televisió"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"No es troba l\'entrada de televisió"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"No s\'admet la funció PIP"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"No hi ha cap entrada disponible que es pugui mostrar amb PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"El sintonitzador no és apte; inicia l\'aplicació Canals en directe per accedir a l\'entrada del sintonitzador."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"No s\'ha pogut sintonitzar"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"No s\'ha trobat cap aplicació per processar aquesta acció."</string>
@@ -241,6 +257,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Desa"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Els enregistraments únics tenen la prioritat més alta"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Cancel·la"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Cancel·la"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"No recordis"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Atura"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Mostra programa d\'enregistrament"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Només aquest programa"</string>
@@ -250,29 +268,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Enregistra aquest programa"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Cancel·la aquest enregistrament"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Mira ara"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Suprimeix els enregistraments…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Enregistrable"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Enregistrament programat"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Conflicte d\'enregistrament"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"S\'està enregistrant"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Error d\'enregistrament"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"S\'estan llegint els programes per crear programacions d\'enregistrament"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"S\'estan llegint els programes"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Mostra els enregistraments recents"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"L\'enregistrament del programa <xliff:g id="PROGRAMNAME">%1$s</xliff:g> no s\'ha completat."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Els enregistraments dels programes <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> i <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> no s\'han completat."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Els enregistraments dels programes <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> i <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> no s\'han completat."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"L\'enregistrament del programa <xliff:g id="PROGRAMNAME">%1$s</xliff:g> no s\'ha completat perquè no hi ha prou espai d\'emmagatzematge."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Els enregistraments dels programes <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> i <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> no s\'han completat perquè no hi ha prou espai d\'emmagatzematge."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Els enregistraments dels programes <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> i <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> no s\'han completat perquè no hi ha prou espai d\'emmagatzematge."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"S\'estan llegint els programes"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"El DVR necessita més emmagatzematge"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Podràs· enregistrar· programes· amb· el· DVR.· No· obstant· això,· en· aquests· moments· no· tens· prou· emmagatzematge· al· dispositiu· perquè· el· DVR· pugui· funcionar.· Connecta· una· unitat· externa· que· tingui· com· a· mínim· <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB· d\'espai· disponible· i· segueix· els· passos· per· formatar-la· com· a· unitat· d\'emmagatzematge· del· dispositiu."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"No hi ha prou espai d\'emmagatzematge"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Aquest programa no s\'enregistrarà perquè no hi ha prou espai d\'emmagatzematge. Prova de suprimir algun dels enregistraments actuals."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Falta el dispositiu d\'emmagatzematge"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Falta contingut emmagatzemat pel DVR. Connecta la unitat externa que utilitzaves abans per tornar a activar el DVR. Si el dispositiu d\'emmagatzematge ja no està disponible, pots optar perquè s\'oblidi."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Vols que s\'oblidi el dispositiu d\'emmagatzematge?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Tot el contingut i totes les agendes que tinguis desades es perdran."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Vols aturar l\'enregistrament?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"El contingut enregistrat es desarà."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"L\'enregistrament de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> s\'aturarà perquè entra en conflicte amb aquest programa. El contingut enregistrat es desarà."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Hi ha un enregistrament programat, però té conflictes"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"L\'enregistrament ha començat, però té conflictes"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> s\'enregistrarà."</string>
@@ -290,27 +304,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Ja s\'ha programat l\'enregistrament d\'aquest programa per a les <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Ja s\'ha enregistrat"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Aquest programa ja s\'ha enregistrat. El trobaràs a la biblioteca de DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"S\'ha programat l\'enregistrament de la sèrie"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">S\'han programat <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistraments de la sèrie <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">S\'ha programat <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> enregistrament de la sèrie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">S\'han programat <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistraments de la sèrie <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> no s\'enregistraran a causa d\'un conflicte.</item>
- <item quantity="one">S\'ha programat <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> enregistrament de la sèrie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. No s\'enregistrarà a causa d\'un conflicte.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">S\'han programat <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistraments de la sèrie <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodis d\'aquesta i d\'altres sèries no s\'enregistraran a causa d\'un conflicte.</item>
- <item quantity="one">S\'ha programat <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> enregistrament de la sèrie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodis d\'aquesta i d\'altres sèries no s\'enregistraran a causa d\'un conflicte.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">S\'han programat <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistraments de la sèrie <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. No s\'enregistrarà un episodi d\'una altra sèrie a causa d\'un conflicte.</item>
- <item quantity="one">S\'ha programat <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> enregistrament de la sèrie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. No s\'enregistrarà un episodi d\'una altra sèrie a causa d\'un conflicte.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">S\'han programat <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistraments de la sèrie <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. No s\'enregistraran <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodis d\'altres sèries a causa d\'un conflicte.</item>
- <item quantity="one">S\'ha programat <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> enregistrament de la sèrie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. No s\'enregistraran <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodis d\'altres sèries a causa d\'un conflicte.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"El programa enregistrat no s\'ha trobat."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Enregistraments relacionats"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Cap descripció del programa)"</string>
@@ -333,7 +334,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Vols aturar l\'enregistrament de la sèrie?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Els episodis enregistrats continuaran estant disponibles a la biblioteca de DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Atura"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"En aquest moment no s\'està emetent cap episodi en directe."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"No hi ha episodis disponibles.\nS\'enregistraran quan estiguin disponibles."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minuts)</item>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index c859c71b..6dac1751 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Ovládání přehrávání"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanály"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Poslední kanály"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Možnosti TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Možnosti PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Ovládací prvky přehrávání pro tento kanál nejsou k dispozici"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Přehrát nebo pozastavit"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Přetočit vpřed"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Skryté titulky"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Režim zobrazení"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Zapnuto"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Vypnuto"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Vícekanál. zvuk"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Další kanály"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Nastavení"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Zdroj"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Zaměnit"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Zapnuto"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Vypnuto"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Zvuk"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Hlavní"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Okno PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Rozvržení"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Vpravo dole"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Vpravo nahoře"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Vlevo nahoře"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Vlevo dole"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Vedle sebe"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Rozměry"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Velké"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Malé"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Zdroj vstupu"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (anténa/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Žádné informace o programu"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Žádné informace"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blokovaný kanál"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Neznámý jazyk"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Skryté titulky: %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Neznámý jazyk"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Skryté titulky"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Vypnuto"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Nastavit formátování"</string>
@@ -120,10 +139,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Kód PIN byl zadán chybně. Zkuste to znovu."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Kód PIN nesouhlasí. Zkuste to znovu."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Zadejte PSČ."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Aplikace Televize online vám na základě PSČ poskytne kompletního programového průvodce televizními kanály."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Zadejte PSČ"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Neplatné PSČ"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Nastavení"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Upravit seznam kanálů"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Vyberte kanály pro programového průvodce"</string>
@@ -132,7 +147,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Rodičovská ochrana"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licence open source"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licence open source"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Odeslat zpětnou vazbu"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Verze"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Chcete-li tento kanál sledovat, stiskněte šipku vpravo a zadejte kód PIN."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Chcete-li tento program sledovat, stiskněte šipku vpravo a zadejte kód PIN."</string>
@@ -175,6 +189,8 @@
<string name="intro_description" msgid="7806473686446937307">"Chcete-li získat přístup k nabídce TV, "<b>"stiskněte SELECT"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nebyl nalezen žádný televizní vstup."</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Televizní vstup nebyl nalezen."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Funkce PIP není podporována."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Není k dispozici vstup, který lze zobrazovat pomocí PIP."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Typ tuneru není vhodný. Pro TV vstup typu tuneru spusťte aplikaci Televize online."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Ladění se nezdařilo."</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Aplikace potřebná k provedení této akce nebyla nalezena."</string>
@@ -263,6 +279,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Uložit"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Jednorázová nahrávání mají nejvyšší prioritu"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Zrušit"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Zrušit"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Zapomenout"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Zastavit"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Zobrazit plán nahrávání"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Pouze tento program"</string>
@@ -272,29 +290,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Místo toho nahrát tento program"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Zrušit toto nahrávání"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Sledovat"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Smazat nahraný obsah…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Lze nahrát"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Nahrávání je naplánováno"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Konflikt nahrávání"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Nahrávání"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Nahrávání se nezdařilo"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Načítání programů za účelem vytvoření plánů nahrávání"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Načítání programů"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Zobrazit poslední nahrávky"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Program <xliff:g id="PROGRAMNAME">%1$s</xliff:g> se nepodařilo nahrát celý."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Programy <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> a <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> se nepodařilo nahrát celé."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Programy <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> a <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> se nepodařilo nahrát celé."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Nahrávání programu <xliff:g id="PROGRAMNAME">%1$s</xliff:g> nebylo dokončeno z důvodu nedostatku místa v úložišti."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Nahrávání programů <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> a <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> nebylo dokončeno z důvodu nedostatku místa v úložišti."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Nahrávání programů <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> a <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> nebylo dokončeno z důvodu nedostatku místa v úložišti."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Načítání programů"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR potřebuje víc místa"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Programy bude možné nahrát pomocí DVR. Ve vašem zařízení však momentálně není dost místa, a DVR proto nebude fungovat. Zapojte externí úložiště o velikosti minimálně <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB a podle pokynů jej naformátujte jako úložiště zařízení."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Nedostatek místa"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Tento program nebude nahrán z důvodu nedostatku místa. Zkuste smazat část nahraného obsahu."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Úložiště není dostupné"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Část úložiště, které využívá DVR, není dostupná. Před opětovnou aktivací DVR připojte externí disk. Pokud úložiště již není k dispozici, můžete jej zapomenout."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Zapomenout úložiště?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Veškerý nahraný obsah a plány nahrávání budou smazány."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Zastavit nahrávání?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Nahraný obsah bude uložen."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Nahrávání pořadu <xliff:g id="PROGRAMNAME">%1$s</xliff:g> bude zastaveno, protože je v konfliktu s tímto programem. Nahraný obsah bude uložen."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Nahrávání je naplánováno, ale obsahuje konflikty"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Nahrávání bylo zahájeno, ale obsahuje konflikty"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Nahraje se program <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -314,37 +328,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Nahrávání stejného programu již bylo naplánováno na <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Již nahráno"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Tento program již byl nahrán. Naleznete jej v knihovně DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Je naplánováno nahrávání pořadu"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="few">Byla naplánována <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="many">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="few">Byla naplánována <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Z důvodu konfliktů některá nahrávání nebudou provedena (celkem <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>).</item>
- <item quantity="many">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Z důvodu konfliktů některá nahrávání nebudou provedena (celkem <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>).</item>
- <item quantity="other">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Z důvodu konfliktů některá nahrávání nebudou provedena (celkem <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>).</item>
- <item quantity="one">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Z důvodu konfliktů nahrávání nebude provedeno.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="few">Byla naplánována <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Z důvodu konfliktů nebudou nahrány epizody tohoto pořadu a jiných pořadů (celkem <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="many">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Z důvodu konfliktů nebudou nahrány epizody tohoto pořadu a jiných pořadů (celkem <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="other">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Z důvodu konfliktů nebudou nahrány epizody tohoto pořadu a jiných pořadů (celkem <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="one">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Z důvodu konfliktů nebudou nahrány epizody tohoto pořadu a jiných pořadů (celkem <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g>).</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="few">Byla naplánována <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Z důvodu konfliktů nebude nahrána 1 epizoda jiného pořadu.</item>
- <item quantity="many">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Z důvodu konfliktů nebude nahrána 1 epizoda jiného pořadu.</item>
- <item quantity="other">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Z důvodu konfliktů nebude nahrána 1 epizoda jiného pořadu.</item>
- <item quantity="one">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Z důvodu konfliktů nebude nahrána 1 epizoda jiného pořadu.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="few">Byla naplánována <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Z důvodu konfliktů nebudou nahrány epizody jiných pořadů (celkem <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="many">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Z důvodu konfliktů nebudou nahrány epizody jiných pořadů (celkem <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="other">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Z důvodu konfliktů nebudou nahrány epizody jiných pořadů (celkem <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="one">Bylo naplánováno <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nahrávání pořadu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Z důvodu konfliktů nebudou nahrány epizody jiných pořadů (celkem <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g>).</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Nahraný program nebyl nalezen."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Související nahrávky"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Žádný popis programu)"</string>
@@ -371,7 +362,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Zastavit nahrávání série?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Nahrané epizody zůstanou dostupné v knihovně DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Zastavit"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Momentálně nejsou vysílány žádné epizody."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Nejsou k dispozici žádné epizody.\nEpizody budou nahrány, až budou k dispozici."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="few">(%1$d minuty)</item>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 9622b4c8..b053e77d 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Afspilningsknapper"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanaler"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Seneste kanaler"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Tv-indstillinger"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP-muligheder"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Afspilningsstyring er ikke tilgængeligt på denne kanal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Afspil, eller sæt på pause"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Spol frem"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Undertekster"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Format"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Til"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Fra"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Flere lydspor"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Få flere kanaler"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Indstillinger"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Kilde"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Skift"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Til"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Fra"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Lyd"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Primær"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP-vindue"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Layout"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Nederst til højre"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Øverst til højre"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Øverst til venstre"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Nederst til venstre"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Side om side"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Størrelse"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Stor"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Lille"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Inputkilde"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Tv (antenne/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Ingen programoplysninger"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Ingen oplysninger"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blokeret kanal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Ukendt sprog"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Undertekster %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Ukendt sprog"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Undertekster"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Fra"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Tilpas formatering"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Pinkoden var forkert. Prøv igen."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Prøv igen. Pinkoden var forkert"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Angiv dit postnummer."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Appen Tv-kanaler bruger postnummeret til at levere en komplet tv-guide til tv-kanalerne."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Angiv dit postnummer"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Ugyldigt postnummer"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Indstillinger"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Tilpas kanallisten"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Vælg kanaler til din programoversigt"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Børnesikring"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Open source-licenser"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Open source-licenser"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Send feedback"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Version"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Se denne kanal ved at trykke på højreknappen og angive din pinkode"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Se dette program ved at trykke på højreknappen og angive din pinkode"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Tryk på VÆLG"</b>" for at få adgang til TV-menuen."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Der blev ikke fundet noget tv-input"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Tv-inputtet blev ikke fundet"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP understøttes ikke"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Der er intet tilgængeligt input, som kan vises med PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tunertypen er uegnet. Åbn appen Tv-kanaler for at få tv-input fra tunertypen."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Tuningen mislykkedes"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Der blev ikke fundet nogen app, der kan håndtere denne handling."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Gem"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Engangsoptagelser har højest prioritet"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Annuller"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Annuller"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Glem"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Stop"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Tidsplan for optagelse"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Dette ene program"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Optag dette program i stedet for"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Annuller denne optagelse"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Se nu"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Slet optagelser…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Kan optages"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Optagelse er planlagt"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Modstridende optagelser"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Optager"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Optagelsen mislykkedes"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Læser programmer for at oprette tidsplaner for optagelse"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Læser programmer"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Se de seneste optagelser"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Optagelsen af <xliff:g id="PROGRAMNAME">%1$s</xliff:g> er ikke fuldført."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Optagelserne af <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> og <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> er ikke fuldført."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Optagelserne af <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> og <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> er ikke fuldført."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Optagelsen af <xliff:g id="PROGRAMNAME">%1$s</xliff:g> blev ikke fuldført, da der ikke var nok lagerplads."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Optagelserne af <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> og <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> blev ikke fuldført, da der ikke var nok lagerplads."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Optagelserne af <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> og <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> blev ikke fuldført, da der ikke var nok lagerplads."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Læser programmer"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR kræver mere lagerplads"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Du kan optage programmer med DVR. Der er dog ikke længere nok lagerplads på din enhed til at DVR kan fungere. Tilslut et eksternt drev på mindst <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB, og følg vejledningen i, hvordan du formaterer det som internt lager."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Der er ikke nok lagerplads"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Dette program kan ikke optages, fordi der ikke er nok lagerplads. Prøv at slette nogle eksisterende optagelser."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Lager mangler"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Noget af det lager, der bruges af DVR, mangler. Tilslut det eksterne drev, du brugte før, for at genaktivere DVR. Alternativt kan du vælge at glemme lageret, hvis det ikke længere er tilgængeligt."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Vil du glemme lageret?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Du mister alt dit optagede indhold og dine tidsplaner."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Skal optagelsen stoppes?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Det optagede indhold gemmes."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Optagelsen af <xliff:g id="PROGRAMNAME">%1$s</xliff:g> stoppes, fordi den falder sammen med dette program. Det indhold, der er optaget, vil blive gemt."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Optagelsen er planlagt, men der er konflikter"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Optagelsen er startet, men der er konflikter"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> optages."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"En optagelse af dette program er allerede planlagt kl. <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Det er allerede optaget"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Dette program er allerede optaget. Du kan finde det i DVR-samlingen."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Optagelsen er planlagt"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> optagelse af <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> optagelser af <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> optagelse af <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> optages ikke på grund af konflikter.</item>
- <item quantity="other">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> optagelser af <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> af dem optages ikke på grund af konflikter.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> optagelse af <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> afsnit af denne og andre serier optages ikke på grund af konflikter.</item>
- <item quantity="other">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> optagelser af <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> afsnit af denne og andre serier optages ikke på grund af konflikter.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> optagelse af <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 afsnit af en anden serie optages ikke på grund af konflikter.</item>
- <item quantity="other">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> optagelser af <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 afsnit af en anden serie optages ikke på grund af konflikter.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> optagelse af <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> afsnit af andre serier optages ikke på grund af konflikter.</item>
- <item quantity="other">Der er planlagt <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> optagelser af <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> afsnit af andre serier optages ikke på grund af konflikter.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Det optagede program blev ikke fundet."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Relaterede optagelser"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Ingen programbeskrivelse)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Vil du stoppe optagelsen af serien?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Optagede afsnit kan findes i DVR-samlingen."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Stop"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Der optages ingen afsnit lige nu."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Der er ingen tilgængelige tv-serier.\nDe optages, så snart de er tilgængelige.."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d minut)</item>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 7e72c63e..b4cc6c0f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"Mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"Stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Wiedergabesteuerung"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanäle"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Letzte Kanäle"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV-Optionen"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP-Optionen"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Wiedergabesteuerung für diesen Kanal nicht verfügbar"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Abspielen oder pausieren"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Vorspulen"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Untertitel"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Anzeigemodus"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"An"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Aus"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-Audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Mehr Kanäle erhalten"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Einstellungen"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Quelle"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Wechseln"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"An"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Aus"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Ton"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Hauptoption"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP-Fenster"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Layout"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Unten rechts"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Oben rechts"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Oben links"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Unten links"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Nebeneinander"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Größe"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Groß"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Klein"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Eingangsquelle"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (Antenne/Kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Keine Programminformationen"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Keine Informationen"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blockierter Kanal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Unbekannte Sprache"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Untertitel für %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Unbekannte Sprache"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Untertitel"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Aus"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Untertitel anpassen"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Diese PIN war falsch. Versuchen Sie es erneut."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Die PIN stimmt nicht. Bitte versuchen Sie es erneut."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Gib deine Postleitzahl ein."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Die Live TV App verwendet die Postleitzahl, um dir die vollständige Programmübersicht der TV-Sender zur Verfügung zu stellen."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Postleitzahl eingeben"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Ungültige Postleitzahl"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Einstellungen"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Kanalliste anpassen"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Kanäle für Programmübersicht auswählen"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Jugendschutzeinstellungen"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Open-Source-Lizenzen"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Open-Source-Lizenzen"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Feedback geben"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Version"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Um sich diesen Kanal anzusehen, drücken Sie rechts und geben Sie die PIN ein."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Um sich dieses Programm anzusehen, drücken Sie rechts und geben Sie die PIN ein."</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Drücken Sie die Auswahltaste"</b>", um auf das TV-Menü zuzugreifen."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Kein TV-Eingang gefunden"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV-Eingang konnte nicht gefunden werden."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP wird nicht unterstützt."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Es ist kein Eingang für die PIP-Anzeige verfügbar."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tunertyp ungeeignet, bitte Live TV App für TV-Eingang des Tunertyps starten"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Fehler beim Einstellen"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Für diese Aktion wurde keine App gefunden."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Speichern"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Einmalige Aufnahmen haben höchste Priorität"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Abbrechen"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Abbrechen"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Entfernen"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Beenden"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Aufnahmeplan ansehen"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Nur diese Folge"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Stattdessen diese Sendung aufnehmen"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Diesen Aufnahmeplan abbrechen"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Jetzt ansehen"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Aufnahmen löschen…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Kann aufgenommen werden"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Aufnahme geplant"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Konflikt bei der Aufnahme"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Aufnahme"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Aufnahme fehlgeschlagen"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Sendungen werden gelesen, um Aufnahmepläne zu erstellen"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Sendungen werden gelesen"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Letzte Aufnahmen ansehen"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Die Aufnahme <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ist nicht abgeschlossen."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Die Aufnahmen <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> und <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> sind nicht abgeschlossen."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Die Aufnahmen <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> und <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> sind nicht abgeschlossen."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Die Aufnahme von <xliff:g id="PROGRAMNAME">%1$s</xliff:g> konnte nicht abgeschlossen werden, weil nicht genügend Speicher vorhanden ist."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Die Aufnahmen von <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> und <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> konnten nicht abgeschlossen werden, weil nicht genügend Speicher vorhanden ist."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Die Aufnahmen von <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> und <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> konnten nicht abgeschlossen werden, weil nicht genügend Speicher vorhanden ist."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Sendungen werden gelesen"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR benötigt mehr Speicher"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Sie können mit DVR Sendungen aufnehmen, jedoch ist auf Ihrem Gerät momentan nicht ausreichend Speicherplatz vorhanden. Schließen Sie ein externes Laufwerk mit mindestens <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB freiem Speicher an und folgen Sie der Anleitung zur Formatierung als Gerätespeicher."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Nicht genug Speicherplatz"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Diese Inhalte werden nicht aufgenommen, weil zu wenig Speicherplatz verfügbar ist. Du kannst Speicherplatz freigeben, indem du ein paar vorhandene Aufnahmen löschst."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Speicher nicht verfügbar"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Ein Teil des DVR-Speichers ist nicht verfügbar. Um DVR neu zu aktivieren, stellen Sie eine Verbindung zu dem externen Gerät her, das Sie zuvor verwendet haben. Sie können den Speicher auch entfernen, wenn er nicht mehr verfügbar ist."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Speicher entfernen?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Alle aufgenommenen Inhalte und Aufnahmepläne gehen verloren."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Aufnahme beenden?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Die aufgenommenen Inhalte werden gespeichert."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Die Aufzeichnung von <xliff:g id="PROGRAMNAME">%1$s</xliff:g> wird aufgrund eines Konflikts mit diesem Programm beendet. Der aufgezeichnete Inhalt wird gespeichert."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Aufnahme geplant, aber es liegen Konflikte vor"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Aufnahme wurde gestartet, aber es liegen Konflikte vor"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> wird aufgenommen."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Diese Sendung wurde dem Aufnahmeplan schon hinzugefügt und wird um <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> aufgenommen."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Schon aufgenommen"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Diese Sendung wurde schon aufgenommen. Sie ist in der DVR-Bibliothek verfügbar."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Serienaufnahme geplant"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> Aufnahmen wurden für <xliff:g id="SERIESNAME_3">%2$s</xliff:g> geplant.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> Aufnahme wurde für <xliff:g id="SERIESNAME_1">%2$s</xliff:g> geplant.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> Aufnahmen wurden für <xliff:g id="SERIESNAME_3">%2$s</xliff:g> geplant. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> davon werden wegen Konflikten nicht aufgezeichnet.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> Aufnahme wurde für <xliff:g id="SERIESNAME_1">%2$s</xliff:g> geplant. Sie wird wegen Konflikten nicht aufgezeichnet.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> Aufnahmen wurden für <xliff:g id="SERIESNAME_4">%2$s</xliff:g> geplant. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> Folgen dieser Serie und anderer Serien werden wegen Konflikten nicht aufgezeichnet.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> Aufnahme wurde für <xliff:g id="SERIESNAME_1">%2$s</xliff:g> geplant. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> Folge dieser oder einer anderen Serie wird wegen Konflikten nicht aufgezeichnet.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> Aufnahmen wurden für <xliff:g id="SERIESNAME_3">%2$s</xliff:g> geplant. 1 Folge einer anderen Serie wird wegen Konflikten nicht aufgezeichnet.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> Aufnahme wurde für <xliff:g id="SERIESNAME_1">%2$s</xliff:g> geplant. 1 Folge einer anderen Serie wird wegen Konflikten nicht aufgezeichnet.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> Aufnahmen wurden für <xliff:g id="SERIESNAME_4">%2$s</xliff:g> geplant. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> Folgen anderer Serien werden wegen Konflikten nicht aufgezeichnet.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> Aufnahme wurde für <xliff:g id="SERIESNAME_1">%2$s</xliff:g> geplant. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> Folge einer anderen Serie wird wegen Konflikten nicht aufgezeichnet.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Aufgenommenes Programm wurde nicht gefunden."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Ähnliche Aufnahmen"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Keine Programmbeschreibung)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Sie möchten die Serienaufnahme beenden?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Die aufgenommenen Folgen werden in der DVR-Bibliothek gespeichert."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Beenden"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Momentan werden keine Folgen ausgestrahlt."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Keine Folgen verfügbar.\nSie werden aufgenommen, sobald sie verfügbar sind."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d Minuten)</item>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 817d116a..9e8e042c 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"μονοφων."</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"στερεοφ."</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Στοιχ. ελέγ. αναπαραγωής"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Κανάλια"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Πρόσφατα κανάλια"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Επιλογές TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Επιλογές PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Τα στοιχεία ελέγχου αναπαραγωγής δεν είναι διαθέσιμα γι\' αυτό το κανάλι"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Αναπαραγωγή ή παύση"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Γρήγορη προώθηση"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Υπότιτλοι"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Τρόπος εμφάν."</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Ενεργό"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Ανενεργό"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Πολλαπλός ήχος"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Περισσότ. κανάλια"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Ρυθμίσεις"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Πηγή"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Ανταλλαγή"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Ενεργό"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Ανενεργό"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Ήχος"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Κύριο"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Παράθυρο PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Διάταξη"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Κάτω δεξιά"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Επάνω δεξιά"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Επάνω αριστερά"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Κάτω αριστερά"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Δίπλα"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Μέγεθος"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Μεγάλο"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Μικρό"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Πηγή εισόδου"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Τηλεόραση (κεραία/καλωδιακή)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Δεν υπάρχουν πληροφορίες προγράμματος"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Δεν υπάρχουν πληροφορίες"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Αποκλεισμένο κανάλι"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Άγνωστη γλώσσα"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Υπότιτλοι %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Άγνωστη γλώσσα"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Υπότιτλοι"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Ανενεργό"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Προσ. μορφοποίησης"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Λάθος PIN. Δοκιμάστε ξανά."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Δοκιμάστε ξανά, δεν υπάρχει αντιστοιχία PIN"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Εισαγωγή ταχυδρομικού κώδικα"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Η εφαρμογή \"Ζωντανά κανάλια\" θα χρησιμοποιεί τον ταχυδρομικό κώδικα για να παρέχει έναν πλήρη οδηγό προγράμματος για τα τηλεοπτικά κανάλια."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Εισαγωγή ταχυδρομικού κώδικα"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Μη έγκυρος ταχυδρομ. κώδικας"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Ρυθμίσεις"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Προσαρμογή λίστας καναλιών"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Επιλέξτε κανάλια για τον οδηγό προγράμματος"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Γονικοί έλεγχοι"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Άδειες λογισμικού ανοικτού κώδικα"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Άδειες λογισμικού ανοικτού κώδικα"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Αποστολή σχολίων"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Έκδοση"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Για να παρακολουθήσετε αυτό το κανάλι, πατήστε το δεξιά και εισαγάγετε το PIN σας"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Για να παρακολουθήσετε αυτό το πρόγραμμα, πατήστε δεξιά και εισαγάγετε το PIN σας"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Πατήστε το πλήκτρο SELECT"</b>" για να μεταβείτε στο μενού της τηλεόρασης."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Δεν βρέθηκε είσοδος τηλεόρασης"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Δεν είναι δυνατή η εύρεση εισόδου τηλεόρασης"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Το PIP δεν υποστηρίζεται"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Δεν υπάρχει διαθέσιμη είσοδος για εμφάνιση με PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Ακατάλληλος τύπος δέκτη. Εκκινήστε την εφαρμογή Κανάλια ζωντανά για είσοδο τύπου δέκτη τηλεόρασης."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Αποτυχία συντονισμού"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Δεν βρέθηκε εφαρμογή για τη διαχείριση αυτής της ενέργειας."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Αποθήκευση"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Οι εγγραφές μίας φοράς έχουν την υψηλότερη προτεραιότητα"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Ακύρωση"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Ακύρωση"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Διαγραφή"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Διακοπή"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Προβολή προγραμματισ. εγγραφών"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Αυτό το συγκεκριμένο επεισόδιο"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Αντί αυτού, εγγρ. αυτού του πρ."</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Ακύρωση αυτής της εγγραφής"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Προβολή τώρα"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Διαγραφή εγγραφών…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Με δυνατότητα εγγραφής"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Η εγγραφή προγραμματίστηκε"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Διένεξη εγγραφής"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Εγγραφή"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Αποτυχία εγγραφής"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Γίνεται ανάγνωση προγραμμάτων για δημιουργία προγραμματισμών εγγραφής"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Ανάγνωση προγραμμάτων"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Προβολή πρόσφατων εγγραφών"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Η εγγραφή του προγράμματος <xliff:g id="PROGRAMNAME">%1$s</xliff:g> δεν είναι ολοκληρωμένη."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Οι εγγραφές των προγραμμάτων <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> και <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> δεν είναι ολοκληρωμένες."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Οι εγγραφές των προγραμμάτων <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> και <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> δεν είναι ολοκληρωμένες."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Η εγγραφή του προγράμματος <xliff:g id="PROGRAMNAME">%1$s</xliff:g> δεν ολοκληρώθηκε, λόγω ανεπαρκούς αποθηκευτικού χώρου."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Οι εγγραφές των προγραμμάτων <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> και <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> δεν ολοκληρώθηκαν, λόγω ανεπαρκούς αποθηκευτικού χώρου."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Οι εγγραφές των προγραμμάτων <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> και <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> δεν ολοκληρώθηκαν, λόγω ανεπαρκούς αποθηκευτικού χώρου."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Ανάγνωση προγραμμάτων"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Το DVR χρειάζεται περισσότερο αποθηκευτικό χώρο"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Θα μπορείτε να εγγράψετε προγράμματα με το DVR. Ωστόσο, αυτήν τη στιγμή δεν υπάρχει αρκετός αποθηκευτικός χώρος στη συσκευή σας έτσι ώστε να λειτουργήσει το DVR. Συνδέστε έναν εξωτερικό δίσκο με χωρητικότητα <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB ή μεγαλύτερη και ακολουθήστε τα βήματα για να τον μορφοποιήσετε και να τον ορίσετε ως αποθηκευτικό χώρο της συσκευής."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Δεν υπάρχει αρκετός αποθηκευτικός χώρος"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Αυτό το πρόγραμμα δεν θα εγγραφεί, επειδή δεν υπάρχει αρκετός αποθηκευτικός χώρος. Δοκιμάστε να διαγράψετε ορισμένες υπάρχουσες εγγραφές."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Ο αποθηκευτικός χώρος λείπει"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Κάποιο τμήμα του αποθηκευτικού χώρου που χρησιμοποιείται από το DVR λείπει. Συνδέστε τον εξωτερικό δίσκο που χρησιμοποιήσατε στο παρελθόν για να ενεργοποιήσετε εκ νέου το DVR. Εναλλακτικά, μπορείτε να επιλέξετε να διαγράψετε τον αποθηκευτικό χώρο αν δεν είναι πλέον διαθέσιμος."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Να διαγραφεί ο αποθηκευτικός χώρος;"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Όλο το εγγεγραμμένο περιεχόμενο και τα χρονοδιαγράμματα θα χαθούν."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Να διακοπεί η εγγραφή;"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Θα γίνει αποθήκευση του περιεχομένου που έχει εγγραφεί."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Η εγγραφή του προγράμματος <xliff:g id="PROGRAMNAME">%1$s</xliff:g> θα τερματιστεί καθώς βρίσκεται σε διένεξη με αυτό το πρόγραμμα. Το περιεχόμενο που έχει εγγραφεί θα αποθηκευτεί."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Η εγγραφή προγραμματίστηκε, αλλά έχει διενέξεις"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Η εγγραφή ξεκίνησε αλλά υπάρχουν διενέξεις"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Θα γίνει εγγραφή του προγράμματος <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Το ίδιο πρόγραμμα έχει προγραμματιστεί για εγγραφή στις <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Έχει ήδη εγγραφεί"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Αυτό το πρόγραμμα έχει ήδη εγγραφεί. Είναι διαθέσιμο στη βιβλιοθήκη DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Η εγγραφή της σειράς προγραμματίστηκε"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> εγγραφές έχουν προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> εγγραφή έχει προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> εγγραφές έχουν προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> από αυτές δεν θα εγγραφούν εξαιτίας διενέξεων.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> εγγραφή έχει προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Δεν θα γίνει η εγγραφή εξαιτίας διενέξεων.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> εγγραφές έχουν προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> επεισόδια αυτής της σειράς και άλλης σειράς δεν θα εγγραφούν εξαιτίας διενέξεων.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> εγγραφή έχει προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> επεισόδια αυτής της σειράς και άλλης σειράς δεν θα εγγραφούν εξαιτίας διενέξεων.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> εγγραφές έχουν προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 επεισόδιο άλλης σειράς δεν θα εγγραφεί εξαιτίας διενέξεων.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> εγγραφή έχει προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 επεισόδιο άλλης σειράς δεν θα εγγραφεί εξαιτίας διενέξεων.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> εγγραφές έχουν προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> επεισόδια άλλης σειράς δεν θα εγγραφούν εξαιτίας διενέξεων.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> εγγραφή έχει προγραμματιστεί για τη σειρά <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> επεισόδια άλλης σειράς δεν θα εγγραφούν εξαιτίας διενέξεων.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Το εγγεγραμμένο πρόγραμμα δεν βρέθηκε."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Σχετικές εγγραφές"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Καμία περιγραφή προγράμματος)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Διακοπή εγγραφής σειράς;"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Τα επεισόδια που έχουν εγγραφεί θα εξακολουθήσουν να είναι διαθέσιμα στη βιβλιοθήκη DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Διακοπή"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Δεν προβάλλονται επεισόδια ζωντανά αυτήν τη στιγμή."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Δεν υπάρχουν διαθέσιμα επεισόδια.\nΗ εγγραφή τους θα πραγματοποιηθεί όταν θα είναι διαθέσιμα."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d λεπτά)</item>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 1b15a022..bda4e1ea 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Play controls"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Channels"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Recent channels"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV options"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP options"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Play controls unavailable for this channel"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Play or pause"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Fast-forward"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Closed captions"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Display mode"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"On"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Off"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Get more channels"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Settings"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Source"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Swap"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"On"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Off"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Sound"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Main"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP window"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Layout"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Bottom right"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Top right"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Top left"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Bottom left"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Side by side"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Size"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Big"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Small"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Input source"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (aerial/cable)"</string>
<string name="no_program_information" msgid="1049844207745145132">"No programme information"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"No information"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blocked channel"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Unknown language"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Closed captions %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Unknown language"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Closed captions"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Off"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Customise formatting"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"That PIN was wrong. Try again."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Try again, PIN doesn\'t match"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Enter your postcode."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Live TV app will use the postcode to provide a complete programme guide for the TV channels."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Enter your postcode"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Invalid postcode"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Settings"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Customise channel list"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Choose channels for your programme guide"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Parental controls"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Open-source licences"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Open-source licences"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Send feedback"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Version"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"To watch this channel, press Right and enter your PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"To watch this program, press Right and enter your PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Press SELECT"</b>" to access the TV menu."</string>
<string name="msg_no_input" msgid="3897674146985427865">"No TV input found"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Cannot find the TV input"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP is not supported"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"There is no available input which can be shown with PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tuner type not suitable. Please launch Live TV app for tuner type TV input."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Tune failed"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"No app was found to handle this action."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Save"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"One-time recordings have the highest priority"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Cancel"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Cancel"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Forget"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Stop"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"View recording schedule"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"This single programme"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Record this one instead"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Cancel this recording"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Watch now"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Delete recordings…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Recordable"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Recording scheduled"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Recording conflict"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Recording"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Recording failed"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Reading programs to create recording schedules"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Reading programmes"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"View recent recordings"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"The recording of <xliff:g id="PROGRAMNAME">%1$s</xliff:g> is incomplete."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> and <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> are incomplete."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> and <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> are incomplete."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"The recording of <xliff:g id="PROGRAMNAME">%1$s</xliff:g> didn\'t complete due to insufficient storage."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> and <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> didn\'t complete due to insufficient storage."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> and <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> didn\'t complete due to insufficient storage."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Reading programmes"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR needs more storage"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"You will be able to record programmes with DVR. At the moment there is not enough storage on your device for DVR to work. Please connect an external drive that is <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB or larger and follow the steps to format it as device storage."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Not enough storage"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"This programme will not be recorded because there is not enough storage. Try deleting some existing recordings."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Missing storage"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Some of the storage used by DVR is missing. Please connect the external drive that you used before to re-enable DVR. Alternatively, you can choose to forget the storage if it\'s no longer available."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Forget storage?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"All your recorded content and schedules will be lost."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Stop recording?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"The recorded content will be saved."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"The recording of <xliff:g id="PROGRAMNAME">%1$s</xliff:g> will be stopped because it conflicts with this programme. The recorded content will be saved."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Recording scheduled but has conflicts"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Recording has started but has conflicts"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> will be recorded."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"The same programme has already been scheduled to be recorded at <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Already recorded"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"This programme has already been recorded. It’s available in the DVR library."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Series recording scheduled"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> of them will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. It will not be recorded due to conflicts.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes of this series and other series will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodes of this series and other series will not be recorded due to conflicts.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 episode of other series will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 episode of other series will not be recorded due to conflicts.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes of other series will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodes of other series will not be recorded due to conflicts.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Recorded programme not found."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Related recordings"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(No programme description)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Stop series recording?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Recorded episodes will remain available in the DVR library."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Stop"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"No episodes are on air now."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"No episodes are available.\nThey will be recorded once they are available."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutes)</item>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 1b15a022..bda4e1ea 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Play controls"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Channels"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Recent channels"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV options"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP options"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Play controls unavailable for this channel"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Play or pause"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Fast-forward"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Closed captions"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Display mode"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"On"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Off"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Get more channels"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Settings"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Source"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Swap"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"On"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Off"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Sound"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Main"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP window"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Layout"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Bottom right"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Top right"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Top left"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Bottom left"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Side by side"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Size"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Big"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Small"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Input source"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (aerial/cable)"</string>
<string name="no_program_information" msgid="1049844207745145132">"No programme information"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"No information"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blocked channel"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Unknown language"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Closed captions %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Unknown language"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Closed captions"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Off"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Customise formatting"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"That PIN was wrong. Try again."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Try again, PIN doesn\'t match"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Enter your postcode."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Live TV app will use the postcode to provide a complete programme guide for the TV channels."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Enter your postcode"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Invalid postcode"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Settings"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Customise channel list"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Choose channels for your programme guide"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Parental controls"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Open-source licences"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Open-source licences"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Send feedback"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Version"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"To watch this channel, press Right and enter your PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"To watch this program, press Right and enter your PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Press SELECT"</b>" to access the TV menu."</string>
<string name="msg_no_input" msgid="3897674146985427865">"No TV input found"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Cannot find the TV input"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP is not supported"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"There is no available input which can be shown with PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tuner type not suitable. Please launch Live TV app for tuner type TV input."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Tune failed"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"No app was found to handle this action."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Save"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"One-time recordings have the highest priority"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Cancel"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Cancel"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Forget"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Stop"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"View recording schedule"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"This single programme"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Record this one instead"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Cancel this recording"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Watch now"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Delete recordings…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Recordable"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Recording scheduled"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Recording conflict"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Recording"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Recording failed"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Reading programs to create recording schedules"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Reading programmes"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"View recent recordings"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"The recording of <xliff:g id="PROGRAMNAME">%1$s</xliff:g> is incomplete."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> and <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> are incomplete."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> and <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> are incomplete."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"The recording of <xliff:g id="PROGRAMNAME">%1$s</xliff:g> didn\'t complete due to insufficient storage."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> and <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> didn\'t complete due to insufficient storage."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> and <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> didn\'t complete due to insufficient storage."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Reading programmes"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR needs more storage"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"You will be able to record programmes with DVR. At the moment there is not enough storage on your device for DVR to work. Please connect an external drive that is <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB or larger and follow the steps to format it as device storage."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Not enough storage"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"This programme will not be recorded because there is not enough storage. Try deleting some existing recordings."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Missing storage"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Some of the storage used by DVR is missing. Please connect the external drive that you used before to re-enable DVR. Alternatively, you can choose to forget the storage if it\'s no longer available."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Forget storage?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"All your recorded content and schedules will be lost."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Stop recording?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"The recorded content will be saved."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"The recording of <xliff:g id="PROGRAMNAME">%1$s</xliff:g> will be stopped because it conflicts with this programme. The recorded content will be saved."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Recording scheduled but has conflicts"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Recording has started but has conflicts"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> will be recorded."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"The same programme has already been scheduled to be recorded at <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Already recorded"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"This programme has already been recorded. It’s available in the DVR library."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Series recording scheduled"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> of them will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. It will not be recorded due to conflicts.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes of this series and other series will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodes of this series and other series will not be recorded due to conflicts.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 episode of other series will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 episode of other series will not be recorded due to conflicts.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes of other series will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodes of other series will not be recorded due to conflicts.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Recorded programme not found."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Related recordings"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(No programme description)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Stop series recording?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Recorded episodes will remain available in the DVR library."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Stop"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"No episodes are on air now."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"No episodes are available.\nThey will be recorded once they are available."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutes)</item>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 1b15a022..bda4e1ea 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Play controls"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Channels"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Recent channels"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV options"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP options"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Play controls unavailable for this channel"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Play or pause"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Fast-forward"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Closed captions"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Display mode"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"On"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Off"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Get more channels"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Settings"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Source"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Swap"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"On"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Off"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Sound"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Main"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP window"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Layout"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Bottom right"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Top right"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Top left"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Bottom left"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Side by side"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Size"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Big"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Small"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Input source"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (aerial/cable)"</string>
<string name="no_program_information" msgid="1049844207745145132">"No programme information"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"No information"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blocked channel"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Unknown language"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Closed captions %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Unknown language"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Closed captions"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Off"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Customise formatting"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"That PIN was wrong. Try again."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Try again, PIN doesn\'t match"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Enter your postcode."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Live TV app will use the postcode to provide a complete programme guide for the TV channels."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Enter your postcode"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Invalid postcode"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Settings"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Customise channel list"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Choose channels for your programme guide"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Parental controls"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Open-source licences"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Open-source licences"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Send feedback"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Version"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"To watch this channel, press Right and enter your PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"To watch this program, press Right and enter your PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Press SELECT"</b>" to access the TV menu."</string>
<string name="msg_no_input" msgid="3897674146985427865">"No TV input found"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Cannot find the TV input"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP is not supported"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"There is no available input which can be shown with PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tuner type not suitable. Please launch Live TV app for tuner type TV input."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Tune failed"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"No app was found to handle this action."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Save"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"One-time recordings have the highest priority"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Cancel"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Cancel"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Forget"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Stop"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"View recording schedule"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"This single programme"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Record this one instead"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Cancel this recording"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Watch now"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Delete recordings…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Recordable"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Recording scheduled"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Recording conflict"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Recording"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Recording failed"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Reading programs to create recording schedules"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Reading programmes"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"View recent recordings"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"The recording of <xliff:g id="PROGRAMNAME">%1$s</xliff:g> is incomplete."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> and <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> are incomplete."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> and <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> are incomplete."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"The recording of <xliff:g id="PROGRAMNAME">%1$s</xliff:g> didn\'t complete due to insufficient storage."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> and <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> didn\'t complete due to insufficient storage."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"The recordings of <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> and <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> didn\'t complete due to insufficient storage."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Reading programmes"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR needs more storage"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"You will be able to record programmes with DVR. At the moment there is not enough storage on your device for DVR to work. Please connect an external drive that is <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB or larger and follow the steps to format it as device storage."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Not enough storage"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"This programme will not be recorded because there is not enough storage. Try deleting some existing recordings."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Missing storage"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Some of the storage used by DVR is missing. Please connect the external drive that you used before to re-enable DVR. Alternatively, you can choose to forget the storage if it\'s no longer available."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Forget storage?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"All your recorded content and schedules will be lost."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Stop recording?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"The recorded content will be saved."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"The recording of <xliff:g id="PROGRAMNAME">%1$s</xliff:g> will be stopped because it conflicts with this programme. The recorded content will be saved."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Recording scheduled but has conflicts"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Recording has started but has conflicts"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> will be recorded."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"The same programme has already been scheduled to be recorded at <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Already recorded"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"This programme has already been recorded. It’s available in the DVR library."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Series recording scheduled"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> of them will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. It will not be recorded due to conflicts.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes of this series and other series will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodes of this series and other series will not be recorded due to conflicts.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 episode of other series will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 episode of other series will not be recorded due to conflicts.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes of other series will not be recorded due to conflicts.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> recording has been scheduled for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodes of other series will not be recorded due to conflicts.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Recorded programme not found."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Related recordings"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(No programme description)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Stop series recording?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Recorded episodes will remain available in the DVR library."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Stop"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"No episodes are on air now."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"No episodes are available.\nThey will be recorded once they are available."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutes)</item>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 314058c9..14e9f506 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"estéreo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Controles de reproducción"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Canales"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Recientes"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opciones de TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opciones de PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Los controles de reproducción no están disponibles en este canal."</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Reproducir o pausar"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Avanzar"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Subtítulos"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Modo pantalla"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Activada"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Desactivada"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Varios audios"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Obtener canales"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Configuración"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Fuente"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Cambiar"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Activada"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Desactivada"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Sonido"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principal"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Ventana PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Diseño"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Abajo derecha"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Arriba derecha"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Arriba izqda."</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Abajo izquierda"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Lado a lado"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Tamaño"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Grande"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Pequeña"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Fuente de entrada"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Televisión (antena/cable)"</string>
<string name="no_program_information" msgid="1049844207745145132">"No hay información del programa"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Sin información"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Canal bloqueado"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Idioma desconocido"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Subtítulos opcionales en %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Idioma desconocido"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Subtítulos opcionales"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Desactivado"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Personalizar formato"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"El PIN es incorrecto. Vuelve a intentarlo."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Inténtalo de nuevo, el PIN no coincide."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Ingresa tu código postal"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"La app de Live Channels usará el código postal para brindar la guía completa de programas de los canales de TV."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Ingresa tu código postal"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Código postal no válido"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Configuración"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personalizar lista de canales"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Seleccionar canales de la guía de programas"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Controles parentales"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licencias de código abierto"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licencias de código abierto"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Envía comentarios"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versión"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Para mirar este canal, presiona la tecla hacia la derecha e ingresa el PIN."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Para mirar este programa, presiona la tecla hacia la derecha e ingresa el PIN."</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Presiona SELECCIONAR"</b>" para acceder al menú de la televisión."</string>
<string name="msg_no_input" msgid="3897674146985427865">"No se encontró ninguna entrada de TV."</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"No se puede encontrar la entrada de TV."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"No se admite PIP."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"No hay entradas disponibles que se puedan mostrar con PIP."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tipo de sintonizador no admitido. Abre la aplicación Canales en vivo para el tipo de sintonizador de entrada de TV."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Error al sintonizar"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"No se encontró ninguna aplicación que pueda realizar esta acción."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Guardar"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Las grabaciones únicas tienen mayor prioridad"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Cancelar"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Cancelar"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Borrar"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Detener"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Ver cronograma de grabación"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Solo este programa"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Grabar este programa en su lugar"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Cancelar esta grabación"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Mirar ahora"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Borrar grabaciones…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Se puede grabar"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Grabación programada"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Error de grabación"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Grabando"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Se produjo un error al grabar"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Leyendo programas para crear programaciones de grabación"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Leyendo programas"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Ver grabaciones recientes"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"No se completó la grabación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"No se completó la grabación de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> y <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"No se completó la grabación de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> y <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"No se completó la grabación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> por falta de espacio de almacenamiento."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"No se completó la grabación de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> y <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> por falta de espacio de almacenamiento."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"No se completó la grabación de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> y <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> por falta de espacio de almacenamiento."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Leyendo programas"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"El DVR necesita más espacio de almacenamiento"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Si bien puedes grabar programas con el DVR, no hay espacio de almacenamiento suficiente en tu dispositivo para usar esta opción. Conecta una unidad externa de <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB como mínimo y sigue los pasos para formatearla como almacenamiento del dispositivo."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"No hay suficiente espacio de almacenamiento"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"No se grabará este programa porque no hay suficiente espacio de almacenamiento. Intenta borrar algunas grabaciones existentes."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Falta almacenamiento"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Falta parte del almacenamiento que se usa para DVR. Conecta la unidad externa que usaste anteriormente para volver a habilitar esta función. También puedes borrar el almacenamiento si ya no está disponible."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"¿Borrar almacenamiento?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Se perderán todas las programaciones y los contenidos grabados."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"¿Deseas detener la grabación?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Se guardará el contenido grabado."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Se detendrá la grabación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> porque entra en conflicto con este programa. Sin embargo, se guardará el contenido grabado."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Grabación programada con conflictos"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Comenzó la grabación, pero tiene problemas"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Se grabará <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"El mismo programa se grabará a las <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Programa grabado"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Este programa ya está grabado. Está disponible en la biblioteca de DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Se programó la grabación de series"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">Se programaron <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> grabaciones de <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">Se programó <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación de <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">Se programaron <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> grabaciones de <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. No se grabarán <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> de ellas debido a algunos conflictos.</item>
- <item quantity="one">Se programó <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación de <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. No podrá completarse debido a algunos conflictos.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">Se programaron <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> grabaciones de <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. No se grabarán <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodios de esta serie y de otras debido a algunos conflictos.</item>
- <item quantity="one">Se programó <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación de <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. No se grabarán <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodios de esta serie y de otras debido a algunos conflictos.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">Se programaron <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> grabaciones de <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. No se grabará 1 episodio de otra serie debido a algunos conflictos.</item>
- <item quantity="one">Se programó <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación de <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. No se grabará 1 episodio de otra serie debido a algunos conflictos.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">Se programaron <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> grabaciones de <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. No se grabarán <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodios de otra serie debido a algunos conflictos.</item>
- <item quantity="one">Se programó <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación de <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. No se grabarán <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodios de otra serie debido a algunos conflictos.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"No se encontró el programa grabado."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Grabaciones relacionadas"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Sin descripción del programa)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"¿Detener grabación de la serie?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Los episodios grabados estarán disponibles en la biblioteca de DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Detener"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"No hay episodios en vivo disponibles en este momento."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"No hay episodios disponibles.\nSe grabarán cuando lo estén."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutos)</item>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index f7941bc7..badab6a4 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"estéreo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Controles de reproducción"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Canales"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Canales recientes"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opciones de TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opciones de PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Controles de reproducción no disponibles en este canal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Reproducir o pausar"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Avance rápido"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Subtítulos"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Modo de pantalla"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Activado"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Desactivado"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Varios audios"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Más canales"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Ajustes"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Fuente"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Cambiar"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Activado"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Desactivado"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Sonido"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principal"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Ventana PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Diseño"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Abajo derecha"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Arriba derecha"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Arriba izquierda"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Abajo izquierda"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"En paralelo"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Dimensiones"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Grande"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Pequeño"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Fuente de entrada"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/cable)"</string>
<string name="no_program_information" msgid="1049844207745145132">"No hay información del programa"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Sin información"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Canal bloqueado"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Idioma desconocido"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Subtítulos en %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Idioma desconocido"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Subtítulos"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Desactivados"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Personalizar formato"</string>
@@ -116,19 +135,14 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Ese PIN era incorrecto. Vuelve a intentarlo."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Vuelve a intentarlo, el PIN no coincide"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Introduce tu código postal"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"La aplicación TV en directo se basa en el código postal para ofrecer una programación completa de los canales de televisión disponibles."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Introduce tu código postal"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"El código postal no es válido"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Ajustes"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personalizar lista de canales"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Seleccionar canales de la programación"</string>
<string name="settings_channel_source_item_setup" msgid="4566190088656419070">"Fuentes de canales"</string>
<string name="settings_channel_source_item_setup_new_inputs" msgid="4845822152617430787">"Nuevos canales disponibles"</string>
<string name="settings_parental_controls" msgid="5449397921700749317">"Control parental"</string>
- <string name="settings_menu_licenses" msgid="1257646083838406103">"Licencias de código abierto"</string>
- <string name="dialog_title_licenses" msgid="4471754920475076623">"Licencias de código abierto"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Enviar sugerencias"</string>
+ <string name="settings_menu_licenses" msgid="1257646083838406103">"Licencias de software libre"</string>
+ <string name="dialog_title_licenses" msgid="4471754920475076623">"Licencias software libre"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versión"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Para ver este canal, pulsa la tecla hacia la derecha e introduce el número PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Para ver este programa, pulsa la tecla hacia la derecha e introduce el número PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Pulsa SELECCIONAR"</b>" para acceder al menú de la TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"No se han encontrado entradas de TV"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"No se puede encontrar la entrada de TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP no admitido"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"No hay entradas disponibles que se puedan mostrar con PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tipo de sintonizador inadecuado. Abre Canales en directo para seleccionar la entrada de TV del tipo de sintonizador."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Error al sintonizar"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"No se ha encontrado ninguna aplicación que pueda realizar esta acción."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Guardar"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Las grabaciones únicas son las que tienen mayor prioridad"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Cancelar"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Cancelar"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Olvidar"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Detener"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Ver programación de grabación"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Este programa"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Grabar esta en su lugar"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Cancelar esta grabación"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Ver ahora"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Eliminar grabaciones…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Se puede grabar"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Grabación programada"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Problema de grabación"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Grabación"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"No se ha podido grabar"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Leyendo programas para crear programaciones de grabación"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Leyendo programas"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Ver grabaciones recientes"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"La grabación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> está incompleta."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Las grabaciones de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> y <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> están incompletas."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Las grabaciones de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> y <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> están incompletas."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"No se ha completado la grabación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> porque no hay espacio de almacenamiento suficiente."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"No se han completado las grabaciones de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> y <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> porque no hay espacio de almacenamiento suficiente."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"No se han completado las grabaciones de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> y <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> porque no hay espacio de almacenamiento suficiente."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Leyendo programas"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Se necesita más almacenamiento para el DVR"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Puedes grabar programas con el DVR, pero no tienes suficiente espacio de almacenamiento en el dispositivo para que el DVR funcione. Conecta una unidad externa que tenga <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB como mínimo y sigue los pasos para formatearlo como almacenamiento del dispositivo."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"No hay suficiente espacio de almacenamiento"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Este programa no se grabará porque no hay espacio de almacenamiento suficiente. Borra algunas grabaciones."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"No se puede acceder al almacenamiento"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"No se puede acceder a parte del almacenamiento utilizado por el DVR. Para volver a habilitarlo, conecta la unidad externa que has utilizado anteriormente. También puedes indicar que se olvide el almacenamiento si ya no está disponible."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"¿Olvidar almacenamiento?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Se perderán todo el contenido grabado y las programaciones."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"¿Detener grabación?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"El contenido grabado se guardará."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"La grabación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> se detendrá porque entra en conflicto con este programa. El contenido grabado se guardará."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Grabación programada con conflictos"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"La grabación se ha iniciado, pero tiene conflictos"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Se grabará <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Ya se ha programado la grabación del mismo programa para esta hora: <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Ya se ha grabado"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Este programa ya se ha grabado y está disponible en la colección del DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Grabación de series programada"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">Se han programado <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> grabaciones para <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">Se ha programado <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">Se han programado <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> grabaciones para <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Episodios que no se grabarán debido a conflictos: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>.</item>
- <item quantity="one">Se ha programado <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Debido a conflictos, no se grabará.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">Se han programado <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> grabaciones para <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Episodios de esta y otras series que no se grabarán debido a conflictos: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="one">Se ha programado <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Episodios de esta y otras series que no se grabarán debido a conflictos: <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">Se han programado <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> grabaciones para <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Debido a conflictos, no se grabará 1 episodio de otra serie.</item>
- <item quantity="one">Se ha programado <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Debido a conflictos, no se grabará 1 episodio de otra serie.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">Se han programado <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> grabaciones para <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Episodios de otras series que no se grabarán debido a conflictos: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="one">Se ha programado <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Episodios de otras series que no se grabarán debido a conflictos: <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g>.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"No se ha encontrado el programa grabado."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Grabaciones relacionadas"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(No hay ninguna descripción)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"¿Detener la grabación de series?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Los episodios grabados seguirán estando disponibles en la colección del DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Detener"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"No se está emitiendo ningún episodio."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"No hay episodios disponibles.\nSe grabarán cuando estén disponibles."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutos)</item>
diff --git a/res/values-et-rEE-v23/strings.xml b/res/values-et-v23/strings.xml
index e981deeb..e981deeb 100644
--- a/res/values-et-rEE-v23/strings.xml
+++ b/res/values-et-v23/strings.xml
diff --git a/res/values-et-rEE/arrays.xml b/res/values-et/arrays.xml
index 2d1d11fd..2d1d11fd 100644
--- a/res/values-et-rEE/arrays.xml
+++ b/res/values-et/arrays.xml
diff --git a/res/values-et-rEE/rating_system_strings.xml b/res/values-et/rating_system_strings.xml
index 5cee5abd..5cee5abd 100644
--- a/res/values-et-rEE/rating_system_strings.xml
+++ b/res/values-et/rating_system_strings.xml
diff --git a/res/values-et-rEE/strings.xml b/res/values-et/strings.xml
index 4d56af1e..83022b8e 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Esituse juhtnupud"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanalid"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Viimas. kanalid"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV-valikud"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP-valikud"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Esituse juhtelemendid ei ole selle kanali puhul saadaval"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Esitamine või peatamine"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Edasikerimine"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Subtiitrid"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Kuvarežiim"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Sees"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Väljas"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multiaudio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Hangi kanaleid"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Seaded"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Allikas"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Vaheta"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Sees"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Väljas"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Heli"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Peamine"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP-aken"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Paigutus"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"All paremal"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Ülal paremal"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Ülal vasakul"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"All vasakul"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Kõrvuti"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Suurus"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Suur"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Väike"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Sisendallikas"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antenn/kaabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Programmiteavet pole"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Teave puudub"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blokeeritud kanal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Tundmatu keel"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Subtiitrid %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Tundmatu keel"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Subtiitrid"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Väljas"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Vormingu kohandamine"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"See PIN-kood oli vale. Proovige uuesti."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Proovige uuesti, PIN-kood pole õige"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Sisestage sihtnumber."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Rakendus Reaalajakanalid kasutab telekanalitele täieliku saatekava pakkumiseks sihtnumbrit."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Sisestage sihtnumber"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Sobimatu sihtnumber"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Seaded"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Kohanda kanaliloendit"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Kanalite valimine saatekava jaoks"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Vanemlik järelevalve"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Avatud lähtekoodi litsentsid"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Avatud lähtekoodi litsentsid"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Tagasiside saatmine"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versioon"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Kanali vaatamiseks vajutage paremale ja sisestage PIN-kood"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Saate vaatamiseks vajutage paremale ja sisestage PIN-kood"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"Teleri menüüle juurdepääsemiseks "<b>"vajutage nuppu SELECT"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"TV-sisendit ei leitud"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV-sisendit ei õnnestu leida"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP-d ei toetata"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Pole ühtegi sisendit, mida saab näidata koos PIP-ga"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Sobimatu tuuneri tüüp. Käivitage tuuneri tüübi TV-sisendi jaoks rakendus Otseülekande kanalid."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Häälestamine ebaõnnestus"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Selle toimingu käsitlemiseks ei leitud ühtegi rakendust."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Salvesta"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Ühekordsete salvestiste prioriteet on kõige kõrgem"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Tühista"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Tühista"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Unusta"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Peata"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Kuva salvestamise ajakava"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Ainult see saade"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Salvesta hoopis see"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Tühista see salvestus"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Kuva nüüd"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Kustuta salvestised …"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Salvestatav"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Salvestamine on ajastatud"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Konflikt salvestamisel"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Salvestamine"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Salvestamine ebaõnnestus"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Programmide lugemine salvestusajakavade loomiseks"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Programmide lugemine"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Kuva hiljutised salvestised"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Saate <xliff:g id="PROGRAMNAME">%1$s</xliff:g> salvestamine on pooleli."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Saadete <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ja <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> salvestamine on pooleli."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Saadete <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ja <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> salvestamine on pooleli."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Ebapiisava salvestusruumi tõttu ei viidud saate <xliff:g id="PROGRAMNAME">%1$s</xliff:g> salvestamist lõpule."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Ebapiisava salvestusruumi tõttu ei viidud saadete <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ja <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> salvestamist lõpule."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Ebapiisava salvestusruumi tõttu ei viidud saadete <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ja <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> salvestamist lõpule."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Programmide lugemine"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR vajab rohkem salvestusruumi"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Saateid saate salvestada DVR-iga. Praegu pole teie seadmes DVR-i töötamiseks siiski piisavalt salvestusruumi. Ühendage väline ketas, mille maht on vähemalt <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB, ja järgige juhiseid selle vormindamiseks salvestusseadmena."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Pole piisavalt mälu"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Programmi ei salvestata, kuna salvestusruumi on liiga vähe. Kustutage mõned olemasolevad salvestised."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Puuduv salvestusruum"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Osa DVR-i kasutatavast salvestusruumist on puudu. DVR-i uuesti lubamiseks ühendage väline ketas, mida varem kasutasite. Teise võimalusena saate salvestusruumi unustada, kui see enam saadaval pole."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Kas unustada salvestusruum?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Kogu teie salvestatud sisu ja ajakavad lähevad kaotsi."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Kas peatada salvestamine?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Salvestatud sisu talletatakse."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Saate <xliff:g id="PROGRAMNAME">%1$s</xliff:g> salvestamine peatatakse, kuna see on selle saatega konfliktis. Salvestatud sisu salvestatakse."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Salvestamine on ajastatud, ent ilmnesid vastuolud"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Salvestamine on alanud, kuid ilmnesid vastuolud"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Saadet <xliff:g id="PROGRAMNAME">%1$s</xliff:g> salvestatakse."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Sama saate salvestus on juba lisatud ajakavva algusega <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Juba salvestatud"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"See saade on juba salvestatud. See on saadaval DVR-i kogus."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Sarja salvestamine lisati ajakavasse"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">Seeria <xliff:g id="SERIESNAME_3">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> salvestist.</item>
- <item quantity="one">Seeria <xliff:g id="SERIESNAME_1">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> salvestis.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">Seeria <xliff:g id="SERIESNAME_3">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> salvestist. Konfliktide tõttu ei salvestata neist <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>.</item>
- <item quantity="one">Seeria <xliff:g id="SERIESNAME_1">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> salvestis. Konfliktide tõttu seda ei salvestata.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">Seeria <xliff:g id="SERIESNAME_4">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> salvestist. Konfliktide tõttu ei salvestata selle seeria ja muude seeriate <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> jagu.</item>
- <item quantity="one">Seeria <xliff:g id="SERIESNAME_1">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> salvestis. Konfliktide tõttu ei salvestata selle seeria ja muude seeriate <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> jagu.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">Seeria <xliff:g id="SERIESNAME_3">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> salvestist. Konfliktide tõttu ei salvestata muu seeria 1 jagu.</item>
- <item quantity="one">Seeria <xliff:g id="SERIESNAME_1">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> salvestis. Konfliktide tõttu ei salvestata muu seeria 1 jagu.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">Seeria <xliff:g id="SERIESNAME_4">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> salvestist. Konfliktide tõttu ei salvestata muu seeria <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> jagu.</item>
- <item quantity="one">Seeria <xliff:g id="SERIESNAME_1">%2$s</xliff:g> puhul lisati ajakavasse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> salvestis. Konfliktide tõttu ei salvestata muu seeria <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> jagu.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Salvestatud programmi ei leitud."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Seotud salvestised"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Programmi kirjeldust pole)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Kas peatada seeria salvestamine?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Salvestatud jaod jäävad saadavale DVR-i kogusse."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Peata"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Ühtegi jagu pole praegu eetris."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Ükski osa pole saadaval.\nNeed salvestatakse siis, kui need kättesaadavaks muutuvad."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutit)</item>
diff --git a/res/values-eu-rES-v23/strings.xml b/res/values-eu-v23/strings.xml
index 86f40b71..86f40b71 100644
--- a/res/values-eu-rES-v23/strings.xml
+++ b/res/values-eu-v23/strings.xml
diff --git a/res/values-eu-rES/arrays.xml b/res/values-eu/arrays.xml
index 89b32135..89b32135 100644
--- a/res/values-eu-rES/arrays.xml
+++ b/res/values-eu/arrays.xml
diff --git a/res/values-eu-rES/rating_system_strings.xml b/res/values-eu/rating_system_strings.xml
index ae0d84d4..ae0d84d4 100644
--- a/res/values-eu-rES/rating_system_strings.xml
+++ b/res/values-eu/rating_system_strings.xml
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu/strings.xml
index e9761874..19a00433 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"estereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Erreprodukzioa kontrolatzeko aukerak"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanalak"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Azken kanalak"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Telebistaren aukerak"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Pantaila txikia"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Erreprodukzioa kontrolatzeko aukerak ez daude erabilgarri kanal honetan"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Erreproduzitu edo pausatu"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Aurreratu"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Azpitituluak"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Bistaratzeko modua"</string>
<string name="options_item_pip" msgid="3951350386626879645">"Pantaila txikia"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Aktibatuta"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Desaktibatuta"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Audio anitza"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Kanal gehiago"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Ezarpenak"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Iturburua"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Aldatu"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Aktibatuta"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Desaktibatuta"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Soinua"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Nagusia"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Pantaila txikia"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Diseinua"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Behean eskuinean"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Goian eskuinean"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Goian ezkerrean"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Behean ezkerrean"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Alboz albo"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Tamaina"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Handia"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Txikia"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Sarrera-iturburua"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Telebista (antena/digitala)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Ez dago telesaioei buruzko informaziorik"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Ez dago informaziorik"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blokeatutako kanala"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Hizkuntza ezezaguna"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Azpitituluak - %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Hizkuntza ezezaguna"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Azpitituluak"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Desaktibatuta"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Pertsonalizatu formatua"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN kodea ez da zuzena. Saiatu berriro."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN kodeak ez datoz bat. Saiatu berriro."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Idatzi posta-kodea."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"\"Telebista zuzenean\" aplikazioak posta-kodea erabiliko du telebistako kanalen programen gida osoa eskaintzeko."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Idatzi posta-kodea"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Posta-kodeak ez du balio"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Ezarpenak"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Pertsonalizatu zerrenda"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Aukeratu telesaioen gidako kanalak"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Gurasoen ezarpenak"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Kode irekiko lizentziak"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Kode irekiko lizentziak"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Bidali iritzia"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Bertsioa"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Kanal hau ikusteko, sakatu Eskuinera tekla eta idatzi PIN kodea."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Telesaio hau ikusteko, sakatu Eskuinera tekla eta idatzi PIN kodea."</string>
@@ -167,13 +181,15 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Telebistaren menua atzitzeko, sakatu HAUTATU"</b></string>
<string name="msg_no_input" msgid="3897674146985427865">"Ez da telebista-sarrerarik aurkitu"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Ezin da aurkitu telebista-sarrera"</string>
- <string name="msg_not_passthrough_input" msgid="4502101097091087411">"Sintonizagailua ez da egokia. Abiarazi Telebista zuzenean aplikazioa sintonizagailua telebistaren sarrera gisa erabiltzeko."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Ez da pantaila txikia erabiltzea onartzen"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Ez dago pantaila txikian erakuts daitekeen sarrerarik"</string>
+ <string name="msg_not_passthrough_input" msgid="4502101097091087411">"Sintonizagailua ez da egokia. Abiarazi zuzeneko kanalen aplikazioa sintonizagailua telebistaren sarrera gisa erabiltzeko."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Ezin izan da sintonizatu"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Ez da aurkitu ekintza gauza dezakeen aplikaziorik."</string>
<string name="msg_all_channels_hidden" msgid="777397634062471936">"Iturburuko kanal guztiak ezkutuan daude.\nHautatu gutxienez kanal bat ikusteko."</string>
<string name="msg_channel_unavailable_unknown" msgid="765586450831081871">"Bideoa ez dago erabilgarri"</string>
<string name="msg_back_key_guide" msgid="7404682718828721924">"Atzera tekla konektatutako gailuari dagokio. Irteteko, sakatu Hasiera botoia."</string>
- <string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Telebista zuzenean aplikazioak baimena behar du telebistako programazioa irakurtzeko."</string>
+ <string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Zuzeneko kanalak aplikazioak baimena behar du telebistako programazioa irakurtzeko."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Konfiguratu iturburuak"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Telebista zuzenean zerbitzuarekin, aplikazioek zuzenean erreproduzitzen dituzten kanalak ohiko telebistaren moduan ikus ditzakezu. \n\nLehen urratsak emateko, konfiguratu instalatutako kanal-iturburuak. Bestela, arakatu Google Play Store denda zuzeneko kanalak eskaintzen dituzten aplikazio gehiago aurkitzeko."</string>
<string name="channels_item_dvr" msgid="8911915252648532469">"Grabaketak eta grabaketen programazioa"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Gorde"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Grabaketa solteek dute lehentasun handiena"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Utzi"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Utzi"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Ahaztu"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Gelditu"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Ikusi grabaketen agenda"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Programa hau bakarrik"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Grabatu beste hau haren ordez"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Utzi grabaketa hau bertan behera"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Ikusi"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Ezabatu grabaketak…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Graba daiteke"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Grabatzeko antolatuta"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Grabatzeko gatazka"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Grabatzen"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Ezin izan da grabatu"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Programak irakurtzen ari gara grabaketa-ordutegiak sortzeko"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Programazioa irakurtzen"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Ikusi azken grabaketak"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Ezin izan da osorik grabatu <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Ezin izan dira osorik grabatu <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> eta <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Ezin izan dira osorik grabatu <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> eta <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Ezin izan da osorik grabatu <xliff:g id="PROGRAMNAME">%1$s</xliff:g>, memoria agortu delako."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Ezin izan dira osorik grabatu <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> eta <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, memoria agortu delako."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Ezin izan dira osorik grabatu <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> eta <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>, memoria agortu delako."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Programazioa irakurtzen"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Bideo-grabagailu digitalak ez dauka behar adina memoria erabilgarri"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Bideo-grabagailu digitalarekin programak grabatu ahal izango dituzu. Dena dela, une honetan ez daukazu bideo-grabagailua erabili ahal izateko behar adina memoria erabilgarri. Konektatu <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB edo gehiago dituen unitate aldagarri bat eta formatea ezazu gailuaren memoria gisa erabiltzeko."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Ez dago behar adina toki"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Ezingo dugu grabatu telesaio hau, ez delako behar adina toki geratzen. Ezabatu grabaketa batzuk tokia egiteko."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Memoria-unitatea falta da"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Bideo-grabagailu digitalak erabili duen memoria-unitateren bat falta da. Bideo-grabagailu digitala gaitu ahal izateko, konektatu aurrez erabilitako unitate aldagarria. Memoria-unitate hura eskura ez baduzu, berriz, aukera ezazu unitatea ahazteko aukera."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Memoria-unitate hau ahaztea nahi duzu?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Grabatuta edo programatuta duzun eduki guztia galduko da."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Grabaketa gelditu nahi duzu?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Grabatutako edukia gordeta geratuko da."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> grabatzeari utziko zaio programa honekin gatazkan dagoelako. Gorde egingo da grabatutako edukia."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Grabatzeko programatu da baina gatazkan dago beste grabaketa batzuekin"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Grabatzen hasi da, baina gatazkak ditu"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> grabatuko da."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Programa hau bera grabatzeko programatu duzu dagoeneko (<xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>)."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Grabatuta dago dagoeneko"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Programa hau grabatuta daukazu dagoeneko. DVR liburutegian duzu ikusgai."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Telesaila grabatzeko antolatuta dago"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> grabaketa antolatu dira (<xliff:g id="SERIESNAME_3">%2$s</xliff:g>).</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabaketa antolatu da (<xliff:g id="SERIESNAME_1">%2$s</xliff:g>).</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> grabaketa antolatu dira (<xliff:g id="SERIESNAME_3">%2$s</xliff:g>). Haietako <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> ezin izango dira grabatu gatazkak daudelako.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabaketa antolatu da (<xliff:g id="SERIESNAME_1">%2$s</xliff:g>). Ezin izango da grabatu gatazkak daudelako.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> grabaketa antolatu dira (<xliff:g id="SERIESNAME_4">%2$s</xliff:g>). Telesail horren eta beste batzuen <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> atal ezin izango dira grabatu gatazkak daudelako.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabaketa antolatu da (<xliff:g id="SERIESNAME_1">%2$s</xliff:g>). Telesail horren eta beste batzuen <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> atal ezin izango dira grabatu gatazkak daudelako.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> grabaketa antolatu dira (<xliff:g id="SERIESNAME_3">%2$s</xliff:g>). Beste telesail baten atal bat ezin izango da grabatu gatazkak daudelako.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabaketa antolatu da (<xliff:g id="SERIESNAME_1">%2$s</xliff:g>). Beste telesail baten atal bat ezin izango da grabatu gatazkak daudelako.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> grabaketa antolatu dira (<xliff:g id="SERIESNAME_4">%2$s</xliff:g>). Beste telesail batzuen <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> atal ezin izango dira grabatu gatazkak daudelako.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> grabaketa antolatu da (<xliff:g id="SERIESNAME_1">%2$s</xliff:g>). Beste telesail batzuen <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> atal ezin izango dira grabatu gatazkak daudelako.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Ez da aurkitu grabatutako programa."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Erlazionatutako grabaketak"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Ez dago programaren azalpenik)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Seriea grabatzeari utzi nahi diozu?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"DVR liburutegian gordeta geratuko dira grabatutako atalak."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Gelditu"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Une honetan ez dira ari atalik igortzen."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Ez dago atalik ikusgai.\nIkusgai ezartzen dituztenean grabatuko ditugu."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutu)</item>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 396a5e66..7dd59c28 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"مونو"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"استریو"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"کنترل‌های پخش"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"کانال‌ها"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"کانال‌های اخیر"</string>
<string name="menu_title_options" msgid="7184594626814914022">"گزینه‌‌ تلویزیون"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"‏گزینه‌های PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"دسترسی به کنترل‌های پخش برای این کانال امکان‌پذیر نیست"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"پخش یا مکث"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"جلو بردن سریع"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"زیرنویس‌ها"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"حالت نمایش"</string>
<string name="options_item_pip" msgid="3951350386626879645">"تصویر در تصویر"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"روشن"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"خاموش"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"چند صدایی"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"دریافت کانا‌ل‌های بیشتر"</string>
<string name="options_item_settings" msgid="7623205838542400074">"تنظیمات"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"منبع"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"تعویض"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"روشن"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"خاموش"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"صدا"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"اصلی"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"پنجره تصویردرتصویر"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"طرح‌بندی"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"پایین سمت راست"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"بالا سمت راست"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"بالا سمت چپ"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"پایین سمت چپ"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"پهلو به پهلو"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"اندازه"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"بزرگ"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"کوچک"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"منبع ورودی"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"تلویزیون (آنتنی/کابلی)"</string>
<string name="no_program_information" msgid="1049844207745145132">"هیچ اطلاعات برنامه‌ای وجود ندارد"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"هیچ اطلاعاتی موجود نیست"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"کانال مسدود شده"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"زبان نامشخص"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"‏زیرنویس %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"زبان نامشخص"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"زیرنویس"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"خاموش"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"سفارشی کردن قالب‌بندی"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"این پین اشتباه بود. دوباره امتحان کنید."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"دوباره امتحان کنید، پین منطبق نیست"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"زیپ‌کدتان را وارد کنید."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"برنامه «کانال‌های زنده» از زیپ‌کد جهت ارائه یک راهنمای برنامه کامل برای کانال‌های تلویزیونی استفاده می‌کند."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"زیپ‌کدتان را وارد کنید"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"زیپ‌کد نامعتبر است"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"تنظیمات"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"سفارشی کردن فهرست کانال‌ها"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"کانال‌ها را برای راهنمای برنامه‌تان انتخاب کنید"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"کنترل‌های والدین"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"مجوزهای منبع آزاد"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"مجوزهای منبع آزاد"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"ارسال بازخورد"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"نسخه"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"برای مشاهده این کانال، راست را فشار دهید و پین خودتان را وارد کنید"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"برای مشاهده این برنامه، راست را فشار دهید و پین خودتان را وارد کنید"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"‏برای دسترسی به منوی تلویزیون، "<b>"SELECT (انتخاب) را فشار دهید"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"هیچ ورودی تلویزیون یافت نشد"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"نمی‌توان ورودی تلویزیون پیدا کرد"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"تصویر در تصویر پشتیبانی نمی‌شود."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"ورودی قابل نمایش با تصویر در تصویر، در دسترس نیست."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"نوع تیونر مناسب نیست. لطفاً برنامه‌ «کانال‌های مستقیم» را برای ورودی تلویزیون نوع تیونر، راه‌اندازی کنید."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"تنظیم نشد"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"برنامه‌ای برای انجام این اقدام پیدا نشد."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"ذخیره"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"ضبط‌های تکی بالاترین اولویت را دارند"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"لغو"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"لغو"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"فراموش شود"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"توقف"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"مشاهده زمان‌بندی ضبط"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"فقط همین برنامه"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"درعوض این مورد ضبط شود"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"لغو این ضبط"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"اکنون تماشا کنید"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"درحال حذف موارد ضبط‌شده…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"قابل ضبط"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"ضبط برنامه‌ریزی‌شده"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"ضبط متناقض با زمان‌بندی"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"درحال ضبط"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"ضبط ناموفق بود"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"درحال خواندن برنامه‌ها برای ایجاد زمان‌بندی ضبط"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"درحال خواندن برنامه‌ها"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"مشاهده موارد ضبط‌شده اخیر"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"ضبط <xliff:g id="PROGRAMNAME">%1$s</xliff:g> کامل نشده است."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"ضبط <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> و <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> کامل نشده است."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"ضبط <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>، <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> و <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> کامل نشده است."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"به دلیل حافظه ناکافی، ضبط <xliff:g id="PROGRAMNAME">%1$s</xliff:g> کامل نشد."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"به دلیل حافظه ناکافی، ضبط <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> و<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> کامل نشد."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"به دلیل حافظه ناکافی، ضبط <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>، <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> و <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> کامل نشد."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"درحال خواندن برنامه‌ها"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"‏DVR به فضای بیشتری نیاز دارد"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"‏با DVR می‌توانید برنامه‌ها را ضبط کنید. اما اکنون فضای ذخیره‌سازی کافی در دستگاهتان وجود ندارد و DVR کار نمی‌کند. لطفاً درایو خارجی‌‌ای با حجم <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> گیگابایت یا بیشتر متصل کنید و برای قالب‌بندی آن‌ به‌عنوان حافظه دستگاه این مراحل را دنبال کنید."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"حافظه ذخیره‌سازی کافی نیست"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"این برنامه ضبط نخوادهد شد، زیرا حافظه ذخیره‌سازی وجود ندارد. برخی از موارد ضبط‌‌شده قبلی را حذف کنید."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"حافظه دردسترس نیست"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"‏مقداری از حافظه‌ای که توسط DVR استفاده می‌شود از بین می‌رود. لطفاً برای فعال‌سازی مجدد DVR، درایو خارجی را که قبلاً‌ استفاده کردید متصل کنید. یا اگر این حافظه دیگر دردسترس نیست می‌توانید انتخاب کنید فراموش شود."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"حافظه فراموش شود؟"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"همه زمان‌بندی‌ها و محتوای ضبط‌شده‌ شما از دست می‌رود."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"ضبط متوقف شود؟"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"محتوای ضبط‌شده ذخیره خواهد شد."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"ضبط <xliff:g id="PROGRAMNAME">%1$s</xliff:g> به دلیل تناقض با این برنامه متوقف خواهد شد. محتوای ضبط‌شده ذخیره می‌شود."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ضبط، زمان‌بندی شده است اما متناقض است"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ضبط شروع شده است اما متناقض است"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ضبط خواهد شد."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"این برنامه قبلاً‌ برای ضبط در <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> زمان‌بندی شده است."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"قبلاً‌ ضبط شده است"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"‏این برنامه قبلاً‌ ضبط شده است و در کتابخانه DVR موجود است."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"ضبط مجموعه زمان‌بندی شد"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_3">%2$s</xliff:g> زمان‌بندی شده است.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_3">%2$s</xliff:g> زمان‌بندی شده است.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_3">%2$s</xliff:g> زمان‌بندی شده است. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> از آن‌ها به دلیل تناقض ضبط نخواهد شد.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_3">%2$s</xliff:g> زمان‌بندی شده است. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> از آن‌ها به دلیل تناقض ضبط نخواهد شد.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_4">%2$s</xliff:g> زمان‌بندی شده است. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> قسمت این مجموعه و مجموعه‌های دیگر به دلیل تناقض ضبط نخواهند شد.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_4">%2$s</xliff:g> زمان‌بندی شده است. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> قسمت این مجموعه و مجموعه‌های دیگر به دلیل تناقض ضبط نخواهند شد.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_3">%2$s</xliff:g> زمان‌بندی شده است. ۱ قسمت مجموعه‌های دیگر به دلیل تناقض ضبط نخواهد شد.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_3">%2$s</xliff:g> زمان‌بندی شده است. ۱ قسمت مجموعه‌های دیگر به دلیل تناقض ضبط نخواهد شد.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_4">%2$s</xliff:g> زمان‌بندی شده است. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> قسمت مجموعه‌های دیگر به دلیل تناقض ضبط نخواهند شد.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ضبط برای <xliff:g id="SERIESNAME_4">%2$s</xliff:g> زمان‌بندی شده است. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> قسمت مجموعه‌های دیگر به دلیل تناقض ضبط نخواهند شد.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"برنامه ضبط‌شده پیدا نشد."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"ضبط‌های مرتبط"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(بدون شرح برنامه)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"ضبط مجموعه متوقف شود؟"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"‏قسمت‌های ضبط‌شده در کتابخانه DVR دردسترس باقی می‌ماند."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"توقف"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"درحال‌حاضر قسمتی پخش مستقیم نمی‌شود."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"هیچ قسمتی موجود نیست.\nهر قسمتی در دسترس قرار بگیرد ضبط خواهد شد."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">‏(%1$d دقیقه)</item>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 548ef41f..b6f5fb7e 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Toistosäätimet"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanavat"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Viim. kanavat"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV-asetukset"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP-asetukset"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Toistosäätimet eivät ole käytettävissä tällä kanavalla."</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Toisto tai keskeytys"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Kelaa eteenpäin"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Tekstitykset"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Näyttötila"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Käytössä"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Ei käytössä"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Moniääni"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Lisää kanavia"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Asetukset"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Lähde"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Vaihda"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Käytössä"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Ei käytössä"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Ääni"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Ensisijainen"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP-ikkuna"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Asettelu"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Alaoikealla"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Yläoikealla"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Ylävasemmalla"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Alavasemmalla"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Vierekkäin"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Mitat"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Suuri"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Pieni"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Syötteen lähde"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antenni/kaapeli)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Ei ohjelmatietoja"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Ei tietoja"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Estetty kanava"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Tuntematon kieli"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Tekstitykset %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Tuntematon kieli"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Tekstitykset"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Ei käytössä"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Muokkaa muotoilua"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Väärä PIN-koodi. Yritä uudelleen."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN-koodit ovat erilaiset, yritä uudelleen"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Anna postinumero"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Live-kanavat-sovellus tarjoaa postinumeron avulla kaikkien alueellasi näkyvien TV-kanavien ohjelmaoppaan."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Anna postinumero"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Virheellinen postinumero"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Asetukset"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Muokkaa kanavaluetteloa"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Valitse kanavat ohjelmaoppaaseen"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Lapsilukko"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Avoimen lähdekoodin käyttöluvat"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Avoimen lähdekoodin käyttöluvat"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Lähetä palautetta"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versio"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Katsele tätä kanavaa painamalla näppäimellä oikealle ja antamalla PIN-koodi"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Katsele tämä ohjelma painamalla näppäimellä oikealle ja antamalla PIN-koodi"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"Avaa TV-valikko "<b>"painamalla VALITSE"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"TV-tuloa ei löytynyt."</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV-tuloa ei löydy."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP:tä ei tueta."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Käytettävissä ei ole syötettä, joka voitaisiin näyttää PIP:ssä."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Viritintä ei tueta. Voit käyttää viritintä käynnistämällä Live-kanavat-sovelluksen."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Viritys epäonnistui."</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Tätä toimintoa käsittelevää sovellusta ei löydy."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Tallenna"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Kertaluotoiset tallennukset ovat tärkeimpiä."</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Peruuta"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Peruuta"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Unohda"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Lopeta"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Näytä tallennusaikataulu"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Vain tämä jakso"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Nauhoita tämä sen sijaan"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Peruuta tämä nauhoitus"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Katso nyt"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Poista tallenteita…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Tallennettavissa"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Tallennus ajastettu"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Tallennusristiriita"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Tallennetaan"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Nauhoitus epäonnistui"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Luetaan ohjelmatietoja tallennusaikataulujen luomista varten."</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Luetaan ohjelmatietoja"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Näytä uusimmat tallenteet"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Kohdetta <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ei nauhoitettu loppuun."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Kohteita <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ja <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ei nauhoitettu loppuun."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Kohteita <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ja <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ei nauhoitettu loppuun."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Kohdetta <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ei nauhoitettu loppuun, koska tallennustila ei riitä."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Kohteita <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ja <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ei nauhoitettu loppuun, koska tallennustila ei riitä."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Kohteita <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ja <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ei nauhoitettu loppuun, koska tallennustila ei riitä."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Luetaan ohjelmatietoja"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR tarvitsee lisää tilaa"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Voit tallentaa ohjelmia DVR:llä. Laitteellasi ei kuitenkaan ole tarpeeksi tilaa DVR:n käyttöön. Yhdistä vähintään <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> Gt:n kokoinen ulkoinen tallennuslaite ja alusta se laitteen tallennustilaksi ohjeiden mukaisesti."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Tallennustila ei riitä"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Tätä ohjelmaa ei tallenneta, koska tallennustila ei riitä. Kokeile poistaa joitakin nykyisiä tallenteita."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Tallennustila puuttuu"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Osa DVR:n käytössä olleesta tallennustilasta puuttuu. Palauta DVR käyttöön liittämällä aiemmin käyttämäsi ulkoinen asema. Voit myös unohtaa tallennustilan, jos asema ei ole enää käytettävissä."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Unohdetaanko tallennustila?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Kaikki tallennettu sisältö ja aikataulut menetetään."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Lopetetaanko tallennus?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Tallennettu sisältö lisätään kirjastoon."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Ohjelman <xliff:g id="PROGRAMNAME">%1$s</xliff:g> nauhoitus pysäytetään, koska se on ristiriidassa tämän ohjelman kanssa. Nauhoitettu sisältö tallennetaan."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Tallennus ajastettu – ristiriitoja havaittu"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Tallennus käynnissä – ristiriitoja havaittu"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> tallennetaan"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Sama ohjelma on jo ajastettu nauhoitettavaksi klo <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Jo nauhoitettu"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Tämä ohjelma on jo nauhoitettu. Se on käytettävissä DVR-kirjastossa."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Sarjan nauhoitus ajastettu"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_3">%2$s</xliff:g> nauhoitusta lisätty.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_1">%2$s</xliff:g> nauhoitus lisätty.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_3">%2$s</xliff:g> nauhoitusta lisätty. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> niistä jätetään nauhoittamatta ristiriidan takia.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_1">%2$s</xliff:g> nauhoitus lisätty. Se jätetään nauhoittamatta ristiriidan takia.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_4">%2$s</xliff:g> nauhoitusta lisätty. Tämän sarjan ja muiden sarjojen <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> jaksoa jätetään nauhoittamatta ristiriidan takia.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_1">%2$s</xliff:g> nauhoitus lisätty. Tämän sarjan ja muiden sarjojen <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> jaksoa jätetään nauhoittamatta ristiriidan takia.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_3">%2$s</xliff:g> nauhoitusta lisätty. Yksi toisen sarjan jakso jätetään nauhoittamatta ristiriidan takia.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_1">%2$s</xliff:g> nauhoitus lisätty. Yksi toisen sarjan jakso jätetään nauhoittamatta ristiriidan takia.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_4">%2$s</xliff:g> nauhoitusta lisätty. Muiden sarjojen <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> jaksoa jätetään nauhoittamatta ristiriidan takia.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> sarjan <xliff:g id="SERIESNAME_1">%2$s</xliff:g> nauhoitus lisätty. Muiden sarjojen <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> jaksoa jätetään nauhoittamatta ristiriidan takia.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Tallennettua ohjelmaa ei löytynyt."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Aiheeseen liittyvät tallenteet"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Ohjelmalla ei ole kuvausta.)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Lopetetaanko sarjan tallennus?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Tallennettuja osia voi edelleen katsella DVR:n kirjastossa."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Lopeta"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Jaksoja ei ole tällä hetkellä saatavilla."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Yhtään jaksoa ei ole saatavilla.\nNe nauhoitetaan, kun ne ovat saatavilla."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minuuttia)</item>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 4b97eb8f..1fc794e3 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stéréo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Commandes de lecture"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Chaînes"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Chaînes récentes"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Options télé"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Options IDI"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Les commandes de lecture ne sont pas disponibles pour cette chaîne"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Lire ou mettre en pause"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Avance rapide"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Sous-titres"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Mode d\'affichage"</string>
<string name="options_item_pip" msgid="3951350386626879645">"IDI"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Activé"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Désactivé"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Plus de chaînes"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Paramètres"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Source"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Basculer"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Activé"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Désactivé"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Son"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principale"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Fenêtre IDI"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Disposition"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"En bas à droite"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"En haut à droite"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"En haut à gauche"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"En bas à gauche"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Côte à côte"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Taille"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Grande"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Petite"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Source de l\'entrée"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Télévision (antenne/câble)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Aucune information sur le programme"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Pas d\'information"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Chaîne bloquée"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Langue indéterminée"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Sous-titres en %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Langue : indéterminée"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Sous-titres"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Désactivé"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Personnaliser format"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Ce NIP est incorrect. Veuillez réessayer."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Le NIP est incorrect. Veuillez réessayer."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Entrez votre code postal."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"L\'application Télé en direct utilisera le code postal pour vous présenter un guide complet des stations de télévision dans votre région."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Entrez votre code postal"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Code postal non valide"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Paramètres"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personnaliser la liste chaînes"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Choisir des chaînes pour le guide des programmes"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Contrôles parentaux"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licences de logiciels libres"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licences de logiciels libres"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Envoyer un commentaire"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Version"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Pour regarder cette chaîne, touchez la droite, puis entrez votre NIP."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Pour regarder ce programme, touchez la droite, puis entrez votre NIP."</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"Appuyez sur la touche "<b>"Sélectionner"</b>" pour accéder au menu Télévision."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Aucune entrée trouvée"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Entrée introuvable"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Le mode Image dans image n\'est pas pris en charge"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Aucune entrée ne pouvant être affichée en mode IDI"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Le type d\'entrée ne convient pas. Veuillez lancer l\'application Chaînes en direct pour une entrée de type syntoniseur."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Échec des réglages"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Aucune application pouvant gérer cette action n\'a été trouvée."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Enregistrer"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Les enregistrements ponctuels ont la plus haute priorité"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Annuler"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Annuler"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Supprimer"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Arrêter"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Voir le programme d\'enregistrement"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Uniquement ce programme"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Enregistrez celui-ci à la place"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Annuler cet enregistrement"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Regarder"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Supprimer des enregistrements"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Enregistrable"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Enregistrement programmé"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Conflit d\'enregistrement"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Enregistrement en cours"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Échec de l\'enregistrement"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Lecture des programmes pour créer des horaires d\'enregistrement…"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Lecture des programmes en cours…"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Afficher les enregistrements récents"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"L\'enregistrement de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> est incomplet."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Les enregistrements de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> et <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> sont incomplets."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Les enregistrements de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> et <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> sont incomplets."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"L\'enregistrement de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> n\'a pas été terminé à cause d\'un espace de stockage insuffisant."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"L\'enregistrement de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> et <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> n\'a pas été terminé à cause d\'un espace de stockage insuffisant."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"L\'enregistrement de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> et <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> n\'a pas été terminé à cause d\'un espace de stockage insuffisant."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Lecture des programmes en cours…"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Le magnétoscope numérique a besoin de plus d\'espace"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Vous pourrez enregistrer des programmes avec le magnétoscope numérique. Toutefois, l\'espace de stockage est insuffisant sur votre appareil pour que le magnétoscope numérique puisse fonctionner actuellement. Veuillez brancher un disque externe d\'au moins <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> Go ou suivez les étapes pour le formater en tant qu\'espace de stockage de l\'appareil."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Espace de stockage insuffisant"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Ce programme ne sera pas enregistré, car l\'espace de stockage disponible est insuffisant. Essayez de supprimer certains enregistrements."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Espace de stockage manquant"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Une partie de l\'espace de stockage utilisé par le magnétoscope numérique est manquante. Veuillez connecter de nouveau le disque externe que vous avez utilisé auparavant afin de réactiver le magnétoscope numérique. Vous pouvez également supprimer cet espace de stockage s\'il n\'est plus disponible."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Supprimer l\'espace de stockage?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Tous vos contenus enregistrés et vos enregistrements planifiés seront perdus."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Arrêter l\'enregistrement?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Le contenu enregistré sera gardé."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"L\'enregistrement de « <xliff:g id="PROGRAMNAME">%1$s</xliff:g> » sera interrompu, car il crée un conflit avec ce programme. Le contenu enregistré sera conservé."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Enregistrement planifié, mais d\'autres enregistrements sont prévus en même temps."</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"L\'enregistrement a commencé, mais d\'autres enregistrements sont prévus en même temps"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Le programme « <xliff:g id="PROGRAMNAME">%1$s</xliff:g> » sera enregistré."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Vous avez déjà planifié l\'enregistrement de ce programme à <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Déjà enregistré"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Ce programme a déjà été enregistré. Il est accessible dans la bibliothèque du magnétoscope numérique."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"L\'enregistrement de la série est programmé"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. L\'enregistrement (<xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>) ne sera pas effectué en raison de conflits.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> d\'entre eux ne seront pas effectués en raison de conflits.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> épisodes de cette série et d\'une autre série ne seront pas enregistrés en raison de conflits.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> épisodes de cette série et d\'une autre série ne seront pas enregistrés en raison de conflits.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Un épisode d\'une autre série ne sera pas enregistré en raison de conflits.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Un épisode d\'une autre série ne sera pas enregistré en raison de conflits.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> épisodes d\'une autre série ne seront pas enregistrés en raison de conflits.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> épisodes d\'une autre série ne seront pas enregistrés en raison de conflits.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Programme enregistré non trouvé."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Enregistrements connexes"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Programme sans description)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Arrêter l\'enregistrement de la série?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Les épisodes enregistrés resteront accessibles dans la bibliothèque du magnétoscope numérique."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Arrêter"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Aucun épisode n\'est diffusé en ce moment."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Aucun épisode.\nLes épisodes seront enregistrés lorsqu\'ils seront diffusés."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d minute)</item>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 9192a821..c140aa62 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stéréo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Commandes de lecture"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Chaînes"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Chaînes récentes"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Options TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Options PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Commandes de lecture indisponibles pour cette chaîne."</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Lire ou mettre en pause"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Avance rapide"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Sous-titres"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Mode d\'affichage"</string>
<string name="options_item_pip" msgid="3951350386626879645">"Mode PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Activé"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Désactivé"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Plus de chaînes"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Paramètres"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Source"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Permuter"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Activé"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Désactivé"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Son"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principale"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Fenêtre mode PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Mise en page"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"En bas à droite"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"En haut à droite"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"En haut à gauche"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"En bas à gauche"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Côte à côte"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Taille"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Grande"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Petite"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Source d\'entrée"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Téléviseur (antenne/câble)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Aucune information sur le programme."</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Aucune information"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Chaîne bloquée"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Langue inconnue"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Sous-titres %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Langue inconnue"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Sous-titres"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Désactivé"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Personnaliser le formatage"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Ce code d\'accès est incorrect. Veuillez réessayer."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Le code est incorrect. Veuillez réessayer."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Saisissez votre code postal."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"L\'application TV en direct utilise le code postal pour fournir un guide des programmes complet pour les chaînes de télévision."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Saisissez votre code postal"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Code postal incorrect"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Paramètres"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personnaliser liste chaînes"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Choisir des chaînes pour le guide des programmes"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Contrôle parental"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licences Open Source"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licences Open Source"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Envoyer des commentaires"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Version"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Pour regarder cette chaîne, appuyez sur le bouton droit, puis saisissez votre code d\'accès."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Pour regarder ce programme, appuyez sur la droite, puis saisissez votre code d\'accès."</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Appuyez sur SÉLECTIONNER"</b>" pour accéder au menu de la télévision."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Aucune entrée TV trouvée."</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Entrée TV introuvable."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Le mode PIP n\'est pas compatible."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Aucune entrée disponible ne peut être affichée en mode PIP."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Type de tuner non adapté. Veuillez lancer l\'application Chaînes en direct pour l\'entrée TV de type tuner."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Échec des réglages."</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Aucune application trouvée pour gérer cette action."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Enregistrer"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Les enregistrements ponctuels ont la plus haute priorité."</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Annuler"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Annuler"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Supprimer"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Arrêter"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Voir planning d\'enregistrement"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Ce programme uniquement"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Enregistrer ce programme"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Annuler cet enregistrement"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Regarder"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Supprimer des enregistrements"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Enregistrable"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Enregistrement programmé"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Conflit d\'enregistrement"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Enregistrement…"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Échec de l\'enregistrement"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Lecture des programmes pour créer des plannings d\'enregistrement…"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Lecture des programmes…"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Afficher les enregistrements récents"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"L\'enregistrement de \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" est incomplet"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Les enregistrements de \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\" et de \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" sont incomplets"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Les enregistrements de \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\", de \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" et de \"<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>\" sont incomplets"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"L\'enregistrement de \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" n\'a pas été effectué en raison d\'un espace de stockage insuffisant."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Les enregistrements de \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\" et de \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" n\'ont pas été effectués en raison d\'un espace de stockage insuffisant."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Les enregistrements de \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\", de \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" et de \"<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>\" n\'ont pas été effectués en raison d\'un espace de stockage insuffisant."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Lecture des programmes…"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Le magnétoscope numérique a besoin de plus d\'espace"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Vous pourrez enregistrer des programmes avec le magnétoscope numérique. Toutefois, l\'espace de stockage est insuffisant sur votre appareil pour que le magnétoscope numérique puisse fonctionner actuellement. Veuillez brancher un disque externe d\'au moins <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> Go ou suivre les étapes pour le formater en tant qu\'espace de stockage de l\'appareil."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Espace de stockage insuffisant"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Ce programme ne sera pas enregistré, car l\'espace de stockage disponible est insuffisant. Essayez de supprimer certains enregistrements."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Espace de stockage manquant"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Une partie de l\'espace de stockage utilisé par le magnétoscope numérique est manquante. Veuillez connecter de nouveau le disque externe que vous avez utilisé auparavant afin de réactiver le magnétoscope numérique. Vous pouvez également supprimer cet espace de stockage s\'il n\'est plus disponible."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Supprimer l\'espace de stockage ?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Tous vos contenus enregistrés et vos enregistrements planifiés seront perdus."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Arrêter l\'enregistrement ?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Le contenu enregistré sera sauvegardé."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"L\'enregistrement de \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" va être interrompu, car il crée un conflit avec ce programme. Le contenu enregistré sera conservé."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Enregistrement planifié, mais d\'autres enregistrements sont prévus en même temps."</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"L\'enregistrement a commencé, mais présente des conflits"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Le programme \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" sera enregistré."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Vous avez déjà planifié l\'enregistrement de ce programme à <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Déjà enregistré"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Ce programme a déjà été enregistré. Il est disponible dans la bibliothèque DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Enregistrement de la série programmé"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. L\'enregistrement (<xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>) ne sera pas effectué en raison de conflits.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> enregistrements ne seront pas effectués en raison de conflits.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> épisodes de cette série et d\'une autre série ne seront pas enregistrés en raison de conflits.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> épisodes de cette série et d\'une autre série ne seront pas enregistrés en raison de conflits.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 épisode d\'une autre série ne sera pas enregistré en raison de conflits.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 épisode d\'une autre série ne sera pas enregistré en raison de conflits.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistrement a été programmé pour <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> épisodes d\'une autre série ne seront pas enregistrés en raison de conflits.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> enregistrements ont été programmés pour <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> épisodes d\'une autre série ne seront pas enregistrés en raison de conflits.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Programme enregistré introuvable."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Enregistrements associés"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Programme sans description)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Arrêter l\'enregistrement de la série ?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Les épisodes enregistrés resteront disponibles dans la bibliothèque DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Arrêter"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Aucun épisode n\'est diffusé actuellement."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Aucun épisode disponible.\nLes épisodes seront enregistrés lorsqu\'ils seront disponibles."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d minute)</item>
diff --git a/res/values-gl-rES-v23/strings.xml b/res/values-gl-v23/strings.xml
index 7cb59c66..7cb59c66 100644
--- a/res/values-gl-rES-v23/strings.xml
+++ b/res/values-gl-v23/strings.xml
diff --git a/res/values-gl-rES/arrays.xml b/res/values-gl/arrays.xml
index 0bbc3853..0bbc3853 100644
--- a/res/values-gl-rES/arrays.xml
+++ b/res/values-gl/arrays.xml
diff --git a/res/values-gl-rES/rating_system_strings.xml b/res/values-gl/rating_system_strings.xml
index 20456b34..20456b34 100644
--- a/res/values-gl-rES/rating_system_strings.xml
+++ b/res/values-gl/rating_system_strings.xml
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl/strings.xml
index 31c42390..7ce0ac2d 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"estéreo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Controis de reprodución"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Canles"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Canles recentes"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opcións de TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opcións de PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Os controis de reprodución non están dispoñibles nesta canle"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Reprodución ou pausa"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Avance rápido"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Subtítulos"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Modo visualiz."</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Activado"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Desactivado"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multiaudio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Obter máis canles"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Configuración"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Fonte"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Cambiar"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Activado"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Desactivado"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Son"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principal"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Ventá de PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Deseño"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Abaixo dereita"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Arriba dereita"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Arriba esquerda"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Abaixo esquerda"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"En paralelo"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Tamaño"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Grande"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Pequeno"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Fonte de entrada"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/cable)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Non hai información do programa"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Non hai información"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Canle bloqueada"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Idioma descoñecido"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Subtítulos en %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Idioma descoñecido"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Subtítulos"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Desactivado"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Personalizar formato"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"О PIN era incorrecto. Téntao de novo."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Téntao de novo. O PIN non coincide."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Introduce o teu código postal."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"A aplicación TV en directo usará o teu código postal para ofrecer unha guía de programas completa para as canles da televisión."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Introduce o teu código postal"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"O código postal non é válido"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Configuración"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personalizar lista de canles"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Selecciona canles para a túa guía de programas"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Controis parentais"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licenzas de código aberto"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licenzas de código aberto"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Enviar comentarios"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versión"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Para ver esta canle, preme na tecla cara á dereita e introduce o PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Para ver esta programa, preme na tecla cara á dereita e introduce o PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Preme SELECCIONAR"</b>" para acceder ao menú da televisión."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Non se atopou ningunha entrada de televisión"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Non se pode atopar a entrada de televisión"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP non é compatible"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Non hai ningunha entrada que se poida mostrar con PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tipo de sintonizador non adecuado. Inicia a aplicación Canles en directo para a entrada de TV do tipo de sintonizador."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Erro de sintonización"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Non se encontrou ningunha aplicación para procesar esta acción."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Gardar"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"As gravacións realizadas unha soa vez teñen máis prioridade"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Cancelar"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Cancelar"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Borrar"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Deter"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Ver programación de gravación"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Só este programa"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Gravar isto no seu lugar"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Cancelar esta gravación"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Visualizar agora"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Eliminar gravacións..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Gravable"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Gravación programada"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Conflito de gravación"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Gravando"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Erro na gravación"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Lendo programas para crear programacións de gravacións"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Lendo programas"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Ver gravacións recentes"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"A gravación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> non está completa."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"As gravacións de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> e <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> non están completas."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"As gravacións de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> e <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> non están completas."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"A gravación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> non se completou por falta de almacenamento suficiente."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"As gravacións de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> e <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> non se completaron por falta de almacenamento suficiente."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"As gravacións de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> e <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> non se completaron por falta de almacenamento suficiente."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Lendo programas"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"O DVR precisa máis almacenamento"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Poderás gravar programas con DVR. Non obstante, o teu dispositivo non ten almacenamento suficiente para que funcione DVR. Conecta unha unidade externa de <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB ou máis e sigue os pasos para formatala como almacenamento do dispositivo."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Non hai almacenamento suficiente"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Este programa non se gravará porque non hai almacenamento suficiente. Proba a eliminar algunhas gravacións."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Falta o almacenamento"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Falta parte do almacenamento que utiliza DVR. Conecta a unidade externa que utilizaches antes para volver activar DVR. Tamén podes decidir borrar o almacenamento se xa non está dispoñible."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Queres borrar o almacenamento?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Perderase toda a programación e o contido gravados."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Queres deter a gravación?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Gardarase o contido gravado."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Deterase a gravación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> porque supón un conflito con este programa. Gardarase o contido gravado."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Programouse a gravación, pero presenta conflitos"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Iniciouse a gravación pero presenta conflitos"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Gravarase <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Xa se programou a gravación do mesmo programa para a seguinte hora: <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Xa está gravado"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Este programa xa está gravado e está dispoñible na mediateca de DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Programouse a gravación da serie"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">Programáronse <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravacións para <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">Programouse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">Programáronse <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravacións para <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Non se gravarán <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> delas por causa dun conflito.</item>
- <item quantity="one">Programouse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Non se gravará por causa dun conflito.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">Programáronse <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> gravacións para <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Non se gravarán <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodios destas series nin doutras por causa dun conflito.</item>
- <item quantity="one">Programouse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Non se gravarán <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodios destas series nin doutras por causa dun conflito.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">Programáronse <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravacións para <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Non se gravará 1 episodio doutras series por causa dun conflito.</item>
- <item quantity="one">Programouse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Non se gravará 1 episodio doutras series por causa dun conflito.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">Programáronse <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> gravacións para <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Non se gravarán <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodios doutras series por causa dun conflito.</item>
- <item quantity="one">Programouse <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravación para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Non se gravarán <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episodios doutras series por causa dun conflito.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Non se atopou o programa gravado."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Gravacións relacionadas"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Non hai descrición do programa)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Queres deter a gravación da serie?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Os episodios gravados seguirán dispoñibles na mediateca de DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Deter"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Agora non hai episodios en directo."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Non hai episodios dispoñibles.\nGravaranse unha vez que estean dispoñibles."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutos)</item>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 16178462..d6db8677 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"मोनो"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"स्टीरियो"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"चलाने के नियंत्रण"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"चैनल"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"हाल ही के चैनल"</string>
<string name="menu_title_options" msgid="7184594626814914022">"टीवी विकल्प"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP विकल्‍प"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"इस चैनल के लिए चलाने के नियंत्रण अनुपलब्‍ध हैं"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"चलाएं या रोकें"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"फ़ास्ट फ़ॉरवर्ड करें"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"उपशीर्षक"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"प्रदर्शन मोड"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"चालू"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"बंद"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"एकाधिक-ऑडियो"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"अधिक चैनल पाएं"</string>
<string name="options_item_settings" msgid="7623205838542400074">"सेटिंग"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"स्रोत"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"स्वैप करें"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"चालू"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"बंद"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ध्वनि"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"मुख्‍य"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP विंडो"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"लेआउट"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"नीचे दाएं"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ऊपर दाएं"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ऊपर बाएं"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"नीचे बाएं"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"साथ-साथ"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"आकार"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"बड़ा"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"छोटा"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"इनपुट स्रोत"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"टीवी (एंटिना/केबल)"</string>
<string name="no_program_information" msgid="1049844207745145132">"कोई कार्यक्रम जानकारी नहीं"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"कोई सूचना नहीं"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"अवरोधित चैनल"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"अज्ञात भाषा"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"बंद कैप्शन %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"अज्ञात भाषा"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"उपशीर्षक"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"बंद"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"प्रारूपण कस्टमाइज़ करें"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"वह पिन गलत था. पुन: प्रयास करें."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"फिर से प्रयास करें, पिन का मिलान नहीं हुआ"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"अपना ज़िप कोड डालें."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"लाइव चैनल ऐप्लिकेशन ज़िप कोड का उपयोग करके टीवी चैनल के लिए पूरी कार्यक्रम मार्गदर्शिका देगा."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"अपना ज़िप कोड डालें"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"अमान्य ज़िप कोड"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"सेटिंग"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"चैनल सूची कस्टमाइज़ करें"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"कार्यक्रम मार्गदर्शिका के लिए चैनल चुनें"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"अभिभावकीय नियंत्रण"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"ओपन सोर्स लाइसेंस"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"ओपन सोर्स लाइसेंस"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"फ़ीडबैक भेजें"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"वर्शन"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"इस चैनल को देखने के लिए, दाईं ओर दबाएं और अपना पिन डालें"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"इस कार्यक्रम को देखने के लिए, दाईं ओर दबाएं और अपना पिन डालें"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"टीवी मेनू ऐक्‍सेस करने के लिए "<b>"चुनें"</b>" दबाएं."</string>
<string name="msg_no_input" msgid="3897674146985427865">"कोई टीवी इनपुट नहीं मिला"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"टीवी इनपुट नहीं मिल पा रहा है"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP समर्थित नहीं है"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"कोई उपलब्ध इनपुट नहीं है जिसे PIP के साथ दिखाया जा सके"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ट्यूनर प्रकार उपयुक्‍त नहीं है. कृपया ट्यूनर प्रकार टीवी इनपुट के लिए Live TV ऐप लॉन्‍च करें."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ट्यून विफल रहा"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"यह कार्रवाई प्रबंधित करने के लिए कोई ऐप नहीं मिला."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"सहेजें"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"एक बार की रिकॉर्डिंग को उच्च प्राथमिकता दी जाती है"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"रद्द करें"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"रद्द करें"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"भूल जाएं"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"रोकें"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"रिकॉर्डिंग शेड्यूल देखें"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"यह एक ही कार्यक्रम"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"उसके बजाय इसे रिकॉर्ड करें"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"यह रिकॉर्डिंग रद्द करें"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"अभी देखें"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"रिकॉर्डिंग हटाएं…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"रिकॉर्ड करने योग्य"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"रिकॉर्डिंग शेड्यूल की गई"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"रिकॉर्डिंग संबंधी विरोध"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"रिकॉर्ड हो रहा है"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"रिकॉर्डिंग विफल रही"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"रिकॉर्डिंग शेड्यूल बनाने के लिए कार्यक्रम पढ़े जा रहे हैं"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"कार्यक्रम पढ़े जा रहे हैं"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"हाल ही की रिकॉर्डिंग देखें"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> की रिकॉर्डिंग अधूरी है."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> और <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> की रिकॉर्डिंग अधूरी है."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> और <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> की रिकॉर्डिंग अधूरी है."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"पर्याप्त जगह नहीं होने के कारण <xliff:g id="PROGRAMNAME">%1$s</xliff:g> की रिकॉर्डिंग पूरी नहीं हुई."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"पर्याप्त जगह नहीं होने के कारण <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> और <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> की रिकॉर्डिंग पूरी नहीं हुई."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"पर्याप्त जगह नहीं होने के कारण <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> और <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> की रिकॉर्डिंग पूरी नहीं हुई."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"प्रोग्राम पढ़े जा रहे हैं"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR को अधिक जगह की आवश्यकता है"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"आप DVR से प्रोग्राम रिकॉर्ड कर पाएंगे. हालांकि इस समय आपके डिवाइस पर DVR के काम करने के लिए पर्याप्त जगह नहीं है. कृपया एक बाहरी डिवाइस कनेक्ट करें जिसमें <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB या उससे अधिक जगह हो और उसे डिवाइस जगह के रूप में फ़ॉर्मेट करने के चरणों का अनुसरण करें."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"पर्याप्‍त जगह नहीं है"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"इस कार्यक्रम को रिकॉर्ड नहीं किया जाएगा क्योंकि पर्याप्त जगह उपलब्ध नहीं है. कुछ मौजूदा रिकॉर्डिंग हटाकर देखें."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"जगह मिल नहीं रही है"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR द्वारा उपयोग की गई कुछ जगह मिल नहीं रही है. कृपया DVR को दोबारा सक्षम करने से पहले अपनी उपयोग की हुई बाहरी डिस्क कनेक्ट करें. वैकल्पिक रूप से, यदि जगह अब उपलब्ध नहीं है तो आप उसे भूल जाना चुन सकते हैं."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"जगह को भूल जाएं?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"आपकी रिकॉर्ड की हुई सभी सामग्री और शेड्यूल खो जाएंगे."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"रिकॉर्डिंग बंद करें?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"रिकॉर्ड की गई सामग्री सहेज ली जाएगी."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> की रिकॉर्डिंग रोक दी जाएगी क्योंकि यह इस प्रोग्राम का विरोध करता है. रिकॉर्ड की गई सामग्री सहेज ली जाएगी."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"रिकॉर्डिंग शेड्यूल की गई लेकिन विरोध मौजूद हैं"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"रिकॉर्डिंग शुरू हो गई है लेकिन उसमें विरोध मौजूद हैं"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> रिकॉर्ड किया जाएगा."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"इसी कार्यक्रम को <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> बजे रिकॉर्ड करने के लिए पहले ही शेड्यूल किया जा चुका है."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"पहले ही रिकॉर्ड हो चुका है"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"यह कार्यक्रम पहले ही रिकॉर्ड हो चुका है. वह DVR लाइब्रेरी में उपलब्ध है."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"सीरीज़ रिकॉर्डिंग शेड्यूल की गई"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं. अन्य शेड्यूल से विरोधों के कारण उनमें से <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> को रिकॉर्ड नहीं किया जाएगा.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं. अन्य शेड्यूल से विरोधों के कारण उनमें से <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> को रिकॉर्ड नहीं किया जाएगा.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं. अन्य शेड्यूल और दूसरे सीरीज़ के एपिसोड से विरोधों के कारण इस सीरीज़ और अन्य सीरीज़ के <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> एपिसोड रिकॉर्ड नहीं किए जाएंगे.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं. अन्य शेड्यूल और दूसरे सीरीज़ के एपिसोड से विरोधों के कारण इस सीरीज़ और अन्य सीरीज़ के <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> एपिसोड रिकॉर्ड नहीं किए जाएंगे.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं. इस सीरीज़ से विरोधों के कारण अन्य सीरीज़ का 1 एपिसोड रिकॉर्ड नहीं किया जाएगा.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं. इस सीरीज़ से विरोधों के कारण अन्य सीरीज़ का 1 एपिसोड रिकॉर्ड नहीं किया जाएगा.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं. इस सीरीज़ से विरोधों के कारण अन्य सीरीज़ के <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> एपिसोड रिकॉर्ड नहीं किए जाएंगे.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> के लिए <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रिकॉर्डिंग शेड्यूल कर दी गई हैं. इस सीरीज़ से विरोधों के कारण अन्य सीरीज़ के <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> एपिसोड रिकॉर्ड नहीं किए जाएंगे.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"रिकॉर्ड किया गया प्रोग्राम नहीं मिला."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"संबंधित रिकॉर्डिंग"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(कोई कार्यक्रम वर्णन नहीं)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"श्रृंखला की रिकॉर्डिंग रोकें?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"रिकॉर्ड किए गए एपिसोड DVR लाइब्रेरी में उपलब्ध रहेंगे."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"रोकें"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"इस समय कोई भी एपिसोड प्रसारित नहीं हो रहा है."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"कोई भी एपिसोड उपलब्ध नहीं है.\nएपिसोड उपलब्ध होने पर उन्हें रिकॉर्ड कर लिया जाएगा."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d मिनट)</item>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 2bd8328e..596a3f96 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Kontrole reprodukcije"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanali"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Nedavni kanali"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV opcije"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opcije PIP-a"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Kontrole reprodukcije nisu dostupne za ovaj kanal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Reprodukcija ili pauziranje"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Brzo unaprijed"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Titlovi"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Način prikaza"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Uključeno"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Isključeno"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multiaudio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Više kanala"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Postavke"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Izvor"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Zamijeni"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Uključeno"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Isključeno"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Zvuk"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Glavni"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Prozor PIP-a"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Raspored"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Pri dnu desno"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Pri vrhu desno"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Pri vrhu lijevo"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Pri dnu lijevo"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Jedno uz drugo"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Veličina"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Velik"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Malen"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Izvor ulaza"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Nema podataka o programu"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Nema informacija"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blokirani kanal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Nepoznati jezik"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Titlovi %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Nepoznati jezik"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Titlovi"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Isključeno"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Prilagodi format"</string>
@@ -118,10 +137,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN je pogrešan. Pokušajte ponovno."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Pokušaj ponovo, PIN se ne podudara"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Unesite svoj poštanski broj."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Na temelju poštanskog broja aplikacija TV kanali uživo pružit će vam potpun programski vodič za TV kanale."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Unesite svoj poštanski broj"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Poštanski broj nije važeći"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Postavke"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Prilagodite popis kanala"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Odaberite kanale za programski vodič"</string>
@@ -130,7 +145,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Roditeljski nadzor"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licence otvorenog izvornog koda"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licence otvorenog izvornog koda"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Pošaljite povratne informacije"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Verzija"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Da biste gledali ovaj kanal, pritisnite desno pa unesite PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Da biste gledali ovaj program, pritisnite desno pa unesite PIN"</string>
@@ -171,6 +185,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Pritisnite ODABERITE"</b>" da biste pristupili izborniku TV-a."</string>
<string name="msg_no_input" msgid="3897674146985427865">"TV ulaz nije pronađen"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV ulaz nije pronađen"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP nije podržan"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Nema dostupnog ulaza koji se može prikazati putem PIP-a"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Vrsta prijemnika nije prikladna. Pokrenite aplikaciju Kanali uživo ako želite koristiti prijemnik kao TV ulaz."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Traženje kanala nije uspjelo"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Nije pronađena nijedna aplikacija koja može provesti tu radnju."</string>
@@ -253,6 +269,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Spremi"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Jednokratna snimanja imaju najviši prioritet"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Odustani"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Odustani"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Zaboravi"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Zaustavi"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Prikaz rasporeda snimanja"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Samo jedna epizoda"</string>
@@ -262,29 +280,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Snimi ovo"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Otkaži snimanje"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Pogledajte odmah"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Brisanje snimki…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Snimanje moguće"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Snimanje programirano"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Sukob rasporeda snimanja"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Snimanje"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Snimanje nije uspjelo"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Čitanje emisija za izradu rasporeda snimanja"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Čitanje emisija"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Prikaži nedavne snimke"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Snimka sadržaja <xliff:g id="PROGRAMNAME">%1$s</xliff:g> nije dovršena."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Snimke sadržaja <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> i <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> nisu dovršene."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Snimke sadržaja <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> i <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> nisu dovršene."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Snimanje sadržaja <xliff:g id="PROGRAMNAME">%1$s</xliff:g> nije dovršeno jer nema dovoljno mjesta u pohrani."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Snimanje sadržaja <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> i <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> nije dovršeno jer nema dovoljno mjesta u pohrani."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Snimanje sadržaja <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> i <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> nije dovršeno jer nema dovoljno mjesta u pohrani."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Čitanje emisija"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR treba više prostora za pohranu"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Moći ćete snimati programe DVR-om. No na vašem uređaju trenutačno nema dovoljno prostora za pohranu da bi DVR funkcionirao. Priključite vanjski disk od najmanje <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB i formatirajte ga kao pohranu uređaja prema uputama."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Nema dovoljno prostora za pohranu"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Emisija se neće snimiti jer nema dovoljno prostora za pohranu. Izbrišite neke snimljene emisije."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Pohrana nedostaje"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Nedostaje dio pohrane kojom se koristi DVR. Da biste ponovo omogućili DVR, povežite ga s vanjskim diskom koji ste upotrebljavali prethodno. Ako ta pohrana više nije dostupna, možete odabrati da je uređaj zaboravi."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Zaboraviti pohranu?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Izgubit ćete sve snimljene sadržaje i programirana snimanja."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Želite li zaustaviti snimanje?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Snimljeni će se sadržaj spremiti."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Snimanje sadržaja <xliff:g id="PROGRAMNAME">%1$s</xliff:g> zaustavit će se zbog sukoba s ovim programom. Snimljeni sadržaj ostat će spremljen."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Snimanje je programirano, ali ima sukoba"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Snimanje je započelo, ali ima sukoba"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Snimit će se <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -303,32 +317,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Snimanje tog programa već je programirano za <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Već snimljeno"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Taj je program već snimljen. Dostupan je u zbirci DVR-a."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Snimanje serije je zakazano"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> snimanje zakazano je za seriju <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> snimanja zakazana su za seriju <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> snimanja zakazano je za seriju <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> snimanje zakazano je za seriju <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> od njih neće se snimiti zbog sukoba.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> snimanja zakazana su za seriju <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> od njih neće se snimiti zbog sukoba.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> snimanja zakazano je za seriju <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> od njih neće se snimiti zbog sukoba.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> snimanje zakazano je za seriju <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizoda/e te serije i druge serije neće se snimiti zbog sukoba.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> snimanja zakazana su za seriju <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizoda/e te serije i druge serije neće se snimiti zbog sukoba.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> snimanja zakazano je za seriju <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizoda/e te serije i druge serije neće se snimiti zbog sukoba.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> snimanje zakazano je za seriju <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 epizoda neke druge serije neće se snimiti zbog sukoba.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> snimanja zakazana su za seriju <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 epizoda neke druge serije neće se snimiti zbog sukoba.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> snimanja zakazano je za seriju <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 epizoda neke druge serije neće se snimiti zbog sukoba.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> snimanje zakazano je za seriju <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizoda/e neke druge serije neće se snimiti zbog sukoba.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> snimanja zakazana su za seriju <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizoda/e neke druge serije neće se snimiti zbog sukoba.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> snimanja zakazano je za seriju <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizoda/e neke druge serije neće se snimiti zbog sukoba.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Snimljeni program nije pronađen."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Povezane snimke"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Nema opisa programa)"</string>
@@ -353,7 +349,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Želite li zaustaviti snimanje serije?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Snimljene epizode ostat će dostupne u zbirci DVR-a."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Zaustavi"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Trenutačno se ne emitira nijedna epizoda."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Nije dostupna nijedna epizoda.\nEpizode će se snimiti kada budu dostupne."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d minuta)</item>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 7f8b700d..d007a135 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"monó"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"sztereó"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Lejátszásvezérlők"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Csatornák"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Legutóbbiak"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Tv beállításai"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP-beállítások"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"A lejátszási vezérlők nem érhetők el ennél a csatornánál"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Lejátszás vagy szüneteltetés"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Előretekerés"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Feliratok"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Megjelenítés"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Bekapcsolva"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Kikapcsolva"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Több hangsáv"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"További csatornák"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Beállítások"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Forrás"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Csere"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Bekapcsolva"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Kikapcsolva"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Hang"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Elsődleges"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP-ablak"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Elrendezés"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Lent jobbra"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Fent jobbra"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Fent balra"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Lent balra"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Egymás mellett"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Méret"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Nagy"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Kicsi"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Bemeneti forrás"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antenna/kábel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Nincsenek műsorinformációk"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Nincs információ."</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Letiltott csatorna"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Ismeretlen nyelv"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Feliratok (%1$d)"</string>
+ <string name="default_language" msgid="4122326459624337928">"Ismeretlen nyelv"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Feliratok"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Kikapcsolva"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Személyre szabás"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"A PIN-kód helytelen, próbálja újra."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"A PIN-kód nem egyezik, próbálja újra"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Irányítószám megadása"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Az Élő Csatornák alkalmazás az irányítószám használatával megjeleníti a csatornák teljes tévéműsorát."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Adja meg irányítószámát"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Érvénytelen irányítószám"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Beállítások"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Csatornalista testreszabása"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Válasszon csatornákat a műsorfüzetbe"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Szülői felügyelet"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Nyílt forráskódú licencek"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Nyílt forráskódú licencek"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Visszajelzés küldése"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Verzió"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"A csatorna megtekintéséhez nyomja meg a jobbra gombot, majd adja meg a PIN kódot"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"A műsor megtekintéséhez nyomja meg a jobbra gombot, majd adja meg a PIN kódot"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Nyomja meg a KIVÁLASZTÁS"</b>" gombot a tévé menüjének eléréséhez."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nem található tévébemenet."</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"A tévébemenet nem található."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"A kép a képben funkció nem támogatott."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Nincs elérhető bemeneti adás, amely megjeleníthető lenne a kép a képben (picture in picture, PIP) funkcióval."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"A tuner típusa nem megfelelő. Indítsa el a tévé bemeneti tunertípusának megfelelő Élő csatornák alkalmazást."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Tunerhiba"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Nincs megfelelő alkalmazás a művelet végrehajtásához."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Mentés"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Az egyszeri rögzítések rendelkeznek a legmagasabb prioritással"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Mégse"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Mégse"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Elfelejt"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Leállítás"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Rögzítési ütemterv megtekintése"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Ezt az egy műsort"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Inkább ez legyen rögzítve"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"A rögzítés törlése"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Nézze meg most"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Felvételek törlése…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Felvehető"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"A felvétel beállítva"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Ütközés más felvétellel"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Rögzítés"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"A felvétel nem sikerült"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Műsorok beolvasása a rögzítési ütemterv kialakításához"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Műsorok beolvasása"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"A legutóbbi felvételek megtekintése"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"A(z) <xliff:g id="PROGRAMNAME">%1$s</xliff:g> felvétele megszakadt."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"A következők felvétele megszakadt: <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> és <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"A következők felvétele megszakadt: <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> és <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"A(z) <xliff:g id="PROGRAMNAME">%1$s</xliff:g> felvétele nem sikerült, mert nincs elég tárhely."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"A következők felvétele a kevés tárhely miatt nem sikerült: <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> és <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"A következők felvétele a kevés tárhely miatt nem sikerült: <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> és <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Műsorok beolvasása"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"A DVR számára több tárhely szükséges"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"A DVR segítségével műsorokat vehet fel. Azonban eszközén nincs elég szabad tárhely a DVR működéséhez. Csatlakoztasson egy legalább <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB tárhellyel rendelkező külső meghajtót, majd kövesse az utasításokat, hogy az eszköz tárhelyévé formázhassa."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Nincs elegendő tárhely"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Ez a műsor nem lesz felvéve, mivel nincs elegendő tárhely. Próbáljon meg törölni néhány meglévő felvételt."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Hiányzó tárhely"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"A DVR által használt tárhely bizonyos része hiányzik. Kérjük, csatlakoztassa a korábban használt külső meghajtót a DVR ismételt engedélyezéséhez. Másik megoldásként megadhatja a rendszernek, hogy ne emlékezzen többé erre a tárhelyre, ha már nem áll a rendelkezésére."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"A rendszer ne emlékezzen többé erre a tárhelyre?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Az összes rögzített tartalom és ütemterv elvész."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Leállítja a rögzítést?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"A rögzített tartalmat elmenti a rendszer."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"A(z) <xliff:g id="PROGRAMNAME">%1$s</xliff:g> felvétele le fog állni, mert ütközik ezzel a programmal. A felvett tartalmat az alkalmazás menteni fogja."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"A rögzítést beállította, de az ütközik más műsorokkal"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"A rögzítés elindult, de az ütközik más műsorokkal"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"A(z) <xliff:g id="PROGRAMNAME">%1$s</xliff:g> rögzítve lesz."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Ugyanennek a műsornak a rögzítése már be van ütemezve a következő időpontban: <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Már készült róla felvétel"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Erről a műsorról már készült felvétel, amely a DVR könyvtárban található."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Sorozatfelvétel ütemezve"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Ütközés miatt a rendszer nem rögzít <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> felvételt.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Ütközés miatt a rendszer nem rögzíti a felvételt.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Ütközés miatt a rendszer <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizódot nem rögzít ebből, valamint más sorozatokból.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Ütközés miatt a rendszer <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> epizódot nem rögzít ebből, valamint más sorozatokból.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Ütközés miatt a rendszer 1 epizódot nem rögzít más sorozatokból.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Ütközés miatt a rendszer 1 epizódot nem rögzít más sorozatokból.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Ütközés miatt a rendszer <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> epizódot nem rögzít más sorozatokból.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> felvétel van ütemezve a következőhöz: <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Ütközés miatt a rendszer <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> epizódot nem rögzít más sorozatokból.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"A rögzített program nem található."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Kapcsolódó felvételek"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Nincs programleírás)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Leállítja a sorozat rögzítését?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"A rögzített részek továbbra is hozzáférhetők lesznek a DVR könyvtárban."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Leállítás"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Egyetlen epizódot sem közvetítenek jelenleg."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Nincs rendelkezésre álló epizód.\nAz epizódok a megjelenésüket követően lesznek rögzítve."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d perc)</item>
diff --git a/res/values-hy-rAM-v23/strings.xml b/res/values-hy-v23/strings.xml
index 774fbd3d..774fbd3d 100644
--- a/res/values-hy-rAM-v23/strings.xml
+++ b/res/values-hy-v23/strings.xml
diff --git a/res/values-hy-rAM/arrays.xml b/res/values-hy/arrays.xml
index 5c6f0bfd..5c6f0bfd 100644
--- a/res/values-hy-rAM/arrays.xml
+++ b/res/values-hy/arrays.xml
diff --git a/res/values-hy-rAM/rating_system_strings.xml b/res/values-hy/rating_system_strings.xml
index 8c69ca7e..8c69ca7e 100644
--- a/res/values-hy-rAM/rating_system_strings.xml
+++ b/res/values-hy/rating_system_strings.xml
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy/strings.xml
index 8ed0fb5e..d10652e1 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"մոնո"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"ստերեո"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Նվագարկման կառավար"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Հեռուստաալիքներ"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Վերջինները"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Հեռ. ընտրանքներ"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP ընտրանքներ"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Նվագարկման կառավարներն այս ալիքում անհասանելի են"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Նվագարկել կամ դադարեցնել"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Արագ առաջանցում"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Փակ խորագրեր"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Ցուցադրման ռեժիմ"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Միացված է"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Անջատված է"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Բազմաուդիո"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Ավելացնել ալիքներ"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Կարգավորումներ"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Աղբյուր"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Փոխել"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Միացված է"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Անջատված է"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Ձայն"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Հիմնական"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP պատուհան"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Դասավորություն"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Ստորին աջ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Վերին աջ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Վերին ձախ"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Ստորին ձախ"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Կողք կողքի"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Չափը"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Մեծ"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Փոքր"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Աղբյուր"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Հեռուստացույց (ալեհավաք/մալուխ)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Ծրագրի մասին տեղեկություններ չկան"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Տեղեկություն չկա"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Ալիքն արգելափակված է:"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Անհայտ լեզու"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"%1$d ենթագրեր"</string>
+ <string name="default_language" msgid="4122326459624337928">"Անհայտ լեզու"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Փակ ենթագրեր"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Անջատված է"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Հարմարացնել ձևաչափը"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN-ը սխալ էր: Կրկին փորձեք:"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Փորձեք կրկին, PIN-ը չի համապատասխանում"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Մուտքագրեք փոստային դասիչը:"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Ուղիղ եթեր հավելվածը փոստային դասիչը կօգտագործի հեռուստաալիքների ամբողջական ցանկը տրամադրելու համար։"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Մուտքագրեք փոստային դասիչը"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Փոստային դասիչը սխալ է"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Կարգավորումներ"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Հարմարեցնել ալիքների ցանկը"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Ընտրեք ալիքներ հեռուստահաղորդումների ծրագրի համար"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Ծնողական վերահսկողություն"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Բաց կոդով ծրագրակազմի արտոնագրեր"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Բաց կոդով ծրագրաշարի լիցենզիաներ"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Կարծիք հայտնել"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Տարբերակ"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Այս կապուղին դիտելու համար սեղմեք Աջ և մուտքագրեք ձեր PIN-ը"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Այս ծրագիրը դիտելու համար սեղմեք Աջ և մուտքագրեք ձեր PIN-ը"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"Հեռուստացույցի ընտրացանկից օգտվելու համար "<b>"սեղմեք ԸՆՏՐԵԼ"</b>":"</string>
<string name="msg_no_input" msgid="3897674146985427865">"Հեռուստացույցի մուտք չի գտնվել"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Հեռուստացույցի մուտքը տեղադրված չէ"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP-ը չի աջակցվում"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP-ը ցուցադրելու համար աղբյուր չկա"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Կարգավորիչի մուտքը համապատասխան չէ: Գործարկեք «Ուղիղ եթեր» հավելվածը, եթե օգտագործում եք հեռուստացույցի մուտք:"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Կարգավորումը չհաջողվեց"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Այս գործողությունը կատարելու համար ոչ մի հավելված չի գտնվել"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Պահել"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Միանգամյա տեսագրումն ունի ամենաբարձր առաջնահերթությունը"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Չեղարկել"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Չեղարկել"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Մոռանալ"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Դադար"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Դիտել տեսագրման ժամանակացույցը"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Միայն այս ծրագիրը"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Փոխարենը տեսագրել այս ծրագիրը"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Չեղարկել այս տեսագրումը"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Դիտել հիմա"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Ջնջել տեսագրությունները…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Հնարավոր է տեսագրել"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Տեսագրումը ծրագրավորված է"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Տեսագրման հակասություն"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Տեսագրում"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Չհաջողվեց տեսագրել"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Ծրագրերի ընթերցում՝ տեսագրության ժամանակացույցեր ստեղծելու համար"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Ծրագրերի ընթերցում"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Դիտել վերջին տեսագրությունները"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ծրագրի տեսագրումը չի ավարտվել:"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> և <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ծրագրերի տեսագրումը չի ավարտվել:"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> և <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ծրագրերի տեսագրումը չի ավարտվել:"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ծրագրի տեսագրումը չի ավարտվել, քանի որ հիշողությունը բավարար չէ:"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> և <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ծրագրերի տեսագրումը չի ավարտվել, քանի որ հիշողությունը բավարար չէ:"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> և <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ծրագրերի տեսագրումը չի ավարտվել, քանի որ հիշողությունը բավարար չէ:"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Ծրագրերի ընթերցում"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR-ին ավելի շատ հիշողություն է անհրաժեշտ"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Դուք կկարողանաք տեսագրել ծրագրեր DVR-ի օգնությամբ: Սակայն այս պահին ձեր սարքում DVR-ի աշխատանքի համար անհրաժեշտ բավականաչափ հիշողություն չկա: Միացեք առնվազն <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>ԳԲ հիշողություն ունեցող արտաքին սարք և հետևեք ցուցումներին՝ այն որպես սարքի հիշողություն ձևաչափելու համար:"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Բավականաչափ հիշողություն չկա"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Այս ծրագիրը չի տեսագրվի բավականաչափ հիշողություն բացակայության պատճառով: Փորձեք ջնջել առկա տեսագրություններից մի քանիսը:"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Հիշողությունն անհասանելի է"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR-ի կողմից օգտագործվող հիշողության մի մասն անհասանելի է: DVR-ը կրկին ակտիվացնելու համար միացրեք նախկինում օգտագործված արտաքին սարքը: Կարող եք նաև մոռանալ հիշողությունը, եթե այն այևս հասանելի չէ:"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Մոռանա՞լ հիշողությունը:"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Ձեր տեսագրած ամբողջ բովանդակությունը և ժամանակացույցները չեն պահվի:"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Դադարեցնե՞լ տեսագրումը:"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Տեսագրված բովանդակությունը կպահվի:"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ծրագրի տեսագրումը կդադարեցվի, քանի որ այն ունի հակասություններ այս ծրագրի հետ: Արդեն իսկ տեսագրված բովանդակությունը կպահվի:"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Տեսագրումը ծրագրավորվեց, սակայն այն հակասություններ ունի"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Տեսագրումը սկսվել է, սակայն որոշ հակասություններ ունի"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ծրագիրը կտեսագրվի:"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Միևնույն ծրագրի տեսագրումն արդեն ծրագրավորվել է <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>-ին:"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Արդեն տեսագրվել է"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Այս ծրագիրն արդեն տեսագրվել է: Այն հասանելի է DVR դարանում:"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Սերիալի տեսագրումը ծրագրավորված է"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g>-ի համար ծրագրավորված է <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> տեսագրում:</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> of them will not be recorded due to conflicts.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g>-ի համար ծրագրավորված է <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> տեսագրում: Այդ տեսագրումներից <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>-ը հակասությունների պատճառով չեն կատարվի:</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes of this series and other series will not be recorded due to conflicts.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g>-ի համար ծրագրավորված է <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> տեսագրում: Այս սերիալի <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> դրվագներ և մյուս սերիալը հակասությունների պատճառով չեն տեսագրվի:</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 episode of other series will not be recorded due to conflicts.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g>-ի համար ծրագրավորված է <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> տեսագրում: Մյուս սերիալի 1 դրվագ հակասությունների պատճառով չի տեսագրվի:</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episodes of other series will not be recorded due to conflicts.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g>-ի համար ծրագրավորված է <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> տեսագրում: Մյուս սերիալի <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> դրվագներ հակասությունների պատճառով չեն տեսագրվի:</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Տեսագրված ծրագիրը չի գտնվել:"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Առնչվող տեսագրություններ"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Ծրագիրը նկարագրություն չունի)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Դադարեցնե՞լ սերիալի տեսագրումը:"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Տեսագրված դրվագները հասանելի կմնան միայն DVR դարանում:"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Դադար"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Այս պահին եթեր հեռարձակվող դրվագներ չկան:"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Հասանելի դրվագներ չկան:\nԴրանք կտեսագրվեն հասանելի դառնալուց հետո:"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d minutes)</item>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 1822bd1f..662cfc89 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Kontrol pemutar"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Saluran"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Saluran terkini"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opsi TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opsi PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Kontrol Play tidak tersedia untuk saluran ini"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Putar atau jeda"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Maju cepat"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Teks"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Mode tayang"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Aktif"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Nonaktif"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Dapatkan saluran lain"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Setelan"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Sumber"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Tukar"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Aktif"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Nonaktif"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Suara"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Utama"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Jendela PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Tata letak"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Kanan bawah"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Kanan atas"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Kiri atas"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Kiri bawah"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Berdampingan"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Ukuran"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Besar"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Kecil"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Sumber masukan"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Tidak ada informasi program"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Tidak ada informasi"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Saluran yang diblokir"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Bahasa tidak dikenal"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Subtitel, CC %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Bahasa tidak dikenal"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Teks"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Nonaktif"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Sesuaikan format"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN salah. Coba lagi."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Pin tidak cocok, coba lagi"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Memasukkan Kode Pos"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Aplikasi Live TV akan menggunakan Kode Pos untuk memberikan panduan program lengkap bagi saluran TV."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Masukkan Kode Pos"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Kode ZIP Tidak Valid"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Setelan"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Sesuaikan daftar saluran"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Pilih saluran untuk panduan program"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Kontrol induk"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Lisensi sumber terbuka"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Lisensi sumber terbuka"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Kirim masukan"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versi"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Untuk menonton saluran ini, tekan Kanan dan masukkan PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Untuk menonton program ini, tekan Kanan dan masukkan PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Tekan PILIH"</b>" untuk mengakses menu TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Tidak ditemukan masukan TV"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Tidak dapat menemukan masukan TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP tidak didukung"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Tidak tersedia masukan yang dapat ditampilkan dengan PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Jenis tuner tidak cocok. Luncurkan aplikasi Saluran Siaran Langsung untuk masukan TV yang sesuai dengan jenis tuner"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Penalaan gagal"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Tidak ditemukan aplikasi untuk menangani tindakan ini."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Simpan"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Perekaman satu kali memiliki prioritas tertinggi"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Batal"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Batal"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Lupakan"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Berhenti"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Lihat jadwal rekaman"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Program tunggal ini"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Rekam yang ini saja"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Batalkan rekaman ini"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Tonton sekarang"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Hapus rekaman…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Dapat direkam"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Perekaman dijadwalkan"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Perekaman bentrok"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Merekam"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Rekaman gagal"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Membaca program untuk membuat jadwal rekaman"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Membaca program"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Lihat rekaman baru-baru ini"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Rekaman <xliff:g id="PROGRAMNAME">%1$s</xliff:g> tidak selesai."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Rekaman <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> dan <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> tidak selesai."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Rekaman <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, dan <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> tidak selesai."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Rekaman <xliff:g id="PROGRAMNAME">%1$s</xliff:g> tidak selesai karena penyimpanan tidak mencukupi."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Rekaman <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> dan <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> tidak selesai karena penyimpanan tidak mencukupi."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Rekaman <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, dan <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> tidak selesai karena penyimpanan tidak mencukupi."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Membaca program"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR memerlukan penyimpanan ekstra"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Anda akan dapat merekam program dengan DVR. Namun, saat ini penyimpanan pada perangkat tidak cukup untuk menjalankan DVR. Hubungkan drive eksternal berukuran <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB atau lebih besar dan ikuti langkah untuk memformat drive tersebut sebagai perangkat penyimpanan."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Penyimpanan tidak cukup"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Program ini tidak akan direkam karena penyimpanan tidak cukup. Coba menghapus beberapa rekaman yang ada."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Penyimpanan tidak ada"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Beberapa penyimpanan yang digunakan oleh DVR tidak ada. Hubungkan drive eksternal yang sebelumnya digunakan untuk kembali mengaktifkan DVR. Atau, Anda dapat memilih untuk melupakan penyimpanan jika sudah tidak tersedia."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Lupakan penyimpanan?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Semua konten dan jadwal yang direkam akan hilang."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Berhenti merekam?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Konten yang direkam akan disimpan."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Perekaman <xliff:g id="PROGRAMNAME">%1$s</xliff:g> akan dihentikan karena bentrok dengan program ini. Konten yang direkam akan disimpan."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Rekaman telah dijadwalkan, tapi jadwalnya bentrok"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Rekaman telah dimulai, namun jadwalnya bentrok"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> akan direkam."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Program yang sama telah dijadwalkan untuk direkam pukul <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Sudah direkam"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Program ini telah direkam. Rekaman ada di pustaka DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Perekaman serial dijadwalkan"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> rekaman tersebut tidak akan direkam karena jadwalnya bentrok.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Rekaman tersebut tidak akan direkam karena jadwalnya bentrok.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episode seri ini dan seri lainnya tidak akan direkam karena jadwalnya bentrok.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episode seri ini dan seri lainnya tidak akan direkam karena jadwalnya bentrok.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 episode seri lainnya tidak akan direkam karena jadwalnya bentrok.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 episode seri lainnya tidak akan direkam karena jadwalnya bentrok.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episode seri lainnya tidak akan direkam karena jadwalnya bentrok.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rekaman telah dijadwalkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episode seri lainnya tidak akan direkam karena jadwalnya bentrok.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Tidak ditemukan program yang direkam."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Rekaman terkait"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Tidak ada deskripsi program)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Hentikan rekaman seri?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Episode yang direkam akan tetap tersedia di pustaka DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Hentikan"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Tidak ada episode tayang sekarang."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Tidak ada episode yang tersedia.\nEpisode akan direkam setelah tersedia."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d menit)</item>
diff --git a/res/values-is-rIS-v23/strings.xml b/res/values-is-v23/strings.xml
index 2954d77b..2954d77b 100644
--- a/res/values-is-rIS-v23/strings.xml
+++ b/res/values-is-v23/strings.xml
diff --git a/res/values-is-rIS/arrays.xml b/res/values-is/arrays.xml
index 27cb8655..27cb8655 100644
--- a/res/values-is-rIS/arrays.xml
+++ b/res/values-is/arrays.xml
diff --git a/res/values-is-rIS/rating_system_strings.xml b/res/values-is/rating_system_strings.xml
index 1725d040..1725d040 100644
--- a/res/values-is-rIS/rating_system_strings.xml
+++ b/res/values-is/rating_system_strings.xml
diff --git a/res/values-is-rIS/strings.xml b/res/values-is/strings.xml
index 4cb91d48..6111b578 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"einóma"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"víðóma"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Spilunarstýringar"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Rásir"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Nýlegar rásir"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Sjónvarpskostir"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Innfelld mynd"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Spilunarstýringar eru ekki í boði fyrir þessa rás"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Spila eða gera hlé"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Spóla áfram"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Skjátextar"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Birtingarstill."</string>
<string name="options_item_pip" msgid="3951350386626879645">"Innfelld mynd"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Kveikt"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Slökkt"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-Audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Fá fleiri rásir"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Stillingar"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Inntak"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Víxla"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Kveikt"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Slökkt"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Hljóð"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Aðalgluggi"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Innfelling"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Útlit"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Neðst til hægri"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Efst til hægri"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Efst til vinstri"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Neðst til vinstri"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Hlið við hlið"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Stærð"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Stór"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Lítil"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Inntak"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Sjónvarp (loftnet/kapall)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Engar dagskrárupplýsingar"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Engar upplýsingar"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Læst rás"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Óþekkt tungumál"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Skjátexti %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Óþekkt tungumál"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Skjátextar"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Slökkt"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Sérstilla snið"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Rangt PIN-númer. Reyndu aftur."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Reyndu aftur; PIN-númerin stemma ekki"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Sláðu inn póstnúmerið þitt."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Forritið Beinar útsendingar notar póstnúmerið þitt til að veita þér nákvæma sjónvarpsdagskrá."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Sláðu inn póstnúmerið þitt"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Ógilt póstnúmer"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Stillingar"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Sérsníða rásalista"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Veldu rásir fyrir dagskrárvísinn þinn"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Foreldraeftirlit"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Leyfi opins kóða"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Leyfi opins kóða"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Senda ábendingu"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Útgáfa"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Til að horfa á þessa rás skaltu ýta til hægri og slá inn PIN-númerið þitt"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Til að horfa á þennan þátt skaltu ýta til hægri og slá inn PIN-númerið þitt"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Ýttu á VELJA"</b>" til að fá aðgang að sjónvarpsvalmyndinni."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Ekkert sjónvarpsinntak fannst"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Sjónvarpsinntak finnst ekki"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Ekki er stuðningur við innfellda mynd"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Ekkert inntak er fyrir hendi til að nota í innfelldri mynd"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Gerð móttakara passar ekki. Ræstu forritið Rásir í beinni til að fá sjónvarpsinntak með móttakaragerð."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Stilling mistókst"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Ekkert forrit fannst sem getur framkvæmt þessa aðgerð."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Vista"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Stakar upptökur hafa forgang"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Hætta við"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Hætta við"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Gleyma"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Stöðva"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Skoða upptökuáætlun"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Bara þennan þátt"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Taka þetta upp í staðinn"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Hætta við þessa upptöku"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Horfa núna"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Eyða upptökum…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Hægt að taka upp"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Upptaka sett á áætlun"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Skarast á við aðra upptöku"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Upptaka í gangi"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Upptaka mistókst"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Les dagskrár til að búa til upptökuáætlanir"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Skoðar þætti"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Skoða nýlegar upptökur"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Upptöku á <xliff:g id="PROGRAMNAME">%1$s</xliff:g> er ekki lokið."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Upptöku á <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> og <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> er ekki lokið."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Upptöku á <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> og <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> er ekki lokið."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Skortur á geymslurými kom í veg fyrir að upptöku á <xliff:g id="PROGRAMNAME">%1$s</xliff:g> væri lokið."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Skortur á geymslurými kom í veg fyrir að upptöku á <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> og <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> væri lokið."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Skortur á geymslurými kom í veg fyrir að upptöku á <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> og <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> væri lokið."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Les dagskrár"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR þarf meira geymslupláss"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Þú getur tekið upp þætti með stafræna upptökubúnaðinum (DVR). Hins vegar er ekki nóg geymslupláss til staðar á tækinu þínu sem stendur til að DVR virki. Tengdu utanáliggjandi disk við tækið sem er <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB eða stærri og fylgdu skrefunum til að setja það upp sem geymslupláss tækisins."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Of lítið geymslurými"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Þátturinn verður ekki tekinn upp þar sem of lítið geymslurými er til staðar. Prófaðu að eyða einhverjum af þeim upptökum sem eru þegar til staðar."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Geymslu vantar"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Hluta af geymslurýminu sem stafræni upptökubúnaðurinn notar vantar. Tengdu utanáliggjandi drif sem þú notaðir áður til að gera stafræna upptökubúnaðinn virkan á ný. Einnig geturðu valið að gleyma geymslunni ef hún er ekki lengur tiltæk."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Viltu gleyma geymslunni?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Allt efni sem þú hefur tekið upp og allar dagskrár glatast."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Stöðva upptöku?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Upptökur á efni verða vistaðar."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Upptöku á <xliff:g id="PROGRAMNAME">%1$s</xliff:g> verður hætt þar sem það skarast á við þennan þátt. Upptekið efni verður vistað."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Upptaka á áætlun en skarast við aðra"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Upptaka er hafin en hún skarast við aðra"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> verður tekið upp."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Sami þáttur er þegar á upptökuáætlun kl. <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Þegar tekið upp"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Þessi þáttur hefur þegar verið tekinn upp. Hann er tiltækur í DVR-safninu."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Upptaka þáttaseríu sett á áætlun"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> upptaka var sett á áætlun fyrir <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> upptökur voru settar á áætlun fyrir <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> upptökur voru settar á áætlun fyrir <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> verður ekki tekið upp því að það skarast á við annað.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> upptökur voru settar á áætlun fyrir <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> verður ekki tekið upp því að það skarast á við annað.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> upptaka var sett á áætlun fyrir <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> þættir úr þessari þáttaröð og í öðrum þáttaröðum verða ekki teknir upp því það skarast á við annað.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> upptökur voru settar á áætlun fyrir <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> þættir úr þessari þáttaröð og í öðrum þáttaröðum verða ekki teknir upp því það skarast á við annað.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> upptaka var sett á áætlun fyrir <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Einn þáttur í annarri þáttaröð verður ekki tekinn upp því að hann skarast á við annað.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> upptökur voru settar á áætlun fyrir <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Einn þáttur í annarri þáttaröð verður ekki tekinn upp því að hann skarast á við annað.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> upptaka var sett á áætlun fyrir <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> þættir úr annarri þáttaröð verða ekki teknir upp því þeir skarast á við annað.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> upptökur voru settar á áætlun fyrir <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> þættir úr annarri þáttaröð verða ekki teknir upp því þeir skarast á við annað.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Upptekinn þáttur fannst ekki."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Tengdar upptökur"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Engin þáttalýsing)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Hætta upptöku á þáttaröð?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Upptökur af þáttum verða áfram tiltækar í DVR-safninu."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Stöðva"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Ekki er verið að sýna þætti að svo stöddu."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Engir þættir eru tiltækir.\nÞeir verða teknir upp þegar þeir eru tiltækir."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d mínúta)</item>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 5264f43a..da0b48a6 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Controlli riproduzione"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Canali"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Canali recenti"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opzioni TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opzioni PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Controlli di riproduzione non disponibili per questo canale"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Riproduci o metti in pausa"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Avanza velocemente"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Sottotitoli"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Visualizzazione"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Attiva"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Non attiva"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Trova altri canali"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Impostazioni"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Fonte"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Scambia"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Attiva"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Non attiva"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Suono"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principale"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Finestra PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Layout"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"In basso a des."</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"In alto a des."</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"In alto a sin."</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"In basso a sin."</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Affiancata"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Dimensioni"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Grande"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Piccola"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Origine ingresso"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antenna/cavo)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Nessuna informazione sul programma"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Nessuna informazione"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Canale bloccato"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Lingua sconosciuta"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Sottotitoli in %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Lingua sconosciuta"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Sottotitoli"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Off"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Personalizza"</string>
@@ -118,10 +137,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Il PIN è errato. Riprova."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Riprova, il PIN non corrisponde"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Inserisci il codice postale."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"L\'app Dirette TV userà il codice postale per fornire una guida ai programmi completa per i canali TV."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Inserisci il codice postale"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Codice postale non valido"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Impostazioni"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personalizza canali"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Scegli canali per guida ai programmi"</string>
@@ -130,7 +145,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Controllo genitori"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licenze open source"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licenze open source"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Invia feedback"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versione"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Per guardare questo canale, premi il pulsante destro e inserisci il PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Per guardare questo programma, premi il pulsante destro e inserisci il PIN"</string>
@@ -169,6 +183,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Premi SELEZIONA"</b>" per accedere al menu della TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nessun ingresso TV trovato"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Impossibile trovare l\'ingresso TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Funzione PIP non supportata"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Nessun ingresso disponibile per visualizzazione PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tipo di sintonizzatore non adatto. Avvia l\'app Live TV per l\'ingresso TV di tipo sintonizzatore."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Sintonizzazione non riuscita"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Nessuna app trovata per gestire questa azione."</string>
@@ -245,6 +261,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Salva"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Le registrazioni uniche hanno la massima priorità"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Annulla"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Annulla"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Elimina"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Interrompi"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Pianificazione registrazione"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Solo questo programma"</string>
@@ -254,29 +272,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Registra questo"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Annulla la registrazione"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Guarda adesso"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Elimina registrazioni…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Registrabile"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Registrazione programmata"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Conflitto di registrazione"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Registrazione in corso"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Registrazione non riuscita"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Lettura dei programmi per la creazione delle pianificazioni di registrazione"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Lettura dei programmi…"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Visualizza registrazioni recenti"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"La registrazione di <xliff:g id="PROGRAMNAME">%1$s</xliff:g> è incompleta."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Le registrazioni di <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> e <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> sono incomplete."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Le registrazioni di <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> e <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> sono incomplete."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"La registrazione di <xliff:g id="PROGRAMNAME">%1$s</xliff:g> non è stata completata poiché lo spazio di archiviazione non era sufficiente."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Le registrazioni di <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> e <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> non sono state completate poiché lo spazio di archiviazione non era sufficiente."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Le registrazioni di <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> e <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> non sono state completate poiché lo spazio di archiviazione non era sufficiente."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Lettura dei programmi…"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Il dispositivo DVR ha bisogno di più spazio di archiviazione"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Potrai registrare programmi con un dispositivo DVR. Tuttavia, al momento lo spazio di archiviazione non è sufficiente per consentire il funzionamento del DVR. Collega un\'unità esterna di almeno <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB e segui la procedura per formattarla come memoria dispositivo."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Spazio di archiviazione insufficiente"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Il programma non sarà registrato perché lo spazio di archiviazione non è sufficiente. Prova a eliminare alcune registrazioni esistenti."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Memoria mancante"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Manca parte della memoria utilizzata dal DVR. Collega l\'unità esterna utilizzata prima di riattivare il DVR. In alternativa, puoi scegliere di eliminare la memoria se non è più disponibile."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Eliminare la memoria?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Tutti i contenuti registrati e le pianificazioni andranno persi."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Interrompere la registrazione?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"I contenuti registrati verranno salvati."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"La registrazione di <xliff:g id="PROGRAMNAME">%1$s</xliff:g> verrà interrotta perché è in conflitto con questo programma. I contenuti registrati verranno salvati."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Registrazione programmata, ma ci sono conflitti"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"La registrazione è iniziata, ma ci sono conflitti"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Verrà registrato il programma <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -294,27 +308,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"È già stata programmata la registrazione dello stesso programma alle <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Già registrato"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Questo programma è già stato registrato. È disponibile nella raccolta DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Registrazione della serie programmata"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> registrazioni sono state pianificate per la serie <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> registrazione è stata pianificata per la serie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> registrazioni sono state pianificate per la serie <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> non saranno registrate a causa di conflitti.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> registrazione è stata pianificata per la serie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Non sarà registrata a causa di conflitti.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> registrazioni sono state pianificate per la serie <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> puntate di questa e altre serie non saranno registrate a causa di conflitti.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> registrazione è stata pianificata per la serie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> puntate di questa e altre serie non saranno registrate a causa di conflitti.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> registrazioni sono state pianificate per la serie <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Una puntata di un\'altra serie non sarà registrata a causa di conflitti.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> registrazione è stata pianificata per la serie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Una puntata di un\'altra serie non sarà registrata a causa di conflitti.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> registrazioni sono state pianificate per la serie <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> puntate di altre serie non saranno registrate a causa di conflitti.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> registrazione è stata pianificata per la serie <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> puntate di altre serie non saranno registrate a causa di conflitti.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Programma registrato non trovato."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Registrazioni correlate"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Nessuna descrizione programma)"</string>
@@ -337,7 +338,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Interrompere la registrazione della serie?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Le puntate registrate resteranno disponibili nella raccolta DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Interrompi"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Nessuna puntata in onda al momento."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Non ci sono episodi a disposizione.\nVerranno registrati non appena saranno disponibili."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minuti)</item>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 35c193f1..743b31fd 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"מונו"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"סטריאו"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"פקדי הפעלה"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"ערוצים"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"ערוצים אחרונים"</string>
<string name="menu_title_options" msgid="7184594626814914022">"‏אפשרויות TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"‏אפשרויות PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"פקדי הפעלה אינם זמינים בשביל הערוץ הזה"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"הפעל או השהה"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"הרץ קדימה"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"כתוביות"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"מצב תצוגה"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"מופעל"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"כבוי"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"מולטי-אודיו"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"קבל ערוצים נוספים"</string>
<string name="options_item_settings" msgid="7623205838542400074">"הגדרות"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"מקור"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"החלף"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"מופעל"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"כבוי"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"צליל"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"ראשי"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"‏חלון PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"פריסה"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"שמאל למטה"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"שמאל למעלה"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ימין למעלה"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"ימין למטה"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"זה לצד זה"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"גודל"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"גדול"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"קטן"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"מקור קלט"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"טלוויזיה (אנטנה/כבלים)"</string>
<string name="no_program_information" msgid="1049844207745145132">"אין פרטי תכנית"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"אין מידע"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"ערוץ חסום"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"שפה לא ידועה"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"‏כתוביות ב%1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"שפה לא ידועה"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"כתוביות"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"כבוי"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"התאם אישית את הפורמט"</string>
@@ -120,10 +139,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"‏מספר ה-PIN היה שגוי. נסה שוב."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"נסה שוב, קוד האימות אינו תואם"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"הזן את המיקוד שלך"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"‏אפליקציית Live TV תשתמש במיקוד כדי לספק לך את לוח השידורים המלא של ערוצי הטלוויזיה."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"הזן את המיקוד שלך"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"מיקוד לא חוקי"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"הגדרות"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"התאם אישית רשימת ערוצים"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"בחר ערוצים ללוח השידורים שלך"</string>
@@ -132,7 +147,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"בקרת הורים"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"רישיונות קוד פתוח"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"רישיונות קוד פתוח"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"שלח משוב"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"גרסה"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"‏כדי לצפות בערוץ הזה, לחץ על \'ימין\' והזן את מספר ה-PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"‏כדי לצפות בתכנית הזו, לחץ על \'ימין\' והזן את מספר ה-PIN"</string>
@@ -175,6 +189,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"לחץ על \'בחר\'"</b>" כדי לפתוח את תפריט הטלוויזיה."</string>
<string name="msg_no_input" msgid="3897674146985427865">"לא נמצא קלט טלוויזיה"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"לא ניתן למצוא את קלט הטלוויזיה"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"‏PIP אינו נתמך"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"‏אין קלט זמין הניתן להצגה באמצעות PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"סוג הטיונר אינו מתאים. הפעל את האפליקציה \'ערוצים בשידור חי\' בשביל טיונר מסוג קלט טלוויזיה."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"הכוונון נכשל"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"לא נמצאה אפליקציה שיכולה לטפל בפעולה הזו."</string>
@@ -263,6 +279,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"שמור"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"הקלטות חד-פעמיות הן בעלות העדיפות הגבוהה ביותר"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"בטל"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"בטל"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"שכח"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"עצור"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"הצג לוח זמנים להקלטה"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"את התוכנית הזו בלבד"</string>
@@ -272,29 +290,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"הקלטת תוכנית זו במקום זאת"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"ביטול הקלטה זאת"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"לצפייה עכשיו"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"מחיקת הקלטות…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"ניתנת להקלטה"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"ההקלטה מתוזמנת"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"התנגשות בין הקלטות"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"מקליט"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"ההקלטה נכשלה"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"קורא תוכניות כדי ליצור לוחות זמנים להקלטות"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"קורא תוכניות"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"הצגת ההקלטות האחרונות"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"ההקלטה של <xliff:g id="PROGRAMNAME">%1$s</xliff:g> חלקית."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"ההקלטות של <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ו-<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> חלקיות."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"ההקלטות של <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ו-<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> חלקיות."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"ההקלטה של <xliff:g id="PROGRAMNAME">%1$s</xliff:g> לא הושלמה מפני ששטח האחסון אינו מספיק."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"ההקלטות של <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ו-<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> לא הושלמו מפני ששטח האחסון אינו מספיק."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"ההקלטות של <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ו-<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> לא הושלמו מפני ששטח האחסון אינו מספיק."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"קורא תוכניות"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"‏DVR זקוק לשטח אחסון נוסף"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"‏תוכל להקליט תוכניות עם DVR. אולם, אין מספיק מקום אחסון במכשיר שלך כרגע כדי ש-DVR יעבוד. התחבר לכונן חיצוני בגודל GB<xliff:g id="STORAGE_SIZE">%1$s</xliff:g> או יותר, ובצע את השלבים לביצוע פורמט כאחסון מכשיר."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"אין מספיק שטח אחסון"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"התוכנית הזאת לא תוקלט מפני שאין מספיק שטח אחסון. נסה למחוק חלק מההקלטות הקיימות."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"אחסון חסר"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"‏חלק מהאחסון שנעשה בו שימוש ב-DVR חסר. חבר את הכונן החיצוני שבו השתמשת בעבר כדי להפעיל מחדש את ה-DVR. לחלופין, תוכל לבחור לשכוח את האחסון אם הוא אינו זמין עוד."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"לשכוח את האחסון?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"כל התוכן ולוחות הזמנים שתיעדת יאבדו."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"האם להפסיק את ההקלטה?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"התוכן המוקלט יישמר."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"ההקלטה של <xliff:g id="PROGRAMNAME">%1$s</xliff:g> תיפסק מפני שהיא מתנגשת עם התוכנית הזאת. התוכן שהוקלט יישמר."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ההקלטה מתוזמנת, אבל ישנן הקלטות מתנגשות."</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ההקלטה החלה, אבל ישנן הקלטות מתנגשות"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"התוכנית <xliff:g id="PROGRAMNAME">%1$s</xliff:g> תוקלט."</string>
@@ -314,37 +328,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"אותה תוכנית כבר תוזמנה להקלטה ב-<xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"כבר הוקלט"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"‏תוכנית זו כבר הוקלטה. היא זמינה לצפייה בספריית ה-DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"הקלטת הסדרה תוזמנה"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="many"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">הקלטה <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> תוזמנה לסדרה <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> הקלטות מתוכן לא יוקלטו עקב התנגשויות.</item>
- <item quantity="many"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> הקלטות מתוכן לא יוקלטו עקב התנגשויות.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> הקלטות מתוכן לא יוקלטו עקב התנגשויות.</item>
- <item quantity="one">הקלטה <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> תוזמנה לסדרה <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. היא לא תוקלט עקב התנגשויות.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> פרקים מסדרה זו וסדרה אחרת לא יוקלטו עקב התנגשויות.</item>
- <item quantity="many"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> פרקים מסדרה זו וסדרה אחרת לא יוקלטו עקב התנגשויות.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> פרקים מסדרה זו וסדרה אחרת לא יוקלטו עקב התנגשויות.</item>
- <item quantity="one">הקלטה <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> תוזמנה לסדרה <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> פרקים מסדרה זו וסדרה אחרת לא יוקלטו עקב התנגשויות.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. פרק אחד מסדרה אחרת לא יוקלט עקב התנגשויות.</item>
- <item quantity="many"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. פרק אחד מסדרה אחרת לא יוקלט עקב התנגשויות.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. פרק אחד מסדרה אחרת לא יוקלט עקב התנגשויות.</item>
- <item quantity="one">הקלטה <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> תזומנה לסדרה <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. פרק אחד מסדרה אחרת לא יוקלט עקב התנגשויות.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> פרקים מסדרה אחרת לא יוקלטו עקב התנגשויות.</item>
- <item quantity="many"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> פרקים מסדרה אחרת לא יוקלטו עקב התנגשויות.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> הקלטות תוזמנו לסדרה <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> פרקים מסדרה אחרת לא יוקלטו עקב התנגשויות.</item>
- <item quantity="one">הקלטה <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> תוזמנה לסדרה <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> פרקים מסדרה אחרת לא יוקלטו עקב התנגשות.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"התוכנית המוקלטת לא נמצאה."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"הקלטות קשורות"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(אין תיאור לתוכנית)"</string>
@@ -371,7 +362,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"האם להפסיק את הקלטת הסדרה?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"‏פרקים מוקלטים יישארו זמינים בספריית DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"הפסק"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"אף פרק אינו משודר כעת."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"אין פרקים זמינים.\nהם יוקלטו כשיהיו זמינים."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="two">‏(%1$d דקות)</item>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index c2572978..9c526c21 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"モノラル"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"ステレオ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"再生操作"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"チャンネル"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"最近のチャンネル"</string>
<string name="menu_title_options" msgid="7184594626814914022">"テレビオプション"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIPオプション"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"このチャンネルでは再生操作を使用できません"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"再生または一時停止"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"早送り"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"字幕"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"表示モード"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"ON"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"OFF"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"マルチオーディオ"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"その他のチャンネル"</string>
<string name="options_item_settings" msgid="7623205838542400074">"設定"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"ソース"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"切り替え"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"ON"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"OFF"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"サウンド"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"メイン"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIPウィンドウ"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"レイアウト"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"右下"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"右上"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"左上"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"左下"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"横並び"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"サイズ"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"大"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"小"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"入力ソース"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"テレビ(アンテナ/ケーブル)"</string>
<string name="no_program_information" msgid="1049844207745145132">"プログラム情報がありません"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"情報はありません"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"ブロックされているチャンネル"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"不明な言語"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"クローズド キャプション %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"不明な言語"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"字幕"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"OFF"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"書式設定のカスタマイズ"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PINが正しくありません。もう一度お試しください。"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"もう一度お試しください。PINが一致しません。"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"郵便番号の入力"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"ライブ チャンネル アプリは、テレビ チャンネルの完全な番組ガイドを提供するために郵便番号を使用します。"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"郵便番号を入力してください"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"郵便番号が無効です"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"設定"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"チャンネル リストをカスタマイズ"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"番組ガイド用のチャンネルを選択します"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"保護者による使用制限"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"オープンソース ライセンス"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"オープンソースライセンス"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"フィードバックを送信"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"バージョン"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"このチャンネルを視聴するには、右のボタンを押してPINを入力してください。"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"このプログラムを視聴するには、右のボタンを押してPINを入力してください。"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"テレビのメニューにアクセスするには"<b>"[SELECT]を押してください"</b>"。"</string>
<string name="msg_no_input" msgid="3897674146985427865">"テレビ入力が見つかりませんでした"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"テレビ入力が見つかりません"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIPがサポートされていません"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIPで表示できる有効な入力はありません"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"無効なチューナータイプ。チューナー入力のライブチャンネルアプリを起動してください。"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"同調に失敗しました"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"この操作を行うアプリが見つかりませんでした。"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"保存"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"1 回のみの録画を最優先"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"キャンセル"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"キャンセル"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"削除"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"停止"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"録画予約を見る"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"この番組のみ"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"この番組を代わりに録画"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"この録画をキャンセル"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"今すぐ見る"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"録画の削除…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"録画できます"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"録画を予約しました"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"録画予約が重複しています"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"録画"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"録画に失敗しました"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"録画予約を作成する番組情報を読み取っています"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"番組情報を読み取っています"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"最近の録画を表示"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"「<xliff:g id="PROGRAMNAME">%1$s</xliff:g>」の録画を完了できませんでした"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"「<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>」と「<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>」の録画を完了できませんでした"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"「<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>」、「<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>」、「<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>」の録画を完了できませんでした"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"ストレージの容量不足のため、「<xliff:g id="PROGRAMNAME">%1$s</xliff:g>」の録画を完了できませんでした。"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"ストレージの容量不足のため、「<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>」と「<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>」の録画を完了できませんでした。"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"ストレージの容量不足のため、「<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>」、「<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>」、「<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>」の録画を完了できませんでした。"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"番組情報を読み取っています"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR のストレージ不足"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"DVR を使用して番組を録画することはできますが、お使いの端末のストレージが十分ではないため、現在 DVR を使用できません。<xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB 以上の外部ストレージを接続し、手順に沿って端末のストレージと同じようにフォーマットしてください。"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"空き容量の不足"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"空き容量が不足しているため、この番組は録画されません。録画済みの番組をいくつか削除してみてください。"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"ストレージにアクセスできません"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR で使用しているストレージの一部にアクセスできません。DVR を再度有効にする前に、使用している外部ドライブを接続してください。アクセスできないストレージは削除することもできます。"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"ストレージの削除"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"録画したコンテンツと録画予約がすべて失われます。"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"録音の停止"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"録画したコンテンツは保存されます。"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"「<xliff:g id="PROGRAMNAME">%1$s</xliff:g>」の録画は、この番組と重なっているため停止されます。録画したコンテンツは保存されます。"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"録画を予約しましたが、他の予約と重なっています"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"録画を開始しましたが、他の予約と重なっています"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"「<xliff:g id="PROGRAMNAME">%1$s</xliff:g>」が録画されます。"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"同じ番組が既に録画予約されています(<xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>)。"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"録画済み"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"この番組は既に録画され、DVR ライブラリから利用できます。"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"シリーズの録画を予約しました"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">「<xliff:g id="SERIESNAME_3">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 件予約されています。</item>
- <item quantity="one">「<xliff:g id="SERIESNAME_1">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 件予約されています。</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">「<xliff:g id="SERIESNAME_3">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 件予約されていますが、予約が競合するため <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> 件は録画されません。</item>
- <item quantity="one">「<xliff:g id="SERIESNAME_1">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 件予約されていますが、予約が競合するため録画されません。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">「<xliff:g id="SERIESNAME_4">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> 件予約されています。予約が競合するため、このシリーズと他のシリーズのエピソード(<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> 件)は録画されません。</item>
- <item quantity="one">「<xliff:g id="SERIESNAME_1">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 件予約されています。予約が競合するため、このシリーズと他のシリーズのエピソード(<xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> 件)は録画されません。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">「<xliff:g id="SERIESNAME_3">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 件予約されています。予約が競合するため、他のシリーズのエピソード(1 件)は録画されません。</item>
- <item quantity="one">「<xliff:g id="SERIESNAME_1">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 件予約されています。予約が競合するため、他のシリーズのエピソード(1 件)は録画されません。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">「<xliff:g id="SERIESNAME_4">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> 件予約されています。予約が競合するため、他のシリーズのエピソード(<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> 件)は録画されません。</item>
- <item quantity="one">「<xliff:g id="SERIESNAME_1">%2$s</xliff:g>」の録画は <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 件予約されています。予約が競合するため、他のシリーズのエピソード(<xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> 件)は録画されません。</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"録画された番組は見つかりませんでした。"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"関連の録画"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(番組の説明はありません)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"シリーズの録画を中止しますか?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"録画したエピソードは DVR ライブラリから利用できます。"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"停止"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"現在、放送中の番組はありません。"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"利用可能なエピソードはありません。\n利用可能になると録画されます。"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d分)</item>
diff --git a/res/values-ka-rGE-v23/strings.xml b/res/values-ka-v23/strings.xml
index 20f03595..20f03595 100644
--- a/res/values-ka-rGE-v23/strings.xml
+++ b/res/values-ka-v23/strings.xml
diff --git a/res/values-ka-rGE/arrays.xml b/res/values-ka/arrays.xml
index 1d6659a6..1d6659a6 100644
--- a/res/values-ka-rGE/arrays.xml
+++ b/res/values-ka/arrays.xml
diff --git a/res/values-ka-rGE/rating_system_strings.xml b/res/values-ka/rating_system_strings.xml
index 498d1d82..498d1d82 100644
--- a/res/values-ka-rGE/rating_system_strings.xml
+++ b/res/values-ka/rating_system_strings.xml
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka/strings.xml
index 774691e9..72608bd4 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"მონო"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"სტერეო"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"ჩართვის კონტროლი"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"არხები"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"უახლესი არხები"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV პარამეტრები"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP პარამეტრები"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"ამ არხისთვის არ არის ხელმისაწვდომი ჩართვის კონტროლი"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"დაკვრა ან პაუზა"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"წინ გადახვევა"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"დახურ.წარწერები"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"ჩვენების რეჟიმი"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"ჩართული"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"გამორთული"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"მულტი-აუდიო"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"მეტი არხის მიღება"</string>
<string name="options_item_settings" msgid="7623205838542400074">"პარამეტრები"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"წყარო"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"შენაცვლება"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"ჩართული"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"გამორთული"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ხმა"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"მთავარი"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP ფანჯარა"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"განლაგება"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"ქვედა მარჯვენა"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ზედა მარჯვენა"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ზედა მარცხენა"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"ქვედა მარცხენა"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"გვერდი-გვერდ"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"ზომა"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"დიდი"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"პატარა"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"შემავალი წყარო"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"ტელევიზია (ანტენა/კაბელი)"</string>
<string name="no_program_information" msgid="1049844207745145132">"პროგრამის ინფორმაცია არ არის"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"ინფორმაცია არ არის ხელმისაწვდომი"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"დაბლოკილი არხი"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"უცნობი ენა"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"დახურული სუბტიტრები %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"უცნობი ენა"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"დახურული სუბტიტრები"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"გამორთულია"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"ფორმატირების მორგება"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"ეს PIN არასწორი იყო. ისევ სცადეთ."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"სცადეთ ისევ, PIN არ შეესაბამება"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"შეიყვანეთ თქვენი ZIP კოდი."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"სატელევიზიო არხების სრული პროგრამის სახელმძღვანელოს მისაწოდებლად, Live TV აპი ZIP კოდს გამოიყენებს."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"შეიყვანეთ თქვენი ZIP კოდი"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"არასწორი ZIP კოდი"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"პარამეტრები"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"არხების სიის მორგება"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"აირჩიეთ არხები პროგრამის სახელმძღვანელოსთვის"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"მშობელთა კონტროლი"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"ღია კოდის ლიცენზიები"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"ღია კოდის ლიცენზიები"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"გამოხმაურება"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"ვერსია"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"ამ არხის საყურებლად დააჭირეთ „მარჯვენას“ და შეიყვანოთ თქვენი PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"ამ პროგრამის საყურებლად დააჭირეთ „მარჯვენას“ და შეიყვანოთ თქვენი PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"დააჭირეთ არჩევას"</b>" სატელევიზიო მენიუზე წვდომისთვის."</string>
<string name="msg_no_input" msgid="3897674146985427865">"TV შეყვანა ვერ მოიძებნა."</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV შეყვანა ვერ იძებნება."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"არ არის PIP-ის მხარდაჭერა."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP-ში გამოსაჩენი შემავალი სიგნალი მიუწვდომელია."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ტიუნერის ტიპი არ არის შესაფერისი; გთხოვთ გაუშვით პირდაპირი არხების აპი, სატელევიზიო შეტანის ტიუნერის ტიპისათვის."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"არხების დაჭერა ვერ მოხერხდა."</string>
<string name="msg_missing_app" msgid="8291542072400042076">"ამ მოქმედების შესასრულებლად აპი ვერ მოიძებნა."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"შენახვა"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"ერთჯერად ჩანაწერებს მიენიჭოს მეტი პრიორიტეტი"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"გაუქმება"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"გაუქმება"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"დავიწყება"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"შეწყვეტა"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"ჩაწერის განრიგის ნახვა"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"მხოლოდ ეს პროგრამა"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"სანაცვლოდ, ჩაიწეროს ეს"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"ამ ჩანაწერის გაუქმება"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"ახლავე ყურება"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"ჩანაწერების წაშლა…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"შესაძლებელია ჩაწერა"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"ჩაწერა დაგეგმილია"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"ჩაწერის კონფლიქტი"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"მიმდინარეობს ჩაწერა"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"ჩაწერა ვერ მოხერხდა"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"მიმდინარეობს პროგრამების წაკითხვა ჩაწერის განრიგების შესაქმნელად"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"მიმდინარეობს პროგრამების წაკითხვა"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"ბოლო ჩანაწერების ნახვა"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> არასრულად ჩაიწერა."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> და <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> არასრულად ჩაიწერა."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> და <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> არასრულად ჩაიწერა."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"არასაკმარისი მეხსიერების გამო, <xliff:g id="PROGRAMNAME">%1$s</xliff:g> არასრულად ჩაიწერა."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"არასაკმარისი მეხსიერების გამო, <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> და <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> არასრულად ჩაიწერა."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"არასაკმარისი მეხსიერების გამო, <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> და <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> არასრულად ჩაიწერა."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"მიმდინარეობს პროგრამების წაკითხვა"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR მეტ მეხსიერებას საჭიროებს"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"DVR-ის მეშვეობით პროგრამების ჩაწერა შესაძლებელია, თუმცა თქვენს მოწყობილობაზე ამჟამად ხელმისაწვდომი მეხსიერება DVR-ის მუშაობისთვის არასაკმარისია. გთხოვთ, დააკავშიროთ <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> გბაიტი ან მეტი მოცულობის დისკწამყვანი და მიჰყვეთ ინსტრუქციას, რომელიც დაგეხმარებათ, დააფორმატოთ ის მოწყობილობის მეხსიერების სახით."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"მეხსიერება არასაკმარისია"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"ეს პროგრამა ვერ ჩაიწერება არასაკმარისი მეხსიერების გამო. ცადეთ არსებული ჩანაწერების წაშლა."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"აკლია მეხსიერება"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR-ის მიერ გამოყენებული მეხსიერების ნაწილი ვერ მოიძებნა. DVR-ის ხელახლა ჩასართავად, გთხოვთ, დააკავშიროთ გარე დისკი, რომლითაც ადრე სარგებლობდით. თუ მეხსიერება ხელმისაწვდომი აღარ არის, შეგიძლიათ მეხსიერების დავიწყება აირჩიოთ."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"გსურთ მეხსიერების დავიწყება?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"მთელი თქვენი ჩაწერილი კონტენტი და ყველა განრიგი დაიკარგება."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"გსურთ ჩაწერის შეწყვეტა?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ჩაწერილი კონტენტი შეინახება."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"„<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“-ის ჩაწერა შეწყდება ამ პროგრამასთან კონფლიქტის გამო. ჩაწერილი კონტენტი შეინახება."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ჩაწერა დაგეგმილია, თუმცა ის კონფლიქტშია"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ჩაწერა დაიწყო, თუმცა ის კონფლიქტშია"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ჩაიწერება."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"იგივე პროგრამა უკვე დაიგეგმა ჩასაწერად <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>-ზე."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"უკვე ჩაწერილია"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"ეს პროგრამა უკვე ჩაწერილია და DVR ბიბლიოთეკაშია ხელმისაწვდომი."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"სერიალის ჩაწერა დაგეგმილია"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">„<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ჩანაწერი.</item>
- <item quantity="one">„<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ჩანაწერი.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">„<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ჩანაწერი. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> მათგანი ვერ ჩაიწერება კონფლიქტების გამო.</item>
- <item quantity="one">„<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ჩანაწერი. ის ვერ ჩაიწერება კონფლიქტების გამო.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">„<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ჩანაწერი. ამ სერიალის <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ეპიზოდი და სხვა სერიალები ვერ ჩაიწერება კონფლიქტების გამო.</item>
- <item quantity="one">„<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ჩანაწერი. ამ სერიალის <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ეპიზოდი და სხვა სერიალები ვერ ჩაიწერება კონფლიქტების გამო.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">„<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ჩანაწერი. სხვა სერიალის 1 ეპიზოდი ვერ ჩაიწერება კონფლიქტების გამო.</item>
- <item quantity="one">„<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ჩანაწერი. სხვა სერიალის 1 ეპიზოდი ვერ ჩაიწერება კონფლიქტების გამო.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">„<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ჩანაწერი. სხვა სერიალების <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ეპიზოდი ვერ ჩაიწერება კონფლიქტების გამო.</item>
- <item quantity="one">„<xliff:g id="SERIESNAME_1">%2$s</xliff:g>“-სთვის დაიგეგმა <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ჩანაწერი. სხვა სერიალების <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ეპიზოდი ვერ ჩაიწერება კონფლიქტების გამო.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"ჩაწერილი პროგრამა ვერ მოიძებნა."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"დაკავშირებული ჩანაწერები"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(პროგრამის აღწერა არ არის)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"გსურთ სერიალის ჩაწერის შეწყვეტა?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"ჩაწერილი ეპიზოდები DVR ბიბლიოთეკაში კვლავ იქნება ხელმისაწვდომი."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"შეწყვეტა"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ამჟამად ეთერში არცერთი ეპიზოდი არ გადის."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"ეპიზოდები მიუწვდომელია.\nმათი ჩაწერა მოხდება მაშინ, როცა ისინი ხელმისაწვდომი გახდება."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d წუთი)</item>
diff --git a/res/values-kk-rKZ-v23/strings.xml b/res/values-kk-v23/strings.xml
index 4da42f69..4da42f69 100644
--- a/res/values-kk-rKZ-v23/strings.xml
+++ b/res/values-kk-v23/strings.xml
diff --git a/res/values-kk-rKZ/arrays.xml b/res/values-kk/arrays.xml
index bbb0282c..bbb0282c 100644
--- a/res/values-kk-rKZ/arrays.xml
+++ b/res/values-kk/arrays.xml
diff --git a/res/values-kk-rKZ/rating_system_strings.xml b/res/values-kk/rating_system_strings.xml
index efeb4715..efeb4715 100644
--- a/res/values-kk-rKZ/rating_system_strings.xml
+++ b/res/values-kk/rating_system_strings.xml
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk/strings.xml
index 98bb482c..2a47972c 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"моно"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"стерео"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Ойын тетіктері"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Арналар"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Жақ-ғы арналар"</string>
<string name="menu_title_options" msgid="7184594626814914022">"ТД опциялары"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP опциялары"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Бұл арна үшін ойнатуды басқару элементтерін қол жетімсіз"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Ойнату немесе кідірту"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Жылдам алға айналдыру"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Жасырын титрлер"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Дисплей режимі"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Қосулы"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Өшірулі"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Мультиаудио"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Басқа арналар"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Параметрлер"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Көз"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Алмастыру"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Қосулы"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Өшірулі"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Дыбыс"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Негізгі"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP терезесі"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Орналасу"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Төменгі оң жақ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Жоғарғы оң жақ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Жоғарғы сол жақ"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Төменгі сол жақ"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Қатар"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Өлшем"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Үлкен"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Кішкентай"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Енгізу көзі"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"ТД (антенна/кабель)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Бағдарлама туралы ақпарат жоқ"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Ақпарат жоқ"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Бөгелген арна"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Белгісіз тіл"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Субтитрлер: %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Белгісіз тіл"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Жасырын титрлер"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Өшірулі"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Пішімдеуді теңшеу"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Бұл PIN қате болды. Әрекетті қайталаңыз."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Әрекетті қайталаңыз, PIN кодтары сәйкес емес"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Пошта индексін енгізіңіз."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Тікелей арналар қолданбасы телеарналардың толық бағдарламалар нұсқаулығын ұсыну үшін пошта индексін пайдаланады."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Индексті енгізіңіз"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Индекс жарамсыз"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Параметрлер"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Арналар тізімін теңшеу"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Бағдарлама нұсқаулығына арналған арналарды таңдау"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Ата-аналық бақылау"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Ашық бастапқы код лицензиялары"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Ашық бастапқы код лицензиялары"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Пікір жіберу"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Нұсқа"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Бұл арнаны көру үшін оңға түймесін басып, PIN кодын енгізіңіз"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Бұл бағдарламаны көру үшін оңға түймесін басып, PIN кодын енгізіңіз"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Теледидар мәзіріне кіру үшін ТАҢДАУ"</b>" түймесін басыңыз."</string>
<string name="msg_no_input" msgid="3897674146985427865">"ТД кіріс сигналы табылмады"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"ТД кіріс сигналын табу мүмкін емес"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP мүмкіндігіне қолдау көрсетілмейді"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP мүмкіндігімен көрсетуге болатын кіріс сигналы жоқ"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Тюнер түрі жарамсыз. Тюнер түрінің ТД кіріс сигналы үшін Тікелей эфир арналары қолданбасын іске қосыңыз."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Арнаға реттелмеді"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Бұл әрекетті орындайтын қолданба табылмады."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Сақтау"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Бір жолғы жазбалар ең маңызды болып табылады"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Бас тарту"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Бас тарту"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Жою"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Тоқтату"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Жазу кестесін көру"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Тек осы бағдарлама"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Орнына мына бағдарламаны жазу"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Бұл жазып алу кестесінен бас тарту"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Қазір көру"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Жазбалар жойылуда…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Жазып алуға болады"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Жазып алынады"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Жазу кестесінде қайшылық бар"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Жазылуда"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Жазу сәтсіз аяқталды"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Жазу кестелерін жасауға арналған оқу бағдарламалары"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Бағдарлама ақпараты оқылуда"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Соңғы жазбаларды көру"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> бағдарламасын жазу аяқталмады."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> және <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> бағдарламасын жазу аяқталмады."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> және <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> бағдарламасын жазу аяқталмады."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Жад жеткіліксіз болғандықтан, <xliff:g id="PROGRAMNAME">%1$s</xliff:g> бағдарламасын жазу аяқталмады."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Жад жеткіліксіз болғандықтан, <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> және <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> бағдарламасын жазу аяқталмады."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Жад жеткіліксіз болғандықтан, <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> және <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> бағдарламасын жазу аяқталмады."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Бағдарлама ақпараты оқылуда"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR көбірек бос орынды қажет етеді"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Бағдарламаларды DVR арқылы жазып алуға болады. Алайда DVR жұмысы үшін құрылғыда бос орын жеткіліксіз. <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> ГБ не одан үлкен сыртқы дискіні жалғап, оны құрылғы жады ретінде форматтау қадамдарын орындаңыз."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Жадта орын жеткіліксіз"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Жадта орын жеткіліксіз болғандықтан, бұл бағдарлама жазылмайды. Кейбір бұрыннан бар жазбаларды жойыңыз."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Жад жоқ"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR пайдаланатын жадтың бір бөлігі жоқ. DVR құрылғысын қайта іске қосу үшін бұрын пайдаланған сыртқы дискіні жалғаңыз. Сондай-ақ егер жад бұдан әрі қолжетімді болмаса, оны жоюыңызға болады."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Жад жойылсын ба?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Барлық жазылған мазмұндар мен кестелер жойылады."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Жазу тоқтатылсын ба?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Жазылған мазмұн сақталады."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Осы бағдарламамен қайшылық тудырғандықтан, <xliff:g id="PROGRAMNAME">%1$s</xliff:g> жазу тоқтатылды. Жазып алынған мазмұн сақталады."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Жоспарланған, бірақ қайшылықтары бар"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Жазу басталды, бірақ қайшылықтары бар"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> жазылады."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Бұл бағдарламаны жазып алу басқа уақытқа (<xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>) әлдеқашан жоспарланған."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Бұрын жазылған"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Бұл бағдарлама бұрын жазылған және DVR кітапханасында бар."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Серияларды жазып алу жоспарланды"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> жазба жоспарланды.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жазба жоспарланды.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> жазба жоспарланды. Олардың ішінде <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> серия қайшылықтарға байланысты жазылмайды.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жазба жоспарланды. Ол қайшылықтарға байланысты жазылмайды.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> жазба жоспарланды. Бұл сериалдың және басқа сериалдың <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> сериясы қайшылықтарға байланысты жазылмайды.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жазба жоспарланды. Бұл сериалдың және басқа сериалдың <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> сериясы қайшылықтарға байланысты жазылмайды.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> жазба жоспарланды. Басқа сериалдың 1 сериясы қайшылықтарға байланысты жазылмайды.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жазба жоспарланды. Басқа сериалдың 1 сериясы қайшылықтарға байланысты жазылмайды.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> жазба .жоспарланды. Басқа сериалдың <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> сериясы қайшылықтарға байланысты жазылмайды.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> үшін <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жазба .жоспарланды. Басқа сериалдың <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> сериясы қайшылықтарға байланысты жазылмайды.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Жазылған бағдарлама табылмады."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Қатысты жазбалар"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Бағдарлама сипаттамасы жоқ)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Серияларды жазу тоқтатылсын ба?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Жазылған серияларды DVR кітапханасынан алуға болады."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Тоқтату"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Ешқандай серия көрсетіліп жатқан жоқ."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Ешқандай серия қолжетімді емес.\nОларды қолжетімді болған кезде ғана жазып алуға болады."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d минут)</item>
diff --git a/res/values-km-rKH-v23/strings.xml b/res/values-km-v23/strings.xml
index 67c48f05..67c48f05 100644
--- a/res/values-km-rKH-v23/strings.xml
+++ b/res/values-km-v23/strings.xml
diff --git a/res/values-km-rKH/arrays.xml b/res/values-km/arrays.xml
index e46312b4..e46312b4 100644
--- a/res/values-km-rKH/arrays.xml
+++ b/res/values-km/arrays.xml
diff --git a/res/values-km-rKH/rating_system_strings.xml b/res/values-km/rating_system_strings.xml
index 8f5df6b3..8f5df6b3 100644
--- a/res/values-km-rKH/rating_system_strings.xml
+++ b/res/values-km/rating_system_strings.xml
diff --git a/res/values-km-rKH/strings.xml b/res/values-km/strings.xml
index b92a75ae..98fa13f5 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"ម៉ូណូ"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"ស្តេរ៉េអូ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"បញ្ជាការចាក់"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"ឆានែល"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"ឆានែល​ថ្មីៗ"</string>
<string name="menu_title_options" msgid="7184594626814914022">"ជម្រើសទូរទស្សន៍"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"ជម្រើស PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"ការបញ្ជាលើការចាក់មិនអាចប្រើបានទេសម្រាប់ឆានែលនេះ។"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"ចាក់ ឬផ្អាក"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"ទៅមុខរហ័ស"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"ចំណងជើង​បិទ"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"របៀប​បង្ហាញ"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"បើក"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"បិទ"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"ពហុ​អូឌីយ៉ូ"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"ទទួលយកប៉ុស្តិ៍ជាច្រើនទៀត"</string>
<string name="options_item_settings" msgid="7623205838542400074">"ការកំណត់"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"ប្រភព"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"ប្ដូរ"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"បើក"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"បិទ"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"សំឡេង"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"ចម្បង"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"ផ្ទាំងវិនដូ PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"ប្លង់"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"បាតខាងស្តាំ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ចុងខាងស្តាំ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ចុងខាងឆ្វេង"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"បាតខាងឆ្វេង"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"នៅក្បែរគ្នា"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"ទំហំ"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"ធំ"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"តូច"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"ប្រភព​ចូល"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"ទូរទស្សន៍ (អង់តែន/ខ្សែកាប)"</string>
<string name="no_program_information" msgid="1049844207745145132">"មិន​មាន​ព័ត៌មាន​កម្មវិធី"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"មិនមានព័ត៌មានទេ"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"បណ្តាញដែលបានរារាំង"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"ភាសាមិនស្គាល់"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"អក្សរ​រត់ %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"ភាសាមិនស្គាល់"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"បានបិទចំណងជើង"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"បិទ"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"ប្ដូររាងតាមត្រូវការ"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"កូដ PIN មិន​ត្រឹមត្រូវ។ ព្យាយាម​ម្ដងទៀត។"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"ព្យាយាម​ម្ដង​ទៀត កូដ​ PIN មិន​ដូច​គ្នា"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"បញ្ចូល​លេខ​កូដ​តំបន់​របស់អ្នក។"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"កម្មវិធី​ប៉ុស្តិ៍​ផ្សាយ​ផ្ទាល់​នឹង​ប្រើ​លេខ​កូដ​តំបន់ ដើម្បី​ផ្តល់ជូន​នូវ​ការ​ណែនាំ​អំពីកម្មវិធី​ទាំងស្រុង​សម្រាប់​ប៉ុស្តិ៍​ទូរទស្សន៍។"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"បញ្ចូល​លេខកូដ​តំបន់​របស់​អ្នក"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"លេខកូដ​តំបន់​មិនត្រឹមត្រូវ​ទេ"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"ការកំណត់"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"ប្ដូរបញ្ជីប៉ុស្តិ៍តាមបំណង"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"ជ្រើសប៉ុស្តិ៍សម្រាប់ការណែនាំកម្មវិធីរបស់អ្នក"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"ការគ្រប់គ្រងដោយមាតាបិតា"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"អាជ្ញាប័ណ្ណប្រភពកូដបើកចំហ"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"អាជ្ញាប័ណ្ណប្រភពកូដចំហ"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"ផ្ញើមតិស្ថាបនា"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"កំណែ"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"ដើម្បី​មើល​ឆានែល​នេះ អ្នក​ត្រូវ​ចុច​កណ្ដុរស្ដាំ រួច​បញ្ចូល​កូដ PIN របស់​អ្នក"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"ដើម្បី​មើល​កម្មវិធី​នេះ អ្នក​ត្រូវ​ចុច​កណ្ដុរស្ដាំ រួច​បញ្ចូល​កូដ PIN របស់​អ្នក"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"ចុច ជ្រើសរើស"</b>" ដើម្បីចូលប្រើម៉ឺនុយទូរទស្សន៍។"</string>
<string name="msg_no_input" msgid="3897674146985427865">"រកមិនឃើញបញ្ចូលទូរទស្សន៍ទេ"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"រកមិនឃើញបញ្ចូលទូរទស្សន៍ទេ"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"មិនគាំទ្រ PIP ទេ។"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"មិនមានបញ្ចូលដែលអាចបង្ហាញជាមួយ PIP បានទេ។"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ប្រភេទឧបករណ៍ចាប់ប៉ុស្តិ៍មិនសមស្រប។ សូមចាប់ផ្តើមដំណើរការកម្មវិធី ប៉ុស្តិ៍ផ្សាយផ្ទាល់ សម្រាប់ធាតុបញ្ជូលទូរទស្សន៍ប្រភេទឧបករណ៍ចាប់ប៉ុស្តិ៍។"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"កាកែសម្រួលប៉ុស្តិ៍បានបរាជ័យ"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"រកមិនឃើញកម្មវិធីដើម្បីគ្រប់គ្រងសកម្មភាពនេះទេ។"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"រក្សាទុក"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"ការថតមួយដងមានអាទិភាពខ្ពស់បំផុត"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"បោះបង់"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"បោះបង់"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"បំភ្លេច"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"បញ្ឈប់"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"មើលកាលវិភាគថត"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"កម្មវិធីមួយនេះ"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"ថតកម្មវិធីនេះជំនួសវិញ"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"បោះបង់ការថតនេះ"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"មើលឥឡូវនេះ"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"លុបការថត…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"អាចថតបាន"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"បានកំណត់ពេលការថត"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"ការថតជាន់ម៉ោងគ្នា"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"ការថត"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"បានបរាជ័យក្នុងការថត"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"កំពុងអានកម្មវិធីដើម្បីបង្កើតកាលវិភាគថត"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"កំពុងអានកម្មវិធី"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"មើលការថតថ្មីៗ"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"ការថត <xliff:g id="PROGRAMNAME">%1$s</xliff:g> មិនទាន់បញ្ចប់ទេ។"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"ការថត <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> និង <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> មិនទាន់បញ្ចប់ទេ។"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"ការថត <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> និង <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> មិនទាន់បញ្ចប់ទេ។"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"ការថត <xliff:g id="PROGRAMNAME">%1$s</xliff:g> មិនបានបញ្ចប់ទេ ដោយសារមិនមានទំហំផ្ទុកគ្រប់គ្រាន់។"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"ការថត <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> និង <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> មិនបានបញ្ចប់ទេ ដោយសារមិនមានទំហំផ្ទុកគ្រប់គ្រាន់។"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"ការថត <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> និង <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> មិនបានបញ្ចប់ទេ ដោយសារមិនមានទំហំផ្ទុកគ្រប់គ្រាន់។"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"កំពុងអានកម្មវិធី"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR ត្រូវការទំហំផ្ទុកបន្ថែមទៀត"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"អ្នកនឹងអាចថតកម្មវិធីដោយប្រើ DVR។ ទោះបីជាយ៉ាងណាក៏ដោយ ឥឡូវនេះមិនមានទំហំផ្ទុកគ្រប់គ្រាន់នៅលើឧបករណ៍របស់អ្នកដើម្បីអនុញ្ញាតឲ្យ DVR ដំណើរការនោះទេ។ សូមភ្ជាប់ទៅឧបករណ៍ផ្ទុកខាងក្រៅដែលមានទំហំផ្ទុក <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB ឬធំជាងនេះ បន្ទាប់មកអនុវត្តតាមជំហានទាំងនេះដើម្បីសម្អាតវាក្នុងនាមជាឧបករណ៍ផ្ទុក។"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"មិនមានទំហំផ្ទុកគ្រប់គ្រាន់ទេ"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"មិនអាចថតកម្មវិធីនេះបានទេ ដោយសារតែមិនមានទំហំផ្ទុកគ្រប់គ្រាន់។ សូមសាកល្បងលុបការថតមួយចំនួនដែលមានស្រាប់។"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"ឧបករណ៍ផ្ទុកដែលបានបាត់"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"ឧបករណ៍ផ្ទុកមួយចំនួនដែលប្រើដោយ DVR បានបាត់បង់។ សូមភ្ជាប់ថាសផ្ទុកផ្នែកខាងក្រៅដែលអ្នកបានប្រើពីមុន ដើម្បីបើកដំណើរការ DVR ឡើងវិញ ឬអ្នកអាចជ្រើសរើសធ្វើការបំភ្លេចឧបករណ៍ផ្ទុកនេះ ប្រសិនបើវាមិនអាចប្រើបានតទៅទៀត។"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"បំភ្លេចឧបករណ៍ផ្ទុកឬ?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"មាតិកា និងកាលវិភាគដែលបានថតទុករបស់អ្នកទាំងអស់នឹងបាត់បង់។"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"បញ្ឈប់ការថតឬ?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"មាតិកាដែលបានថតនឹងត្រូវបានរក្សាទុក"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"ការថត <xliff:g id="PROGRAMNAME">%1$s</xliff:g> នឹងត្រូវបានបញ្ឈប់ ដោយសារតែវាជាន់ម៉ោងគ្នាជាមួយកម្មវិធីនេះ។ មាតិកាដែលបានថតនេះនឹងត្រូវបានរក្សាទុក។"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ការថតបានកំណត់ពេលហើយ ប៉ុន្តែមានម៉ោងជាន់គ្នា"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ការថតបានចាប់ផ្តើមប៉ុន្តែវាជាន់គ្នា"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> នឹងត្រូវបានថត។"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"កម្មវិធីដូចគ្នានេះត្រូវបានកំណត់ពេលថតរួចហើយនៅម៉ោង <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"បានថតរួចហើយ"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"កម្មវិធីនេះត្រូវបានថតរួចហើយ។ វាអាចប្រើបាននៅក្នុងបណ្ណាល័យ DVR ។"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"បានកំណត់ពេលថតវគ្គ"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ។</item>
- <item quantity="one">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ។</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ។ ការថតចំនួន <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> ក្នុងចំណោមនោះនឹងមិនត្រូវបានថតទេ ដោយសារម៉ោងជាន់គ្នា។</item>
- <item quantity="one">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ។ វានឹងមិនត្រូវបានថតទេ ដោយសារម៉ោងជាន់គ្នា។</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ។ ភាគចំនួន <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> នៃវគ្គនេះ និងវគ្គផ្សេងទៀតនឹងមិនត្រូវបានថតទេ ដោយសារម៉ោងជាន់គ្នា។</item>
- <item quantity="one">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ។ ភាគចំនួន <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> នៃវគ្គនេះ និងវគ្គផ្សេងទៀតនឹងមិនត្រូវបានថតទេ ដោយសារម៉ោងជាន់គ្នា។</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ។ ភាគចំនួន 1 នៃវគ្គផ្សេងនឹងមិនត្រូវបានថតទេ ដោយសារម៉ោងជាន់គ្នា។</item>
- <item quantity="one">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ។ ភាគចំនួន 1 នៃវគ្គផ្សេងនឹងមិនត្រូវបានថតទេ ដោយសារម៉ោងជាន់គ្នា។</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ។ ភាគចំនួន <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> នៃវគ្គផ្សេងនឹងមិនត្រូវបានថតទេ ដោយសារម៉ោងជាន់គ្នា។</item>
- <item quantity="one">ការថតចំនួន <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ត្រូវបានកំណត់ពេលសម្រាប់ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ។ ភាគចំនួន <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> នៃវគ្គផ្សេងនឹងមិនត្រូវបានថតទេ ដោយសារម៉ោងជាន់គ្នា។</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"រកមិនឃើញកម្មវិធីដែលបានថតទេ"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"ការថតដែលពាក់ព័ន្ធ"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(គ្មានការពិពណ៌នាអំពីកម្មវិធីទេ)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"បញ្ឈប់ការថតវគ្គឬ?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"ភាគដែលបានថតនឹងនៅតែមាននៅក្នុងបណ្ណាល័យ DVR ។"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"បញ្ឈប់"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ឥឡូវនេះមិនមានការផ្សាយភាគថ្មីទេ។"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"មិនមានផ្តល់ជូនភាគណាមួយទេ។\nពួកវានឹងត្រូវបានថតបន្ទាប់ពីមានផ្តល់ជូន។"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d នាទី)</item>
diff --git a/res/values-kn-rIN-v23/strings.xml b/res/values-kn-v23/strings.xml
index 95f50839..95f50839 100644
--- a/res/values-kn-rIN-v23/strings.xml
+++ b/res/values-kn-v23/strings.xml
diff --git a/res/values-kn-rIN/arrays.xml b/res/values-kn/arrays.xml
index e6d19c9f..e6d19c9f 100644
--- a/res/values-kn-rIN/arrays.xml
+++ b/res/values-kn/arrays.xml
diff --git a/res/values-kn-rIN/rating_system_strings.xml b/res/values-kn/rating_system_strings.xml
index 4d878099..4d878099 100644
--- a/res/values-kn-rIN/rating_system_strings.xml
+++ b/res/values-kn/rating_system_strings.xml
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn/strings.xml
index e5afe1fa..adc99656 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"ಮೊನೊ"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"ಸ್ಟೀರಿಯೋ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Play ನಿಯಂತ್ರಣಗಳು"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"ಚಾನಲ್‌ಗಳು"</string>
- <string name="menu_title_options" msgid="7184594626814914022">"ಟಿವಿ ಆಯ್ಕೆಗಳು"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"ಇತ್ತೀಚಿನ ಚಾನಲ್‌ಗಳು"</string>
+ <string name="menu_title_options" msgid="7184594626814914022">"TV ಆಯ್ಕೆಗಳು"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP ಆಯ್ಕೆಗಳು"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"ಈ ಚಾನಲ್‌ಗೆ ಪ್ಲೇ ನಿಯಂತ್ರಣಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"ಪ್ಲೇ ಮಾಡಿ ಅಥವಾ ವಿರಾಮಗೊಳಿಸಿ"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"ವೇಗವಾಗಿ ಮುಂದಕ್ಕೆ"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳು"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"ಪ್ರದರ್ಶನ ಮೋಡ್"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"ಆನ್"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"ಆಫ್"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"ಬಹು-ಆಡಿಯೊ"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"ಹೆಚ್ಚು ಚಾನಲ್‌ ಪಡೆ"</string>
<string name="options_item_settings" msgid="7623205838542400074">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
- <string name="input_long_label_for_tuner" msgid="3423514011918382209">"ಟಿವಿ (ಆಂಟೆನಾ/ಕೇಬಲ್)"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"ಮೂಲ"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"ಸ್ವ್ಯಾಪ್‌ ಮಾಡು"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"ಆನ್"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"ಆಫ್"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ಶಬ್ದ"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"ಪ್ರಮುಖ"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP ವಿಂಡೋ"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"ಲೇಔಟ್"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"ಕೆಳಗಿನ ಬಲಭಾಗ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ಮೇಲಿನ ಬಲಭಾಗ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ಮೇಲಿನ ಎಡಭಾಗ"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"ಕೆಳಗಿನ ಎಡಭಾಗ"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"ಅಕ್ಕ ಪಕ್ಕ"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"ಗಾತ್ರ"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"ದೊಡ್ಡದು"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"ಸಣ್ಣ"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"ಇನ್‌ಪುಟ್ ಮೂಲ"</string>
+ <string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (ಆಂಟೆನಾ/ಕೇಬಲ್)"</string>
<string name="no_program_information" msgid="1049844207745145132">"ಯಾವುದೇ ಕಾರ್ಯಕ್ರಮದ ಮಾಹಿತಿ ಇಲ್ಲ"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"ಯಾವುದೇ ಮಾಹಿತಿ ಇಲ್ಲ"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"ನಿರ್ಬಂಧಿಸಲಾದ ಚಾನಲ್"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"ಅಪರಿಚಿತ ಭಾಷೆ"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳು %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"ಅಪರಿಚಿತ ಭಾಷೆ"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳು"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"ಆಫ್"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"ಫಾರ್ಮ್ಯಾಟ್‌ ಮಾಡುವಿಕೆ ವೈಯಕ್ತೀಕರಿಸಿ"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"ಆ PIN ತಪ್ಪಾಗಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ, PIN ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"ನಿಮ್ಮ ಪಿನ್ ಕೋಡ್ ನಮೂದಿಸಿ."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"ಲೈವ್ ಚಾನಲ್‌ಗಳ ಅಪ್ಲಿಕೇಶನ್ ಟಿವಿ ಚಾನಲ್‌ಗಳಿಗೆ ಸಂಪೂರ್ಣ ಕಾರ್ಯಕ್ರಮ ಮಾರ್ಗದರ್ಶನವನ್ನು ಒದಗಿಸಲು ಪಿನ್ ಕೋಡ್ ಅನ್ನು ಬಳಸುತ್ತದೆ."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"ನಿಮ್ಮ ಪಿನ್ ಕೋಡ್ ನಮೂದಿಸಿ"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"ಅಮಾನ್ಯ ಪಿನ್‌ ಕೋಡ್"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"ಚಾನಲ್‌ಪಟ್ಟಿ ಕಸ್ಟಮೈಸ್‌"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"ನಿಮ್ಮ ಕಾರ್ಯಕ್ರಮ ಸೂಚಿಗಾಗಿ ಚಾನಲ್‌ಗಳನ್ನು ಆರಿಸಿ"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"ಪೋಷಕ ನಿಯಂತ್ರಣಗಳು"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"ಮುಕ್ತ ಮೂಲ ಪರವಾನಗಿಗಳು"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"ಮುಕ್ತ ಮೂಲ ಪರವಾನಗಿಗಳು"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"ಆವೃತ್ತಿ"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"ಈ ಚಾನಲ್ ಅನ್ನು ವೀಕ್ಷಿಸಲು, ಬಲಕ್ಕೆ ಒತ್ತಿ ಮತ್ತು ನಿಮ್ಮ PIN ಅನ್ನು ನಮೂದಿಸಿ"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"ಈ ಕಾರ್ಯಕ್ರಮವನ್ನು ವೀಕ್ಷಿಸಲು, ಬಲಕ್ಕೆ ಒತ್ತಿ ಮತ್ತು ನಿಮ್ಮ PIN ಅನ್ನು ನಮೂದಿಸಿ"</string>
@@ -164,10 +178,12 @@
<string name="new_sources_action_skip" msgid="2501296961258184330">"ಸರಿ, ಅರ್ಥವಾಯಿತು"</string>
<!-- no translation found for intro_title (251772896916795556) -->
<skip />
- <string name="intro_description" msgid="7806473686446937307">"ಟಿವಿ ಮೆನುವನ್ನು ಪ್ರವೇಶಿಸಲು "<b>"ಆಯ್ಕೆ ಮಾಡು ಒತ್ತಿರಿ"</b>"."</string>
- <string name="msg_no_input" msgid="3897674146985427865">"ಯಾವುದೇ ಟಿವಿ ಇನ್‌ಪುಟ್ ಕಂಡುಬಂದಿಲ್ಲ"</string>
- <string name="msg_no_specific_input" msgid="2688885987104249852">"ಟಿವಿ ಇನ್‌ಪುಟ್ ಹುಡುಕಲಾಗಲಿಲ್ಲ"</string>
- <string name="msg_not_passthrough_input" msgid="4502101097091087411">"ಟ್ಯೂನರ್ ಪ್ರಕಾರವು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ದಯವಿಟ್ಟು ಟ್ಯೂನರ್ ಪ್ರಕಾರದ ಟಿವಿ ಇನ್‌ಪುಟ್‌ಗೆ ಲೈವ್‌ ಚಾನಲ್‌ಗಳ ಅಪ್ಲಿಕೇಶನ್‌ ಪ್ರಾರಂಭಿಸಿ."</string>
+ <string name="intro_description" msgid="7806473686446937307">"TV ಮೆನುವನ್ನು ಪ್ರವೇಶಿಸಲು "<b>"ಆಯ್ಕೆ ಮಾಡು ಒತ್ತಿರಿ"</b>"."</string>
+ <string name="msg_no_input" msgid="3897674146985427865">"ಯಾವುದೇ TV ಇನ್‌ಪುಟ್ ಕಂಡುಬಂದಿಲ್ಲ"</string>
+ <string name="msg_no_specific_input" msgid="2688885987104249852">"TV ಇನ್‌ಪುಟ್ ಹುಡುಕಲಾಗಲಿಲ್ಲ"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP ಬೆಂಬಲಿತವಾಗಿಲ್ಲ"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP ನೊಂದಿಗೆ ತೋರಿಸಬಹುದಾದ ಯಾವುದೇ ಇನ್‌ಪುಟ್ ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="msg_not_passthrough_input" msgid="4502101097091087411">"ಟ್ಯೂನರ್ ಪ್ರಕಾರವು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ದಯವಿಟ್ಟು ಟ್ಯೂನರ್ ಪ್ರಕಾರದ TV ಇನ್‌ಪುಟ್‌ಗೆ ಲೈವ್‌ ಚಾನಲ್‌ಗಳ ಅಪ್ಲಿಕೇಶನ್‌ ಪ್ರಾರಂಭಿಸಿ."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ಟ್ಯೂನ್ ವಿಫಲವಾಗಿದೆ"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"ಈ ಕ್ರಿಯೆಯನ್ನು ನಿರ್ವಹಿಸಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ ಕಂಡುಬಂದಿಲ್ಲ."</string>
<string name="msg_all_channels_hidden" msgid="777397634062471936">"ಎಲ್ಲ ಮೂಲ ಚಾನಲ್‌ಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ.\nವೀಕ್ಷಿಸಲು ಕನಿಷ್ಠ ಒಂದು ಚಾನಲ್‌‌ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ."</string>
@@ -242,7 +258,9 @@
<string name="dvr_priority_description" msgid="8362040921417154645">"ಏಕ ಕಾಲದಲ್ಲಿ ರೆಕಾರ್ಡ್‌ ಮಾಡಲು ಸಾಕಷ್ಟು ಕಾರ್ಯಕ್ರಮಗಳು ಇದ್ದ ಸಂದರ್ಭದಲ್ಲಿ, ಹೆಚ್ಚಿನ ಆದ್ಯತೆ ಇರುವುದನ್ನು ಮಾತ್ರ ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾಗುತ್ತದೆ."</string>
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"ಉಳಿಸು"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"ಒಂದು ಬಾರಿ ಮಾಡಿದ ರೆಕಾರ್ಡಿಂಗ್‌ಗಳು ಹೆಚ್ಚಿನ ಆದ್ಯತೆ ಹೊಂದಿರುತ್ತದೆ"</string>
- <string name="dvr_action_cancel" msgid="8094060199570272625">"ರದ್ದುಮಾಡಿ"</string>
+ <string name="dvr_action_cancel" msgid="8094060199570272625">"ರದ್ದುಮಾಡು"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"ರದ್ದುಮಾಡಿ"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"ಮರೆತುಬಿಡು"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"ನಿಲ್ಲಿಸು"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"ರೆಕಾರ್ಡಿಂಗ್ ವೇಳಾಪಟ್ಟಿ ವೀಕ್ಷಿಸಿ"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"ಈ ಏಕೈಕ ಪ್ರೋಗ್ರಾಂ"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"ಬದಲಿಗೆ ಇದನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"ಈ ರೆಕಾರ್ಡಿಂಗ್ ರದ್ದುಗೊಳಿಸಿ"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"ಈಗ ವೀಕ್ಷಿಸಿ"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"ರೆಕಾರ್ಡಿಂಗ್‌‌ಗಳನ್ನು ಅಳಿಸಿ..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"ರೆಕಾರ್ಡ್ ಮಾಡಬಹುದಾದ"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"ರೆಕಾರ್ಡಿಂಗ್ ನಿಗದಿಪಡಿಸಲಾಗಿದೆ"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"ರೆಕಾರ್ಡಿಂಗ್ ಸಂಘರ್ಷ"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"ರೆಕಾರ್ಡ್ ಆಗುತ್ತಿದೆ"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"ರೆಕಾರ್ಡಿಂಗ್ ವಿಫಲವಾಗಿದೆ"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"ರೆಕಾರ್ಡಿಂಗ್ ವೇಳಾಪಟ್ಟಿಗಳನ್ನು ರಚಿಸಲು ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ರೀಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ರೀಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"ಇತ್ತೀಚಿನ ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ನ ರೆಕಾರ್ಡಿಂಗ್ ಅಪೂರ್ಣವಾಗಿದೆ."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ಮತ್ತು <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ನ ರೆಕಾರ್ಡಿಂಗ್‌ಗಳು ಅಪೂರ್ಣವಾಗಿವೆ."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ಮತ್ತು <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ನ ರೆಕಾರ್ಡಿಂಗ್‌ಗಳು ಅಪೂರ್ಣವಾಗಿವೆ."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆ ಇಲ್ಲದಿರುವ ಕಾರಣ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ನ ರೆಕಾರ್ಡಿಂಗ್ ಪೂರ್ಣಗೊಂಡಿಲ್ಲ."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆ ಇಲ್ಲದಿರುವ ಕಾರಣ <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ಮತ್ತು <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ನ ರೆಕಾರ್ಡಿಂಗ್‌ಗಳು ಪೂರ್ಣಗೊಂಡಿಲ್ಲ."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆ ಇಲ್ಲದಿರುವ ಕಾರಣ <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ಮತ್ತು <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ನ ರೆಕಾರ್ಡಿಂಗ್‌ಗಳು ಪೂರ್ಣಗೊಂಡಿಲ್ಲ."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ರೀಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR ಗೆ ಹೆಚ್ಚಿನ ಸಂಗ್ರಹಣೆಯ ಅಗತ್ಯವಿದೆ"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"DVR ಮೂಲಕ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ. ಅದಾಗ್ಯೂ DVR ಗೆ ಕೆಲಸ ಮಾಡಲು ಇದೀಗ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸಾಕಷ್ಟು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ. ದಯವಿಟ್ಟು <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB ಅಥವಾ ಅದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಬಾಹ್ಯ ಡ್ರೈವ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಿ ಮತ್ತು ಸಾಧನ ಸಂಗ್ರಹಣೆಯಂತೆ ಫಾರ್ಮ್ಯಾಟ್‌ ಮಾಡಲು ಹಂತಗಳನ್ನು ಅನುಸರಿಸಿ."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆಯಿಲ್ಲ"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆ ಇಲ್ಲದಿರುವ ಕಾರಣ ಈ ಕಾರ್ಯಕ್ರಮವನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಕೆಲವು ರೆಕಾರ್ಡಿಂಗ್ ಅಳಿಸಲು ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"ಸಂಗ್ರಹಣೆ ಕಾಣೆಯಾಗಿದೆ"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR ಮೂಲಕ ಬಳಸಲಾದ ಕೆಲವು ಸಂಗ್ರಹಣೆಯು ಕಾಣೆಯಾಗಿದೆ. ನೀವು DVR ಮರು-ಸಕ್ರಿಯಗೊಳಿಸುವ ಮೊದಲು ಬಳಸಲಾದ ಬಾಹ್ಯ ಡ್ರೈವ್ ಅನ್ನು ಸಂಪರ್ಕಪಡಿಸಿ. ಪರ್ಯಾಯವಾಗಿ, ಇನ್ನೂ ಮುಂದೆ ಲಭ್ಯವಿಲ್ಲದಿದ್ದರೆ ಸಂಗ್ರಹಣೆಯನ್ನು ಮರೆಯಲು ನೀವು ಆಯ್ಕೆಮಾಡಬಹುದು."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"ಸಂಗ್ರಹಣೆಯನ್ನು ಮರೆತಿರುವಿರಾ?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"ನಿಮ್ಮ ಎಲ್ಲಾ ರೆಕಾರ್ಡ್ ಮಾಡಲಾದ ವಿಷಯ ಮತ್ತು ವೇಳಾಪಟ್ಟಿಗಳು ಕಳೆದುಹೋಗುತ್ತವೆ."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"ರೆಕಾರ್ಡಿಂಗ್ ನಿಲ್ಲಿಸುವುದೇ?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾದ ವಿಷಯವನ್ನು ಉಳಿಸಲಾಗುತ್ತದೆ."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"ಈ ಕಾರ್ಯಕ್ರಮದ ಜೊತೆಗೆ ರೆಕಾರ್ಡಿಂಗ್ ಸಂಘರ್ಷಿಸುವ ಕಾರಣದಿಂದಾಗಿ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ನಿಲ್ಲಿಸಲಾಗುವುದು. ರೆಕಾರ್ಡ್ ಮಾಡಲಾದ ವಿಷಯವನ್ನು ಉಳಿಸಲಾಗುವುದು."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ರೆಕಾರ್ಡಿಂಗ್ ನಿಗದಿಪಡಿಸಲಾಗಿದೆ ಆದರೆ ಸಂಘರ್ಷಣೆಗಳನ್ನು ಹೊಂದಿದೆ"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಾರಂಭಿಸಲಾಗಿದೆ ಆದರೆ ಸಂಘರ್ಷಣೆಗಳನ್ನು ಹೊಂದಿದೆ"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ಅನ್ನು ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾಗುತ್ತದೆ."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"ಅದೇ ಕಾರ್ಯಕ್ರಮವನ್ನು ಈಗಾಗಲೇ <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> ಸಮಯಕ್ಕೆ ರೆಕಾರ್ಡ್ ಮಾಡಲು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"ಈಗಾಗಲೇ ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"ಈ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಈಗಾಗಲೇ ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾಗಿದೆ. ಇದು DVR ಲೈಬ್ರರಿಯಲ್ಲಿ ಲಭ್ಯವಿದೆ."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"ಸರಣಿ ರೆಕಾರ್ಡಿಂಗ್ ನಿಗದಿಪಡಿಸಲಾಗಿದೆ"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ. ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ಅವುಗಳಲ್ಲಿ <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> ಅನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ. ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ಅವುಗಳಲ್ಲಿ <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> ಅನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ. ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ಈ ಸರಣಿಯ ಮತ್ತು ಇತರ ಸರಣಿಯ <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ಸಂಚಿಕೆಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ. ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ಈ ಸರಣಿಯ ಮತ್ತು ಇತರ ಸರಣಿಯ <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ಸಂಚಿಕೆಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ. ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ಇತರ ಸರಣಿಯ 1 ಸಂಚಿಕೆಯನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ. ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ಇತರ ಸರಣಿಯ 1 ಸಂಚಿಕೆಯನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ. ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ಇತರ ಸರಣಿಯ <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ಸಂಚಿಕೆಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ರೆಕಾರ್ಡಿಂಗ್‌ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ. ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ಇತರ ಸರಣಿಯ <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ಸಂಚಿಕೆಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾದ ಕಾರ್ಯಕ್ರಮ ಕಂಡುಬಂದಿಲ್ಲ."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"ಸಂಬಂಧಿಸಿದ ರೆಕಾರ್ಡಿಂಗ್‌ಗಳು"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(ಯಾವುದೇ ಪ್ರೋಗ್ರಾಂ ವಿವರಣೆಯಿಲ್ಲ)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"ಸರಣಿ ರೆಕಾರ್ಡಿಂಗ್ ನಿಲ್ಲಿಸುವುದೇ?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾದ ಭಾಗಗಳು DVR ಲೈಬ್ರರಿಯಲ್ಲಿ ಲಭ್ಯವಿರುತ್ತವೆ."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"ನಿಲ್ಲಿಸಿ"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ಈಗ ಪ್ರಸಾರ ಮಾಡಲು ಯಾವುದೇ ಸಂಚಿಕೆಗಳಿಲ್ಲ."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"ಯಾವುದೇ ಸಂಚಿಕೆಗಳು ಲಭ್ಯವಿಲ್ಲ.\nಅವುಗಳು ಒಮ್ಮೆ ಲಭ್ಯವಾದಾಗ ಅವುಗಳನ್ನು ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾಗುತ್ತದೆ."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d ನಿಮಿಷಗಳು)</item>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index d3bc71cd..4e9fa6a6 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"모노"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"스테레오"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"재생 컨트롤"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"채널"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"최근 시청한 채널"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV 옵션"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP 옵션"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"이 채널에서 재생 컨트롤을 사용할 수 없습니다."</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"재생 또는 일시중지"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"빨리 감기"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"자막"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"표시 모드"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"사용"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"사용 안함"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"멀티 오디오"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"채널 더보기"</string>
<string name="options_item_settings" msgid="7623205838542400074">"설정"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"소스"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"전환"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"사용"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"사용 안함"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"소리"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"기본"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP 창"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"레이아웃"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"오른쪽 하단"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"오른쪽 상단"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"왼쪽 상단"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"왼쪽 하단"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"나란히"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"크기"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"크게"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"작게"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"입력 소스"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV(안테나/케이블)"</string>
<string name="no_program_information" msgid="1049844207745145132">"프로그램 정보가 없습니다."</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"정보 없음"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"차단된 채널"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"알 수 없는 언어"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"%1$d 자막"</string>
+ <string name="default_language" msgid="4122326459624337928">"알 수 없는 언어"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"자막"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"사용 안함"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"포맷 맞춤설정"</string>
@@ -118,10 +137,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN이 잘못되었습니다. 다시 시도해 주세요."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"다시 시도해 주세요. PIN이 일치하지 않습니다."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"우편번호 입력"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"실시간 채널 앱에서 TV 채널에 관한 전체 프로그램 가이드를 제공하는 데 우편번호가 사용됩니다."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"우편번호를 입력하세요."</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"잘못된 우편번호입니다."</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"설정"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"채널 목록 맞춤설정"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"프로그램 가이드용 채널을 선택합니다."</string>
@@ -130,7 +145,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"자녀 보호 기능"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"오픈소스 라이선스"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"오픈소스 라이선스"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"의견 보내기"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"버전"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"이 채널을 보려면 오른쪽을 누르고 PIN을 입력하세요."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"이 프로그램을 보려면 오른쪽을 누르고 PIN을 입력하세요."</string>
@@ -169,6 +183,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"선택을 눌러"</b>" TV 메뉴에 액세스합니다."</string>
<string name="msg_no_input" msgid="3897674146985427865">"TV 입력이 없습니다."</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV 입력을 찾을 수 없습니다."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP가 지원되지 않습니다."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP로 표시할 수 있는 입력이 없습니다."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"튜너 유형이 적합하지 않습니다. 튜너 유형 TV 입력에 실시간 채널 앱을 실행하세요."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"조정에 실패했습니다."</string>
<string name="msg_missing_app" msgid="8291542072400042076">"이 작업을 처리하는 앱을 찾을 수 없습니다."</string>
@@ -245,6 +261,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"저장"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"일회 녹화의 우선순위가 가장 높음"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"취소"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"취소"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"삭제"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"중지"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"녹화 일정 보기"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"이 프로그램만"</string>
@@ -254,29 +272,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"대신 이 항목을 녹화하기"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"이 녹화 취소하기"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"지금 보기"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"녹화된 프로그램 삭제 중..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"녹화 가능"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"녹화 예약됨"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"녹화 예약 충돌"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"녹화 중"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"녹화 실패"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"프로그램을 확인하고 녹화 일정을 만듭니다."</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"프로그램 정보 읽는 중"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"최근 녹화 보기"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> 녹화를 완료하지 못했습니다."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> 녹화를 완료하지 못했습니다."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> 녹화를 완료하지 못했습니다."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"저장용량이 부족하여 <xliff:g id="PROGRAMNAME">%1$s</xliff:g> 녹화를 완료하지 못했습니다."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"저장용량이 부족하여 <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> 녹화를 완료하지 못했습니다."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"저장용량이 부족하여 <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> 녹화를 완료하지 못했습니다."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"프로그램 정보 읽는 중"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR에 저장용량이 더 필요합니다."</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"DVR을 사용하여 프로그램을 녹화할 수 있습니다. 그러나 DVR을 사용하기에는 기기에 남아있는 저장용량이 충분하지 않습니다. <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB 이상의 외부 드라이브를 연결하고 외부 드라이브를 기기 저장소로 포맷하기 위한 단계를 따르세요."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"저장공간 부족"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"저장용량이 부족하여 이 프로그램을 녹화할 수 없습니다. 기존 녹화 프로그램 일부를 삭제해 주세요."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"저장소 없음"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR에 사용되던 일부 저장소가 없습니다. 사용하던 외부 드라이브를 연결한 다음 DVR을 다시 사용 설정하시기 바랍니다. 또는 저장소를 더 이상 사용할 수 없는 경우 삭제할 수 있습니다."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"저장소를 삭제하시겠습니까?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"기록된 모든 콘텐츠 및 일정이 삭제됩니다."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"녹화를 중지하시겠습니까?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"녹화된 콘텐츠가 저장됩니다."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> 녹화가 이 프로그램과 충돌하여 중지됩니다. 녹화된 콘텐츠는 저장됩니다."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"녹화가 예약되었으나 충돌이 있음"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"녹화가 시작되었으나 충돌이 있음"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>이(가) 녹화됩니다."</string>
@@ -294,27 +308,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"동일한 프로그램이 이미 <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>에 녹화 예약되었습니다."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"이미 녹화됨"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"이 프로그램이 이미 녹화되었습니다. DVR 라이브러리에서 사용할 수 있습니다."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"시리즈 녹화 예약됨"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>개가 예약되었습니다.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>개가 예약되었습니다.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>개가 예약되었습니다. 충돌이 발생하여 이 중 <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>개는 녹화되지 않습니다.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>개가 예약되었습니다. 충돌이 발생하여 녹화되지 않습니다.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>개가 예약되었습니다. 충돌이 발생하여 이 시리즈 및 다른 시리즈의 에피소드 <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>개는 녹화되지 않습니다.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>개가 예약되었습니다. 충돌이 발생하여 이 시리즈 및 다른 시리즈의 에피소드 <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g>개는 녹화되지 않습니다.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>개가 예약되었습니다. 충돌이 발생하여 다른 시리즈의 에피소드 1개는 녹화되지 않습니다.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>개가 예약되었습니다. 충돌이 발생하여 다른 시리즈의 에피소드 1개는 녹화되지 않습니다.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>개가 예약되었습니다. 충돌이 발생하여 다른 시리즈의 에피소드 <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>개는 녹화되지 않습니다.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> 녹화 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g>개가 예약되었습니다. 충돌이 발생하여 다른 시리즈의 에피소드 <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g>개는 녹화되지 않습니다.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"녹화된 프로그램을 찾을 수 없습니다."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"관련 녹화"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(프로그램 설명 없음)"</string>
@@ -337,7 +338,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"시리즈 녹화를 중지하시겠습니까?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"녹화된 에피소드는 DVR 라이브러리에서 계속 사용할 수 있습니다."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"중지"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"현재 방송 중인 에피소드가 없습니다."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"사용할 수 있는 에피소드가 없습니다.\n사용 가능한 에피소드가 생기면 녹화됩니다."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d분)</item>
diff --git a/res/values-ky-rKG-v23/strings.xml b/res/values-ky-v23/strings.xml
index ae85b5f8..ae85b5f8 100644
--- a/res/values-ky-rKG-v23/strings.xml
+++ b/res/values-ky-v23/strings.xml
diff --git a/res/values-ky-rKG/arrays.xml b/res/values-ky/arrays.xml
index 835274e6..835274e6 100644
--- a/res/values-ky-rKG/arrays.xml
+++ b/res/values-ky/arrays.xml
diff --git a/res/values-ky-rKG/rating_system_strings.xml b/res/values-ky/rating_system_strings.xml
index 1d422a0c..1d422a0c 100644
--- a/res/values-ky-rKG/rating_system_strings.xml
+++ b/res/values-ky/rating_system_strings.xml
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky/strings.xml
index 600a2d38..2b9d37ab 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"моно"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"стерео"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Ойнотууну башкаруу"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Каналдар"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Акыркы каналдар"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Сынлг прметрлр"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP параметрлери"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Бул канал үчүн ойнотуу көзөмөлдөрү жеткиликтүү эмес"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Ойнотуу же тындыруу"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Алдыга түрүү"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Жабык субттрлр"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Көрсөтүү режими"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Күйүк"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Өчүк"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Мульти-аудио"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Дагы канлдрд алуу"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Жөндөөлөр"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Булак"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Алмаштыруу"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Күйүк"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Өчүк"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Үн"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Негизги"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP терезеси"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Үлгү"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Төмөнкү оң"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Жогорку оң"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Жогорку сол"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Төмөнкү сол"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Тушма-туш"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Өлчөмү"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Чоң"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Кичине"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Киргизүү булагы"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Сыналгы (антенна/кабель)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Программанын маалыматы жок"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Маалымат жок"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Бөгөттөлгөн канал"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Белгисиз тил"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Коштомо жазуулар %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Белгисиз тил"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Коштомо жазуулар"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Өчүк"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Формттоону өзгөчөлшт"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Ал PIN туура эмес. Дагы бир жолу киргизиңиз."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN дал келбей жатат, дагы бир жолу аракет кылыңыз"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Почтаңыздын индексин киргизиңиз."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Түз ободогу каналдар колдонмосу сыналгы каналдары боюнча программалардын толук тизмесин түзүү үчүн почта индексин пайдаланат."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Почтаңыздын индексин киргизиңиз"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Почта индекси жараксыз"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Жөндөөлөр"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Канал тизмесин ыңгайлаштыруу"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Программа жетегиңиз үчүн каналдарды тандаңыз"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Ата-эненин көзөмөлү"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Ачык программа уруксаттамалары"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Ачык программа уруксаттамалары"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Пикир билдирүү"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Версиясы"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Бул каналды көрүү үчүн, Оңго басып, PIN-иңизди киргизиңиз"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Бул программаны көрүү үчүн, Оңго басып, PIN-иңизди киргизиңиз"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"Сыналгынын менюсун ачуу үчүн "<b>"ТАНДОО"</b>" баскычын басыңыз."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Сыналгыга киргизме табылган жок"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Сыналгыга киргизме табылбай жатат"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP колдоого алынбайт"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP аркылуу көрсөтүлө турган эч нерсе киргизилген жок."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Тюнердин түрү ылайыксыз. Тюнердин түрүндөгү сыналгы киргизмеси үчүн Жандуу каналдар колдонмосун ишке киргизиңиз."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Жөндөлбөй калды"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Бул ишти аткара турган бир дагы колдонмо табылган жок."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Сактоо"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Бир жолку жаздыруулар жогорку артыкчылыкка ээ болот"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Баш тартуу"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Жокко чыгаруу"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Унутуу"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Токтотуу"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Жаздыруу графигин көрүү"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Жалгыз ушул программа"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Анын ордуна бул жаздырылсын"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Бул жаздыруу жокко чыгарылсын"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Азыр көрүңүз"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Жаздырылган көрсөтүүлөрдү өчүрүү"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Жаздырууга болот"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Пландаштырылган жаздыруу"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Жаздырууда дал келбестик бар"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Жаздырууда"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Жаздырылбай калды"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Ырааттамаларды жаздырууну түзүү үчүн программаларды окуу"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Программалар окулууда"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Акыркы жаздырууларды көрүңүз"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> жаздырылып бүтпөй калды."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> жана <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> жаздырылып бүтпөй калды."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> жана <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> жаздырылып бүтпөй калды."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Сактагычта орун жетишсиз болгондуктан <xliff:g id="PROGRAMNAME">%1$s</xliff:g> жаздырылып бүтпөй калды."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Сактагычта орун жетишсиз болгондуктан <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> жана <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> жаздырылып бүтпөй калды."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Сактагычта орун жетишсиз болгондуктан <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> жана <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> жаздырылып бүтпөй калды."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Программалар окулууда"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR көбүрөөк орунду талап кылат"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Сиз DVR менен программаларды жаздыра аласыз. Бирок, DVR\'ды иштетүү үчүн түзмөгүңүздө бош орун калбай калды. Көлөмү <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>Гб же андан ашык болгон тышкы драйверге туташыңыз да, аны түзмөктүн сактагычы катары жөндөп алыңыз."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Сактагычта орун жетишсиз"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Сактагычта орун жетишсиз болгондуктан, бул көрсөтүү жаздырылбайт. Мурда жаздырылган көрсөтүүлөрдү өчүрүп көрүңүз."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Сактагыч жок болуп жатат"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR колдонгон сактагычтын айрым бөлүмдөрү жок болуп жатат. DVR\'ды кайра иштетүү үчүн колдонулган тышкы драйверди туташтырыңыз. Же болбосо, жеткиликсиз сактагыч унутулсун дегенди тандасаңыз болот."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Сактагыч унутулсунбу?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Бардык жаздырылган мазмун жана графиктериңиз жоголот."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Жаздыруу токтотулсунбу?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Тартылган мазмун сакталып калат."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Убакыты бул программаныкына дал келип калгандыктан <xliff:g id="PROGRAMNAME">%1$s</xliff:g> жаздыруусу токтотулат. Жаздырылган мазмун сакталып калат."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Пландаштырылган жаздыруу, бирок бир убакытка коюлуп калган"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Жаздыруу башталды, бирок башка программа менен дал келип калган"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> жаздырылат."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Ушул эле программа буга чейин <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> жаздыруу графигине кошулган."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Буга чейин жаздырылган"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Бул программа буга чейин жазылган. Ал DVR китепканасында жеткиликтүү."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Сериалдын жаздыруусу пландаштырылды"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> жолу жаздыруу пландаштырылган.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жолу жаздыруу пландаштырылган.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> жолу жаздыруу пландаштырылган. Убакыттары дал келип калгандыктан, алардын <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> сериясы жаздырылбайт.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жолу жаздыруу пландаштырылган. Убакыты дал келип калгандыктан, ал жаздырылбайт.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> жолу жаздыруу пландаштырылган. Убакыттары дал келип калгандыктан, бул сериалдын <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> сериясы жана башка сериал жаздырылбайт.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жолу жаздыруу пландаштырылган. Убакыттары дал келип калгандыктан, бул сериалдын <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> сериясы жана башка сериал жаздырылбайт.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> жолу жаздыруу пландаштырылган. Убакыттары дал келип калгандыктан, башка сериалдын 1 сериясы жаздырылбайт.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жолу жаздыруу пландаштырылган. Убакыттары дал келип калгандыктан, башка сериалдын 1 сериясы жаздырылбайт.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> жолу жаздыруу пландаштырылган. Убакыттары дал келип калгандыктан, башка сериалдын <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> сериясы жаздырылбайт.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> сериалын <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> жолу жаздыруу пландаштырылган. Убакыттары дал келип калгандыктан, башка сериалдын <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> сериясы жаздырылбайт.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Жаздырылган программа табылган жок."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Окшош жаздыруулар"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Программанын сүрөттөлүшү жок)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Сериал тартуу токтотулсунбу?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Тартылган сериялар DVR китепканасында сакталып калат."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Токтотуу"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Азыр эч кандай серия көрсөтүлбөй турат"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Учурда бир да эпизод жок.\nАлар жеткиликтүү болоору менен жаздырылат."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d мүнөт)</item>
diff --git a/res/values-lo-rLA-v23/strings.xml b/res/values-lo-v23/strings.xml
index 53804594..53804594 100644
--- a/res/values-lo-rLA-v23/strings.xml
+++ b/res/values-lo-v23/strings.xml
diff --git a/res/values-lo-rLA/arrays.xml b/res/values-lo/arrays.xml
index 5e1c1e0c..5e1c1e0c 100644
--- a/res/values-lo-rLA/arrays.xml
+++ b/res/values-lo/arrays.xml
diff --git a/res/values-lo-rLA/rating_system_strings.xml b/res/values-lo/rating_system_strings.xml
index 534b6a89..534b6a89 100644
--- a/res/values-lo-rLA/rating_system_strings.xml
+++ b/res/values-lo/rating_system_strings.xml
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo/strings.xml
index 176de1f7..05aba1ce 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"​ໂມ​ໂນ"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"ສະ​ເຕ​ຣິ​ໂອ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"ຄວບ​ຄຸມ​ການ​ຫຼິ້ນ"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"​ຊ່ອງ"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"ຊ່ອງ​ບໍ່ດົນ​ມານີ້"</string>
<string name="menu_title_options" msgid="7184594626814914022">"ໂຕເລືອກ​ໂທລະພາບ"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"​ຕົວ​ເລືອກ PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"ຫຼິ້ນ​ການ​ຄວບ​ຄຸມ​ບໍ່​ມີ​ໃຫ້​ສຳ​ລັບ​ຊ່ອງ​ນີ້"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"ຫຼິ້ນ​ ຫລື​ຢຸດ​ຊົ່ວ​ຄາວ"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"ເລື່ອນ​ໄປ​ໜ້າ"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"ຄຳ​ບັນຍາຍ​ແບບ​ປິດ"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"ໂໝດ​ການ​ສະແດງຜົນ"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"​ເປີດ"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"ປິດ"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"ຫຼາຍສຽງ"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"ເອົາຊ່ອງເພີ່ມເຕີມ"</string>
<string name="options_item_settings" msgid="7623205838542400074">"ການ​ຕັ້ງ​ຄ່າ"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"ທີ່​ມາ"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"ສະຫຼັບ"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"​ເປີດ"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"ປິດ"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ສຽງ"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"ຫຼັກ"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"ໜ້າ​ຕ່າງ PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"ຮູບ​ແບບ"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"ເບື້ອງ​ຂວາ​ທາງ​ລຸ່ມ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ເບື້ອງ​ຂວາ​ດ້ານ​ເທິງ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ເບື້ອງ​ຊ້າຍ​ດ້ານ​ເທິງ"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"ເບື້ອງ​ຊ້າຍທາງ​ລຸ່ມ"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"ເທື່ອ​ລະ​ດ້ານ"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"ຂະໜາດ"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"ໃຫຍ່"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"ນ້ອຍ"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"​ແຫຼ່ງ​ສັນ​ຍານ"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (ເສົາ​ສັນ​ຍານ/ສາຍ​ເຄ​ເບິນ)"</string>
<string name="no_program_information" msgid="1049844207745145132">"ບໍ່​ມີ​ຂໍ້​ມູນ​ລາຍ​ການ"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"ບໍ່ມີຂໍ້ມູນ"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"ຊ່ອງ​ທີ່​ຖືກບ​ລັອກ"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"ພາ​ສາ​ບໍ່​ຮູ້​ຈັກ"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"ຄຳບັນຍາຍ %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"ພາ​ສາ​ບໍ່​ຮູ້​ຈັກ"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"ຄຳ​ບັນຍາຍ​ແບບ​ປິດ"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"ປິດ"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"ປັບແຕ່ງການຈັດຮູບແບບ"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"ລະຫັດ PIN ນັ້ນບໍ່​ຖືກ​ຕ້ອງ, ກະ​ລຸ​ນາລອງ​ໃຫມ່​ອີກ​ຄັ້ງ."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"ລະ​ຫັດ PIN ບໍ່​ກົງ​ກັນ, ກະ​ລຸ​ນາ​ລອງ​ໃໝ່."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"ລະບຸລະຫັດ ZIP ຂອງທ່ານ."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"ແອັບ Live TV ຈະໃຊ້ລະຫັດ ZIP ເພື່ອສະໜອງຄຳແນະນຳລາຍການທີ່ສົມບູນໃຫ້ກັບຊ່ອງໂທລະທັດຕ່າງໆ."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"ໃສ່ລະຫັດ ZIP ຂອງທ່ານ"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"ລະຫັດ ZIP ບໍ່ຖືກຕ້ອງ"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"ການ​ຕັ້ງ​ຄ່າ"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"ປັບແຕ່ງ​ລາຍ​ຊື່​ຊ່ອງ"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"ເລືອກ​ຊ່ອງ​ສຳລັບການ​ແນະນຳລາຍການ​ຂອງ​ທ່ານ"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"ການ​ຄວບຄຸມ​ຂອງພໍ່ແມ່"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"​ໃບ​ອະ​ນຸ​ຍາດ​ Open source"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"​ໃບ​ອະ​ນຸ​ຍາດ​ແຫຼ່ງ​ເປີດ"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"ສົ່ງຄຳຕິຊົມ"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"ເວີຊັນ"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"​ເພື່ອ​ເບິ່ງ​ຊ່ອງ​ນີ້, ກົດ​ປຸ່ມ ຂວາ ແລະ ປ້ອນ​ລະ​ຫັດ PIN ຂອງ​ທ່ານ"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"​ເພື່ອ​ເບິ່ງ​ລາຍ​ການ​ນີ້, ໃຫ້ກົດ​ປຸ່ມ ຂວາ ແລະ ປ້ອນ​ລະ​ຫັດ PIN ຂອງ​ທ່ານ"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"ກົດ SELECT"</b>" ເພື່ອ​ເຂົ້າ​ຫາ​ເມ​ນູ TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"ບໍ່​ພົບການ​ປ້ອນ​ເຂົ້າ TV"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"ບໍ່​ສາ​ມາດ​ຊອກ​ຫາການ​ປ້ອນ​ເຂົ້າ TV ​ໄດ້"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"ບໍ່​ຮອງ​ຮັບ PIP"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"ບໍ່ມີການຮັບສັນຍານທີ່ສາມາດສະແດງໄດ້ດ້ວຍຮູບພາບຊ້ອນຮູບພາບ PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ປະ​ເພດ​ເຄື່ອງ​ຈູນ​ບໍ່​ເໝາະ​ສົມ; ກະ​ລຸ​ນາ​ເປີດ​ໃຊ້​ແອັບ​ຊ່ອງ​ສົດ​ສຳ​ລັບ​ການ​ປ້ອນ​ເຂົ້າ TV ປະ​ເພດ​ເຄື່ອງ​ຈູນ."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ການ​ປັບ​ຊ່ອງ​ລົ້ມ​ເຫລວ"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"ບໍ່ພົບແອັບຯທີ່ໃຊ້ເພື່ອດຳເນີນການ."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"ບັນທຶກ"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"ການບັນທຶກຕາມເວລາມີຄວາມສຳຄັນສູງສຸດ"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"​ຍົກເລີກ"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"ຍົກເລີກ"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"ລືມ"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"ຢຸດ"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"ເບິ່ງຕາຕາລາງການບັນທຶກ"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"ນີ້ເປັນລາຍການດ່ຽວ"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"ບັນທຶກອັນນີ້ແທນ"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"ຍົກເລີກການບັນທຶກນີ້"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"ເບິ່ງດຽວນີ້"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"ລຶບການບັນທຶກອອກ…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"ບັນທຶກໄດ້"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"ຕັ້ງເວລາບັນທຶກແລ້ວ"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"ເກີດຄວາມຂັດແຍ່ງໃນການບັນທຶກ"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"ກຳລັງບັນທຶກ"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"ບັນທຶກບໍ່ສຳເລັດ"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"ກຳລັງອ່ານເນື້ອຫາລາຍການເພື່ອຕັ້ງເວລາບັນທຶກ"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"ກຳລັງອ່ານລາຍການ"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"ເບິ່ງການບັນທຶກຫຼ້າສຸດ"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"ບັນທຶກ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ບໍ່ສົມບູນ."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"ບັນທຶກ <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ແລະ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ບໍ່ສົມບູນ."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"ບັນທຶກ <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ແລະ <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ບໍ່ສົມບູນ."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"ບັນທຶກ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ບໍ່ສຳເລັດເນື່ອງຈາກບ່ອນຈັດເກັບຂໍ້ມູນບໍ່ພຽງພໍ."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"ບັນທຶກ <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ແລະ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ບໍ່ສຳເລັດເນື່ອງຈາກບ່ອນຈັດເກັບຂໍ້ມູນບໍ່ພຽງພໍ."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"ບັນທຶກ <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ແລະ <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ບໍ່ສຳເລັດເນື່ອງຈາກບ່ອນຈັດເກັບຂໍ້ມູນບໍ່ພຽງພໍ."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"ກຳລັງອ່ານລາຍການ"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR ຕ້ອງໃຊ້ບ່ອນຈັດເກັບຂໍ້ມູນເພີ່ມເຕີມ"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"ທ່ານຈະສາມາດບັນທຶກລາຍການດ້ວຍ DVR ໄດ້. ຢ່າງໃດກໍຕາມ, ອຸປະກອນຂອງທ່ານບໍ່ມີບ່ອນຈັດເກັບຂໍ້ມູນພຽງພໍໃຫ້ DVR ເຮັດວຽກໄດ້. ກະລຸນາເຊື່ອມຕໍ່ຫາໄດຣຟ໌ພາຍນອກທີ່ມີຂະໜາດ <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB ຫຼືໃຫຍ່ກວ່າ ແລ້ວເຮັດຕາມຂັ້ນຕອນໃນການໃຊ້ມັນເປັນອຸປະກອນຈັດເກັບຂໍ້ມູນ."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"ບ່ອນຈັດເກັບຂໍ້ມູນບໍ່ພຽງພໍ"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"ຈະບໍ່ບັນທຶກລາຍການນີ້ເນື່ອງຈາກມີບ່ອນຈັດເກັບຂໍ້ມູນບໍ່ພຽງພໍ. ໃຫ້ລອງລຶບການບັນທຶກບາງອັນອອກກ່ອນ."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"ບໍ່ພົບບ່ອນຈັດເກັບຂໍ້ມູນ"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"ບໍ່ພົບບ່ອນຈັດເກັບຂໍ້ມູນບາງອັນທີ່ໃຊ້ໂດຍ DVR. ກະລຸນາເຊື່ອມຕໍ່ໄດຣຟ໌ພາຍນອກທີ່ທ່ານໃຊ້ກ່ອນຈະເປີດໃຊ້ DVR ຄືນໃໝ່. ຫຼືອີກວິທີໜຶ່ງ, ທ່ານສາມາດເລືອກໃຫ້ລືມບ່ອນຈັດເກັບຂໍ້ມູນດັ່ງກ່າວໄດ້ຫາກມັນບໍ່ມີໃຫ້ໃຊ້ອີກຕໍ່ໄປແລ້ວ."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"ລືມການຈັດເກັບຂໍ້ມູນບໍ?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"ທ່ານຈະສູນເສຍເນື້ອຫາ ແລະ ການຕັ້ງເວລາທັງໝົດທີ່ທ່ານບັນທຶກໄວ້ແລ້ວ."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"ຢຸດການບັນທຶກໄວ້ບໍ?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ເນື້ອຫາທີ່ອັດໄວ້ແລ້ວຈະຖືກບັຍທຶກໄວ້."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"ການບັນທຶກ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ຈະຖືກຢຸດໄວ້ເພາະມັນຂັດແຍ່ງກັບລາຍການນີ້. ເນື້ອຫາທີ່ບັນທຶກໄປແລ້ວຈະຖືກຈັດເກັບໄວ້."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ຕັ້ງເວລາການບັນທຶກແລ້ວແຕ່ມີຂໍ້ຂັດແຍ່ງເກີດຂຶ້ນ"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ເລີ່ມການບັນທຶກແລ້ວແຕ່ມີຂໍ້ຂັດແຍ່ງ"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ຈະຖືກບັນທຶກໄວ້."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"ລາຍການດຽວກັນນີ້ໄດ້ຕັ້ງເວລາໃຫ້ບັນທຶກໄວ້ແລ້ວເວລາ <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"ບັນທຶກໄປກ່ອນແລ້ວ"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"ລາຍການນີ້ຖືກບັນທຶກໄປກ່ອນແລ້ວ. ມັນສາມາດເບິ່ງໄດ້ໃນຫ້ອງສະໝຸດ DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"ຕັ້ງເວລາບັນທຶກຊີຣີແລ້ວ"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ແລ້ວ.</item>
- <item quantity="one">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ແລ້ວ.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ແລ້ວ. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> ລາຍການຈະບໍ່ຖືກບັນທຶກເນື່ອງຈາກມີຂໍ້ຂັດແຍ່ງ.</item>
- <item quantity="one">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ແລ້ວ. ມັນຈະບໍ່ຖືກບັນທຶກເນື່ອງຈາກມີຂໍ້ຂັດແຍ່ງ.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ແລ້ວ. ຈະບໍ່ບັນທຶກເອັບພິໂສດ <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ຕອນຂອງຊີຣີອື່ນເນື່ອງຈາກເວລາຂັດແຍ່ງກັນ.</item>
- <item quantity="one">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ແລ້ວ. ຈະບໍ່ບັນທຶກເອັບພິໂສດ <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ຕອນຂອງຊີຣີອື່ນເນື່ອງຈາກເວລາຂັດແຍ່ງກັນ.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ແລ້ວ. ຈະບໍ່ບັນທຶກເອັບພິໂສດ 1 ຕອນຂອງຊີຣີອື່ນເນື່ອງຈາກເວລາຂັດແຍ່ງກັນ.</item>
- <item quantity="one">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ແລ້ວ. ຈະບໍ່ບັນທຶກເອັບພິໂສດ 1 ຕອນຂອງຊີຣີອື່ນເນື່ອງຈາກເວລາຂັດແຍ່ງກັນ.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ແລ້ວ. ຈະບໍ່ບັນທຶກເອັບພິໂສດ <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ຕອນຂອງຊີຣີອື່ນເນື່ອງຈາກເວລາຂັດແຍ່ງກັນ.</item>
- <item quantity="one">ຕັ້ງເວລາບັນທຶກ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ລາຍການສຳລັບ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ແລ້ວ. ຈະບໍ່ບັນທຶກເອັບພິໂສດ <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ຕອນຂອງຊີຣີອື່ນເນື່ອງຈາກເວລາຂັດແຍ່ງກັນ.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"ບໍ່ພົບໂປຣແກຣມທີ່ບັນທຶໄວ້."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"ການບັນທຶກທີ່ກ່ຽວຂ້ອງ"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(ບໍ່ມີຄຳອະທິບາຍລາຍການ)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"ຢຸດການບັນທຶກຊີຣີບໍ່?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"ເອັບພິໂສດທີ່ບັນທຶກໄວ້ແລ້ວຈະຍັງຄົງສາມາດເບິ່ງໄດ້ໃນຫ້ອງສະໝຸດ DVR ຢູ່."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"ຢຸດ"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ບໍ່ມີເອັບພິໂສດໃດທີ່ກຳລັງສາຍຢູ່ໃນຕອນນີ້."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"ຍັງບໍ່ມີເອບພິໂສດທີ່ສາມາດເບິ່ງໄດ້ເທື່ອ.\nພວກມັນຈະຖືກບັນທຶອຶກເມື່ອມີການສາຍ."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d ນາທີ)</item>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index acbe31cb..88afdec0 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"monofon."</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereof."</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Leidimo valdikliai"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanalai"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Naujausi kanal."</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV parinktys"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP parinktys"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Leidimo valdikliai negalimi šiame kanale"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Leisti arba pristabdyti"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Sukti pirmyn"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Subtitrai"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Rodymo režimas"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Įjungta"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Išjungta"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Keli garso įr."</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Gauti daug. kan."</string>
<string name="options_item_settings" msgid="7623205838542400074">"Nustatymai"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Šaltinis"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Sukeisti"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Įjungta"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Išjungta"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Garsas"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Pagrindinis"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP langas"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Išdėstymas"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Apač. dešinėje"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Virš. dešinėje"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Viršuje kairėje"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Apač. kairėje"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Šalia"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Dydis"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Didelis"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Mažas"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Įvesties šaltinis"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena / kabelis)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Nėra informacijos apie programą"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Informacijos nėra."</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Užblokuotas kanalas"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Nežinoma kalba"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Subtitrai %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Nežinoma kalba"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Subtitrai"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Išjungti"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Tinkinti formatavimą"</string>
@@ -120,10 +139,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Tas PIN kodas buvo netinkamas. Bandykite dar kartą."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Bandykite dar kartą, PIN kodas neatitinka"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Įveskite pašto kodą."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Tiesioginių kanalų programa naudos pašto kodą, kad galėtų pateikti išsamų TV kanalų programų vadovą."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Įveskite pašto kodą"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Netinkamas pašto kodas"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Nustatymai"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Tinkinti kanalų sąrašą"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Pasirinkite programų vadovo kanalus"</string>
@@ -132,7 +147,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Tėvų kontrolė"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Atvirojo šaltinio licencijos"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Atvirojo šaltinio licencijos"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Siųsti atsiliepimą"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versija"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Jei norite žiūrėti šį kanalą, paspauskite „Tinkamas“ ir įveskite PIN kodą"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Jei norite žiūrėti šią programą, paspauskite „Tinkama“ ir įveskite PIN kodą"</string>
@@ -175,6 +189,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Paspauskite PASIRINKTI,"</b>" kad pasiektumėte TV meniu."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nerasta jokių TV įvesčių"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Nepavyksta rasti TV įvesties"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP nepalaikoma"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Nėra galimos įvesties, kurią galima rodyti kartu su PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Netinkamas derintuvo tipas. Paleiskite derintuvo tipo TV įvestį, skirtą programai „Live TV“."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Derinimas nepavyko"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Nerasta jokių programų šiam veiksmui apdoroti."</string>
@@ -263,6 +279,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Išsaugoti"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Vienkartinis įrašymo veiksmas turi didžiausią prioritetą"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Atšaukti"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Atšaukti"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Pamiršti"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Sustabdyti"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Žr. įrašymo tvarkaraštį"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Ši viena programa"</string>
@@ -272,30 +290,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Vietoj tos įrašyti šią"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Atšaukti šį įrašymą"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Žiūrėti dabar"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Ištrinti įrašus…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Galima įrašyti"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Įrašymas suplanuotas"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Įrašo nesuderinamumas"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Įrašoma"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Įrašyti nepavyko"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Nuskaitomos programos, kad būtų sukurti įrašymo tvarkaraščiai"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Nuskaitomos programos"</string>
- <!-- no translation found for dvr_error_insufficient_space_action_view_recent_recordings (137918938589787623) -->
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Nuskaitomos programos"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
<skip />
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"„<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ įrašymo procesas nebaigtas."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"„<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>“ ir „<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>“ įrašymo procesas nebaigtas."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"„<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>“, „<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>“ ir „<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>“ įrašymo procesas nebaigtas."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"„<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ įrašymo procesas nebaigtas, nes nepakanka saugyklos vietos."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"„<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>“ ir „<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>“ įrašymo procesas nebaigtas, nes nepakanka saugyklos vietos."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"„<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>“, „<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>“ ir „<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>“ įrašymo procesas nebaigtas, nes nepakanka saugyklos vietos."</string>
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Norint naudoti DVR reikia daugiau saugyklos vietos"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Naudodami DVR galėsite įrašyti programas. Tačiau dabar įrenginyje nepakanka saugyklos vietos, kad DVR veiktų. Prijunkite išorinį diską, kuris yra <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB arba didesnis, ir atlikite veiksmus, kad formatuotumėte jį kaip įrenginio saugyklą."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Trūksta saugyklos vietos"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Ši programa nebus įrašyta, nes nepakanka saugyklos vietos. Pabandykite ištrinti kai kuriuos esamus įrašus."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Nėra saugyklos"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Nėra kai kurių saugyklų, kurias naudoja DVR. Prijunkite anksčiau naudotą išorinį diską, kad iš naujo įgalintumėte DVR. Taip pat galite pasirinkti pamiršti saugyklą, jei ji nebepasiekiama."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Pamiršti saugyklą?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Visas įrašytas turinys ir tvarkaraščiai bus prarasti."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Sustabdyti įrašymą?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Įrašytas turinys bus išsaugotas."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"„<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ įrašas bus sustabdytas dėl prieštaravimų su šia programa. Įrašytas turinys bus išsaugotas."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Įrašymas suplanuotas, bet yra neatitikimų"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Įrašymo procesas pradėtas, bet yra neatitikimų"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Programa „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ bus įrašyta."</string>
@@ -315,37 +328,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Ta pati programa jau suplanuota įrašyti <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Jau įrašyta"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Ši programa jau buvo įrašyta. Ji pasiekiama DVR bibliotekoje."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Suplanuotas serijos įrašas"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one">Suplanuotas <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašas.</item>
- <item quantity="few">Suplanuoti <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašai.</item>
- <item quantity="many">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašo.</item>
- <item quantity="other">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašų.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one">Suplanuotas <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašas. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> iš jų nebus įraš. dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="few">Suplanuoti <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašai. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> iš jų nebus įraš. dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="many">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašo. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> iš jų nebus įraš. dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="other">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašų. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> iš jų nebus įraš. dėl nesuderinamo tvarkaraščio.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one">Suplanuotas <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ įrašas. Šio ir kitų serialų serijos (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) nebus įrašytos dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="few">Suplanuoti <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ įrašai. Šio ir kitų serialų serijos (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) nebus įrašytos dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="many">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ įrašo. Šio ir kitų serialų serijos (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) nebus įrašytos dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="other">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ įrašų. Šio ir kitų serialų serijos (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) nebus įrašytos dėl nesuderinamo tvarkaraščio.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one">Suplanuotas <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašas. 1 kitų serialų serija nebus įrašyta dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="few">Suplanuoti <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašai. 1 kitų serialų serija nebus įrašyta dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="many">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašo. 1 kitų serialų serija nebus įrašyta dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="other">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> „<xliff:g id="SERIESNAME_3">%2$s</xliff:g>“ įrašų. 1 kitų serialų serija nebus įrašyta dėl nesuderinamo tvarkaraščio.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one">Suplanuotas <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ įrašas. Kitų serialų serijos (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) nebus įrašytos dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="few">Suplanuoti <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ įrašai. Kitų serialų serijos (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) nebus įrašytos dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="many">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ įrašo. Kitų serialų serijos (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) nebus įrašytos dėl nesuderinamo tvarkaraščio.</item>
- <item quantity="other">Suplanuota <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> „<xliff:g id="SERIESNAME_4">%2$s</xliff:g>“ įrašų. Kitų serialų serijos (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) nebus įrašytos dėl nesuderinamo tvarkaraščio.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Įrašyta programa nerasta."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Susiję įrašai"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Nėra laidos aprašo)"</string>
@@ -372,8 +362,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Sustabdyti serijos įrašymą?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Įrašytos serijos bus pasiekiamos DVR bibliotekoje."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Sustabdyti"</string>
- <!-- no translation found for dvr_series_schedules_stopped_empty_state (1464244804664395151) -->
- <skip />
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Nėra jokių serijų.\nSerijos bus įrašytos, kai jų bus."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d minutė)</item>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 39a5a380..00021bca 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Atskaņošanas vadīklas"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanāli"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Nesenie kanāli"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV iespējas"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP opcijas"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Šim kanālam nav pieejamas atskaņošanas vadīklas."</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Atskaņot vai pauzēt"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Pārtīt uz priekšu"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Slēgtie paraksti"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Attēla režīms"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Ieslēgts"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Izslēgts"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multiaudio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Vairāk kanālu"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Iestatījumi"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Avots"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Mainīt"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Ieslēgts"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Izslēgts"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Skaņa"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Galvenais"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP logs"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Izkārtojums"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Apakšā pa labi"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Augšā pa labi"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Augšā pa kreisi"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Apakšā pa kreisi"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Līdzās"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Izmēri"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Liels"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Mazs"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Ievades avots"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/kabelis)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Nav informācijas par programmu"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Nav informācijas"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Bloķēts kanāls"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Nezināma valoda"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Slēgtie paraksti %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Nezināma valoda"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Slēgtie paraksti"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Izslēgti"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Pielāgot formatēšanu"</string>
@@ -118,10 +137,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN kods nav pareizs. Mēģiniet vēlreiz."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Neatbilstošs PIN. Mēģiniet vēlreiz."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Pasta indeksa ievadīšana"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Lietotnē Live Channels pasta indekss tiks izmantots, lai nodrošinātu visu TV kanālu programmu ceļvedi."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Ievadiet pasta indeksu"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Nederīgs pasta indekss"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Iestatījumi"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Pielāgot kanālu sarakstu"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Izvēlieties kanālus programmu ceļvedim."</string>
@@ -130,7 +145,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Vecāku kontrole"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Atklātā pirmkoda licences"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Atklātā pirmkoda licences"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Sūtīt atsauksmes"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versija"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Lai skatītos šo kanālu, nospiediet pa labi vērsto bultiņu un ievadiet PIN kodu."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Lai skatītos šo programmu, nospiediet pa labi vērsto bultiņu un ievadiet PIN kodu."</string>
@@ -171,6 +185,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Nospiediet ATLASĪT"</b>", lai piekļūtu TV izvēlnei."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nav atrasta neviena TV ieeja."</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Nevar atrast TV ieeju."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Funkcija PIP netiek atbalstīta."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Nav ievades, ko parādīt, izmantojot PIP."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Kanālu meklētāja veids nav piemērots. Lūdzu, palaidiet lietotni “Tiešraides kanāli” kanālu meklētāja veida TV ievadei."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Kanālu meklēšana neizdevās."</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Netika atrasta neviena lietotne šīs darbības veikšanai."</string>
@@ -253,6 +269,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Saglabāt"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Vienreizējiem ierakstiem ir visaugstākā prioritāte"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Atcelt"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Atcelt"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Aizmirst"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Apturēt"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Skatīt ierakstīšanas grafiku"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Šī viena programma"</string>
@@ -262,29 +280,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Tā vietā ierakstīt tālāk norādīto"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Atcelt šo ierakstīšanu"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Skatīties tūlīt"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Dzēst ierakstus…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Var ierakstīt"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Ierakstīšana ir ieplānota"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Ierakstīšanas konflikts"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Ierakstīšana"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Neizdevās ierakstīt"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Tiek lasītas programmas, lai izveidotu ierakstīšanas grafikus."</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Tiek lasītas programmas"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Skatīt nesenos ierakstus"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"“<xliff:g id="PROGRAMNAME">%1$s</xliff:g>” ierakstīšana netika pabeigta."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"“<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>” un “<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>” ierakstīšana netika pabeigta."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"“<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>”, “<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>” un “<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>” ierakstīšana netika pabeigta."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"“<xliff:g id="PROGRAMNAME">%1$s</xliff:g>” ierakstīšana netika pabeigta, jo krātuvē nepietiek vietas."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"“<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>” un “<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>” ierakstīšana netika pabeigta, jo krātuvē nepietiek vietas."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"“<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>”, “<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>” un “<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>” ierakstīšana netika pabeigta, jo krātuvē nepietiek vietas."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Tiek lasītas programmas"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Ciparvideo ierakstītājam nepieciešama lielāka krātuve"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Jūs varēsiet ierakstīt programmas, izmantojot ciparvideo ierakstītāju. Taču pašlaik jūsu ierīces krātuvē nav pietiekami daudz vietas, lai tas darbotos. Lūdzu, pievienojiet vismaz <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB lielu ārējo disku un izpildiet sniegtos norādījumus, lai formatētu to kā ierīces krātuvi."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Krātuvē nepietiek vietas"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Šī programma netiks ierakstīta, jo krātuvē nepietiek vietas. Izdzēsiet dažus esošos ierakstus."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Trūkst krātuves"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Trūkst ciparvideo ierakstītāja izmantotās krātuves. Lūdzu, pievienojiet ārējo disku, ko izmantojāt iepriekš ciparvideo ierakstītāja atkārtotai iespējošanai. Varat arī izvēlēties aizmirst krātuvi, ja tā vairs nav pieejama."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Vai aizmirst krātuvi?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Viss jūsu ierakstītais saturs un grafiki tiks zaudēti."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Vai apturēt ierakstīšanu?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Ierakstītais saturs tiks saglabāts."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Seriāla “<xliff:g id="PROGRAMNAME">%1$s</xliff:g>” ierakstīšana tiks apturēta, jo ir konflikts ar šo programmu. Ierakstītais saturs tiks saglabāts."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Ierakstīšana ir ieplānota, taču ir konflikti"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Ierakstīšana tika sākta, taču ir konflikti"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Programma <xliff:g id="PROGRAMNAME">%1$s</xliff:g> tiks ierakstīta."</string>
@@ -300,32 +314,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Šo pārraidi jau ir plānots ierakstīt plkst. <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Jau tika ierakstīta"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Šī pārraide jau ir ierakstīta. Tā ir pieejama DVR bibliotēkā."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Ir ieplānota seriāla ierakstīšana"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="zero">Seriālam <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ieraksti.</item>
- <item quantity="one">Seriālam <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ir ieplānots <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ieraksts.</item>
- <item quantity="other">Seriālam <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ieraksti.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="zero">Seriālam <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ieraksti. Konfliktu dēļ netiks ierakstīts(-i) <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> no tiem.</item>
- <item quantity="one">Seriālam <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ir ieplānots <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ieraksts. Konfliktu dēļ netiks ierakstīts(-i) <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> no tiem.</item>
- <item quantity="other">Seriālam <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ieraksti. Konfliktu dēļ netiks ierakstīts(-i) <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> no tiem.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="zero">Seriālam <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ieraksti. Konfliktu dēļ netiks ierakstītas <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> šī un cita(-u) seriāla(-u) sērijas.</item>
- <item quantity="one">Seriālam <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ir ieplānots <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ieraksts. Konfliktu dēļ netiks ierakstītas <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> šī un cita(-u) seriāla(-u) sērijas.</item>
- <item quantity="other">Seriālam <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ieraksti. Konfliktu dēļ netiks ierakstītas <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> šī un cita(-u) seriāla(-u) sērijas.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="zero">Seriālam <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ieraksti. Konfliktu dēļ netiks ierakstīta 1 cita seriāla sērija.</item>
- <item quantity="one">Seriālam <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ir ieplānots <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ieraksts. Konfliktu dēļ netiks ierakstīta 1 cita seriāla sērija.</item>
- <item quantity="other">Seriālam <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ieraksti. Konfliktu dēļ netiks ierakstīta 1 cita seriāla sērija.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="zero">Seriālam <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ieraksti. Konfliktu dēļ netiks ierakstītas <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> cita seriāla sērijas.</item>
- <item quantity="one">Seriālam <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ir ieplānots <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ieraksts. Konfliktu dēļ netiks ierakstītas <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> cita seriāla sērijas.</item>
- <item quantity="other">Seriālam <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ir ieplānoti <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ieraksti. Konfliktu dēļ netiks ierakstītas <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> cita seriāla sērijas.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Ierakstītā programma netika atrasta."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Saistītie ieraksti"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Nav programmas apraksta)"</string>
@@ -350,7 +346,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Vai apturēt sērijas ierakstīšanu?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Ierakstītās sērijas būs pieejamas DVR bibliotēkā."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Apturēt"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Šobrīd nav iznākusi neviena sērija."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Nav pieejama neviena sērija.\nTās tiks ierakstītas, kad būs pieejamas."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="zero">(%1$d minūtes)</item>
diff --git a/res/values-mk-rMK-v23/strings.xml b/res/values-mk-v23/strings.xml
index 4fd7f740..4fd7f740 100644
--- a/res/values-mk-rMK-v23/strings.xml
+++ b/res/values-mk-v23/strings.xml
diff --git a/res/values-mk-rMK/arrays.xml b/res/values-mk/arrays.xml
index b1ae7467..b1ae7467 100644
--- a/res/values-mk-rMK/arrays.xml
+++ b/res/values-mk/arrays.xml
diff --git a/res/values-mk-rMK/rating_system_strings.xml b/res/values-mk/rating_system_strings.xml
index da9a40b3..da9a40b3 100644
--- a/res/values-mk-rMK/rating_system_strings.xml
+++ b/res/values-mk/rating_system_strings.xml
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk/strings.xml
index 9c3cfbc9..566377a8 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"моно"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"стерео"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Контроли за игри"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Канали"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Последни канали"</string>
<string name="menu_title_options" msgid="7184594626814914022">"ТВ опции"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Опции за ПИП"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Контролите за репродуцирање се недостапни за овој канал"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Пуштање или паузирање"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Брзо премотување напред"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Затворени титли"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Реж. на прикаж."</string>
<string name="options_item_pip" msgid="3951350386626879645">"ПИП"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Вклучено"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Исклучено"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Мултиаудио"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Добиј уште канали"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Поставки"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Извор"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Замени"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Вклучено"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Исклучено"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Звук"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Главен"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"ПИП прозорец"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Распоред"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Долу десно"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Горе десно"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Горе лево"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Долу лево"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Едно до друго"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Големина"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Голема"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Мала"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Влезен извор"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"ТВ (антена/кабел)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Нема информации за програмата"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Нема информации"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Блокиран канал"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Непознат јазик"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Затворени титлови %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Непознат јазик"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Затворени титли"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Исклучено"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Прилаг. форматирање"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN-кодот е погрешен. Обидете се повторно."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Обидете се повторно, PIN-кодот не се совпаѓа"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Внесете го поштенскиот број."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Апликацијата Live TV ќе го користи поштенскиот број за да обезбеди целосен програмски водич за ТВ-каналите."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Внесете го поштенскиот број"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Неважечки поштенски број"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Поставки"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Приспособи го списокот канали"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Изберете канали за програмскиот водич"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Родителски надзор"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Лиценци за софтвер со отворен код"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Лиценци за отворен код"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Испратете повратни информации"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Верзија"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"За да го гледате овој канал, притиснете Во ред и внесете го вашиот PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"За да ја гледате оваа програма, притиснете Во ред и внесете го вашиот PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Притиснете ИЗБЕРИ"</b>" за да пристапите до ТВ-менито."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Не е пронајден ТВ-влез"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"ТВ-влезот не може да се најде"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"ПИП не е поддржано"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Нема достапен влез што може да се прикаже со ПИП"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Типот приемник не е соодветен. Стартувајте ја апликацијата Live TV за ТВ-влез од типот приемник."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Бирањето не успеа"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Не е пронајдена апликација што ќе се справи со ова дејство."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Зачувај"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Еднократните снимања имаат највисок приоритет"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Откажи"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Откажи"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Заборави"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Сопри"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Прикажи распоред на снимање"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Само оваа програма"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Наместо неа, снимај ја оваа"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Откажете го снимањево"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Гледајте сега"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Избришете ги снимките…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Може да се снима"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Снимањето е закажано"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Конфликт при снимање"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Се снима"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Неуспешно снимање"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Се читаат програми за да се создадат распореди за снимање"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Се читаат програми"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Прегледајте ги последните снимки"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Снимањето на <xliff:g id="PROGRAMNAME">%1$s</xliff:g> е незавршено."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Снимањата на <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> и <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> се незавршени."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Снимањата на <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> и <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> се незавршени."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Снимањето на <xliff:g id="PROGRAMNAME">%1$s</xliff:g> не заврши поради недоволен простор за складирање."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Снимањата <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> и <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> не завршија поради недоволен простор за складирање."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Снимањата <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> и <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> не завршија поради недоволен простор за складирање."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Се читаат програми"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Потребна е поголема меморија за DVR"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Ќе може да снимате програми со DVR. Но во моментов нема доволно простор на вашиот уред за да може DVR да функционира. Поврзете надворешна податочна едница од <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB или повеќе и следете ги чекорите за да ја форматирате како меморија на уредот."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Нема доволно меморија"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Програмава нема да се сними бидејќи нема доволно меморија. Обидете се да избришете постоечки снимки."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Недостасува простор"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Недостасува дел од просторот што го користи DVR. Поврзете го надворешниот диск што го користевте претходно за да овозможите DVR повторно. Во спротивно, може да изберете да се заборави просторот ако веќе не е достапен."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Да се заборави просторот?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Сите ваши снимени содржини и распореди ќе се изгубат."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Да се сопре со снимање?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Снимените содржини ќе се зачуваат."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Снимањето на <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ќе прекине поради конфликти со програмава. Снимената содржина ќе се зачува."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Снимањето е закажано, но постојат конфликти"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Снимањето започна, но постојат конфликти"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ќе се сними."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Истата програма е веќе закажана за снимање во <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Веќе е снимена"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Програмава е веќе снимена. Достапна е во DVR-збирката."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Закажано е снимање серија"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимање е закажано за <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимања се закажани за <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимање е закажано за <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> од нив нема да се снимат поради конфликти.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимања се закажани за <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> од нив нема да се снимат поради конфликти.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимање е закажано за <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизоди од оваа и други серии нема да се снимат поради конфликти.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимања се закажани за <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизоди од оваа и други серии нема да се снимат поради конфликти.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимање е закажано за <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 епизода од други серии нема да се сними поради конфликти.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимања се закажани за <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 епизода од други серии нема да се сними поради конфликти.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимање е закажано за <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизоди од други серии нема да се снимат поради конфликти.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимања се закажани за <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизоди од други серии нема да се снимат поради конфликти.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Снимената програма не е пронајдена."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Поврзани снимки"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Нема опис на програмата)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Да се сопре снимањето на серијата?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Снимените епизоди ќе останат достапни во DVR-збирката."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Сопри"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Не се емитуваат епизоди во моментов."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Не се достапни епизоди.\nЌе се снимат штом ќе бидат достапни."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d минута)</item>
diff --git a/res/values-ml-rIN-v23/strings.xml b/res/values-ml-v23/strings.xml
index 2333cc0f..2333cc0f 100644
--- a/res/values-ml-rIN-v23/strings.xml
+++ b/res/values-ml-v23/strings.xml
diff --git a/res/values-ml-rIN/arrays.xml b/res/values-ml/arrays.xml
index 383837e7..383837e7 100644
--- a/res/values-ml-rIN/arrays.xml
+++ b/res/values-ml/arrays.xml
diff --git a/res/values-ml-rIN/rating_system_strings.xml b/res/values-ml/rating_system_strings.xml
index e17f91f8..e17f91f8 100644
--- a/res/values-ml-rIN/rating_system_strings.xml
+++ b/res/values-ml/rating_system_strings.xml
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml/strings.xml
index 236413a0..e29a8755 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"മോണോ"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"സ്‌റ്റീരിയോ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"പ്ലേ നിയന്ത്രണങ്ങൾ"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"ചാനലുകൾ"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"ഏറ്റവും പുതിയ ചാനലുകൾ"</string>
<string name="menu_title_options" msgid="7184594626814914022">"ടിവി ഓപ്‌ഷനുകൾ"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP ഓ‌പ്‌ഷനുകൾ"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"ഈ ചാനലിന് പ്ലേ നിയന്ത്രണങ്ങൾ ലഭ്യമല്ല"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"പ്ലേ ചെയ്യുക അല്ലെങ്കിൽ താല്‍‌ക്കാലികമായി നിര്‍‌ത്തുക"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"വേഗത്തിലുള്ള കൈമാറൽ"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"അടച്ച അടിക്കുറിപ്പുകൾ"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"ഡിസ്‌പ്ലേ മോഡ്"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"ഓണാണ്"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"ഓഫാണ്"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"മൾട്ടി ഓഡിയോ"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"കൂടുതൽ ചാനൽ സ്വീകരിക്കൂ"</string>
<string name="options_item_settings" msgid="7623205838542400074">"ക്രമീകരണം"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"ഉറവിടം"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"സ്വാപ്പുചെയ്യുക"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"ഓണാണ്"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"ഓഫാണ്"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ശബ്ദം"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"പ്രധാന വിൻഡോ"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP വിൻഡോ"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"ലേ‌ഔട്ട്"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"ചുവടെ വലതുഭാഗത്ത്"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"മുകളില്‍‌ വലതുഭാഗത്ത്"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"മുകളില്‍‌ ഇടതുഭാഗത്ത്"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"ചുവടെ ഇടതുഭാഗത്ത്"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"വശങ്ങളിലായി"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"വലുപ്പം"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"വലുത്"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"ചെറുത്"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"ഇൻപുട്ട് ഉറവിടം"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"ടിവി (ആന്റിന/കേബിൾ)"</string>
<string name="no_program_information" msgid="1049844207745145132">"പ്രോഗ്രാം വിവരമൊന്നുമില്ല"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"വിവരമൊന്നുമില്ല"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"തടഞ്ഞ ചാനൽ"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"അറിയാത്ത ഭാഷ"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"അടച്ച അടിക്കുറിപ്പുകൾ %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"അറിയാത്ത ഭാഷ"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"അടച്ച അടിക്കുറിപ്പുകൾ"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"ഓഫ്"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"ഫോർമാറ്റുചെയ്യൽ ഇഷ്‌ടാനുസൃതമാക്കുക"</string>
@@ -114,10 +133,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"നൽകിയ പിൻ തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"പിൻ യോജിക്കുന്നില്ല, വീണ്ടും ശ്രമിക്കുക"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"നിങ്ങളുടെ തപാൽ കോഡ് നൽകുക."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"ടിവി ചാനലുകൾക്ക് സമ്പൂർണ്ണ പ്രോഗ്രാം ഗൈഡ് നൽകുന്നതിന് തത്സമയ ചാനലുകൾ ആപ്പ്, തപാൽ കോഡ് ഉപയോഗിക്കും."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"നിങ്ങളുടെ തപാൽ കോഡ് നൽകുക"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"തെറ്റായ തപാൽ കോഡ്"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"ക്രമീകരണം"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"ചാനൽ ലിസ്റ്റ് ഇഷ്‌ടാനുസൃതമാക്കൂ"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"നിങ്ങളുടെ പ്രോഗ്രാം ഗൈഡിനായി ചാനലുകൾ തിരഞ്ഞെടുക്കുക"</string>
@@ -126,7 +141,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"ഓപ്പൺ സോഴ്‌സ് ലൈസൻസ്"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"ഓപ്പൺ സോഴ്‌സ് ലൈസൻസുകൾ"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"ഫീഡ്‍ബാക്ക് അയയ്ക്കുക"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"പതിപ്പ്"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"ഈ ചാനൽ കാണുന്നതിന് വലതുവശത്ത് അമർത്തിക്കൊണ്ട് നിങ്ങളുടെ പിൻ നൽകുക"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"ഈ പ്രോഗ്രാം കാണുന്നതിന് വലതുവശത്ത് അമർത്തിക്കൊണ്ട് നിങ്ങളുടെ പിൻ നൽകുക"</string>
@@ -165,6 +179,8 @@
<string name="intro_description" msgid="7806473686446937307">"ടിവി മെനു ആക്‌സസ്സ് ചെയ്യാൻ "<b>"\'തിരഞ്ഞെടുക്കുക\' അമർത്തുക"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"ടിവി ഇൻപുട്ടൊന്നും കണ്ടെത്തിയില്ല"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"ടിവി ഇൻപുട്ട് കണ്ടെത്താനാകില്ല"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP പിന്തുണയ്‌ക്കുന്നില്ല"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP-യിൽ കാണിക്കാനാകുന്ന ഇൻപുട്ടൊന്നും ലഭ്യമല്ല"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ട്യൂണർ തരം അനുയോജ്യമല്ല. ട്യൂണർ തരം ടിവി ഇൻപുട്ടിനായി തത്സമയ ചാനലുകളുടെ അപ്ലിക്കേഷൻ സമാരംഭിക്കുക."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ട്യൂൺ ചെയ്യൽ പരാജയപ്പെട്ടു"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"ഈ പ്രവർത്തനം കൈകാര്യം ചെയ്യാൻ ആപ്പുകളൊന്നും കണ്ടെത്തിയില്ല."</string>
@@ -241,6 +257,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"സംരക്ഷിക്കുക"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"ഒറ്റത്തവണ റെക്കോർഡിംഗുകൾക്ക് ഏറ്റവും ഉയർന്ന മുൻഗണന"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"റദ്ദാക്കൂ"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"റദ്ദാക്കുക"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"മറക്കുക"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"നിർത്തുക"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"റെക്കോർഡിംഗ് ഷെഡ്യൂൾ കാണുക"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"ഈ ഒരൊറ്റ പ്രോഗ്രാം"</string>
@@ -250,29 +268,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"പകരം, ഇത് റെക്കോർഡ് ചെയ്യുക"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"ഈ റെക്കോർഡിംഗ് റദ്ദാക്കുക"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"ഇപ്പോൾ കാണുക"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"റെക്കോർഡിംഗുകൾ ഇല്ലാതാക്കുക…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"റെക്കോർഡുചെയ്യാവുന്നത്"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"റെക്കോർഡിംഗ് ഷെഡ്യൂൾചെയ്‌തു"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"റെക്കോർഡിംഗ് പൊരുത്തക്കേട്"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"റെക്കോർഡിംഗ്"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"റെക്കോർഡുചെയ്യൽ പരാജയപ്പെട്ടു"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"റെക്കോർഡിംഗ് ഷെഡ്യൂളുകൾ സൃഷ്ടിക്കാൻ പ്രോഗ്രാമുകൾ വായിക്കുന്നു"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"വായനാ പ്രോഗ്രാമുകൾ"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"സമീപകാല റെക്കോർഡിംഗുകൾ കാണുക"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> റെക്കോർഡുചെയ്യൽ പൂർണ്ണമായില്ല."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> എന്നിവയുടെ റെക്കോർഡുചെയ്യൽ പൂർണ്ണമായില്ല."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> എന്നിവയുടെ റെക്കോർഡുചെയ്യൽ പൂർണ്ണമായില്ല."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"വേണ്ടത്ര സ്റ്റോറേജ് ഇല്ലാത്തതിനാൽ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> റെക്കോർഡുചെയ്യൽ പൂർത്തിയായില്ല."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"വേണ്ടത്ര സ്റ്റോറേജ് ഇല്ലാത്തതിനാൽ <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> എന്നിവയുടെ റെക്കോർഡുചെയ്യൽ പൂർത്തിയായില്ല."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"വേണ്ടത്ര സ്റ്റോറേജ് ഇല്ലാത്തതിനാൽ <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> എന്നിവയുടെ റെക്കോർഡുചെയ്യൽ പൂർത്തിയായില്ല."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"വായനാ പ്രോഗ്രാമുകൾ"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR-ന് കൂടുതൽ സ്റ്റോറേജ് ആവശ്യമാണ്"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"DVR ഉപയോഗിച്ച് നിങ്ങൾക്ക് പ്രോഗ്രാമുകൾ റെക്കോർഡുചെയ്യാനാകും. എന്നിരുന്നാലും, DVR പ്രവർത്തിക്കുന്നതിന് നിങ്ങളുടെ ഉപകരണത്തിൽ ഇപ്പോൾ വേണ്ടത്ര സ്റ്റോറേജ് ഇല്ല. <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB-യോ കൂടുതലോ ഉള്ള ഒരു എക്സ്റ്റേണൽ ഡ്രൈവ് കണക്റ്റുചെയ്യുകയും ഉപകരണ സ്റ്റോറേജായി അത് ഫോർമാറ്റുചെയ്യുന്നതിന് നിർദ്ദേശങ്ങൾ പിന്തുടരുകയും ചെയ്യുക."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"മതിയായ സ്റ്റോറേജ് ഇല്ല"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"മതിയായ സ്റ്റോറേജ് ഇല്ലാത്തതിനാൽ ഈ പ്രോഗ്രാം റെക്കോർഡ് ചെയ്യപ്പെടില്ല. നിലവിലുള്ള റെക്കോർഡിംഗുകളിൽ ചിലത് ഇല്ലാതാക്കിക്കൊണ്ട് ശ്രമിച്ചുനോക്കുക."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"നഷ്ടമായ സ്റ്റോറേജ്"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR ഉപയോഗിക്കുന്ന സ്റ്റോറേജിന്റെ ചിലത് നഷ്ടമായിരിക്കുന്നു. വീണ്ടും DVR പ്രവർത്തനക്ഷമമാക്കുന്നതിന്, നിങ്ങൾ മുമ്പ് ഉപയോഗിച്ച എക്സ്റ്റേണൽ ഡ്രൈവ് കണക്റ്റുചെയ്യുക. സ്റ്റോറേജ് തുടർന്നങ്ങോട്ട് ലഭ്യമല്ലെങ്കിൽ, ഇതരമാർഗ്ഗമെന്ന നിലയിൽ, നിങ്ങൾക്ക് മറക്കുന്നതിന് തിരഞ്ഞെടുക്കാവുന്നതാണ്."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"സ്റ്റോറേജ് മറക്കണോ?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"നിങ്ങളുടെ റെക്കോർഡ് ചെയ്തിട്ടുള്ള എല്ലാ ഉള്ളടക്കവും ഷെഡ്യൂളുകളും നഷ്ടപ്പെടും."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"റെക്കോർഡിംഗ് നിർത്തണോ?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"റെക്കോർഡുചെയ്തിട്ടുള്ള ഉള്ളടക്കം സംരക്ഷിക്കപ്പെടും."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"ഈ പ്രോഗ്രാമുമായി പൊരുത്തക്കേട് ഉള്ളതിനാൽ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> എന്ന പ്രോഗ്രാമിന്റെ റെക്കോർഡിംഗ് അവസാനിപ്പിക്കും. റെക്കോർഡുചെയ്ത ഉള്ളടക്കം സംരക്ഷിക്കപ്പെടും."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"റെക്കോർഡിംഗ് ഷെഡ്യൂൾ ചെയ്തിരിക്കുന്നു, എന്നാൽ പൊരുത്തക്കേടുകൾ ഉണ്ട്"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"റെക്കോർഡിംഗ് ആരംഭിച്ചിരിക്കുന്നു, എന്നാൽ പൊരുത്തക്കേടുകൾ ഉണ്ട്"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> റെക്കോർഡുചെയ്യപ്പെടും."</string>
@@ -290,27 +304,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"ഇതേ പ്രോഗ്രാം <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>-ന് റെക്കോർഡ് ചെയ്യുന്നതിനായി ഇതിനകം തന്നെ ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"ഇതിനകം തന്നെ റെക്കോർഡ് ചെയ്തു"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"ഈ പ്രോഗ്രാം ഇതിനകം തന്നെ റെക്കോർഡ് ചെയ്തിട്ടുണ്ട്. DVR ലൈഒബ്രറിയിൽ ഇത് ലഭ്യമാണ്."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"പരമ്പരയുടെ റെക്കോർഡിംഗ് ഷെഡ്യൂൾ ചെയ്‌തു"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> റെക്കോർഡിംഗുകൾ ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> റെക്കോർഡിംഗ് ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> റെക്കോർഡിംഗുകൾ ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്. പൊരുത്തക്കേടുകൾ ഉള്ളതിനാൽ അവയിലെ <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> എണ്ണം റെക്കോർഡുചെയ്യപ്പെടില്ല.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> റെക്കോർഡിംഗ് ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്. പൊരുത്തക്കേടുകൾ ഉള്ളതിനാൽ അത് റെക്കോർഡ് ചെയ്യപ്പെടില്ല.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> റെക്കോർഡിംഗുകൾ ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്. പൊരുത്തക്കേടുകൾ ഉള്ളതിനാൽ ഈ പരമ്പരയുടെയും മറ്റ് പരമ്പരയുടെയും <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> എപ്പിസോഡുകൾ റെക്കോർഡുചെയ്യപ്പെടില്ല.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> റെക്കോർഡിംഗ് ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്. പൊരുത്തക്കേടുകൾ ഉള്ളതിനാൽ ഈ പരമ്പരയുടെയും മറ്റ് പരമ്പരയുടെയും <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> എപ്പിസോഡുകൾ റെക്കോർഡുചെയ്യപ്പെടില്ല.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> റെക്കോർഡിംഗുകൾ ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്. പൊരുത്തക്കേടുകൾ ഉള്ളതിനാൽ മറ്റ് പരമ്പരയുടെ ഒരു എപ്പിസോഡ് റെക്കോർഡുചെയ്യപ്പെടില്ല.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> റെക്കോർഡിംഗ് ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്. പൊരുത്തക്കേടുകൾ ഉള്ളതിനാൽ മറ്റ് പരമ്പരയുടെ ഒരു എപ്പിസോഡ് റെക്കോർഡുചെയ്യപ്പെടില്ല.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> റെക്കോർഡിംഗുകൾ ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്. പൊരുത്തക്കേടുകൾ ഉള്ളതിനാൽ മറ്റ് പരമ്പരകളുടെ <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> എപ്പിസോഡുകൾ റെക്കോർഡുചെയ്യപ്പെടില്ല.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> എന്ന പരമ്പരയുടെ <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> റെക്കോർഡിംഗ് ഷെഡ്യൂൾ ചെയ്തിട്ടുണ്ട്. പൊരുത്തക്കേടുകൾ ഉള്ളതിനാൽ മറ്റ് പരമ്പരകളുടെ <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> എപ്പിസോഡുകൾ റെക്കോർഡുചെയ്യപ്പെടില്ല.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"റെക്കോർഡുചെയ്ത പ്രോഗ്രാം കണ്ടെത്തിയില്ല."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"ബന്ധപ്പെട്ട റെക്കോർഡിംഗുകൾ"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(പ്രോഗ്രാം വിവരണമില്ല)"</string>
@@ -333,7 +334,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"സീരീസ് റെക്കോർഡുചെയ്യുന്നത് നിർത്തണോ?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"റെക്കോർഡുചെയ്ത എപ്പിസോഡുകൾ DVR ലൈബ്രറിയിൽ ലഭ്യമാകുന്നത് തുടരും."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"നിർത്തുക"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"എപ്പിസോഡുകളൊന്നും ഇപ്പോൾ പ്രക്ഷേപണം ചെയ്യുന്നില്ല."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"എപ്പിസോഡുകളൊന്നും ലഭ്യമല്ല.\nലഭ്യമായിക്കഴിഞ്ഞാൽ അവ റെക്കോർഡ് ചെയ്യപ്പെടും."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d മിനിറ്റ്)</item>
diff --git a/res/values-mn-rMN-v23/strings.xml b/res/values-mn-v23/strings.xml
index 7da24abf..7da24abf 100644
--- a/res/values-mn-rMN-v23/strings.xml
+++ b/res/values-mn-v23/strings.xml
diff --git a/res/values-mn-rMN/arrays.xml b/res/values-mn/arrays.xml
index 3d0b16ba..3d0b16ba 100644
--- a/res/values-mn-rMN/arrays.xml
+++ b/res/values-mn/arrays.xml
diff --git a/res/values-mn-rMN/rating_system_strings.xml b/res/values-mn/rating_system_strings.xml
index 7c883a13..7c883a13 100644
--- a/res/values-mn-rMN/rating_system_strings.xml
+++ b/res/values-mn/rating_system_strings.xml
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn/strings.xml
index 2aa79038..e99f8a0e 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"моно"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"стерео"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Play хяналт"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Сувгууд"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Саяхны сувгууд"</string>
<string name="menu_title_options" msgid="7184594626814914022">"ТВ-н сонголтууд"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP Сонголтууд"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Энэ сувагт тоглуулах хяналтыг ашиглах боломжгүй байна"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Тоглуулах эсвэл түр зогсоох"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Хурдан урагшлуулах"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Хаалттай капшн"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Дэлгэцийн горим"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Идэвхтэй"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Идэвхгүй"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Мульти-аудио"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Нэмж суваг авах"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Тохиргоо"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Эх сурвалж"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Солих"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Идэвхтэй"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Идэвхгүй"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Дуу"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Үндсэн"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP цонх"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Байрлал"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Баруун доод"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Баруун дээд"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Зүүн дээд"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Зүүн доод"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Зэрэгцсэн"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Хэмжээ"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Том"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Жижиг"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Оролтын эх үүсвэр"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TВ (Антен /Кабел)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Хөтөлбөрийн мэдээлэл байхгүй"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Мэдээлэл байхгүй"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Хаагдсан суваг"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Үл мэдэгдэх хэл"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Хаалттай тайлбар %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Үл мэдэгдэх хэл"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Хаалттай тайлбар"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Идэвхгүй"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Форматыг тааруулах"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Энэ PIN буруу байна. Дахин оролдоно уу."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Дахин оролдоно уу, PIN таарахгүй байна"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"ЗИП кодоо оруулна уу."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"ТВ сувагт хөтөлбөрийн хуваарийг бүрнээр нь олгохын тулд Шууд сувгийн апп ЗИП код ашиглах болно."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"ЗИП кодоо оруулна уу"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"ЗИП код буруу байна"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Тохиргоо"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Сувгийн жагсаалтыг тохируулах"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"ТВ хөтөлбөрт оруулах сувгуудыг сонгоно уу"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Эцэг эхийн хяналт"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Нээлттэй эхийн лиценз"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Нээлттэй эхийн лиценз"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Санал хүсэлт илгээх"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Хувилбар"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Энэ сувгийг үзэхийн тулд Баруун товчийг дараад өөрийн PIN-г оруулна уу"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Энэ хөтөлбөрийг үзэхийн тулд Баруун товчийг дараад өөрийн PIN-г оруулна уу"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"ТВ цэс рүү хандахын тулд "<b>"СОНГОХ гэснийг дарна уу"</b></string>
<string name="msg_no_input" msgid="3897674146985427865">"ТВ оролт олдсонгүй."</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"ТВ оролтыг олж чадахгүй байна."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP дэмжигдээгүй байна."</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP-тай харуулж болох бэлэн оролт байхгүй байна."</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Дуу тохируулагчийн төрөл тохирохгүй байна. Зурагтын оролтын дуу тохируулагчийн төрөлд зориулан Шууд Сувгуудын апликейшнийг эхлүүл."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Дуу тааруулж чадсангүй."</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Энэ үйлдлийг гүйцэтгэх апп олдсонгүй."</string>
@@ -241,6 +257,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Хадгалах"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Нэг удаагийн бичлэг өндөр ач холбогдолтой"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Цуцлах"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Цуцлах"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Мартах"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Зогсоох"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Бичих хуваарийг харах"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Зөвхөн энэ хөтөлбөр"</string>
@@ -250,29 +268,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Оронд нь үүнийг бичих"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Энэ бичлэгийг цуцлах"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Одоо үзэх"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Бичлэгийг устгах..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Дүрс бичих боломжтой"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Дүрс бичихээр товлосон"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Дүрс бичих боломжгүй"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Бичиж байна"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Бичиж чадсангүй"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Бичлэгийн хуваарь үүсгэхийн тулд хөтөлбөрийг уншиж байна"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Хөтөлбөрийг уншиж байна"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Сүүлийн бичлэгийг харах"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>-г бичиж чадсангүй."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>-г бичиж чадсангүй."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>-г бичиж чадсангүй."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Багтаамж хангалтгүйн улмаас <xliff:g id="PROGRAMNAME">%1$s</xliff:g>-г бичиж чадсангүй."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Багтаамж хангалтгүйн улмаас <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>-г бичиж чадсангүй."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Багтаамж хангалтгүйн улмаас <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>-г бичиж чадсангүй."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Хөтөлбөрийг уншиж байна"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR-д илүү багтаамж шаардлагатай"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Та DVR-р хөтөлбөр бичих боломжтой болно. Гэсэн хэдий ч таны төхөөрөмжид DVR ажиллуулах хангалттай багтаамж алга. <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>гигабайт, эсвэл үүнээс дээш багтаамжтай гадаад драйв холбож, үүнийг төхөөрөмжийн сан болгож хэлбэршүүлэхийн тулд зааврыг дагана уу."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Хангалттай сан алга"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Сангийн багтаамж хангалтгүй байгаа тул энэ хөтөлбөрийг бичихгүй. Зарим шаардлагагүй бичлэгийг устгана уу."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Сан алга"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR-н ашигласан зарим сан алга. DVR-г дахин идэвхжүүлэхээс өмнө ашигласан гадаад драйвыг холбоно уу. Хэрэв сан байхгүй бол үүнийг мартах боломжтой."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Санг мартах уу?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Таны бичсэн агуулга, хуваарь устах болно."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Бичлэгийг зогсоох уу?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Бичсэн агуулгыг хадгална."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>-н бичлэгийг энэ хөтөлбөртэй зөрчилдөж байгаа тул зогсоох болно. Бичсэн агуулгыг хадгална."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Бичихээр товлосон ч зөрчилтэй байна"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Бичлэг эхлүүлсэн хэдий ч зөрчилтэй байна"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>-г бичих болно."</string>
@@ -290,27 +304,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Үүнтэй ижил хөтөлбөрийг <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>-д бичихээр товлосон байна."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Аль хэдийн бичсэн"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Энэ хөтөлбөрийг аль хэдийн бичсэн байна. Энэ нь DVR санд боломжтой."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Цувралын бичлэгийг товлосон"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> бичлэг товлосон.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> бичлэг товлосон.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> бичлэг товлосон. Тэдгээрийн <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>-г зөрчлийн улмаас бичихгүй.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> бичлэг товлосон. Үүнийг зөрчлийн улмаас бичихгүй.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> бичлэг товлосон. Энэ болон бусад цувралын <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ангийг зөрчлийн улмаас бичихгүй.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> бичлэг товлосон. Энэ болон бусад цувралын <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ангийг зөрчлийн улмаас бичихгүй.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> бичлэг товлосон. Бусад цувралын 1 ангийг зөрчлийн улмаас бичихгүй.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> бичлэг товлосон. Бусад цувралын 1 ангийг зөрчлийн улмаас бичихгүй.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> бичлэг товлосон. Бусад цувралын <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ангийг зөрчлийн улмаас бичихгүй.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>-н <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> бичлэг товлосон. Бусад цувралын <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ангийг зөрчлийн улмаас бичихгүй.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Бичсэн хөтөлбөр олдсонгүй."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Холбоотой бичлэг"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Хөтөлбөрийн тодорхойлолт алга)"</string>
@@ -333,7 +334,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Цувралыг бичихээ зогсоох уу?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Бичсэн цувралыг DVR санд хадгална."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Зогсоох"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Одоо ямар ч ангийг бичээгүй байна."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Ямар ч анги алга.\nТэд боломжтой болсон үедээ бичих болно."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d минут)</item>
diff --git a/res/values-mr-rIN-v23/strings.xml b/res/values-mr-v23/strings.xml
index d7b703e6..d7b703e6 100644
--- a/res/values-mr-rIN-v23/strings.xml
+++ b/res/values-mr-v23/strings.xml
diff --git a/res/values-mr-rIN/arrays.xml b/res/values-mr/arrays.xml
index a91434f4..a91434f4 100644
--- a/res/values-mr-rIN/arrays.xml
+++ b/res/values-mr/arrays.xml
diff --git a/res/values-mr-rIN/rating_system_strings.xml b/res/values-mr/rating_system_strings.xml
index d192c799..d192c799 100644
--- a/res/values-mr-rIN/rating_system_strings.xml
+++ b/res/values-mr/rating_system_strings.xml
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr/strings.xml
index 713064c6..1888e9de 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"एक"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"स्टिरिओ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"प्ले नियंत्रणे"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"चॅनेल"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"अलीकडील चॅनेल"</string>
<string name="menu_title_options" msgid="7184594626814914022">"टीव्‍ही पर्याय"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP पर्याय"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"या चॅनेलसाठी अनुपलब्ध असलेली नियंत्रणे प्ले करा"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"प्ले करा किंवा विराम द्या"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"फास्ट फॉरवर्ड करा"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"उपशीर्षक"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"प्रदर्शन मोड"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"चालू"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"बंद"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"मल्टी-ऑडिओ"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"अधिक चॅनेल मिळवा"</string>
<string name="options_item_settings" msgid="7623205838542400074">"सेटिंग्ज"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"स्त्रोत"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"अदलाबदल करा"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"चालू"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"बंद"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ध्वनी"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"मुख्य"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP विंडो"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"लेआउट"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"तळाशी उजवीकडे"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"शीर्षस्थानी उजवीकडे"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"शीर्षस्थानी डावीकडे"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"तळाशी डावीकडे"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"शेजारी शेजारी"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"आकार"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"मोठा"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"लहान"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"इनपुट स्त्रोत"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"टीव्ही (अँटेना/केबल)"</string>
<string name="no_program_information" msgid="1049844207745145132">"कोणतीही कार्यक्रम माहिती नाही"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"कोणतीही माहिती नाही"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"अवरोधित चॅनेल"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"अज्ञात भाषा"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"बंद मथळा %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"अज्ञात भाषा"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"बंद मथळा"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"बंद"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"स्वरुपन सानुकूलित करा"</string>
@@ -104,7 +123,7 @@
<string name="option_subrating_header" msgid="4637961301549615855">"उप रेटिंग"</string>
<string name="pin_enter_unlock_channel" msgid="4797922378296393173">"हे चॅनेल पाहण्‍यासाठी आपला पिन प्रविष्‍ट करा"</string>
<string name="pin_enter_unlock_program" msgid="7311628843209871203">"हा कार्यक्रम पाहण्‍यासाठी आपला पिन प्रविष्‍ट करा"</string>
- <string name="pin_enter_unlock_dvr" msgid="1637468108723176684">"हा प्रोग्राम <xliff:g id="RATING">%1$s</xliff:g> रेट केलेला आहे. हा प्रोग्राम पाहण्यासाठी आपला पिन प्रविष्ट करा"</string>
+ <string name="pin_enter_unlock_dvr" msgid="1637468108723176684">"हा प्रोग्राम <xliff:g id="RATING">%1$s</xliff:g> रेट केलेला आहे. हा प्रोग्राम पाहण्यासाठी आपला PIN प्रविष्ट करा"</string>
<string name="pin_enter_pin" msgid="249314665028035038">"आपला पिन प्रविष्‍ट करा"</string>
<string name="pin_enter_create_pin" msgid="3385754356793309946">"पालक नियंत्रणे सेट करण्यासाठी, एक पिन तयार करा"</string>
<string name="pin_enter_new_pin" msgid="1739471585849790384">"नवीन पिन प्रविष्ट करा"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"तो पिन चुकीचा होता. पुन्हा प्रयत्न करा."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"पुन्हा प्रयत्न करा, पिन जुळत नाही"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"आपला पिन कोड प्रविष्ट करा."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"टीव्ही चॅनेलसाठी संपूर्ण कार्यक्रम मार्गदर्शक प्रदान करण्यासाठी थेट चॅनेल अॅप पिन कोड वापरेल."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"आपला पिन कोड प्रविष्ट करा"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"अवैध पिन कोड"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"सेटिंग्ज"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"चॅनेल सूची सानुकूल करा"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"आपल्या कार्यक्रम मार्गदर्शकासाठी चॅनेल निवडा"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"पालक नियंत्रणे"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"मुक्त स्त्रोत परवाने"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"मुक्त स्त्रोत परवाने"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"अभिप्राय पाठवा"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"आवृत्ती"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"हे चॅनेल पाहण्यासाठी, उजवे दाबा आणि आपला पिन प्रविष्‍ट करा"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"हा कार्यक्रम पाहण्‍यासाठी, उजवे दाबा आणि आपला पिन प्रविष्‍ट करा"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"टीव्ही मेनूवर प्रवेश करण्यासाठी "<b>"निवडा दाबा"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"कोणतेही टीव्ही इनपुट आढळले नाही"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"टीव्ही इनपुट शोधू शकत नाही"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP समर्थित नाही"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP सह दर्शविले जाऊ शकते असे कोणतेही उपलब्ध इनपुट नाही"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ट्यूनर प्रकार अनुकूल नाही. कृपया ट्यूनर प्रकार टीव्ही इनपुटसाठी थेट चॅनेल अॅप लाँच करा."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ट्यून अयशस्वी झाले"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"ही क्रिया हाताळण्यासाठी कोणताही अ‍ॅप आढळला नाही."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"जतन करा"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"एक-वेळ रेकॉर्डिंगला सर्वोच्च प्राधान्य आहे"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"रद्द करा"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"रद्द करा"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"विसरा"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"थांबा"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"रेकॉर्डिंग अनुसूची पहा"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"हा एक कार्यक्रम"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"त्याऐवजी हे रेकॉर्ड करा"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"हे रेकॉर्डिंग रद्द करा"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"आता पहा"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"रेकॉर्डिंग हटवा..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"रेकॉर्ड करण्यायोग्य"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"रेकॉर्डिंग अनुसूचित केले"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"रेकॉर्डिंग संबंधी विरोध"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"रेकॉर्डिंग"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"रेकॉर्डिंग अयशस्वी झाले"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"रेकॉर्डिंग अनुसूची तयार करण्यासाठी प्रोग्राम वाचत आहे"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"वाचन कार्यक्रम"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"अलीकडील रेकॉर्डिंग पहा"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> चे रेकॉर्डिंग अपूर्ण आहे."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> आणि <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> चे रेकॉर्डिंग अपूर्ण आहे."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> आणि <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> चे रेकॉर्डिंग अपूर्ण आहे."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"अपुर्‍या संचयामुळे <xliff:g id="PROGRAMNAME">%1$s</xliff:g> चे रेकॉर्डिंग पूर्ण झाले नाही."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"अपुर्‍या संचयामुळे <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> आणि <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> चे रेकॉर्डिंग पूर्ण झाले नाही."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"अपुर्‍या संचयामुळे <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> चे रेकॉर्डिंग पूर्ण झाले नाही."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"वाचन कार्यक्रम"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR साठी आणखी संचय आवश्यक आहे"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"आपण DVR ने प्रोग्राम रेकॉर्ड करण्यात सक्षम असाल. तथापि DVR ने कार्य करण्यासाठी आपल्या डिव्हाइसवर आता पुरेसा संचय नाही. कृपया <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB किंवा त्यापेक्षा मोठ्या बाह्य ड्राइव्हशी कनेक्ट करा आणि त्यास डिव्हाइस संचय म्हणून स्वरूपित करण्‍यासाठी चरणांचे अनुसरण करा."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"पुरेसा संचय नाही"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"पुरेसा संचय नसल्याने हा कार्यक्रम रेकॉर्ड केला जाणार नाही. काही विद्यमान रेकॉर्डिंग हटवून पहा."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"संचय गहाळ आहे"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR ने वापरलेला काही संचय गहाळ आहे. कृपया DVR पुन्हा सक्षम करण्‍यासाठी आपण पूर्वी वापरलेला बाह्य ड्राइव्ह कनेक्ट करा. वैकल्पिकपणे, यापुढे संचय उपलब्ध नसल्यास आपण तो विसरणे निवडू शकता."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"संचय विसरलात?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"आपली सर्व रेकॉर्ड केलेली सामग्री आणि अनुसूची गमावल्या जातील."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"रेकॉर्डिंग थांबवायचे?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"रेकॉर्ड केलेली सामग्री जतन केली जाईल."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> चे रेकॉर्डिंग थांबवले जाईल कारण ते या कार्यक्रमासह संघर्ष करते. रेकॉर्ड केलेली सामग्री जतन केली जाईल."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"रेकॉर्डिंगची अनुसूची केली परंतु त्यासंबंधी विरोध आहेत"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"रेकॉर्डिंग सुरू झाली परंतु त्यासंबंधी विरोध आहेत"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> रेकॉर्ड केला जाईल."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"<xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> रोजी रेकॉर्ड करण्यासाठी तोच कार्यक्रम आधीच शेड्यूल केला आहे."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"आधीच रेकॉर्ड केला आहे"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"हा कार्यक्रम आधीच रेकॉर्ड केला गेला आहे. तो DVR लायब्ररीमध्ये उपलब्ध आहे."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"मालिका रेकॉर्डिंग अनुसूचित केले"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली. त्यांंच्यापैकी <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> विरोधांमुळे रेकॉर्ड केले जाणार नाहीत.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली. त्यांंच्यापैकी <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> विरोधांमुळे रेकॉर्ड केले जाणार नाहीत.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली. या मालिकेचे आणि अन्य मालिकांचे <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> भाग विरोधांमुळे रेकॉर्ड केले जाणार नाहीत.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली. या मालिकेचे आणि अन्य मालिकांचे <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> भाग विरोधांमुळे रेकॉर्ड केले जाणार नाहीत.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली. अन्य मालिकांचा 1 भाग विरोधांमुळे रेकॉर्ड केला जाणार नाही.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली. अन्य मालिकांचा 1 भाग विरोधांमुळे रेकॉर्ड केला जाणार नाही.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली. अन्य मालिकेचे <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> भाग विरोधांंमुळे रेकॉर्ड केले जाणार नाहीत.</item>
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> साठी <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रेकॉर्डिंगची अनुसूची केली गेली. अन्य मालिकेचे <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> भाग विरोधांंमुळे रेकॉर्ड केले जाणार नाहीत.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"रेकॉर्ड केलेला प्रोग्राम सापडला नाही."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"संबंधित रेकॉर्डिंग"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(कोणत्याही प्रोग्रामचे वर्णन नाही)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"मालिका रेकॉर्ड करणे थांबवायचे?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"रेकॉर्ड केलेले भाग DVR लायब्ररी मध्ये उपलब्ध राहतील."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"थांबा"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"आता कोणत्याही भागांचे प्रसारण होत नाही."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"कोणतेही भाग उपलब्ध नाहीत.\nते उपलब्ध झाल्यावर रेकॉर्ड केले जातील."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d मिनिट)</item>
diff --git a/res/values-ms-rMY-v23/strings.xml b/res/values-ms-v23/strings.xml
index ba29d7b7..ba29d7b7 100644
--- a/res/values-ms-rMY-v23/strings.xml
+++ b/res/values-ms-v23/strings.xml
diff --git a/res/values-ms-rMY/arrays.xml b/res/values-ms/arrays.xml
index 16ccce64..16ccce64 100644
--- a/res/values-ms-rMY/arrays.xml
+++ b/res/values-ms/arrays.xml
diff --git a/res/values-ms-rMY/rating_system_strings.xml b/res/values-ms/rating_system_strings.xml
index a5f781fe..a5f781fe 100644
--- a/res/values-ms-rMY/rating_system_strings.xml
+++ b/res/values-ms/rating_system_strings.xml
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms/strings.xml
index 932021dd..816dee35 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Kawalan main"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Saluran"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Saluran terbaru"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Pilihan TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Pilihan PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Kawalan main tidak tersedia untuk saluran ini"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Main atau jeda"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Mara laju"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Sari kata"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Mod paparan"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Hidupkan"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Matikan"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Berbilang audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Dptkn lg saluran"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Tetapan"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Sumber"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Silih"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Hidupkan"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Matikan"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Bunyi"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Utama"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Tetingkap PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Reka Letak"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Kanan bawah"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Kanan atas"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Kiri atas"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Kiri bawah"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Bersebelahan"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Saiz"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Besar"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Kecil"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Sumber input"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Maklumat program tiada"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Tiada maklumat"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Saluran disekat"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Bahasa tidak diketahui"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Sari kata %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Bahasa tidak diketahui"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Sari kata"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Dimatikan"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Sesuaikan format"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN itu salah. Cuba lagi."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Cuba lagi, PIN tidak sepadan"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Masukkan Poskod anda."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Apl Saluran Langsung akan menggunakan Poskod untuk menyediakan panduan lengkap rancangan saluran TV."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Masukkan Poskod anda"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Poskod tidak sah"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Tetapan"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Sesuaikan senarai saluran"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Pilih saluran untuk panduan rancangan anda"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Kawalan ibu bapa"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Lesen sumber terbuka"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Lesen sumber terbuka"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Hantar maklum balas"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versi"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Untuk menonton saluran ini, tekan Kanan dan masukkan PIN anda"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Untuk menonton rancangan ini, tekan Kanan dan masukkan PIN anda"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Tekan PILIH"</b>" untuk mengakses menu TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Input TV tidak ditemui"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Tidak menemui input TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP tidak disokong"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Tiada input tersedia yang boleh ditunjukkan dengan PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Jenis penala tidak sesuai; Sila lancarkan apl Saluran Langsung untuk input TV jenis penala."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Penalaan gagal"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Tiada apl ditemui untuk mengendalikan tindakan ini."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Simpan"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Rakaman bersifat sekali sahaja mendapat keutamaan tertinggi"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Batal"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Batal"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Lupakan"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Berhenti"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Lihat jadual rakaman"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Program ini sahaja"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Sebaliknya rakamkan yang ini"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Batalkan rakaman ini"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Tonton sekarang"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Padam rakaman..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Boleh rakam"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Rakaman dijadualkan"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Konflik rakaman"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Merakam"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Perakaman gagal"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Membaca rancangan untuk membuat jadual rakaman"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Membaca rancangan"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Lihat rakaman terbaharu"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Rakaman <xliff:g id="PROGRAMNAME">%1$s</xliff:g> tidak lengkap."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Rakaman <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> dan <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> tidak lengkap."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Rakaman <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> dan <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> tidak lengkap."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Rakaman <xliff:g id="PROGRAMNAME">%1$s</xliff:g> tidak lengkap kerana storan tidak mencukupi."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Rakaman <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> dan <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> tidak lengkap kerana storan tidak mencukupi."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Rakaman <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> dan <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> tidak lengkap kerana storan tidak mencukupi."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Membaca rancangan"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR memerlukan storan yang lebih besar"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Anda boleh merakam rancangan menggunakan DVR. Walau bagaimanapun storan pada peranti anda kini tidak mencukupi untuk DVR berfungsi. Sila sambungkan pemacu luaran <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB atau lebih besar dan ikut langkah untuk memformat pemacu itu sebagai storan peranti."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Storan tidak mencukupi"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Rancangan ini tidak akan dirakamkan kerana storan tidak mencukupi. Cuba padamkan beberapa rakaman sedia ada."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Storan hilang"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Beberapa storan yang digunakan oleh DVR telah hilang. Sila sambungkan pemacu luaran yang anda gunakan sebelum ini untuk mendayakan semula DVR. Secara alternatif, anda boleh memilih untuk melupakan storan jika storan itu tidak lagi tersedia."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Lupakan storan?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Semua kandungan dan jadual anda yang dirakamkan akan hilang."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Berhenti merakam?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Kandungan yang dirakamkan akan disimpan."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Rakaman <xliff:g id="PROGRAMNAME">%1$s</xliff:g> akan dihentikan kerana wujud konflik dengan rancangan ini. Kandungan yang dirakamkan akan disimpan."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Rakaman dijadualkan tetapi wujud konflik"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Rakaman telah bermula tetapi wujud konflik"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> akan dirakamkan."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Rancangan yang sama telah dijadualkan akan dirakamkan pada <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Sudah dirakamkan"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Rancangan ini telah dirakamkan dan tersedia di pustaka DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Rakaman siri telah dijadualkan"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> daripadanya tidak akan dirakamkan kerana berlaku konflik.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Rakaman ini tidak akan dijalankan kerana berlaku konflik.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episod siri ini dan siri yang lain tidak akan dirakamkan kerana berlaku konflik.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episod siri ini dan siri yang lain tidak akan dirakamkan kerana berlaku konflik.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 episod siri yang lain tidak akan dirakamkan kerana berlaku konflik.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 episod siri yang lain tidak akan dirakamkan kerana berlaku konflik.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episod siri yang lain tidak akan dirakamkan kerana berlaku konflik.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> rakaman telah dijadualkan untuk <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episod siri yang lain tidak akan dirakamkan kerana berlaku konflik.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Program yang dirakam tidak ditemui."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Rakaman yang berkaitan"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Tiada perihalan program)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Berhenti merakam siri?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Episod yang dirakamkan akan kekal tersedia dalam pustaka DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Berhenti"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Tiada episod sedang dalam siaran."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Tiada episod yang tersedia.\nEpisod ini akan dirakamkan apabila sudah tersedia."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minit)</item>
diff --git a/res/values-my-rMM-v23/strings.xml b/res/values-my-v23/strings.xml
index 015247d8..015247d8 100644
--- a/res/values-my-rMM-v23/strings.xml
+++ b/res/values-my-v23/strings.xml
diff --git a/res/values-my-rMM/arrays.xml b/res/values-my/arrays.xml
index e302ceac..e302ceac 100644
--- a/res/values-my-rMM/arrays.xml
+++ b/res/values-my/arrays.xml
diff --git a/res/values-my-rMM/rating_system_strings.xml b/res/values-my/rating_system_strings.xml
index 153ad407..153ad407 100644
--- a/res/values-my-rMM/rating_system_strings.xml
+++ b/res/values-my/rating_system_strings.xml
diff --git a/res/values-my-rMM/strings.xml b/res/values-my/strings.xml
index 8e9cc4dd..1ab6baf7 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"မိုနို"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"စတီရီယို"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Play ထိန်းချုပ်မှုများ"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"ချာနယ်များ"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"မကြာမီက ချာနယ်"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV ရွေးစရာများ"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP ရွေးချယ်စရာများ"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"ဤလိုင်းအတွက် အဖွင့်ထိန်းချုပ်ခြင်းများ မရနိုင်ပါ"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"ဖွင့်ပါ သို့မဟုတ် ခဏရပ်ပါ"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"ရှေ့သို့ အမြန်သွားရန်"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"စာတမ်းထိုးများ"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"မြင်ကွင်း မုဒ်"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"ဖွင့်ထား"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"ပိတ်ထား"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"အသံစုံ"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"နောက်ထပ်ချန်နယ်များ ရယူရန်"</string>
<string name="options_item_settings" msgid="7623205838542400074">"ဆက်တင်များ"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"ရင်းမြစ်"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"လဲပြောင်းသည်"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"ဖွင့်ထား"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"ပိတ်ထား"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"အသံ"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"အဓိက"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP ဝင်းဒိုး"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"အဆင်အပြင်"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"အောက်ညာ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"အပေါ်ညာ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"အပေါ်ဘယ်"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"အောက်ဘယ်"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"ကပ်လျက်"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"ဆိုက်"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"ကြီး"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"သေး"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"ထည့်သွင်းမှု ရင်းမြစ်"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"တီဗီ (ဧရီယာတိုင်/ကြိုး)"</string>
<string name="no_program_information" msgid="1049844207745145132">"အစီအစဉ် အချက်အလက်များ မရှိ"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"သတင်းအချက်အလက် မရှိပါ"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"ပိတ်ဆို့ ချာနယ်"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"အမည်မသိဘာသာစကား"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"စာတန်းထိုး %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"အမည်မသိဘာသာစကား"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"စာတမ်းထိုးများ"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"ပိတ်ထား"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"စိတ်ကြိုက်ပုံစံချရန်"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"ထို PIN မှာ မှားနေသည်။ ထပ်ကြိုးစားပါ။"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN မှာ မတိုက်ဆိုင်ပါ၊ ထပ်ပြီး စမ်းပါ။"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"စာတိုက်ကုဒ်ကို ထည့်ပါ။"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"TV ချန်နယ်များအတွက် ပြီးပြည့်စုံသည့် အစီအစဉ်များကို ပံ့ပိုးပေးရန် Live TV က စာတိုက်ကုဒ်ကိုသုံးပါမည်။"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"စာတိုက်ကုဒ်ကို ထည့်ပါ"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"စာတိုက်သင်္က​ေတ မမှန်ပါ"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"ဆက်တင်များ"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"ချန်နယ်စာရင်းကို စိတ်တိုင်းကျပြုပြင်ရန်"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"သင့်ပရိုဂရမ်လမ်းညွှန်အတွက် ချန်နယ်များရွေးချယ်ပါ"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"မိဘ ထိန်းချုပ်မှု"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"အခမဲ့အရင်းအမြစ်လိုင်စင်များ"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"အခမဲ့ ရင်းမြစ် လိုင်စင်များ"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"တုံ့ပြန်ချက် ပေးပို့ပါ"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"ဗားရှင်း"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"ဤချာနယ်ကို ကြည့်ရန်၊ ညာဘက် နှိပ်ပြီး PIN ရိုက်ထည့်ပါ"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"ဤအစီအစဉ်ကို ကြည့်ရန်၊ ညာဘက် နှိပ်ပြီး PIN ရိုက်ထည့်ပါ"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>" ရွေးချယ်ပါအားနှိပ်ပြီး"</b>" တီဗီမန်နယူးကိုဝင်ရောက်ကြည့်ရှုပါ။"</string>
<string name="msg_no_input" msgid="3897674146985427865">"တီဗီ ထည့်သွင်းမှု ရှာမတွေ့ပါ။"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"တီဗီ ထည့်သွင်းမှု ရှာမတွေ့နိုင်ပါ။"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP ကို ပံ့ပိုးမထားပါ။"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP နှင့် ပြနိုင်သည့် ထည့်သွင်းစရာ မရှိပါ။"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"သင့်တော်သည့် တျူနာ အမျိုးအစား မဟုတ်ပါ။ တီဗွီ အဝင်ပေါက်အတွက် တိုက်ရိုက်လွှင့် ချန်နယ်များ အက်ပ်အား ဖွင့်ပါ။"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ညှိမှု မအောင်မြင်ပါ"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"ဤလုပ်ဆောင်ချက်ကို ကိုင်တွယ်နိုင်သည့် အက်ပ်မရှိပါ။"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"သိမ်းရန်"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"တစ်ကြိမ်တစ်ခါတည်း ဖမ်းယူခြင်းသည် ဦးစားပေးမှုအမြင့်ဆုံးဖြစ်သည်"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"မလုပ်တော့"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"မလုပ်တော့"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"မေ့ပစ်ရန်"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"ရပ်ရန်"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"ဖမ်းယူခြင်းအချိန်ဇယားကို ကြည့်ရန်"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"ဤအစီအစဉ် တစ်ခုတည်း"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"၎င်းအစား ဤတစ်ခုကို ဖမ်းယူပါ"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"ဤဖမ်းယူမှုကို ပယ်ဖျက်ရန်"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"ယခုကြည့်ရန်"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"ရုပ်သံရိုက်ကူးမှုများ ဖျက်ပါ..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"ရိုက်ကူးနိုင်သည်"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"ရိုက်ကူးရေးအတွက် စီစဉ်ထားပါသည်"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"ရိုက်ကူးရေးအစီအစဉ်တိုက်နေပါသည်"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"ဖမ်းယူနေသည်"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"ဖမ်းယူခြင်း မအောင်မြင်ပါ"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"ရိုက်ကူးရေး အချိန်ဇယားများ သတ်မှတ်ရန် အစီအစဉ်များကို ဖတ်နေသည်"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"ပရိုဂရမ်များကို ဖတ်နေသည်"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"မကြာသေးမီက ရိုက်ကူးမှုများကို ကြည့်ပါ"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ကို ကူးယူမှု မပြီးဆုံးခဲ့ပါ။"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> နှင့် <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> တို့ကို ကူးယူမှု မပြီးဆုံးခဲ့ပါ။"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>၊ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> နှင့် <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> တို့ကို ကူးယူမှု မပြီးဆုံးခဲ့ပါ။"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"သိုလှောင်ခန်း လုံလောက်မှု မရှိသည့်အတွက် <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ကို ပြီးဆုံးအောင် မကူးယူနိုင်ခဲ့ပါ။"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"သိုလှောင်ခန်း လုံလောက်မှု မရှိသည့်အတွက် <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> နှင့် <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> တို့ကို ပြီးစီးအောင် မကူးယူနိုင်ခဲ့ပါ။"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"သိုလှောင်ခန်း လုံလောက်မှု မရှိသည့်အတွက် <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>၊ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> နှင့် <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> တို့ကို ပြီးစီးအောင် မကူးယူနိုင်ခဲ့ပါ။"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"ပရိုဂရမ်များကို ဖတ်နေသည်"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR သည် နောက်ထပ်သိုလှောင်ရန်နေရာလွတ် လိုအပ်နေသည်"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"အစီအစဉ်များကို DVR နှင့် ဖမ်းယူသိမ်းဆည်းထားနိုင်ပါသည်။ သို့သော် DVR ကို အသုံးပြုနိုင်ရန် သင့်စက်ပစ္စည်းတွင် လုံလောက်သော နေရာလွတ် လောလောဆယ်မရှိပါ။ <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>ဂစ်ဂါဘိုက် သို့မဟုတ် ၎င်းနှင့်အထက်ရှိသော ပြင်ပသိုလှောင်ကိရိယာနှင့် ချိတ်ဆက်ပြီး ၎င်းကို သိုလှောင်ခန်းစက်ပစ္စည်းအဖြစ် ပြင်ဆင်သတ်မှတ်ရန် ညွှန်ကြားချက်များအတိုင်း လိုက်နာပါ။"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"သိုလှောင်ခန်း မလုံလောက်ပါ"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"သိုလှောင်ခန်း လုံလောက်မှုမရှိသည့်အတွက် ဤအစီအစဉ်ကို ရိုက်ကူးမည်မဟုတ်ပါ။ လက်ရှိရိုက်ကူးချက်အချို့ကို ဖျက်ကြည့်ပါ။"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"သိုလှောင်မှုများ ပျောက်ဆုံးနေခြင်း"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR က အသုံးပြုသော သိုလှောင်ခန်းအချို့မှာ ပျောက်ဆုံးနေသည်။ DVR ကို ပြန်ဖွင့်ရန်အတွက် ယခင်က အသုံးပြုခဲ့သော ပြင်ပသုံးအခွေဖွင့်စက်နှင့် ချိတ်ဆက်ပါ။ နောက်တစ်နည်းအနေဖြင့် ၎င်းကို အသုံးပြု၍ မရတော့လျှင် မေ့ပစ်ရန် ရွေးချယ်နိုင်ပါသည်။"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"သိုလှောင်ခန်းကို မေ့ပစ်မလား။"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"သင်မှတ်တမ်းတင်ထားသော အကြောင်းအရာနှင့် အချိန်ဇယားများအားလုံး ဆုံးရှုံးသွားလိမ့်မည်။"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"ရိုက်ကူးခြင်းကို ရပ်လိုပါသလား။"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ဖမ်းယူထားသည့် အကြောင်းအရာကို သိမ်းဆည်းထားပါမည်။"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ကို ဖမ်းယူခြင်းသည် ဤပရိုဂရမ်နှင့် ပဋိပက္ခများ ဖြစ်နေသောကြောင့် ၎င်းသည် ရပ်တန့်သွားပါမည်။ ဖမ်းယူထားသည့် အကြောင်းအရာကို သိမ်းဆည်းသွားပါမည်။"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ဖမ်းယူရန် စီစဉ်ထားသော်လည်း အချိန်ဇယားတိုက်နေပါသည်"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ဖမ်းယူမှုကို စတင်လိုက်ပါပြီ။ သို့သော် အချိန်ဇယားတိုက်နေပါသည်"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ကို ဖမ်းယူသွားပါမည်။"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"တူညီသည့် ပရိုဂရမ်ကို <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> ၌ ဖမ်းယူရန် စီစဉ်ထားပြီး ဖြစ်ပါသည်။"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"ဖမ်းယူပြီးပါပြီ"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"ဤပရိုဂရမ်ကို ဖမ်းယူပြီးပါပြီ။ ၎င်းကို DVR စာကြည့်တိုက်တွင် ကြည့်ရှုနိုင်ပါသည်။"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"စီးရီးများကို ဖမ်းယူခြင်းကို စီစဉ်ထားပါသည်"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_3">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။</item>
- <item quantity="one">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_1">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_3">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။ ပဋိပက္ခများ ရှိနေသဖြင့် ၎င်းတို့အနက်မှ <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> ခုကို ကူးယူသွားမည် မဟုတ်ပါ။</item>
- <item quantity="one">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_1">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။ ပဋိပက္ခများ ရှိနေသဖြင့် ၎င်းကို ကူးယူသွားမည် မဟုတ်ပါ။</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_4">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။ ပဋိပက္ခများ ရှိနေသဖြင့် ဤစီးရီးနှင့် အခြားစီးရီးများ၏ ဇာတ်လမ်းပိုင်း <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ပိုင်းကို ကူးယူသွားမည်မဟုတ်ပါ။</item>
- <item quantity="one">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_1">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။ ပဋိပက္ခများ ရှိနေသဖြင့် ဤစီးရီးနှင့် အခြားစီးရီးများ၏ ဇာတ်လမ်းပိုင်း <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ပိုင်းကို ကူးယူသွားမည်မဟုတ်ပါ။</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_3">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။ ပဋိပက္ခများ ရှိနေသဖြင့် အခြားစီးရီးများ၏ ဇာတ်လမ်းပိုင်း ၁ ပိုင်းကို ကူးယူသွားမည်မဟုတ်ပါ။</item>
- <item quantity="one">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_1">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။ ပဋိပက္ခများ ရှိနေသဖြင့် အခြားစီးရီးများ၏ ဇာတ်လမ်းပိုင်း ၁ ပိုင်းကို ကူးယူသွားမည်မဟုတ်ပါ။</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_4">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။ ပဋိပက္ခများ ရှိနေသဖြင့် အခြားစီးရီးများ၏ ဇာတ်လမ်းပိုင်း <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ပိုင်းကို ကူးယူသွားမည်မဟုတ်ပါ။</item>
- <item quantity="one">ရိုက်ကူးမှု <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ခုကို <xliff:g id="SERIESNAME_1">%2$s</xliff:g> အတွက် စီစဉ်ထားပါသည်။ ပဋိပက္ခများ ရှိနေသဖြင့် အခြားစီးရီးများ၏ ဇာတ်လမ်းပိုင်း <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ပိုင်းကို ကူးယူသွားမည်မဟုတ်ပါ။</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"ရိုက်ကူးထားသည့်ပရိုဂရမ်ကို မတွေ့ပါ။"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"ဆက်စပ်နေသည့် ရိုက်ကူးမှုများ"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(ပရိုဂရမ် ဖော်ပြချက်မရှိပါ)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"ဇာတ်လမ်းတွဲဖမ်းယူခြင်းကို ရပ်မလား။"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"ဖမ်းယူထားသည့် အပိုင်းများသည် DVR စာကြည့်တိုက်တွင် ရှိနေဦးမည်ဖြစ်သည်။"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"ရပ်ရန်"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ယခု မည်သည့် ဇာတ်လမ်းပိုင်းကိုမျှ လွှင့်နေခြင်း မရှိပါ။"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"အပိုင်းငယ်များ မရနိုင်သေးပါ။\nရနိုင်သည်နှင့် ၎င်းတို့ကို ဖမ်းယူသွားပါမည်။"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d မိနစ်)</item>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index d3f3324a..a2cf46cc 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Play-kontroller"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanaler"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Nylige kanaler"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV-alternativer"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP-alternativer"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Play-kontroller er ikke tilgjengelige for denne kanalen"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Spill av eller sett på pause"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Spol fremover"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Teksting"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Visningsmodus"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"På"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Av"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Flere lydspor"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Få flere kanaler"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Innstillinger"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Kilde"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Bytt"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"På"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Av"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Lyd"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Hovedkontroll"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP-vindu"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Utforming"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Nede til høyre"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Oppe til høyre"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Oppe til venstre"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Nede til venstre"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Side om side"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Størrelse"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Stor"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Liten"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Inndatakilde"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antenne/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Ingen programinformasjon"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Ingen informasjon"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blokkert kanal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Ukjent språk"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Teksting %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Ukjent språk"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Teksting for hørselshemmede"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Av"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Tilpass formatering"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Prøv på nytt, PIN-koden er feil."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Prøv på nytt, PIN-koden er feil"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Skriv inn postnummeret ditt."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Direkte-TV-appen bruker postnummeret til å oppgi en fullstendig programoversikt for TV-kanalene."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Skriv inn postnummeret ditt"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Ugyldig postnummer"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Innstillinger"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Tilpass kanallisten"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Velg kanaler for programoversikten din"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Foreldrekontroll"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Lisenser for åpen kildekode"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Åpen kildekode-lisenser"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Send tilbakemelding"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versjon"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"For å se på denne kanalen, trykk til høyre og skriv inn PIN-koden din"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"For å se på dette programmet, trykk til høyre og skriv inn PIN-koden din"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Trykk på «SELECT» (VELG)"</b>" for å åpne TV-menyen."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Kunne ikke finne noen TV-inngang"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Kunne ikke finne TV-inngangen"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP støttes ikke"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Det finnes ingen tilgjengelige inndata som kan vises med PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tuner-typen kan ikke brukes. Kjør Live TV-appen med tuner-typen for TV-inndata."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Justering mislyktes."</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Kunne ikke finne noen app som kan håndtere denne handlingen."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Lagre"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Engangsopptak har høyeste prioritet"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Avbryt"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Avbryt"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Glem"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Stopp"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Se tidsplanen for opptak"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Bare dette programmet"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Spill inn dette i stedet"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Kanseller dette opptaket"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Se nå"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Slett opptak …"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Opptaksbar"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Opptak planlagt"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Opptakskonflikt"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Tar opp"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Opptaket mislyktes"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Leser av programmer for å opprette tidsplaner for opptak"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Leser av programmer"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Se nylige opptak"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Opptaket av <xliff:g id="PROGRAMNAME">%1$s</xliff:g> er ufullstendig."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Opptakene av <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> og <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> er ufullstendige."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Opptakene av <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> og <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> er ufullstendige."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Opptaket av <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ble ikke fullført på grunn av utilstrekkelig lagringsplass."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Opptakene av <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> og <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ble ikke fullført på grunn av utilstrekkelig lagringsplass."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Opptakene av <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> og <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ble ikke fullført på grunn av utilstrekkelig lagringsplass."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Leser av programmer"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR trenger mer lagringsplass"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Det kommer til å være mulig til å ta opp programmer med DVR. Det er imidlertid ikke nok lagringsplass på enheten din til at DVR kan fungere. Koble til en ekstern stasjon på <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB eller mer, og følg trinnene for å formatere den som lagringsenhet."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Ikke nok lagringsplass"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Dette programmet blir ikke tatt opp fordi det ikke er nok lagringsplass. Prøv å slette noen eksisterende opptak."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Manglende lagringsplass"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Noe av lagringsplassen som brukes av DVR, mangler. Koble til den eksterne disken du bruke tidligere, for å slå på DVR igjen. Eventuelt kan du velge å glemme lagringsplassen hvis den ikke er tilgjengelig lenger."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Vil du glemme lagring?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Alt innspilt innhold og alle tidsplanene går tapt."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Vil du stoppe opptaket?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Det innspilte innholdet blir lagret."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Opptaket av <xliff:g id="PROGRAMNAME">%1$s</xliff:g> stoppes fordi det har konflikter med dette programmet. Det innspilte innholdet blir lagret."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Opptak er planlagt, men har konflikter"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Opptak har startet, men har konflikter"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> blir tatt opp."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Det samme programmet er allerede planlagt for opptak <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Allerede tatt opp"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Dette programmet er allerede tatt opp. Det er tilgjengelig i DVR-biblioteket."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Opptak av serie er planlagt"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> av dem blir ikke tatt opp på grunn av konflikter.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Det blir ikke tatt opp på grunn av konflikter.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episoder av denne serien og andre serier blir ikke tatt opp på grunn av konflikter.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episoder av denne serien og andre serier blir ikke tatt opp på grunn av konflikter.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Én episode av andre serier blir ikke tatt opp på grunn av konflikter.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Én episode av andre serier blir ikke tatt opp på grunn av konflikter.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episoder av andre serier blir ikke tatt opp på grunn av konflikter.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opptak er planlagt for <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episoder av andre serier blir ikke tatt opp på grunn av konflikter.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Finner ikke programopptaket."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Relaterte opptak"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Ingen programbeskrivelse)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Vil du stoppe opptaket av serien?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Episoder som er tatt opp, er fremdeles tilgjengelige i DVR-biblioteket."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Stopp"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Ingen episoder er på luften nå."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Ingen episoder er tilgjengelige.\nDe blir tatt opp når de er tilgjengelige."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutter)</item>
diff --git a/res/values-ne-rNP-v23/strings.xml b/res/values-ne-v23/strings.xml
index 67220466..67220466 100644
--- a/res/values-ne-rNP-v23/strings.xml
+++ b/res/values-ne-v23/strings.xml
diff --git a/res/values-ne-rNP/arrays.xml b/res/values-ne/arrays.xml
index a6dc0066..a6dc0066 100644
--- a/res/values-ne-rNP/arrays.xml
+++ b/res/values-ne/arrays.xml
diff --git a/res/values-ne-rNP/rating_system_strings.xml b/res/values-ne/rating_system_strings.xml
index 776e7175..776e7175 100644
--- a/res/values-ne-rNP/rating_system_strings.xml
+++ b/res/values-ne/rating_system_strings.xml
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne/strings.xml
index c11820f4..142dfade 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"मोनो"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"स्टेरियो"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"प्ले नियन्त्रणहरु"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"च्यानलहरू"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"भर्खरैका च्यानलहरू"</string>
<string name="menu_title_options" msgid="7184594626814914022">"टिभी विकल्पहरू"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP विकल्पहरू"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"यस च्यानलका लागि प्ले नियन्त्रणहरू अनुपलब्ध"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"प्ले वा पज"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"फास्ट फर्वार्ड"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"बन्द क्याप्सनहरु"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"डिस्प्ले मोड"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"खुला"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"बन्द"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"मल्टि-अडियो"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"अझ बढी च्यानलहरू प्राप्त गर्नुहोस्"</string>
<string name="options_item_settings" msgid="7623205838542400074">"सेटिङहरू"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"स्रोत"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"स्वाप"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"खुला"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"बन्द"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"आवाज"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"मुख्य"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP सन्झ्याल"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"लेआउट"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"तल्लो दायाँ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"माथिल्लो दायाँ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"माथिल्लो बायाँ"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"तल्लो बायाँ"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"सँगसँगै"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"आकार"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"ठूलो"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"सानो"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"इनपुट स्रोत"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"टिभी (एन्टेना/केबल)"</string>
<string name="no_program_information" msgid="1049844207745145132">"कुनै पनि कार्यक्रम जानकारी छैन"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"केही सूचना छैन"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"अवरुद्ध च्यानल"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"अज्ञात भाषा"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"उपशीर्षकहरू %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"अज्ञात भाषा"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"उपशीर्षक"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"बन्द गर्नुहोस्"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"फर्‍म्याटिङ अनुकूलित"</string>
@@ -54,7 +73,7 @@
<string name="multi_audio_channel_surround_6" msgid="6066304966228963942">"५.१ सराउन्ड"</string>
<string name="multi_audio_channel_surround_8" msgid="2765140653768694313">"७.१ सराउन्ड"</string>
<string name="multi_audio_channel_suffix" msgid="4443825738196093772">"%d च्यानलहरु"</string>
- <string name="side_panel_title_edit_channels_for_an_input" msgid="7334895164698222989">"च्यानल सूची आफू अनुकूल गर्नुहोस्"</string>
+ <string name="side_panel_title_edit_channels_for_an_input" msgid="7334895164698222989">"च्यानल सूची अनुकूलन गर्नुहोस्"</string>
<string name="edit_channels_item_select_group" msgid="4953000352257999703">"समूह छान्नुहोस्"</string>
<string name="edit_channels_item_deselect_group" msgid="5092649099546997807">"समूह अचयन नगर्नुहोस्"</string>
<string name="edit_channels_item_group_by" msgid="7794571851966798199">"द्वारा समूह"</string>
@@ -93,7 +112,7 @@
<string name="option_rating_high" msgid="8898400296730158893">"उच्च प्रतिबन्धहरू"</string>
<string name="option_rating_medium" msgid="6455853836426497151">"मध्यम प्रतिबन्धहरू"</string>
<string name="option_rating_low" msgid="5800146024503377969">"न्यून प्रतिबन्धहरू"</string>
- <string name="option_rating_custom" msgid="3155377834510646436">"आफू अनुकूल"</string>
+ <string name="option_rating_custom" msgid="3155377834510646436">"अनुकूलन"</string>
<string name="option_rating_high_description" msgid="609567565273278745">"बालबालिकाका लागि उपयुक्त सामग्री"</string>
<string name="option_rating_medium_description" msgid="7169199016608935280">"ठूला बच्चाहरुका लागि उपयुक्त सामग्री"</string>
<string name="option_rating_low_description" msgid="4740109576615335045">"किशोर किशोरीहरुका लागि उपयुक्त सामग्री"</string>
@@ -116,19 +135,14 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"त्यो PIN गलत थियो। पुनः प्रयास गर्नुहोस्।"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"पुनः प्रयास गर्नुहोस्, PIN मेल खाँदैन"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"आफ्नो जिप कोड प्रविष्ट गर्नुहोस्।"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"TV च्यानलहरूको कार्यक्रमको बारेमा समग्र मार्गदर्शन प्रदान गर्न लाइभ च्यानल अनुप्रयोगले उक्त जिप कोड प्रयोग गर्नेछ।"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"आफ्नो जिप कोड प्रविष्ट गर्नुहोस्"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"अमान्य ZIP कोड"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"सेटिङहरू"</string>
- <string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"च्यानलको सूची आफू अनुकूल गर्नुहोस्"</string>
+ <string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"च्यानलको सूची अनुकूलन गर्नुहोस्"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"आफ्नो कार्यक्रम निर्देशिकाको लागि च्यानलहरू छनौट गर्नुहोस्"</string>
<string name="settings_channel_source_item_setup" msgid="4566190088656419070">"च्यानलका स्रोतहरू"</string>
<string name="settings_channel_source_item_setup_new_inputs" msgid="4845822152617430787">"नयाँ च्यानलहरू उपलब्ध छन्"</string>
<string name="settings_parental_controls" msgid="5449397921700749317">"अभिभावकीय नियन्त्रणहरू"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"स्रोतका इजाजतपत्रहरू खोल्नुहोस्"</string>
- <string name="dialog_title_licenses" msgid="4471754920475076623">"खुला स्रोतका इजाजतपत्रहरू"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"प्रतिक्रिया पठाउनुहोस्"</string>
+ <string name="dialog_title_licenses" msgid="4471754920475076623">"खुला स्रोत इजाजतपत्रहरू"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"संस्करण"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"यो च्यानल हेर्न, दायाँ प्रेस गर्नुहोस् र आफ्नो पिन प्रविष्ट गर्नुहोस्"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"यो कार्यक्रम हेर्न, दायाँ प्रेस गर्नुहोस् र आफ्नो पिन प्रविष्ट गर्नुहोस्"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"टिभी मेनु खोल्न "<b>"SELECT थिच्नुहोस्"</b>"।"</string>
<string name="msg_no_input" msgid="3897674146985427865">"कुनै पनि टिभी स्रोत भेटिएन।"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"टिभी स्रोत भेटिएन लागेन"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP समर्थित छैन"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP सँग देखाउन सकिने कुनै स्रोत उपलब्ध छैन।"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ट्यूनर प्रकार अनुपयुक्त। कृपया ट्यूनर प्रकार टिभी स्रोतको लागि Live TV को अनुप्रयोग सुरु गर्नुहोस।"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ट्युन गर्न असफल"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"यो कार्य सम्हाल्न कुनै पनि अनुप्रयोग भेटिएन।"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"सुरक्षित गर्नुहोस्"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"एक-पटके रेकर्डिङहरूलाई सबैभन्दा उच्च प्राथमिकता दिइन्छ"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"रद्द गर्नु"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"रद्द गर्नुहोस्"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"बिर्सनुहोस्"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"रोक्नुहोस्"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"रेकर्डिङको समयतालिका हेर्नुहोस्"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"यो कार्यक्रम मात्र"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"बरु यो रेकर्ड गर्नुहोस्"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"यस रेकर्डिङलाई रद्द गर्नुहोस्"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"अहिले हेर्नुहोस्"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"रेकर्डिङहरू मेट्नुहोस्…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"रेकर्ड गर्न मिल्ने"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"रेकर्डिङको कार्यतालिका निर्धारण गरिएको छ"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"रेकर्डिङ सम्बन्धी असहमति"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"रेकर्ड गर्दै"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"रेकर्डिङ गर्न सकिएन"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"रेकर्डिङका समय तालिकाहरू सिर्जना गर्न कार्यक्रमहरू पढ्दै"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"कार्यक्रमहरूको जानकारी पढ्दै"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"हालका रेकर्डिङहरू हेर्नुहोस्"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> को रेकर्डिङ अपूर्ण छ।"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> र <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> का रेकर्डिङहरू अपूर्ण छन्।"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> र <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> का रेकर्डिङहरू अपूर्ण छन्।"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"भण्डारण स्थान अपर्याप्त भएकाले <xliff:g id="PROGRAMNAME">%1$s</xliff:g> को रेकर्डिङ पूरा भएन।"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"भण्डारण स्थान अपर्याप्त भएकाले <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> र <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> का रेकर्डिङहरू पूरा भएनन्।"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"भण्डारण स्थान अपर्याप्त भएकाले <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> र <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> का रेकर्डिङहरू पूरा भएनन्।"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"कार्यक्रमहरूको जानकारी पढ्दै"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR लाई थप भण्डारण चाहिन्छ"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"तपाईँले DVR मार्फत कार्यक्रमहरू रेकर्ड गर्न सक्नुहुनेछ। यद्यपि, अहिले तपाईँको यन्त्रमा DVR ले काम गर्न पुग्ने गरी पर्याप्त भण्डारण छैन। कृपया <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> जि.बि.वा सो भन्दा बढी भण्डारण क्षमता भएको कुनै बाह्य ड्राइभ जडान गर्नुहोस् र त्यसलाई यन्त्रको भण्डारणका रूपमा फर्म्याट गर्न आवश्यक कदमहरू चाल्नुहोस्।"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"पर्याप्त भण्डारण छैन"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"पर्याप्त भण्डारण उपलब्ध नभएको हुनाले यस कार्यक्रमलाई रेकर्ड गरिने छैन। केही विद्यमान रेकर्डिङहरू मेटाई हेर्नुहोस्।"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"भण्डारण उपलब्ध छैन"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR ले प्रयोग गरेको केही भण्डारण उपलब्ध छैन। DVR लाई पुन: सक्षम पार्न कृपया तपाईँले पहिले प्रयोग गर्नुभएको बाह्य ड्राइभलाई जडान गर्नुहोस्। वैकल्पिक रूपमा, यदि अब भण्डारण उपलब्ध छैन भने तपाईँ त्यसलाई बिर्सने विकल्प छान्न सक्नुहुन्छ।"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"भण्डारण बिर्सने हो?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"तपाईँका रेकर्ड गरिएका सबै सामग्री र समय सहितका कार्यतालिकाहरू हराउने छन्।"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"रेकर्डिङ रोक्ने हो?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"रेकर्ड गरिएको सामग्रीलाई सुरक्षित गरिनेछ।"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"यस कार्यक्रमसँग परस्पर विरोधी भएकाले <xliff:g id="PROGRAMNAME">%1$s</xliff:g> को रेकर्डिङ रोकिने छ। रेकर्ड गरिएका सामग्रीहरू सुरक्षित गरिने छन्।"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"रेकर्डिङको कार्यतालिका निर्धारण गरिएको छ तर यसमा असहमतिहरू छन्"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"रेकर्डिङ सुरु भएको छ तर यसमा असहमतिहरू छन्"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> लाई रेकर्ड गरिनेछ।"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"यस कार्यक्रमलाई पहिले नै <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> मा रेकर्ड गर्न समय सहितको कार्यतालिका निर्धारण गरिएको छ।"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"पहिले नै रेकर्ड गरिएको छ"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"यस कार्यक्रमलाई पहिले नै रेकर्ड गरिएको छ। यो DVR को लाइब्रेरीमा उपलब्ध छ।"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"शृङ्खलाहरूको रेकर्डिङको समय तालिका बनाइयो"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> का <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रेकर्डिङहरूको समय तालिका तय गरिएको छ।</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> को <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> रेकर्डिङको समय तालिका तय गरिएको छ।</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> का <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रेकर्डिङहरूको समय तालिका तय गरिएको छ। तालमेल नमिलेका कारण ती मध्ये <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> लाई रेकर्ड गरिने छैन।</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> को <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> रेकर्डिङको समय तालिका तय गरिएको छ। तालमेल नमिलेका कारण यसलाई रेकर्ड गरिने छैन।</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> का <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रेकर्डिङहरूको समय तालिका तय गरिएको छ। तालमेल नमिलेका कारण यस शृङ्खला र अन्य शृङ्खलाका <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> एपिसोडहरूलाई रेकर्ड गरिने छैन।</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> को <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> रेकर्डिङको समय तालिका तय गरिएको छ। तालमेल नमिलेका कारण यस शृङ्खला र अन्य शृङ्खलाका <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> एपिसोडहरूलाई रेकर्ड गरिने छैन।</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> का <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> रेकर्डिङहरूको समय तालिका तय गरिएको छ। तालमेल नमिलेका कारण अन्य शृङ्खलाको १ एपिसोडलाई रेकर्ड गरिने छैन।</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> को <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> रेकर्डिङको समय तालिका तय गरिएको छ। तालमेल नमिलेका कारण अन्य शृङ्खलाको १ एपिसोडलाई रेकर्ड गरिने छैन।</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> का <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> रेकर्डिङहरूको समय तालिका तय गरिएको छ। तालमेल नमिलेका कारण अन्य शृङ्खलाका <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> एपिसोडहरूलाई रेकर्ड गरिने छैन।</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> को <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> रेकर्डिङको समय तालिका तय गरिएको छ। तालमेल नमिलेका कारण अन्य शृङ्खलाका <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> एपिसोडहरूलाई रेकर्ड गरिने छैन।</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"रेकर्ड गरिएको कार्यक्रम भेट्टिएन।"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"सम्बन्धित रेकर्डिङहरू"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(कार्यक्रम सम्बन्धी वर्णन छैन)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"शृंखलाको रेकर्डिङ रोक्ने हो?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"रेकर्ड गरिएका एपिसोडहरू DVR सम्बन्धी लाइब्रेरीमा उपलब्ध रहनेछन्।"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"रोक्नुहोस्"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"अहिले कुनै एपिसोड प्रसारण भइरहेको छैन।"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"कुनै एपिसोड उपलब्ध छैन।\nएपिसोडहरू उपलब्ध भएपछि तिनीहरूलाई रेकर्ड गरिनेछ।"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d मिनेट)</item>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 218fbb9c..f24ed1c3 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Afspeelknoppen"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanalen"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Recente kanalen"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Tv-opties"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP-opties"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Er zijn geen afspeelknoppen beschikbaar voor dit kanaal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Afspelen of onderbreken"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Vooruitspoelen"</string>
@@ -31,18 +32,36 @@
<string name="channels_item_program_guide" msgid="2889807207930678418">"Programmagids"</string>
<string name="channels_item_setup" msgid="6557412175737379022">"Nieuwe kanalen beschikbaar"</string>
<string name="channels_item_app_link_app_launcher" msgid="1395352122187670523">"<xliff:g id="APP_NAME">%1$s</xliff:g> openen"</string>
- <string name="options_item_closed_caption" msgid="5945274655046367170">"Ondertitels"</string>
+ <string name="options_item_closed_caption" msgid="5945274655046367170">"Ondertiteling"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Weergavemodus"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Aan"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Uit"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Kanalen ophalen"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Instellingen"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Bron"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Wisselen"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Aan"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Uit"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Geluid"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Hoofd"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP-venster"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Lay-out"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Rechtsonder"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Rechtsboven"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Linksboven"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Linksonder"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Naast elkaar"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Formaat"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Groot"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Klein"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Invoerbron"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Tv (antenne/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Geen programmagegevens"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Geen informatie"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Geblokkeerd kanaal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Onbekende taal"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Ondertiteling %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Onbekende taal"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Ondertiteling"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Uit"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Opmaak aanpassen"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Die pincode is onjuist. Probeer het opnieuw."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Probeer het opnieuw; de pincode komt niet overeen"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Je postcode opgeven"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"De app Live tv gebruikt je postcode om een volledige programmagids voor de tv-kanalen aan te leveren."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Geef je postcode op"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Ongeldige postcode"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Instellingen"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Kanaallijst aanpassen"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Kanalen kiezen voor je tv-gids"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Ouderlijk toezicht"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Open-sourcelicenties"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Open-sourcelicenties"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Feedback verzenden"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versie"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Als je dit kanaal wilt bekijken, druk je rechts en geef je je pincode op"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Als je dit programma wilt bekijken, druk je rechts en geef je je pincode op"</string>
@@ -167,13 +181,15 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Druk op SELECTEREN"</b>" voor toegang tot het tv-menu."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Geen tv-invoer gevonden"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Kan de tv-invoer niet vinden"</string>
- <string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tunertype is geen geschikte optie. Start de Live tv-app voor tv-invoer van het type tuner."</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP wordt niet ondersteund"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Geen beschikbare invoer die kan worden weergegeven met PIP"</string>
+ <string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tunertype is geen geschikte optie. Start de app Live kanalen voor tv-invoer van het type tuner."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Afstemmen mislukt"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Er is geen app gevonden om deze actie uit te voeren."</string>
<string name="msg_all_channels_hidden" msgid="777397634062471936">"Alle bronkanalen zijn verborgen.\nSelecteer ten minste één kanaal om te bekijken."</string>
<string name="msg_channel_unavailable_unknown" msgid="765586450831081871">"De video is onverwacht niet beschikbaar"</string>
<string name="msg_back_key_guide" msgid="7404682718828721924">"De toets TERUG is voor verbonden apparaten. Druk op de knop HOME om te sluiten."</string>
- <string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"De app \'Live tv\' heeft toestemming nodig om tv-vermeldingen te lezen."</string>
+ <string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"De app \'Live kanalen\' heeft toestemming nodig om tv-vermeldingen te lezen."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Je bronnen configureren"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Live tv combineert de functionaliteit van traditionele tv-kanalen met streaming kanalen die worden geleverd door apps. \n\nJe kunt aan de slag gaan door de kanaalbronnen te configureren die al zijn geïnstalleerd. Of browse in de Google Play Store voor meer apps die live tv aanbieden."</string>
<string name="channels_item_dvr" msgid="8911915252648532469">"Opnamen en planningen"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Opslaan"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Eenmalige opnamen krijgen de hoogste prioriteit"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Annuleren"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Annuleren"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Vergeten"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Stoppen"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Opnameschema bekijken"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Dit afzonderlijke programma"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Dit programma opnemen"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Deze opname annuleren"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Nu bekijken"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Opnamen verwijderen"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Kan worden opgenomen"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Opname gepland"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Opnameconflict"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Opnemen"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Opname mislukt"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Programma\'s lezen om opnameplanningen te maken"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Programma\'s lezen"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Recente opnamen bekijken"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"De opname van <xliff:g id="PROGRAMNAME">%1$s</xliff:g> is niet voltooid."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"De opnamen van <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> en <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> zijn niet voltooid."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"De opnamen van <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> en <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> zijn niet voltooid."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"De opname van <xliff:g id="PROGRAMNAME">%1$s</xliff:g> is niet voltooid vanwege onvoldoende opslagruimte."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"De opnamen van <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> en <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> zijn niet voltooid vanwege onvoldoende opslagruimte."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"De opnamen van <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> en <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> zijn niet voltooid vanwege onvoldoende opslagruimte."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Programma\'s lezen"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Voor DVR is meer opslagruimte nodig"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Je kunt programma\'s opnemen met DVR. Er is echter momenteel onvoldoende opslagruimte beschikbaar op je apparaat om DVR te gebruiken. Sluit een externe schijf aan die <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB of groter is en volg de stappen om deze te formatteren als apparaatopslag."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Onvoldoende opslagruimte"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Dit programma wordt niet opgenomen omdat er onvoldoende opslagruimte is. Verwijder een aantal bestaande opnamen."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Opslag ontbreekt"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Een deel van de opslagruimte ontbreekt die door de DVR wordt gebruikt. Sluit de externe schijf aan die je eerder hebt gebruikt om DVR opnieuw in te schakelen. Je kunt er ook voor kiezen de opslagruimte te vergeten als deze niet langer beschikbaar is."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Opslag vergeten?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Al je opgenomen content en planningen gaan verloren."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Opname stoppen?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"De opgenomen content wordt opgeslagen."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"De opname van <xliff:g id="PROGRAMNAME">%1$s</xliff:g> wordt gestopt omdat deze conflicteert met dit programma. De opgenomen content wordt opgeslagen."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Opname ingepland, maar heeft conflicten"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"De opname is gestart, maar heeft conflicten"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> wordt opgenomen."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Hetzelfde programma is al ingepland voor opname om <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Al opgenomen"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Dit programma is al opgenomen. Het is beschikbaar in de DVR-bibliotheek."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Serie-opname gepland"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">Er zijn <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> opnamen gepland voor <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">Er is <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname gepland voor <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">Er zijn <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> opnamen gepland voor <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> hiervan worden niet opgenomen vanwege conflicten.</item>
- <item quantity="one">Er is <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname gepland voor <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Dit wordt niet opgenomen vanwege conflicten.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">Er zijn <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> opnamen gepland voor <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> afleveringen van deze serie en andere series worden niet opgenomen vanwege conflicten.</item>
- <item quantity="one">Er is <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname gepland voor <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> afleveringen van deze serie en andere series worden niet opgenomen vanwege conflicten.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">Er zijn <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> opnamen gepland voor <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 aflevering van andere series wordt niet opgenomen vanwege conflicten.</item>
- <item quantity="one">Er is <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname gepland voor <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 aflevering van andere series wordt niet opgenomen vanwege conflicten.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">Er zijn <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> opnamen gepland voor <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> afleveringen van andere series worden niet opgenomen vanwege conflicten.</item>
- <item quantity="one">Er is <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> opname gepland voor <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> afleveringen van andere series worden niet opgenomen vanwege conflicten.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Opgenomen programma niet gevonden."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Gerelateerde opnamen"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Geen programmabeschrijving)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Serie-opname stoppen?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Opgenomen afleveringen blijven beschikbaar in de DVR-bibliotheek."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Stoppen"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Er worden nu geen afleveringen uitgezonden."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Er zijn geen afleveringen beschikbaar.\nZe worden opgenomen zodra ze beschikbaar zijn."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minuten)</item>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 0b8a5c16..1e86cb7a 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Sterowanie odtwarzaniem"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanały"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Ostatnie kanały"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opcje TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opcje PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Elementy sterujące Play są niedostępne dla tego kanału"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Odtwórz lub wstrzymaj"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Przewiń do przodu"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Napisy"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Tryb wyświetl."</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Włączony"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Wyłączony"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Wiele kan. audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Więcej kanałów"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Ustawienia"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Źródło"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Przełącz"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Włączone"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Wyłączone"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Dźwięk"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Główne okno"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Okno PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Układ"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Prawy dolny róg"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Prawy górny róg"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Lewy górny róg"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Lewy dolny róg"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Obok siebie"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Rozmiar"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Duży"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Mały"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Źródło sygnału"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Brak informacji o programach"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Brak informacji"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Kanał zablokowany"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Nieznany język"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Napisy: %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Nieznany język"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Napisy"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Wył."</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Dostosuj format"</string>
@@ -120,10 +139,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Nieprawidłowy PIN. Spróbuj ponownie"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Spróbuj ponownie. Niezgodny kod PIN"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Wpisz kod pocztowy."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Aplikacja Telewizja online będzie używać kodu pocztowego, by udostępniać kompletny przewodnik po programach telewizyjnych."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Wpisz kod pocztowy"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Nieprawidłowy kod pocztowy"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Ustawienia"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Dostosuj listę kanałów"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Wybierz kanały do przewodnika TV"</string>
@@ -132,7 +147,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Kontrola rodzicielska"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licencje open source"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licencje open source"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Prześlij opinię"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Wersja"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Aby oglądać ten kanał, naciśnij Prawo i wpisz kod PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Aby oglądać ten program, naciśnij Prawo i wpisz kod PIN"</string>
@@ -175,6 +189,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Naciśnij SELECT"</b>", by otworzyć menu TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nie znaleziono wejścia TV"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Nie można znaleźć wejścia TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Tryb PIP nie jest obsługiwany"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Brak sygnału wejściowego do wyświetlenia w trybie PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Nieodpowiedni typ tunera. Uruchom aplikację Telewizja online na jego wejściu TV."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Strojenie nie powiodło się"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Nie znaleziono aplikacji do obsługi tego działania."</string>
@@ -263,6 +279,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Zapisz"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Nagrania jednorazowe mają najwyższy priorytet"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Anuluj"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Anuluj"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Zapomnij"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Zatrzymaj"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Pokaż harmonogram nagrywania"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Tylko ten program"</string>
@@ -272,29 +290,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Nagraj to w zamian"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Anuluj to nagrywanie"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Obejrzyj teraz"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Usuń nagrania…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Można nagrać"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Zaplanowano nagrywanie"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Konflikt nagrywania"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Nagrywam"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Nie udało się nagrać"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Odczytuję programy, by utworzyć harmonogram nagrywania"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Odczytuję programy"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Zobacz ostatnie nagrania"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Nagranie <xliff:g id="PROGRAMNAME">%1$s</xliff:g> jest niepełne."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Nagrania <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> i <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> są niepełne."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Nagrania <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> i <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> są niepełne."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Nie udało się dokończyć nagrania <xliff:g id="PROGRAMNAME">%1$s</xliff:g> z powodu braku miejsca."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Nie udało się dokończyć nagrań <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> i <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> z powodu braku miejsca."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Nie udało się dokończyć nagrań <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> i <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> z powodu braku miejsca."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Odczytuję programy"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Nagrywarka DVR potrzebuje więcej miejsca"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Dzięki funkcji nagrywarki DVR możesz nagrywać programy, ale obecnie na urządzeniu jest za mało miejsca, by można było z niej korzystać. Podłącz dysk zewnętrzny o pojemności co najmniej <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB i postępuj zgodnie z instrukcjami, by sformatować go jako pamięć urządzenia."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Za mało miejsca"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Nie można nagrać tego programu, bo brakuje miejsca. Usuń któreś z wcześniejszych nagrań."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Brak dostępu do pamięci"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Brak dostępu do części pamięci wykorzystywanej przez DVR. Podłącz dysk zewnętrzny, którego używasz, zanim włączysz DVR ponownie. Jeśli nie masz już tego dysku zewnętrznego, możesz go zapomnieć."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Zapomnieć pamięć nagrywarki?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Wszystkie zapisane treści i zaplanowane nagrania zostaną utracone."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Zatrzymać nagrywanie?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Nagrana treść zostanie zapisana."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Nagrywanie programu „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>” zostanie zatrzymane, bo jest w konflikcie z tym programem. Nagrane treści zostaną zachowane."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Nagrywanie zostało zaplanowane, ale wystąpiły konflikty"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Zaczęło się nagrywanie, ale występują konflikty"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Program <xliff:g id="PROGRAMNAME">%1$s</xliff:g> zostanie nagrany."</string>
@@ -314,37 +328,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Nagrywanie tego samego programu zostało już zaplanowane na <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Już nagrany"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Ten program został już nagrany. Jest dostępny w bibliotece nagrywarki DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Zaplanowano nagrywanie serialu"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="few">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="many">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nagrań serialu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nagranie serialu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="few">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Z powodu pokrywających się harmonogramów nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> odcinków.</item>
- <item quantity="many">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nagrań serialu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Z powodu pokrywających się harmonogramów nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> odcinków.</item>
- <item quantity="other">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Z powodu pokrywających się harmonogramów nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> odcinków.</item>
- <item quantity="one">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nagranie serialu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Z powodu pokrywających się harmonogramów nie uda się nagrać tego odcinka.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="few">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Z powodu pokrywających się harmonogramów nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> odcinków tego i innych seriali.</item>
- <item quantity="many">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nagrań serialu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Z powodu pokrywających się harmonogramów nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> odcinków tego i innych seriali.</item>
- <item quantity="other">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Z powodu pokrywających się harmonogramów nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> odcinków tego i innych seriali.</item>
- <item quantity="one">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nagranie serialu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Z powodu pokrywających się harmonogramów nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> odcinków tego i innych seriali.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="few">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Przez to nie uda się nagrać 1 odcinka innego serialu.</item>
- <item quantity="many">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nagrań serialu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Przez to nie uda się nagrać 1 odcinka innego serialu.</item>
- <item quantity="other">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Przez to nie uda się nagrać 1 odcinka innego serialu.</item>
- <item quantity="one">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nagranie serialu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Przez to nie uda się nagrać 1 odcinka innego serialu.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="few">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Przez to nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> odcinków innych seriali.</item>
- <item quantity="many">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nagrań serialu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Przez to nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> odcinków innych seriali.</item>
- <item quantity="other">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> nagrania serialu <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Przez to nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> odcinków innych seriali.</item>
- <item quantity="one">Zaplanowano <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> nagranie serialu <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Przez to nie uda się nagrać <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> odcinków innych seriali.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Nie znaleziono nagranego programu."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Powiązane nagrania"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Brak opisu programu)"</string>
@@ -371,7 +362,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Zatrzymać nagrywanie cykliczne?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Nagrane odcinki będą dostępne w bibliotece nagrywarki DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Zatrzymaj"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"W tej chwili nie są nadawane żadne odcinki."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Brak dostępnych odcinków.\nZostaną one nagrane, gdy będą dostępne."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="few">(%1$d minuty)</item>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 480aac5a..45fa4e20 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"estéreo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Controlos de reprodução"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Canais"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Canais recentes"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opções de TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opções de PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Controlos de reprodução indisponíveis para este canal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Reproduzir ou colocar em pausa"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Avançar"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Legendas"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Modo de apres."</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Ativado"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Desativado"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multiáudio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Obter mais canais"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Definições"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Fonte"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Alternar"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Ativado"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Desativado"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Som"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principal"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Janela de PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Esquema"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Canto inf. dir."</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Canto sup. dir."</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Canto sup. esq."</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Canto inf. esq."</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Lado a lado"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Tamanho"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Grande"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Pequeno"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Fonte de entrada"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/cabo)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Sem informação de programação"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Sem informações"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Canal bloqueado"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Idioma desconhecido"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Legendas %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Idioma desconhecido"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Legendas"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Desativado"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Person. a formatação"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Esse PIN estava errado. Tente novamente."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Tente novamente, o PIN não corresponde"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Introduza o seu código postal."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"A aplicação Canais em Direto utiliza o código postal para disponibilizar um guia de programação completo para os canais de TV."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Introduza o seu código postal"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Código postal inválido"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Definições"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personalizar lista de canais"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Escolher canais para o guia de programação"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Controlo parental"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licenças de código aberto"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licenças de código aberto"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Enviar comentários"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versão"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Para ver este canal, prima Direito e introduza o PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Para ver este programa, prima Direito e introduza o PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Prima SELECT"</b>" para aceder ao menu da TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nenhuma entrada de TV encontrada"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Não é possível localizar a entrada de TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Não é suportada a opção PIP"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Nenhuma entrada disponível para apresentar com PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tipo de sintonizador inadequado. Inicie a aplicação Canais em direito para a entrada de TV do tipo de sintonizador."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Falha ao sintonizar"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Não foram encontradas aplicações para executar esta ação."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Guardar"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"As gravações únicas têm a prioridade mais alta"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Cancelar"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Cancelar"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Esquecer"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Parar"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Ver horários de gravação"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Este programa único"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Gravar antes este"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Cancelar esta gravação"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Ver agora"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Eliminar gravações"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Gravável"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Gravação agendada"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Conflito de gravação"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"A gravar"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Falha na gravação"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"A ler os programas para criar horários de gravação…"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"A ler os programas…"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Ver gravações recentes"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"A gravação de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> está incompleta."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"As gravações de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> e <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> estão incompletas."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"As gravações de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> e <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> estão incompletas."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"A gravação de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> não foi concluída devido a armazenamento insuficiente."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"As gravações de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> e <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> não foram concluídas devido a armazenamento insuficiente."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"As gravações de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> e <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> não foram concluídas devido a armazenamento insuficiente."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"A ler os programas…"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"O DVR necessita de mais armazenamento"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Pode gravar programas com o DVR. Contudo, não existe neste momento armazenamento suficiente no dispositivo para que o DVR funcione. Ligue uma unidade externa que tenha, pelo menos, <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB e siga os passos para a formatar como armazenamento do dispositivo."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Sem armazenamento suficiente"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Este programa não será gravado porque não existe armazenamento suficiente. Experimente eliminar algumas gravações existentes."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Armazenamento em falta"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Algum do armazenamento utilizado pelo DVR está em falta. Ligue a unidade externa que utilizou anteriormente para reativar o DVR. Em alternativa, pode optar por esquecer o armazenamento se este já não estiver disponível."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Pretende esquecer o armazenamento?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Todos os seus conteúdos e agendamentos gravados serão perdidos."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Pretende parar a gravação?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"O conteúdo gravado será guardado."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"A gravação de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> será interrompida devido a conflitos com este programa. O conteúdo gravado será guardado."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Gravação agendada, mas com conflitos"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"A gravação foi iniciada, mas tem conflitos"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"O programa <xliff:g id="PROGRAMNAME">%1$s</xliff:g> será gravado."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"O mesmo programa já foi agendado para ser gravado às <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Já gravado"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Este programa já foi gravado. Está disponível na biblioteca do DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Gravação da série agendada"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">Foram agendadas <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravações para <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">Foi agendada <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravação para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">Foram agendadas <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravações para <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> destas não serão gravadas devido a conflitos.</item>
- <item quantity="one">Foi agendada <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravação para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Esta não será gravada devido a conflitos.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">Foram agendadas <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> gravações para <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episódios desta e de outras séries não serão gravados devido a conflitos.</item>
- <item quantity="one">Foi agendada <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravação para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episódios desta e de outras séries não serão gravados devido a conflitos.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">Foram agendadas <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravações para <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Não será gravado 1 episódio de outra série devido a conflitos.</item>
- <item quantity="one">Foi agendada <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravação para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Não será gravado 1 episódio de outra série devido a conflitos.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">Foram agendadas <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> gravações para <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Não serão gravados <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episódios de outras séries devido a conflitos.</item>
- <item quantity="one">Foi agendada <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> gravação para <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Não serão gravados <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episódios de outras séries devido a conflitos.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Programa gravado não encontrado."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Gravações relacionadas"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Sem descrição do programa)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Pretende parar a gravação da série?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Os episódios gravados ficam disponíveis na biblioteca do DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Parar"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Não estão a ser transmitidos episódios em direto."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Não existem episódios disponíveis.\nVão ser gravados assim que estiverem disponíveis."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minutos)</item>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index bc6f7803..9c22a58a 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"estéreo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Controles de reprodução"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Canais"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Canais recentes"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opções da TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opções de PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Controles de reprodução indisponíveis para este canal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Reproduzir ou pausar"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Avançar"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Closed captions"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Modo de exibiç."</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Ativado"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Desativado"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Múltip. áudios"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Adquirir mais canais"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Config."</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Origem"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Trocar"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Ativadas"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Desativadas"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Som"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principal"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Janela de PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Layout"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Inferior direito"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Superior direito"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Superior esquerdo"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Inferior esquerdo"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Lado a lado"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Tamanho"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Grande"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Pequeno"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Origem da entrada"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/a cabo)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Nenhuma informação sobre o programa"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Nenhuma informação"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Canal bloqueado"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Idioma desconhecido"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Closed captions %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Idioma desconhecido"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Closed captions"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Desativado"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Person. formatação"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"O PIN estava errado. Tente novamente."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Tente novamente, o PIN não corresponde"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Digite seu CEP."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"O app Canais ao vivo usará o CEP para fornecer um guia completo da programação para os canais de TV."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Digite seu CEP"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"CEP inválido"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Config."</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personalizar lista de canais"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Escolher canais para guia de programação"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Controle dos pais"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licenças de código aberto"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licenças de código aberto"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Enviar feedback"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versão"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Para assistir a este canal, pressione para a direita e digite o PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Para assistir a este programa, pressione para a direita e digite o PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Pressione \"SELECIONAR\""</b>" para acessar o menu da TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nenhuma entrada de TV encontrada"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Não foi possível encontrar a entrada de TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP não é suportado"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Não há entrada disponível que possa ser mostrada com PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tipo de sintonizador não adequado. Inicie o app \"Canais ao vivo\" para abrir o tipo de sintonizador para entrada de TV."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Falha na sintonia"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Nenhum app foi encontrado para executar esta ação."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Salvar"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Gravações únicas têm a maior prioridade"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Cancelar"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Cancelar"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Ignorar"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Parar"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Ver programação de gravação"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Este único programa"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Gravar este, e não o outro"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Cancelar esta gravação"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Assistir agora"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Excluir gravações…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Pode ser gravado"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Gravação programada"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Conflito de gravação"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Gravação"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Falha na gravação"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Lendo programas para criar programações de gravação"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Lendo programas"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Ver gravações recentes"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"A gravação de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> está incompleta."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"As gravações de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> e <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> estão incompletas."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"As gravações de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> e <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> estão incompletas."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"A gravação de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> não foi concluída devido à falta de espaço de armazenamento."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"As gravações de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> e <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> não foram concluídas devido à falta de espaço de armazenamento."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"As gravações de <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> e <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> não foram concluídas devido à falta de espaço de armazenamento."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Lendo programas"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"O DVR precisa de mais armazenamento"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Você poderá gravar programas com DVR. No entanto, não há espaço de armazenamento suficiente no seu dispositivo no momento para que o DVR funcione. Conecte um drive externo que tenha <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB ou mais e siga as etapas para formatá-lo como um armazenamento do dispositivo."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Armazenamento insuficiente"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Este programa não será gravado porque não há espaço de armazenamento suficiente. Tente excluir algumas gravações já existentes."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Armazenamento ausente"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Alguns dos armazenamentos usados por DVR estão ausentes. Conecte o drive externo usado antes de reativar o DVR. Também é possível optar por esquecer o armazenamento se ele não estiver mais disponível."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Esquecer armazenamento?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Todo o conteúdo gravado e programações serão perdidos."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Interromper gravação?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"O conteúdo gravado será salvo."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"A gravação de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> será interrompida porque ela tem um conflito com esse programa. O conteúdo gravado será salvo."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Gravação programada, mas há conflitos"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"A gravação começou, mas há conflitos"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"O programa <xliff:g id="PROGRAMNAME">%1$s</xliff:g> será gravado."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"A gravação do mesmo programa já foi programada para <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Já gravado"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Este programa já foi gravado. Ele está disponível na biblioteca de DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Gravação de série programada"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one">Foi programada <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravação de <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other">Foram programadas <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravações de <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one">Foi programada <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravação de <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Ao todo, <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> delas não serão gravadas devido a conflitos.</item>
- <item quantity="other">Foram programadas <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravações de <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Ao todo, <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> delas não serão gravadas devido a conflitos.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one">Foi programada <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> gravação de <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Ao todo, <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episódios dessa e de outras séries não serão gravados devido a conflitos.</item>
- <item quantity="other">Foram programadas <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> gravações de <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Ao todo, <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episódios dessa e de outras séries não serão gravados devido a conflitos.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one">Foi programada <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravação de <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Ao todo, 1 episódio de outras séries não será gravado devido a conflitos.</item>
- <item quantity="other">Foram programadas <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> gravações de <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Ao todo, 1 episódio de outras séries não será gravado devido a conflitos.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one">Foi programada <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> gravação de <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Ao todo, <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episódios de outras séries não serão gravados devido a conflitos.</item>
- <item quantity="other">Foram programadas <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> gravações de <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Ao todo, <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episódios de outras séries não serão gravados devido a conflitos.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Programa gravado não encontrado."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Gravações relacionadas"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"Nenhuma descrição do programa"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Parar gravação da série?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Os episódios gravados permanecerão disponíveis na biblioteca de DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Parar"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Nenhum episódio está sendo transmitido no momento."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Nenhum episódio disponível.\nOs episódios serão gravados quando estiverem disponíveis."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d minuto)</item>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index ec979f1a..adc3b359 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Comenzi de redare"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Canale"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Canale recente"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opțiuni TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Opțiuni PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Comenzile de redare nu sunt disponibile pentru acest canal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Redați sau întrerupeți redarea"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Derulați rapid înainte"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Subtitrări"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Mod de afișare"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Activat"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Dezactivat"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Obțineți mai multe canale"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Setări"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Sursă"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Schimbați"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Activat"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Dezactivat"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Sunet"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Principală"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Fereastră PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Aspect"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Dreapta jos"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Dreapta sus"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Stânga sus"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Stânga jos"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Alăturat"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Dimensiuni"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Mare"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Mic"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Sursă de intrare"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antenă/cablu)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Nu există informații despre program"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Nicio informație"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Canal blocat"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Limbă necunoscută"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Subtitrări %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Limbă necunoscută"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Subtitrări"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Dezactivat"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Personaliz. format."</string>
@@ -118,10 +137,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Codul PIN a fost greșit. Încercați din nou."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Încercați din nou. Codul PIN nu se potrivește."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Introduceți codul poștal"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Aplicația Canale live va folosi codul poștal pentru a vă oferi un ghid de programe complet pentru canalele TV."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Introduceți codul poștal"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Cod poștal nevalid"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Setări"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Personalizați lista de canale"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Alegeți canale pentru ghidul de programe"</string>
@@ -130,7 +145,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Control parental"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licențe open source"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licențe open source"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Trimiteți feedback"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versiune"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Pentru a viziona acest canal, apăsați la dreapta și introduceți codul PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Pentru a viziona acest program, apăsați la dreapta și introduceți codul PIN"</string>
@@ -171,6 +185,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Apăsați pe SELECTAȚI"</b>" pentru a accesa meniul TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nu s-a găsit nicio intrare TV"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Nu se poate găsi intrarea TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Funcția PIP nu este acceptată"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Nu există intrări disponibile pentru afișarea cu PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tipul tuner nu este corespunzător. Lansați aplicația Canale live pentru intrarea TV tip tuner."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Eroare la optimizare"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Nu s-a găsit o aplicație care să îndeplinească această acțiune."</string>
@@ -253,6 +269,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Salvați"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Înregistrările unice au cea mai mare prioritate"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Anulați"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Anulați"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Eliminați"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Opriți"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Vedeți programul de înregistrare"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Numai acest program"</string>
@@ -262,29 +280,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Înregistrați acest program"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Anulați această înregistrare"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Vedeți acum"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Ștergeți înregistrări…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Se poate înregistra"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Înregistrare programată"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Conflict privind înregistrarea"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Se înregistrează"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Nu s-a înregistrat"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Se citesc programele pentru crearea programărilor de înregistrare"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Se citesc programele"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Vedeți înregistrările recente"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Înregistrarea pentru <xliff:g id="PROGRAMNAME">%1$s</xliff:g> nu este finalizată."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Înregistrările pentru <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> și <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> nu sunt finalizate."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Înregistrările pentru <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> și <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> nu sunt finalizate."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Înregistrarea pentru <xliff:g id="PROGRAMNAME">%1$s</xliff:g> nu s-a finalizat, din cauza spațiului de stocare insuficient."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Înregistrările pentru <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> și <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> nu s-au finalizat, din cauza spațiului de stocare insuficient."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Înregistrările pentru <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> și <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> nu s-au finalizat, din cauza spațiului de stocare insuficient."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Se citesc programele"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR are nevoie de mai mult spațiu de stocare"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Veți putea înregistra programe folosind DVR. Cu toate acestea, momentan, pe dispozitiv nu există suficient spațiu de stocare ca să funcționeze DVR-ul. Conectați o unitate externă de cel puțin <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB și urmați pașii pentru a o formata ca stocare pe dispozitiv."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Nu există suficient spațiu de stocare"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Programul nu va fi înregistrat, deoarece nu există suficient spațiu de stocare. Ștergeți unele înregistrări existente."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Stocare lipsă"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"O parte din stocarea folosită de DVR lipsește. Pentru a reactiva DVR, conectați unitatea externă folosită anterior. Dacă stocarea externă nu mai este disponibilă, puteți să o eliminați."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Eliminați stocarea?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Tot conținutul înregistrat și toate programările vor fi șterse."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Opriți înregistrarea?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Conținutul înregistrat va fi salvat."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Înregistrarea pentru <xliff:g id="PROGRAMNAME">%1$s</xliff:g> va fi oprită, deoarece există conflicte cu acest program. Conținutul înregistrat va fi salvat."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Înregistrarea a fost programată, dar există conflicte"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Înregistrarea a început, dar există conflicte"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> va fi înregistrat."</string>
@@ -303,32 +317,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Același program a fost programat deja pentru înregistrare la <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Înregistrat deja"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Acest program a fost înregistrat deja. Este disponibil în biblioteca DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Înregistrarea serialului a fost programată"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> înregistrări au fost programate pentru <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> de înregistrări au fost programate pentru <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> înregistrare a fost programată pentru <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> înregistrări au fost programate pentru <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> dintre acestea nu vor fi înregistrate din cauza unor conflicte.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> de înregistrări au fost programate pentru <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> dintre acestea nu vor fi înregistrate din cauza unor conflicte.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> înregistrare a fost programată pentru <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Nu va fi înregistrată din cauza unor conflicte.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> înregistrări au fost programate pentru <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episoade din acest serial și din alte seriale nu vor fi înregistrate din cauza unor conflicte.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> de înregistrări au fost programate pentru <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episoade din acest serial și din alte seriale nu vor fi înregistrate din cauza unor conflicte.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> înregistrare a fost programată pentru <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episoade din acest serial și din alte seriale nu vor fi înregistrate din cauza unor conflicte.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> înregistrări au fost programate pentru <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Un episod din alte seriale nu va fi înregistrat din cauza unor conflicte.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> de înregistrări au fost programate pentru <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Un episod din alte seriale nu va fi înregistrat din cauza unor conflicte.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> înregistrare a fost programată pentru <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Un episod din alte seriale nu va fi înregistrat din cauza unor conflicte.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> înregistrări au fost programate pentru <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episoade din alte seriale nu vor fi înregistrate din cauza unor conflicte.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> de înregistrări au fost programate pentru <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episoade din alte seriale nu vor fi înregistrate din cauza unor conflicte.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> înregistrare a fost programată pentru <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> episoade din alte seriale nu vor fi înregistrate din cauza unor conflicte.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Programul înregistrat nu a fost găsit."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Înregistrări conexe"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Nicio descriere de program)"</string>
@@ -353,7 +349,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Opriți înregistrarea seriei?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Episoadele înregistrate vor rămâne disponibile în biblioteca DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Opriți"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Acum nu este difuzat niciun episod."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Nu există episoade disponibile.\nAcestea vor fi înregistrate de îndată ce vor fi disponibile."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="few">(%1$d minute)</item>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 0ac177d9..61bef1f6 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"Моно"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"Стерео"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Управление"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Каналы"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Недавние каналы"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Настройки ТВ"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Настройки PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Команды управления недоступны для этого канала"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Воспроизведение/пауза"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Перемотать вперед"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Субтитры"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Режим"</string>
<string name="options_item_pip" msgid="3951350386626879645">"Кадр в кадре"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Вкл."</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Выкл."</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Многоканальный"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Ещё каналы"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Настройки"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Источник"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Поменять"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Вкл."</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Выкл."</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Звук"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Главное окно"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Кадр в кадре"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Расположение"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Справа внизу"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Справа вверху"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Слева вверху"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Слева внизу"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Рядом"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Размер"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Крупный"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Мелкий"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Источник"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"ТВ (антенна/кабель)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Нет информации о программах"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Неизвестно"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Заблокированный канал"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Неизвестный язык"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Субтитры (%1$d)"</string>
+ <string name="default_language" msgid="4122326459624337928">"Неизвестный язык"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Субтитры"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Выкл."</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Настройка субтитров"</string>
@@ -120,10 +139,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Неверный PIN-код. Повторите попытку."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN-коды не совпадают. Повторите попытку."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Введите почтовый индекс"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Приложение \"Прямой эфир\" использует почтовый индекс, чтобы создавать телегид специально для вас."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Введите почтовый индекс"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Недопустимый почтовый индекс."</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Настройки"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Настроить список"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Выбрать каналы для телегида"</string>
@@ -132,7 +147,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Родительский контроль"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Лицензии открытого ПО"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Лицензии открытого ПО"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Отправить отзыв"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Версия"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Чтобы смотреть этот канал, нажмите стрелку вправо и введите PIN-код."</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Чтобы смотреть эту программу, нажмите стрелку вправо и введите PIN-код."</string>
@@ -175,6 +189,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Нажмите кнопку \"ВЫБРАТЬ\""</b>", чтобы открыть меню телевизора."</string>
<string name="msg_no_input" msgid="3897674146985427865">"ТВ-вход не найден"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Не удается найти ТВ-вход"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP не поддерживается"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Нет источника для режима PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Для ТВ-входа типа \"тюнер\" используйте приложение \"Прямой эфир\""</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Не удалось выполнить настройку"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Действие не поддерживается ни в одном приложении."</string>
@@ -263,6 +279,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Сохранить"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Однократная запись имеет самый высокий приоритет"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Отмена"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Отмена"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Удалить"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Остановить"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Смотреть расписание записи"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Только эту серию"</string>
@@ -272,29 +290,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Записать эту программу"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Отменить эту запись"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Смотреть"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Удалить записи…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Можно записать"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Таймер записи установлен"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Конфликт таймера записи"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Идет запись"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Ошибка записи видео"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Выполняется чтение программ. Будет создано расписание записи."</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Выполняется чтение программ…"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Недавние записи"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Не удалось завершить запись \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\"."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Не удалось завершить записи \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\" и \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\"."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Не удалось завершить записи \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\", \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" и \"<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>\"."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Не удалось завершить запись \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" из-за нехватки места."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Не удалось завершить записи \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\" и \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" из-за нехватки места."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Не удалось завершить записи \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\", \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" и \"<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>\" из-за нехватки места."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Выполняется чтение программ…"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Недостаточно места на устройстве"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Вы сможете записывать программы на DVR, однако в настоящее время на вашем устройстве недостаточно места. Подключите внешний накопитель объемом не менее <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> ГБ и отформатируйте его как память устройства."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Недостаточно места"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Недостаточно места для сохранения данных. Попробуйте удалить несколько ненужных записей."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Хранилище отсутствует"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Хранилище не найдено. Подсоедините внешний диск, прежде чем снова включить видеомагнитофон, либо удалите хранилище, если оно недоступно."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Удалить хранилище?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Все созданные и запланированные записи будут стерты."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Остановить запись?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Записанный контент будет сохранен."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Запись сериала \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" будет остановлена из-за конфликта в расписании. Записанный контент сохранится."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Возник конфликт в расписании записи"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Возник конфликт в расписании записи"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Программа \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" будет записана."</string>
@@ -314,37 +328,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Запись этой программы уже запланирована на <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Программа уже записана"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Эта программа сохранена в библиотеке видеорекордера."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Запись запланирована"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one">Запланирована <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> запись сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\".</item>
- <item quantity="few">Запланировано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\".</item>
- <item quantity="many">Запланировано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записей сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\".</item>
- <item quantity="other">Запланировано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\".</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one">Запланирована <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> запись сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>) этого сериала не будут записаны из-за конфликта в расписании.</item>
- <item quantity="few">Запланировано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>) этого сериала не будут записаны из-за конфликта в расписании.</item>
- <item quantity="many">Запланировано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записей сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>) этого сериала не будут записаны из-за конфликта в расписании.</item>
- <item quantity="other">Запланировано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>) этого сериала не будут записаны из-за конфликта в расписании.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one">Запланирована <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> запись сериала \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) этого и других сериалов не будут записаны из-за конфликта в расписании.</item>
- <item quantity="few">Запланировано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) этого и других сериалов не будут записаны из-за конфликта в расписании.</item>
- <item quantity="many">Запланировано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записей сериала \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) этого и других сериалов не будут записаны из-за конфликта в расписании.</item>
- <item quantity="other">Запланировано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) этого и других сериалов не будут записаны из-за конфликта в расписании.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one">Запланирована <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> запись сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Одна серия другого сериала не будет записана из-за конфликта в расписании.</item>
- <item quantity="few">Запланировано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Одна серия другого сериала не будет записана из-за конфликта в расписании.</item>
- <item quantity="many">Запланировано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записей сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Одна серия другого сериала не будет записана из-за конфликта в расписании.</item>
- <item quantity="other">Запланировано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Одна серия другого сериала не будет записана из-за конфликта в расписании.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one">Запланирована <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> запись сериала \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) других сериалов не будут записаны из-за конфликта в расписании.</item>
- <item quantity="few">Запланировано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) других сериалов не будут записаны из-за конфликта в расписании.</item>
- <item quantity="many">Запланировано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записей сериала \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) других сериалов не будут записаны из-за конфликта в расписании.</item>
- <item quantity="other">Запланировано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записи сериала \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Несколько серий (<xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>) других сериалов не будут записаны из-за конфликта в расписании.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Записанная программа не найдена."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Похожие записи"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(без описания)"</string>
@@ -371,7 +362,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Остановить запись?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Записанные серии будут сохранены в библиотеке видеорекордера."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Остановить"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"В эфире нет ни одной серии."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Серий пока нет.\nОни будут записаны, как только выйдут в эфир."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d минута)</item>
diff --git a/res/values-si-rLK-v23/strings.xml b/res/values-si-v23/strings.xml
index 1209e55b..1209e55b 100644
--- a/res/values-si-rLK-v23/strings.xml
+++ b/res/values-si-v23/strings.xml
diff --git a/res/values-si-rLK/arrays.xml b/res/values-si/arrays.xml
index 657fb91d..657fb91d 100644
--- a/res/values-si-rLK/arrays.xml
+++ b/res/values-si/arrays.xml
diff --git a/res/values-si-rLK/rating_system_strings.xml b/res/values-si/rating_system_strings.xml
index f22044ba..f22044ba 100644
--- a/res/values-si-rLK/rating_system_strings.xml
+++ b/res/values-si/rating_system_strings.xml
diff --git a/res/values-si-rLK/strings.xml b/res/values-si/strings.xml
index c21997a9..eab8c336 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"මොනෝ"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"ස්ටීරියෝ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"ධාවක පාලන"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"නාලිකා"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"මෑත නාලිකා"</string>
<string name="menu_title_options" msgid="7184594626814914022">"රූපවාහිනී විකල්ප"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP විකල්ප"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"මෙම නාලිකාව සඳහා Play පාලන ලද නොහැකිය"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"ධාවනය හෝ විරාමය කරන්න"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"වේගයෙන් ඉදිරියට"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"වසන ලද ශිර්ෂ"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"දර්ශන ආකාරය"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"සක්‍රියයි"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"අක්‍රිය කරන්න"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"බහු-ශ්‍රව්‍ය"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"තවත් නාලිකා ගන්න"</string>
<string name="options_item_settings" msgid="7623205838542400074">"සැකසීම්"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"මුල්‍ය"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"මාරු කරන්න"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"සක්‍රියයි"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"අක්‍රිය කරන්න"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ශබ්දය"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"මූලික"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP කවුළුව"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"පිරිසැලසුම"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"පහළ දකුණ"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ඉහළ දකුණ"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ඉහළ වම"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"පහළ වම"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"පැතෙන් පැත්තට"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"ප්‍රමාණය"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"ලොකු"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"කුඩා"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"මූලය අදානය කරන්න"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (ඇන්ටනාව/කේබලය)"</string>
<string name="no_program_information" msgid="1049844207745145132">"වැඩසටහන් තොරතුරු නැත"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"තොරතුරු නැත."</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"නාලිකාව අවහිර කරන ලදි"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"නොදන්නා භාෂාව"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"වැසූ සිරස්තල %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"නොදන්නා භාෂාව"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"වැසූ සිරස්තල"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"අක්‍රිය කරන්න"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"ආකෘතිකරණය අභිරුචි කරන්න"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"එම PIN එක වැරදිය. නැවත උත්සාහ කරන්න."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN එක ගැලපී නැත"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"ඔබේ ZIP කේතය ඇතුළු කරන්න."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"සජීව නාලිකා යෙදුම TV නාලිකා සඳහා සම්පූර්ණ වැඩසටහන් මාර්ගෝපදේශයක් සැපයීමට ZIP කේතය භාවිත කරනු ඇත."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"ඔබේ ZIP කේතය ඇතුළු කරන්න"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"වලංගු නොවන ZIP කේතයකි"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"සැකසීම්"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"නාලිකා ලැයිස්තුව අභිමත කරන්න"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"ඔබගේ වැඩසටහන් මාර්ගෝපදේශය සඳහා නාලිකා තෝරන්න"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"මාපිය පාලන"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"විවෘත මූලාශ්‍ර බලපත්‍ර"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"විවෘත මූලාශ්‍ර වරපත්"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"ප්‍රතිපෝෂණය යවන්න"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"අනුවාදය"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"මෙම නාලිකාව නැරඹිමට දකුණ ඔබා PIN එක ඇතුළු කරන්න"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"මෙම වැඩසටහන නැරඹිමට දකුණ ඔබා PIN එක ඇතුළු කරන්න"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"TV මෙනුවට පිවිසීමට "<b>"SELECT ඔබන්න"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"TV ආදානය සොයාගැනීමට නොහැකි විය"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV ආදානය සොයාගත නොහැක"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP සහාය දක්වන්නේ නැත"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP සමඟ පෙන්වූ විට අදානයක් එහි නොතිබේ"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"සුසරක වර්ගය ගැලපෙන්නේ නැත; කරුණාකර සුසර කරන වර්ගයේ TV අදානය සඳහා සජීවී නාලිකා යෙදුම දමන්න."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"සුසර කිරීම අසාර්ථක වුණි"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"මෙම ක්‍රියාව හැසිරවීමට යෙදුමක් සොයාගත්තේ නැත"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"සුරකින්න"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"එක්-වරක පටිගත කිරීම්වලට වැඩිම ප්‍රමුඛතාව ඇත"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"අවලංගු කර."</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"අවලංගු කරන්න"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"අමතක කරන්න"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"නතර කරන්න"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"පටිගත කිරීමේ කාල සටහන බලන්න"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"මෙම තනි වැඩසටහන"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"ඒ වෙනුවට මෙය පටිගත කරන්න"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"මෙම පටිගත කිරීම අවලංගු කරන්න"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"දැන් නරඹන්න"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"පටිගත කිරීම් මකන්න..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"පටිගත කළ හැකි"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"පටිගත කිරීම කාල සටහන්ගතයි"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"පටිගත කිරීමේ ගැටුම"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"පටිගත කරමින්"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"පටිගත කිරීම අසාර්ථක විය"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"පටිගත කිරීමේ කාලසටහන් සෑදීමට වැඩසටහන් කියවමින්"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"කියවීමේ වැඩසටහන්"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"මෑත පටිගත කිරීම් බලන්න"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> හි පටිගත කිරීම අසම්පූර්ණයි."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> සහ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> හි පටිගත කිරීම් අසම්පූර්ණයි."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> සහ <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> හි පටිගත කිරීම් අසම්පූර්ණයි."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"ප්‍රමාණවත් නොවන ගබඩාව නිසා <xliff:g id="PROGRAMNAME">%1$s</xliff:g> හි පටිගත කිරීම සම්පූර්ණ නොකරන ලදී."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"ප්‍රමාණවත් නොවන ගබඩාව නිසා <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> සහ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> හි පටිගත කිරීම් සම්පූර්ණ නොකරන ලදී."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"ප්‍රමාණවත් නොවන ගබඩාව නිසා <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> සහ <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> හි පටිගත කිරීම් සම්පූර්ණ නොකරන ලදී."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"කියවීමේ වැඩසටහන්"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR සඳහා වැඩිපුර ගබඩාව අවශ්‍යයි"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"ඔබට DVR සමගින් වැඩසටහන් පටිගත කිරීමට හැකි වනු ඇත. කෙසේ වෙතත් දැන් DVR ක්‍රියා කිරීම සඳහා ඔබේ උපාංගයේ ප්‍රමාණවත් තරම් ගබඩාව නැත. කරුණාකර <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB හෝ ඊට වඩා විශාල බාහිර ධාවකයක් සම්බන්ධ කර එය උපාංග ගබඩාව ලෙස ෆෝමැට් කිරීමට පහත පියවර අනුගමනය කරන්න."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"ප්‍රමාණවත් තරම් ගබඩා ඉඩ නැත"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"ප්‍රමාණවත් තරම් ගබඩා ඉඩ නොමැති නිසා මෙම වැඩසටහන පටිගත කළ නොහැකි වනු ඇත. පවතින පටිගත කිරීම් සමහරක් මැකීම උත්සාහ කරන්න."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"අස්ථානගත ගබඩාව"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR මගින් භාවිත කළ ගබඩා සමහරක් අස්ථානගතය. කරුණාකර DVR නැවත-සබල කිරීමට ඔබ පෙරදී භාවිත කළ බාහිර drive සම්බන්ධ කරන්න. විකල්පව, එය තවදුරටත් ලබා ගත නොහැකි නම් ඔබට ගබඩාව අමතක කිරීමට තේරිය හැකිය."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"ගබඩාව අමතකද?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"ඔබේ පටිගත කළ සියලු අන්තර්ගත සහ කාල සටහන් අහිමි වනු ඇත."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"පටිගත කිරීම නවත්වන්නද?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"පටිගත කළ අන්තර්ගතය සුරැකෙනු ඇත."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"මෙම වැඩසටහන සමගින් වන ගැටුම් නිසා <xliff:g id="PROGRAMNAME">%1$s</xliff:g> හි පටිගත කිරීම නවත්වන ලදී. පටිගත කරන ලද අන්තර්ගතය සුරකිනු ඇත."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"පටිගත කිරීම කාල සටහන්ගත කර ඇති නමුත් ගැටුම් ඇත"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"පටිගත කිරීම ආරම්භ කර ඇති නමුත් ගැටුම් ඇත"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> පටිගත කරනු ඇත."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"එම වැඩසටහනම <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>ට පටිගත කිරීමට කාල සටහන්ගත කර ඇත."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"දැනටමත් පටිගත කර ඇත"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"මෙම වැඩසටහන දැනටමත් පටිගත කර ඇත. එය DVR පුස්තකාලය තුළදී ලබා ගත හැකිය."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"මාලා පටිගත කිරීම කාලසටහන්ගත කරන ලදී"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_3">%2$s</xliff:g> සඳහා කාල සටහන්ගත කර ඇත.</item>
- <item quantity="other">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_3">%2$s</xliff:g> සඳහා කාල සටහන්ගත කර ඇත.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_3">%2$s</xliff:g> සඳහා කාල සටහන්ගත කර ඇත. ඒවායින් <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>ක් ගැටුම් නිසා පටිගත නොකරනු ඇත.</item>
- <item quantity="other">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_3">%2$s</xliff:g> සඳහා කාල සටහන්ගත කර ඇත. ඒවායින් <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>ක් ගැටුම් නිසා පටිගත නොකරනු ඇත.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_4">%2$s</xliff:g> සඳහා කාල සටහන්ගත කර ඇත. මෙම මාලාවෙහි සහ වෙනත් මාලාවල කථාංග <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>ක් ගැටුම් නිසා පටිගත නොකරනු ඇත.</item>
- <item quantity="other">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_4">%2$s</xliff:g> සඳහා කාල සටහන්ගත කර ඇත. මෙම මාලාවෙහි සහ වෙනත් මාලාවල කථාංග <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>ක් ගැටුම් නිසා පටිගත නොකරනු ඇත.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_3">%2$s</xliff:g> සඳහා කාලසටහන්ගත කර ඇත. වෙනත් මාලාවල කථාංග 1ක් ගැටුම් නිසා පටිගත නොකරනු ඇත.</item>
- <item quantity="other">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_3">%2$s</xliff:g> සඳහා කාලසටහන්ගත කර ඇත. වෙනත් මාලාවල කථාංග 1ක් ගැටුම් නිසා පටිගත නොකරනු ඇත.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_4">%2$s</xliff:g> සඳහා කාල සටහන්ගත කර ඇත. වෙනත් මාලාවේ කථාංග <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>ක් ගැටුම් නිසා පටිගත නොකරනු ඇත.</item>
- <item quantity="other">පටිගත කිරීම් <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g>ක් <xliff:g id="SERIESNAME_4">%2$s</xliff:g> සඳහා කාල සටහන්ගත කර ඇත. වෙනත් මාලාවේ කථාංග <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>ක් ගැටුම් නිසා පටිගත නොකරනු ඇත.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"පටිගත කළ වැඩසටහන හමු නොවීය."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"අදාළ පටිගත කිරීම්"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(වැඩසටහන් විස්තරය නැත)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"මාලා පටිගත කිරීම නවත්වන්නද?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"පටිගත කළ කථාංග DVR පුස්තකාලය තුළ ලබා ගත හැකිව පවතිනු ඇත."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"නවත්වන්න"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"දැන් ගුවනේ කථාංග නැත."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"ලබා ගත හැකි කථාංග නැත.\nඒවා ලබා ගත හැකි වූ විට පටිගත කරනු ඇත."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(මිනිත්තු %1$d)</item>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index ce3cbdb9..78d94c7f 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Ovládanie prehrávania"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanály"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Nedávne kanály"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Možnosti TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Možnosti PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Pre tento kanál nie sú k dispozícii ovládacie prvky prehrávania"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Prehrať alebo pozastaviť"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Pretočiť dopredu"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Skryté titulky"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Režim zobrazenia"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Zapnuté"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Vypnuté"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Ďalšie kanály"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Nastavenia"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Zdroj"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Zameniť"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Zapnuté"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Vypnuté"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Zvuk"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Hlavné"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Okno PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Rozloženie"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Vpravo dole"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Vpravo hore"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Vľavo hore"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Vľavo dole"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Vedľa seba"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Rozmery"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Veľké"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Malé"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Zdroj vstupu"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (anténa/kábel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Žiadne informácie o programe"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Žiadne informácie"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Zablokovaný kanál"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Neznámy jazyk"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Skryté titulky: %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Neznámy jazyk"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Skryté titulky"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Vypnuté"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Prispôsobiť formát"</string>
@@ -120,10 +139,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Kód PIN bol zadaný chybne. Skúste to znova."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Kód PIN nesúhlasí. Skúste to znova."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Zadajte svoje PSČ."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Aplikácia Televízia online vám na základe PSČ poskytne kompletný program pre televízne kanály."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Zadajte svoje PSČ"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Neplatné PSČ"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Nastavenia"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Prispôsobiť zoznam kanálov"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Vybrať kanály pre televízny program"</string>
@@ -132,7 +147,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Rodičovská kontrola"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licencie open source"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Licencie open source"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Odoslať spätnú väzbu"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Verzia"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Ak chcete sledovať tento kanál, stlačte šípku vpravo a zadajte kód PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Ak chcete sledovať tento program, stlačte šípku doprava a zadajte kód PIN"</string>
@@ -175,6 +189,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Stlačením tlačidla VYBRAŤ"</b>" prejdete do TV ponuky."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Nenašiel sa žiadny TV vstup"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV vstup sa nenašiel"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Funkcia Obraz v obraze (PIP) nie je podporovaná"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Neexistuje vstup, ktorý by mohla funkcia PIP zobraziť"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Typ tunera nie je vhodný. Pre TV vstup typu tunera spustite aplikáciu Aktívne kanály."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Ladenie zlyhalo"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Aplikácia potrebná na spracovanie tejto akcie sa nenašla."</string>
@@ -263,6 +279,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Uložiť"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Jednorazové záznamenávania majú najvyššiu prioritu"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Zrušiť"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Zrušiť"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Odstrániť"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Zastaviť"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Zobraziť rozvrh nahrávania"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Iba tento program"</string>
@@ -272,29 +290,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Zaznamenať radšej tento program"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Zrušiť tento záznam"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Pozrieť"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Odstrániť nahratý obsah..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Je možné nahrať"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Nahrávanie je naplánované"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Konflikt nahrávania"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Nahráva sa"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Nahrávanie zlyhalo"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Čítajú sa programy s cieľom vytvoriť plány zaznamenávania"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Načítavajú sa programy"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Zobraziť nedávne nahrávky"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Záznam programu <xliff:g id="PROGRAMNAME">%1$s</xliff:g> nie je úplný."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Záznamy programov <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> a <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> nie sú úplné."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Záznamy programov <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> a <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> nie sú úplné."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Zaznamenávanie programu <xliff:g id="PROGRAMNAME">%1$s</xliff:g> nebolo dokončené z dôvodu nedostatku miesta v úložisku."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Zaznamenávanie programov <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> a <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> nebolo dokončené z dôvodu nedostatku miesta v úložisku."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Zaznamenávanie programov <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> a <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> nebolo dokončené z dôvodu nedostatku miesta v úložisku."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Načítavajú sa programy"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR vyžaduje viac miesta v úložisku"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Budete môcť zaznamenávať programy pomocou zariadenia DVR. Teraz však v úložisku vášho zariadenia nie je dostatok miesta na fungovanie zariadenia DVR. Pripojte externý disk s minimálnou kapacitou <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB a podľa uvedených krokov ho naformátujte ako úložisko zariadenia."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Nedostatok úložiska"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Tento program nebude nahratý z dôvodu nedostatku úložiska. Skúste odstrániť časť nahratého obsahu."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Chýba úložisko"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Určitá časť úložiska využitého zariadením DVR chýba. Pred opätovným povolením zariadenia DVR pripojte externý disk, ktorý ste predtým používali. Prípadne môžete úložisko odstrániť, ak už nie je ďalej k dispozícii."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Odstrániť úložisko?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Všetok váš zaznamenaný obsah a plány budú stratené."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Zastaviť nahrávanie?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Nahraný obsah sa uloží."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Zaznamenávanie relácie <xliff:g id="PROGRAMNAME">%1$s</xliff:g> bude zastavené, pretože koliduje s týmto programom. Zaznamenaný obsah sa uloží."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Nahrávanie je naplánované, ale obsahuje konflikty"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Záznam sa spustil, ale obsahuje konflikty"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Zaznamená sa program <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -314,37 +328,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Zaznamenanie rovnakého programu už bolo naplánované na <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Už je zaznamenané"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Tento program je už zaznamenaný. Nájdete ho v knižnici zariadenia DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Zaznamenávanie relácie bolo naplánované"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="few">Pre seriál <xliff:g id="SERIESNAME_3">%2$s</xliff:g> boli naplánované <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> záznamy.</item>
- <item quantity="many">Pre seriál <xliff:g id="SERIESNAME_3">%2$s</xliff:g> bolo naplánovaného <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> záznamu.</item>
- <item quantity="other">Pre seriál <xliff:g id="SERIESNAME_3">%2$s</xliff:g> bolo naplánovaných <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> záznamov.</item>
- <item quantity="one">Pre seriál <xliff:g id="SERIESNAME_1">%2$s</xliff:g> bol naplánovaný <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> záznam.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="few">Pre seriál <xliff:g id="SERIESNAME_3">%2$s</xliff:g> boli naplánované <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> záznamy. Z dôvodu konfliktov sa nezaznamenajú niektoré epizódy (počet: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>).</item>
- <item quantity="many">Pre seriál <xliff:g id="SERIESNAME_3">%2$s</xliff:g> bolo naplánovaného <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> záznamu. Z dôvodu konfliktov sa nezaznamenajú niektoré epizódy (počet: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>)</item>
- <item quantity="other">Pre seriál <xliff:g id="SERIESNAME_3">%2$s</xliff:g> bolo naplánovaných <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> záznamov. Z dôvodu konfliktov sa nezaznamenajú niektoré epizódy (počet: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>)</item>
- <item quantity="one">Pre seriál <xliff:g id="SERIESNAME_1">%2$s</xliff:g> bol naplánovaný <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> záznam. Z dôvodu konfliktov sa nezaznamená.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="few">Pre seriál <xliff:g id="SERIESNAME_4">%2$s</xliff:g> boli naplánované <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> záznamy. Z dôvodu konfliktov sa nezaznamenajú niektoré epizódy z tohto seriálu a ďalších seriálov (počet: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="many">Pre seriál <xliff:g id="SERIESNAME_4">%2$s</xliff:g> bolo naplánovaného <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> záznamu. Z dôvodu konfliktov sa nezaznamenajú niektoré epizódy z tohto seriálu a ďalších seriálov (počet: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="other">Pre seriál <xliff:g id="SERIESNAME_4">%2$s</xliff:g> bolo naplánovaných <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> záznamov. Z dôvodu konfliktov sa nezaznamenajú niektoré epizódy z tohto seriálu a ďalších seriálov (počet: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="one">Pre seriál <xliff:g id="SERIESNAME_1">%2$s</xliff:g> bol naplánovaný <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> záznam. Z dôvodu konfliktov sa nezaznamenajú niektoré epizódy z tohto seriálu a ďalších seriálov (počet: <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g>).</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="few">Pre seriál <xliff:g id="SERIESNAME_3">%2$s</xliff:g> boli naplánované <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> záznamy.Z dôvodu konfliktov nebude zaznamenaná 1 epizóda inej relácie.</item>
- <item quantity="many">Pre seriál <xliff:g id="SERIESNAME_3">%2$s</xliff:g> bolo naplánovaného <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> záznamu.Z dôvodu konfliktov nebude zaznamenaná 1 epizóda inej relácie.</item>
- <item quantity="other">Pre seriál <xliff:g id="SERIESNAME_3">%2$s</xliff:g> bolo naplánovaných <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> záznamov.Z dôvodu konfliktov nebude zaznamenaná 1 epizóda inej relácie.</item>
- <item quantity="one">Pre seriál <xliff:g id="SERIESNAME_1">%2$s</xliff:g> bol naplánovaný <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> záznam.Z dôvodu konfliktov nebude zaznamenaná 1 epizóda inej relácie.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="few">Pre seriál <xliff:g id="SERIESNAME_4">%2$s</xliff:g> boli naplánované <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> záznamy. Z dôvodu konfliktov sa nezaznamenajú epizódy z iného seriálu (počet: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="many">Pre seriál <xliff:g id="SERIESNAME_4">%2$s</xliff:g> bolo naplánovaného <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> záznamu. Z dôvodu konfliktov sa nezaznamenajú epizódy z iného seriálu (počet: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="other">Pre seriál <xliff:g id="SERIESNAME_4">%2$s</xliff:g> bolo naplánovaných <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> záznamov. Z dôvodu konfliktov sa nezaznamenajú epizódy z iného seriálu (počet: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>).</item>
- <item quantity="one">Pre seriál <xliff:g id="SERIESNAME_1">%2$s</xliff:g> bol naplánovaný <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> záznam. Z dôvodu konfliktov sa nezaznamenajú epizódy z iného seriálu (počet: <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g>).</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Zaznamenaný program sa nenašiel."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Súvisiace nahrávky"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Žiadny popis programu)"</string>
@@ -371,7 +362,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Zastaviť nahrávanie série?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Nahrané epizódy zostanú k dispozícii v knižnici DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Zastaviť"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Momentálne nie sú vysielané žiadne epizódy."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Nie sú k dispozícii žiadne epizódy.\nZaznamenajú sa, keď budú dostupné."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="few">(%1$d minúty)</item>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index d36b0858..6e79cacc 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Kontrolniki predvajanja"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanali"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Nedavni kanali"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Možnosti za TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Možnosti za PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Kontrolniki za predvajanje niso na voljo za ta kanal"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Predvajanje ali zaustavitev"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Previjanje naprej"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Podnapisi"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Način prikaza"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Vklopljeno"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Izklopljeno"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multizvok"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Več kanalov"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Nastavitve"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Vir"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Zamenjaj"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Vklopljeno"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Izklopljeno"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Zvok"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Glavno"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Okno PIP-a"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Postavitev"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Spodaj desno"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Zgoraj desno"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Zgoraj levo"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Spodaj levo"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Vzporedno"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Velikost"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Veliko"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Majhno"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Vir vhoda"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antena/kabelska)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Ni informacij o programu"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Ni informacij"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blokiran kanal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Neznan jezik"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Podnapisi %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Neznan jezik"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Podnapisi"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Izklopljeno"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Oblikovanje po meri"</string>
@@ -120,10 +139,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Koda PIN je bila napačna. Poskusite znova."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Poskusite znova. Koda PIN se ne ujema."</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Vnos poštne številke."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Aplikacija Televizija v živo uporablja poštno številko za posredovanje popolnega programskega vodnika za televizijske kanale."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Vnesite poštno številko"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Neveljavna poštna številka"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Nastavitve"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Prilagajanje seznama kanalov"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Izbira kanalov za programski vodnik"</string>
@@ -132,7 +147,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Starševski nadzor"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Odprtokodne licence"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Odprtokodne licence"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Pošljite povratne informacije"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Različica"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Če želite gledati ta kanal, pritisnite v desno in vnesite kodo PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Če želite gledati ta program, pritisnite v desno in vnesite kodo PIN"</string>
@@ -175,6 +189,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Pritisnite »IZBIRA«"</b>", če želite dostopati do menija TV-ja."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Ni TV-vhodov"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Ni mogoče najti TV-vhoda"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Slika v sliki ni podprta"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Ni vhoda, ki bi omogočal prikaz s sliko v sliki (PIP)"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Vrsta sprejemnika ni ustrezna. Zaženite aplikacijo Kanali v živo za uporabo TV-vhoda, ki deluje kot sprejemnik."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Nastavljanje kanalov ni uspelo"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Za to dejanje ni bilo mogoče najti nobene aplikacije."</string>
@@ -263,6 +279,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Shrani"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Enkratna snemanja imajo najvišjo prednost"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Prekliči"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Prekliči"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Pozabi"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Ustavi"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Ogled razporeda snemanja"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Samo to oddajo"</string>
@@ -272,29 +290,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Snemanje tega namesto drugega"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Preklic tega snemanja"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Ogled"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Izbris posnetkov …"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Omogoča snemanje"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Čas snemanja nastavljen"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Posnetek v sporu"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Snemanje"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Snemanje ni uspelo"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Branje oddaj za ustvarjanje razporedov snemanja"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Branje oddaj"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Ogled nedavnih posnetkov"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Posnetek vsebine <xliff:g id="PROGRAMNAME">%1$s</xliff:g> je nepopoln."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Posnetka vsebin <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> in <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> sta nepopolna."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Posnetki vsebin <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> in <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> so nepopolni."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Snemanje vsebine <xliff:g id="PROGRAMNAME">%1$s</xliff:g> se ni dokončalo zaradi pomanjkanja prostora za shranjevanje."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Snemanje vsebin <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> in <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> se ni dokončalo zaradi pomanjkanja prostora za shranjevanje."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Snemanje vsebin <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> in <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> se ni dokončalo zaradi pomanjkanja prostora za shranjevanje."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Branje oddaj"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Digitalni videorekorder potrebuje več shrambe"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Z digitalnim videorekorderjem boste lahko snemali oddaje, vendar v napravi ni dovolj shrambe, potrebne za njegovo delovanje. Priključite zunanji pogon velikosti <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB ali več in upoštevajte navodila, da ga formatirate kot shrambo naprave."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Ni dovolj prostora za shranjevanje"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Ta program ne bo posnet, ker ni dovolj prostora za shranjevanje. Poskusite izbrisati nekatere obstoječe posnetke."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Manjkajoča shramba"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Del shrambe, ki jo uporablja digitalni videorekorder, manjka. Povežite zunanji pogon, ki ste ga že uporabljali, če želite znova omogočiti digitalni videorekorder. Če shramba ni več na voljo, jo lahko tudi pozabite."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Želite pozabiti shrambo?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Posneta vsebina in razporedi bodo izgubljeni."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Želite ustaviti snemanje?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Posneta vsebina bo shranjena."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Snemanje vsebine <xliff:g id="PROGRAMNAME">%1$s</xliff:g> bo ustavljeno, ker je v sporu s tem programom. Posneta vsebina bo shranjena."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Snemanje je nastavljeno, ampak obstajajo spori"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Snemanje se je začelo, vendar so spori"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Oddaja <xliff:g id="PROGRAMNAME">%1$s</xliff:g> bo posneta."</string>
@@ -314,37 +328,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Snemanje iste oddaje je že nastavljeno za ob <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Že posneto"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Ta oddaja je že posneta. Na voljo je v knjižnici digitalnega videorekorderja."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Snemanje serije je načrtovano"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetek je načrtovan za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetka sta načrtovana za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetki so načrtovani za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetkov je načrtovanih za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetek je načrtovan za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Zaradi sporov jih ne bo posnetih toliko: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>.</item>
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetka sta načrtovana za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Zaradi sporov jih ne bo posnetih toliko: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetki so načrtovani za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Zaradi sporov jih ne bo posnetih toliko: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetkov je načrtovanih za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Zaradi sporov jih ne bo posnetih toliko: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> posnetek je načrtovan za serijo <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Zaradi sporov ne bo posnetih toliko epizod te serije in drugih serij: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> posnetka sta načrtovana za serijo <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Zaradi sporov ne bo posnetih toliko epizod te serije in drugih serij: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> posnetki so načrtovani za serijo <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Zaradi sporov ne bo posnetih toliko epizod te serije in drugih serij: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> posnetkov je načrtovanih za serijo <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Zaradi sporov ne bo posnetih toliko epizod te serije in drugih serij: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetek je načrtovan za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Zaradi sporov ne bo posneta 1 epizoda druge serije.</item>
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetka sta načrtovana za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Zaradi sporov ne bo posneta 1 epizoda druge serije.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetki so načrtovani za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Zaradi sporov ne bo posneta 1 epizoda druge serije.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> posnetkov je načrtovanih za serijo <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Zaradi sporov ne bo posneta 1 epizoda druge serije.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> posnetek je načrtovan za serijo <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Zaradi sporov ne bo posnetih toliko epizod drugih serij: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="two"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> posnetka sta načrtovana za serijo <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Zaradi sporov ne bo posnetih toliko epizod drugih serij: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> posnetki so načrtovani za serijo <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Zaradi sporov ne bo posnetih toliko epizod drugih serij: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> posnetkov je načrtovanih za serijo <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Zaradi sporov ne bo posnetih toliko epizod drugih serij: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Posnetega programa ni bilo mogoče najti."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Sorodni posnetki"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(ni opisa programa)"</string>
@@ -371,7 +362,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Ustavitev snemanja serije?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Posnete epizode bodo na voljo v knjižnici digitalnega videorekorderja."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Ustavi"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Trenutno se ne predvaja nobena epizoda."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Na voljo ni nobena epizoda.\nPosnete bodo, ko bodo na voljo."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d minuta)</item>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 618f9e86..0b4c2f3c 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"моно"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"стерео"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Play контроле"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Канали"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Недавни канали"</string>
<string name="menu_title_options" msgid="7184594626814914022">"ТВ опције"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Опц. сл. у сл."</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Контроле за пуштање нису доступне за овај канал"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Пусти или паузирај"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Премотај унапред"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Титлови"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Режим приказа"</string>
<string name="options_item_pip" msgid="3951350386626879645">"Слика у слици"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Укључено"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Искључено"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Вишеструк аудио"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Набави још канала"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Подешавања"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Извор"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Замени"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Укључено"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Искључено"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Звук"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Главни"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Прозор слике у слици"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Распоред"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Доњи десни угао"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Горњи десни угао"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Горњи леви угао"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Доњи леви угао"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Упоредо"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Величина"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Велика"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Мала"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Извор улаза"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"ТВ (антенска/кабловска)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Нема информација о програму"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Нема информација"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Блокирани канал"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Непознат језик"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Опционални титл: %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Непознат језик"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Опционални титлови"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Искључи"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Прилагоди формат"</string>
@@ -118,10 +137,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Тај PIN је погрешан. Пробајте поново."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Пробајте поново, PIN се не подудара"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Унесите поштански број"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Апликација Канали уживо ће користити овај поштански број да би пружила комплетан водич за програме за ТВ канале."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Унесите поштански број"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Неважећи поштански број"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Подешавања"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Прилагоди листу канала"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Изаберите канале за водич за програме"</string>
@@ -130,7 +145,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Родитељски надзор"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Лиценце отвореног кода"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Лиценце отвореног кода"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Пошаљи повратне информације"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Верзија"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Да бисте гледали овај канал, притисните дугме Десно и унесите PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Да бисте гледали овај програм, притисните дугме Десно и унесите PIN"</string>
@@ -171,6 +185,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Притисните ИЗАБЕРИ"</b>" да бисте приступили TV менију."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Нису пронађени ТВ улази"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Не можемо да пронађемо ТВ улаз"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Слика у слици није подржана"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Нема улаза који може да се прикаже као слика у слици"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Тип тјунера не одговара. Покрените апликацију Канали уживо за тип ТВ улаза са тјунером."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Подешавање није успело"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Није пронађена ниједна апликација која би могла да обави ову радњу."</string>
@@ -253,6 +269,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Сачувај"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Једнократни снимци имају највиши приоритет"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Откажи"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Откажи"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Заборави"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Заустави"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Прикажи распоред за снимање"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Само ова епизода"</string>
@@ -262,29 +280,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Сними овај програм уместо њега"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Откажи ово снимање"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Пусти одмах"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Избришите снимке…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Подржава снимање"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Снимање је заказано"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Неусаглашеност при снимању"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Снимање"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Снимање није успело"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Читамо програме да бисмо направили распореде"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Читамо програме"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Прикажи недавне снимке"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Снимање програма <xliff:g id="PROGRAMNAME">%1$s</xliff:g> није довршено."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Снимање програма <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> и <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> није довршено."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Снимање програма <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> и <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> није довршено."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Нисмо довршили снимање програма <xliff:g id="PROGRAMNAME">%1$s</xliff:g> због недовољног меморијског простора."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Снимање програма <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> и <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> није довршено због недовољног меморијског простора."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Снимање програма <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> и <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> није довршено због недовољног меморијског простора."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Читамо програме"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR-у треба више меморијског простора"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Моћи ћете да снимате програме помоћу DVR-а. Међутим, тренутно на уређају нема довољно меморијског простора да би DVR функционисао. Повежите спољни диск који има <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB или више и пратите кораке да бисте га форматирали као меморијски простор уређаја."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Нема довољно меморијског простора"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Овај програм неће бити снимљен јер нема довољно меморијског простора. Пробајте да избришете неколико постојећих снимака."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Меморијски простор недостаје"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Недостаје део меморијског простора који DVR користи. Повежите спољни диск који сте раније користили да бисте поново омогућили DVR. Уместо тога можете да заборавите меморијски простор ако више није доступан."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Желите ли да заборавите меморијски простор?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Сав снимљени садржај и распореди ће бити изгубљени."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Зауставити снимање?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Снимљени садржај ће се сачувати."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Снимање програма <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ће се зауставити јер је дошло до неусаглашености са овим програмом. Снимљени садржај ће бити сачуван."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Снимање је заказано, али постоје неусаглашености"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Снимање је почело али има неусаглашености"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Програм <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ће бити снимљен."</string>
@@ -303,32 +317,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Снимање истог програма је већ заказано за <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Већ је снимљено"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Овај програм је већ снимљен. Доступан је у DVR филмотеци."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Снимање серије је заказано"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимање је заказано за серијал <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимања су заказана за серијал <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимања је заказано за серијал <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимање је заказано за серијал <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Због преклапања неће бити снимљено: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимања су заказана за серијал <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Због преклапања неће бити снимљено: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимања је заказано за серијал <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Због преклапања неће бити снимљено: <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимање је заказано за серијал <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизода(е) овог серијала и других серијала неће бити снимљено због преклапања.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимања су заказана за серијал <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизода(е) овог серијала и других серијала неће бити снимљено због преклапања.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимања је заказано за серијал <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизода(е) овог серијала и других серијала неће бити снимљено због преклапања.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимање је заказано за серијал <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 епизода другог серијала неће бити снимљена због преклапања.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимања су заказана за серијал <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 епизода другог серијала неће бити снимљена због преклапања.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> снимања је заказано за серијал <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 епизода другог серијала неће бити снимљена због преклапања.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимање је заказано за серијал <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизоде(а) других серијала неће бити снимљено због преклапања.</item>
- <item quantity="few"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимања су заказана за серијал <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизоде(а) других серијала неће бити снимљено због преклапања.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> снимања је заказано за серијал <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> епизоде(а) других серијала неће бити снимљено због преклапања.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Снимљени програм није пронађен."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Сродни снимци"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Нема описа програма)"</string>
@@ -353,7 +349,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Зауставити снимање серије?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Снимљене епизоде ће остати доступне у DVR библиотеци."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Заустави"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Тренутно се не приказује ниједна епизода."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Нема доступних епизода.\nБиће снимљене када постану доступне."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d минут)</item>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 8f554150..212fd957 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Uppspelningskontroller"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanaler"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Senaste kanaler"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Tv-alternativ"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP-alternativ"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Uppspelningskontrollerna är inte tillgängliga för den här kanalen"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Spela upp eller pausa"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Snabbspola framåt"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Textning"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Visningsläge"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"På"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Av"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Flera ljudkäll."</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Få fler kanaler"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Inställningar"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Källa"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Byt"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"På"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Av"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Ljud"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Primär"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP-fönster"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Layout"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Nere till h."</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Uppe till h."</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Uppe till v."</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Nere till v."</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Sida vid sida"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Storlek"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Stor"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Liten"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Ingångskälla"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Tv (antenn/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Ingen programinformation"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Ingen information"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Blockerad kanal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Okänt språk"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Textning %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Okänt språk"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Textning"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Av"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Anpassa formatering"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Det var fel pinkod. Försök igen."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Försök igen. Pinkoden stämmer inte"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Ange ditt postnummer."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Appen Livekanaler använder postnumret till att ta fram en komplett programguide för TV-kanalerna."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Ange ditt postnummer"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Ogiltigt postnummer"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Inställningar"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Anpassa kanallista"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Välj kanaler för programguiden"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Innehållsfilter"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Licenser för öppen källkod"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Öppen källkod"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Skicka feedback"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Version"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Tryck till höger och ange pinkoden om du vill titta på den här kanalen"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Tryck till höger och ange pinkoden om du vill titta på det här programmet"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Tryck på VÄLJ"</b>" för att öppna TV-menyn."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Ingen tv-ingång hittades"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Det går inte att hitta tv-ingången"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP stöds inte"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Det finns ingen tillgänglig ingång som kan visas med PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Olämplig insignal. Starta appen Livekanaler om du vill kunna ta emot insignaler av tv-kortstyp."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Kanaljusteringen misslyckades"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Ingen app som kan hantera åtgärden hittades"</string>
@@ -175,11 +191,11 @@
<string name="msg_back_key_guide" msgid="7404682718828721924">"Knappen BACK (bakåt) gäller en ansluten enhet. Avsluta genom att trycka på knappen HOME (start)."</string>
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Livekanaler behöver behörighet att läsa TV-tablåer."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Konfigurera dina källor"</string>
- <string name="setup_sources_description" msgid="5695518946225445202">"Livekanaler kombinerar det bästa från traditionella TV-kanaler med streamade kanaler från appar. \n\nKom igång genom att konfigurera de kanalkällor som redan är installerade eller kolla in Google Play Butik för fler appar som erbjuder livekanaler."</string>
+ <string name="setup_sources_description" msgid="5695518946225445202">"Livekanaler kombinerar det bästa från traditionella TV-kanaler med strömmande kanaler från appar. \n\nKom igång genom att konfigurera de kanalkällor som redan är installerade eller kolla in Google Play Butik för fler appar som erbjuder livekanaler."</string>
<string name="channels_item_dvr" msgid="8911915252648532469">"Inspelningar och scheman"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minuter"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minuter"</string>
- <string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 timme"</string>
+ <string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"En timme"</string>
<string name="recording_start_dialog_3_hours_duration" msgid="295984419320006238">"3 timmar"</string>
<string name="dvr_main_recent" msgid="2553805424822806495">"Senaste"</string>
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Planerat"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Spara"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Engångsinspelningar har högsta prioritet"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Avbryt"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Avbryt"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Glöm"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Stoppa"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Visa inspelningsschema"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Bara det här programmet"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Spela in detta i stället"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Avbryt den här inspelningen"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Titta nu"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Radera inspelningar …"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Kan spelas in"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Inspelningen har schemalagts"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Inspelningskonflikt"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Inspelning"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Inspelningen misslyckades"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Läser in program för att inspelningsscheman"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Läser in program"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Visa de senaste inspelningarna"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Inspelningen av <xliff:g id="PROGRAMNAME">%1$s</xliff:g> är ofullständig."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Inspelningen av <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> och <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> är ofullständig."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Inspelningen av <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> och <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> är ofullständig."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Det gick inte att slutföra inspelningen av <xliff:g id="PROGRAMNAME">%1$s</xliff:g> eftersom det inte finns tillräckligt med lagringsutrymme."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Det gick inte att slutföra inspelningen av <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> och <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> eftersom det inte finns tillräckligt med lagringsutrymme."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Det gick inte att slutföra inspelningen av <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> och <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> eftersom det inte finns tillräckligt med lagringsutrymme."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Läser in program"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Mer lagringsutrymme krävs för hårddiskinspelning"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Du kan använda hårddiskinspelning för att spela in program, men just nu finns det inte tillräckligt mycket ledigt lagringsutrymme på enheten för hårddiskinspelning. Anslut en extern enhet på minst <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB och följ anvisningarna för att formatera den som enhetslagring."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Otillräckligt lagringsutrymme"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Det här programmet spelas inte in eftersom lagringsutrymmet inte räcker. Du kan göra plats genom att radera gamla inspelningar."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Lagringsutrymmet är inte tillgängligt"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"En del av lagringsutrymmet som används av DVR saknas. Anslut den externa hårddisken du använde innan DVR återaktiverades. Du kan också att välja att glömma bort lagringsutrymmet om det inte längre är tillgängligt."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Ska lagringsutrymmet glömmas bort?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Allt rekommenderat innehåll och alla inspelningsscheman försvinner."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Vill du sluta spela in?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Det inspelade innehållet sparas."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Inspelningen av <xliff:g id="PROGRAMNAME">%1$s</xliff:g> avbryts eftersom den krockar med det här programmet. Det inspelade innehållet sparas."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Inspelningen har schemalagts men innehåller konflikter"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Inspelningen har startat men innehåller konflikter"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> spelas in."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Samma program har schemalagts för inspelning kl. <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Redan inspelat"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Programmet har redan spelats in. Det finns i DVR-biblioteket."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Serieinspelningen har schemalagts"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> inspelningar har schemalagts för <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> inspelning har schemalagts för <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> inspelningar har schemalagts för <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> av dem spelas inte in på grund av programkrockar.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> inspelning har schemalagts för <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Det spelas inte in på grund av programkrockar.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> inspelningar har schemalagts för <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> avsnitt av den här serien och andra serier spelas inte in på grund av programkrockar.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> inspelning har schemalagts för <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> avsnitt av den här serien och andra serier spelas inte in på grund av programkrockar.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> inspelningar har schemalagts för <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 avsnitt av andra serier spelas inte in på grund av programkrockar.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> inspelning har schemalagts för <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 avsnitt av andra serier spelas inte in på grund av programkrockar.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> inspelningar har schemalagts för <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> avsnitt av andra serier spelas inte in på grund av programkrockar.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> inspelning har schemalagts för <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> avsnitt av andra serier spelas inte in på grund av programkrockar.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Det gick inte att hitta det inspelade programmet."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Relaterade inspelningar"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Programbeskrivning saknas)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Vill du stoppa serieinspelning?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Inspelade avsnitt finns kvar i DVR-biblioteket"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Stoppa"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Inga avsnitt sänds just nu."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Det finns inga tillgängliga avsnitt.\nDe spelas in när de är tillgängliga."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d minuter)</item>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 92f4d200..00038ff4 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Vidhibiti vya kucheza"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Vituo"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Vituo vya hivi karibuni"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Chaguo za Runinga"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Chaguo za PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Vidhibiti vya kucheza havipatikani kwa kituo hiki"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Cheza au usitishe"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Peleka mbele kwa kasi"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Manukuu"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Hali ya onyesho"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Imewashwa"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Imezimwa"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Sauti nyingi"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Pata vituo zaidi"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Mipangilio"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Chanzo"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Badili"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Imewashwa"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Imezimwa"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Sauti"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Kuu"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Dirisha la PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Muundo"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Chini kulia"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Juu kulia"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Juu kushoto"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Chini kushoto"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Upande kwa upande"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Ukubwa"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Kubwa"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Ndogo"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Chanzo cha data"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"Runinga (antena/kebo)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Hakuna maelezo ya programu"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Hakuna maelezo"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Kituo kilichozuiwa"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Lugha isiyojulikana"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Manukuu %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Lugha Isiyojulikana"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Manukuu"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Imezimwa"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Geuza muundo ukufae"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN uliyoweka si sahihi. Jaribu tena."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Jaribu tena, PIN hailingani"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Andika Msimbo wa Eneo lako"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Programu ya Televisheni Mtandaoni itatumia Msimbo wa eneo lako ili kutoa orodha kamili ya vipindi vya vituo vya televisheni."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Weka Msimbo wa Eneo lako"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Msimbo wa Eneo si Sahihi"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Mipangilio"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Geuza orodha ya vituo utakavyo"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Chagua vituo kwa ajili ya orodha yako ya vipindi"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Udhibiti wa wazazi"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Leseni za programu huria"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Leseni za programu huria"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Tuma maoni"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Toleo"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Ili uangalie kituo hiki, bonyeza Kulia na uweke PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Ili uangalie kipindi hiki, bonyeza Kulia na uweke PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Bonyeza CHAGUA "</b>" ili ufikie menyu ya televisheni."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Hakuna vifaa vya kuingiza maudhui ya runinga vinavyopatikana"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Haiwezi kupata vifaa vya kuingiza maudhui kwenye runinga"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP haiwezi kutumika"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Hakuna maudhui yanayoweza kuonyeshwa pamoja na PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Aina ya kirekebishaji haifai. Fungua programu ya Vituo vya Moja kwa Moja ya vifaa vya kuingiza maudhui ya runinga."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Haikuweza kurekebisha"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Hakuna programu iliyopatikana inayoweza kushughulikia kitendo hiki."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Hifadhi"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Rekodi za mara moja hupewa kipaumbele"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Ghairi"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Ghairi"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Sahau"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Komesha"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Angalia ratiba ya kurekodi"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Mpango huu mmoja"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Rekodi hii badala yake"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Ghairi rekodi hii"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Angalia sasa"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Futa rekodi..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Inaweza kurekodiwa"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Kurekodi kumeratibiwa"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Hitilafu ya kurekodi"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Inarekodi"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Imeshindwa kurekodi"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Inasoma maelezo ya programu ili kuunda ratiba"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Inasoma ratiba"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Angalia rekodi za hivi majuzi"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Haikumaliza kurekodi <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Haikumaliza kurekodi <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> na <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Haikumaliza kurekodi <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> na <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Haikumaliza kurekodi <xliff:g id="PROGRAMNAME">%1$s</xliff:g> kwa sababu nafasi ya hifadhi haikutosha."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Haikumaliza kurekodi <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> na <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> kwa sababu nafasi ya hifadhi haikutosha."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Haikumaliza kurekodi <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> na <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> kwa sababu nafasi ya hifadhi haikutosha."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Inasoma programu"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR inahitaji nafasi zaidi ya hifadhi"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Utaweza kurekodi vipindi kwa kutumia DVR. Hata hivyo, kwa sasa hakuna hifadhi ya kutosha kwenye kifaa chako ili kuwezesha DVR kufanya kazi. Tafadhali unganisha hifadhi ya nje isiyopungua GB <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> na ufuate hatua za kuiumbiza kuwa hifadhi ya kifaa."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Hifadhi haitoshi"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Kipindi hiki hakitarekodiwa kwa sababu hakuna hifadhi ya kutosha. Jaribu kufuta baadhi ya vipindi vilivyopo."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Hifadhi haipo"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Baadhi ya hifadhi inayotumiwa na DVR haipo. Tafadhali unganisha hifadhi ya nje uliyotumia awali ili uwashe upya DVR yako. Vinginevyo, unaweza kuchagua kusahau hifadhi ikiwa haipatikani tena."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Ungependa kusahau hifadhi?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Hatua hii itaondoa maudhui na ratiba zote ulizohifadhi."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Ungependa kuacha kurekodi?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Itahifadhi maudhui uliyorekodi."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Shughuli ya kurekodi kipindi cha <xliff:g id="PROGRAMNAME">%1$s</xliff:g> itasitishwa kwa sababu inakinzana na kipindi hiki. Maudhui yaliyorekodiwa yatahifadhiwa."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Rekodi zimeratibiwa lakini zinakinzana"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Inaendelea kurekodi japo kuna ukinzani"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> itarekodiwa."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Tayari umeratibu kurekodi kipindi hiki saa <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Tayari kimerekodiwa"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Tayari umerekodi kipindi hiki. Kinapatikana katika maktaba ya DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Shughuli ya kurekodi mfululizo imeratibiwa"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">Imeratibu kurekodi vipindi <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> vya <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one">Imeratibu kurekodi kipindi <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> cha <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">Imeratibu kurekodi vipindi <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> vya <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Haitarekodi vipindi <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> kutokana na ukinzani.</item>
- <item quantity="one">Imeratibu kurekodi kipindi <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> cha <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Haitarekodi kipindi kutokana na ukinzani.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">Imeratibu kurekodi vipindi <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> vya <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Haitarekodi vipindi <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> vya mfululizo huu na mifululizo mingine kutokana na ukinzani.</item>
- <item quantity="one">Imeratibu kurekodi kipindi <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> cha <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Haitarekodi vipindi <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> vya mfululizo huu na mifululizo mingine kutokana na ukinzani.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">Imeratibu kurekodi vipindi <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> vya <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Haitarekodi kipindi 1 cha mifululizo mingine kutokana na ukinzani.</item>
- <item quantity="one">Imeratibu kurekodi kipindi <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> cha <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Haitarekodi kipindi 1 cha mifululizo mingine kutokana na ukinzani.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">Imeratibu kurekodi vipindi <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> vya <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. Haitarekodi vipindi <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> vya mifululizo mingine kutokana na ukinzani.</item>
- <item quantity="one">Imeratibu kurekodi kipindi <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> cha <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Haitarekodi vipindi <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> vya mifululizo mingine kutokana na ukinzani.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Haikupata programu iliyorekodiwa."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Rekodi zinazohusiana"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Hakuna maelezo ya programu)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Ungependa kukomesha kurekodi mfululizo?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Vipindi vilivyorekodiwa vitaendelea kupatikana katika maktaba ya DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Komesha"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Hakuna vipindi vinavyopeperushwa kwa sasa."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Hakuna vipindi vinavyopatikana.\nVitarekodiwa pindi vitakapopatikana."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(Dakika %1$d)</item>
diff --git a/res/values-ta-rIN-v23/strings.xml b/res/values-ta-v23/strings.xml
index 1b94e0c4..1b94e0c4 100644
--- a/res/values-ta-rIN-v23/strings.xml
+++ b/res/values-ta-v23/strings.xml
diff --git a/res/values-ta-rIN/arrays.xml b/res/values-ta/arrays.xml
index 9d2c1f24..9d2c1f24 100644
--- a/res/values-ta-rIN/arrays.xml
+++ b/res/values-ta/arrays.xml
diff --git a/res/values-ta-rIN/rating_system_strings.xml b/res/values-ta/rating_system_strings.xml
index ae80dee6..ae80dee6 100644
--- a/res/values-ta-rIN/rating_system_strings.xml
+++ b/res/values-ta/rating_system_strings.xml
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta/strings.xml
index 79e9d974..7d13e3cf 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"மோனோ"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"ஸ்டீரியோ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"இயக்கக் கட்டுப்பாடுகள்"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"சேனல்கள்"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"சமீபத்திய சேனல்கள்"</string>
<string name="menu_title_options" msgid="7184594626814914022">"டிவி விருப்பங்கள்"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP விருப்பங்கள்"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"இந்தச் சேனலுக்கு இயக்கக் கட்டுப்பாடுகள் இல்லை"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"இயக்கு அல்லது இடைநிறுத்து"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"வேகமாக முன் நகர்த்து"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"விரிவான வசனங்கள்"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"காட்சிப் பயன்முறை"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"இயக்கத்தில்"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"முடக்கத்தில்"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"மல்டி-ஆடியோ"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"மேலும் சேனல்கள்"</string>
<string name="options_item_settings" msgid="7623205838542400074">"அமைப்புகள்"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"மூலம்"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"மாற்று"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"இயக்கத்தில்"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"முடக்கத்தில்"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ஒலி"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"முதன்மை"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP சாளரம்"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"தளவமைப்பு"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"கீழ் வலதுபுறம்"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"மேல் வலதுபுறம்"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"மேல் இடதுபுறம்"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"கீழ் இடதுபுறம்"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"அருகருகே"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"அளவு"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"பெரியது"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"சிறியது"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"உள்ளீட்டு மூலம்"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"டிவி (ஆண்டெனா/கேபிள்)"</string>
<string name="no_program_information" msgid="1049844207745145132">"நிகழ்ச்சி தகவல் இல்லை"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"தகவல் இல்லை"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"தடுக்கப்பட்ட சேனல்"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"தெரியாத மொழி"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"வசனங்கள் %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"தெரியாத மொழி"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"விரிவான வசனங்கள்"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"முடக்கு"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"வடிவமைப்பைத் தனிப்பயனாக்கவும்"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN தவறானது. மீண்டும் முயலவும்."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"மீண்டும் முயலவும், PIN பொருந்தவில்லை"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"அஞ்சல் குறியீட்டை உள்ளிடவும்."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"நேரலைச் சேனல்கள் பயன்பாடானது, டிவி சேனல்களின் முழுமையான நிகழ்ச்சி வழிகாட்டியை வழங்குவதற்கு அஞ்சல் குறியீட்டைப் பயன்படுத்தும்."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"அஞ்சல் குறியீட்டை உள்ளிடவும்"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"தவறான அஞ்சல் குறியீடு"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"அமைப்புகள்"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"சேனல் பட்டியலைத் தனிப்பயனாக்கு"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"நிகழ்ச்சி வழிகாட்டியில் சேர்ப்பதற்கான சேனல்களைத் தேர்வுசெய்க"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"பெற்றோர் கட்டுப்பாடுகள்"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"ஓப்பன் சோர்ஸ் உரிமங்கள்"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"ஓப்பன் சோர்ஸ் உரிமங்கள்"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"கருத்து அனுப்பு"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"பதிப்பு"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"இந்தச் சேனலைப் பார்க்க, வலது பக்கம் அழுத்தி, உங்கள் PINஐ உள்ளிடவும்"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"இந்த நிகழ்ச்சியைப் பார்க்க, வலது பக்கம் அழுத்தி PINஐ உள்ளிடவும்"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"TV மெனுவை அணுக, "<b>"SELECTஐ அழுத்தவும்"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"டிவி உள்ளீடு இல்லை"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"டிவி உள்ளீடு இல்லை"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP ஆதரிக்கப்படவில்லை"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP உடன் காண்பிக்கத்தக்க உள்ளீடு எதுவுமில்லை"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ட்யூனர் வகை பொருந்தவில்லை. ட்யூனர் வகை டிவி உள்ளீட்டிற்கு நேரலைச் சேனல்கள் பயன்பாட்டைத் துவங்கவும்."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ட்யூன் செய்ய முடியவில்லை"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"இந்தச் செயலைச் செய்வதற்கான பயன்பாடு எதுவுமில்லை."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"சேமி"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"ஒரே முறை ரெக்கார்டு செய்யக்கூடியவற்றுக்கு மிக அதிக முன்னுரிமை வழங்கு"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"ரத்துசெய்"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"ரத்துசெய்"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"நீக்கு"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"நிறுத்து"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"ரெக்கார்டிங் ஷெட்யூலைக் காட்டு"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"இந்த நிகழ்ச்சியை மட்டும்"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"பதிலாக, இதை ரெக்கார்டு செய்"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"இந்த ரெக்கார்டிங்கை ரத்துசெய்"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"இப்போது காட்டு"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"ரெக்கார்டிங்குகளை நீக்கு…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"ரெக்கார்டு செய்யக்கூடியது"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"ரெக்கார்டிங் திட்டமிடப்பட்டது"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"ரெக்கார்டிங்கில் முரண்பாடு"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"ரெக்கார்ட் செய்யப்படுகிறது"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"ரெக்கார்டு செய்ய முடியவில்லை"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"ரெக்கார்டிங் ஷெட்யூல்களை உருவாக்க, நிகழ்ச்சிகளைப் படிக்கிறது"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"நிகழ்ச்சிகளைப் படிக்கிறது"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"சமீபத்திய ரெக்கார்டிங்குகளைக் காட்டு"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>ஐ ரெக்கார்டு செய்வது முடிவடையவில்லை."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> மற்றும் <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>ஐ ரெக்கார்டு செய்வது முடிவடையவில்லை."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ஆகியவற்றை ரெக்கார்டு செய்வது முடிவடையவில்லை."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"போதுமான சேமிப்பிடம் இல்லாததால், <xliff:g id="PROGRAMNAME">%1$s</xliff:g>ஐ ரெக்கார்டு செய்வது முடிவடையவில்லை."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"போதுமான சேமிப்பிடம் இல்லாததால், <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> மற்றும் <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>ஐ ரெக்கார்டு செய்வது முடிவடையவில்லை."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"போதுமான சேமிப்பிடம் இல்லாததால், <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>, <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ஆகியவற்றை ரெக்கார்டு செய்வது முடிவடையவில்லை."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"நிகழ்ச்சிகளைப் படிக்கிறது"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVRக்கு அதிகச் சேமிப்பிடம் தேவை"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"நீங்கள் DVR மூலம் நிகழ்ச்சிகளைப் பதிவுசெய்ய முடியும். எனினும், DVR சரியாக வேலை செய்வதற்குத் தேவைப்படும் போதுமான சேமிப்பகம் இப்போது சாதனத்தில் இல்லை. <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>ஜி.பை. அல்லது அதற்கும் அதிகமான அளவில் உள்ள வெளிப்புற இயக்ககத்தை இணைக்கவும். பின் அதைச் சாதனச் சேமிப்பகமாகப் பயன்படுத்த, இந்தப் படிகளைப் பின்பற்றவும்."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"போதுமான சேமிப்பிடம் இல்லை"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"போதுமான சேமிப்பிடம் இல்லாததால், இந்த நிகழ்ச்சி ரெக்கார்டு செய்யப்படாது. ஏற்கனவே உள்ள சில ரெக்கார்டிங்குகளை நீக்கவும்."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"சேமிப்பகம் இல்லை"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR பயன்படுத்தும் சேமிப்பகம் இல்லை. DVRஐ மீண்டும் இயக்கும் முன், நீங்கள் பயன்படுத்தும் வெளிப்புற டிரைவை இணைக்கவும். மாற்றுவழியாக, சேமிப்பகத்தை இனி பயன்படுத்த மாட்டீர்கள் எனில், அதை நீக்கும்படியும் தேர்ந்தெடுக்கலாம்."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"சேமிப்பகத்தை நீக்கவா?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"பதிவுசெய்த உள்ளடக்கத்தையும் திட்ட அட்டவணைகளையும் இழப்பீர்கள்."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"ரெக்கார்டு செய்வதை நிறுத்தவா?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ரெக்கார்டு செய்த உள்ளடக்கம் சேமிக்கப்படும்."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>ஐ ரெக்கார்டு செய்வது இந்த நிகழ்ச்சியுடன் முரண்படுவதால், ரெக்கார்டிங் நிறுத்தப்படும். ரெக்கார்டு செய்த உள்ளடக்கம் சேமிக்கப்படும்."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ரெக்கார்டிங் திட்டமிடப்பட்டது, ஆனால் முரண்பாடுகள் உள்ளன"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ரெக்கார்டு செய்வது தொடங்கப்பட்டது, ஆனால் முரண்பாடுகள் உள்ளன"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ரெக்கார்டு செய்யப்படும்."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"<xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>க்கு ரெக்கார்டு செய்வதற்காக இந்த நிகழ்ச்சி ஏற்கனவே திட்டமிடப்பட்டுள்ளது."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"ஏற்கனவே ரெக்கார்டு செய்யப்பட்டது"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"இந்த நிகழ்ச்சி ஏற்கனவே ரெக்கார்டு செய்யப்பட்டது. மேலும் DVR நூலகத்தில் கிடைக்கும்."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"தொடர் ரெக்கார்டிங் திட்டமிடப்பட்டது"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ரெக்கார்டிங்குகள் திட்டமிடப்பட்டுள்ளன.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ரெக்கார்டிங் திட்டமிடப்பட்டுள்ளது.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ரெக்கார்டிங்குகள் திட்டமிடப்பட்டுள்ளன. முரண்பாடுகளின் காரணமாக, இந்தத் தொடரின் <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> எபிசோடுகள் ரெக்கார்டு செய்யப்படாது.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ரெக்கார்டிங் திட்டமிடப்பட்டுள்ளது. முரண்பாடுகளின் காரணமாக, இது ரெக்கார்டு செய்யப்படாது.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ரெக்கார்டிங்குகள் திட்டமிடப்பட்டுள்ளன. முரண்பாடுகளின் காரணமாக, இந்தத் தொடர் மற்றும் பிற தொடரின் <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> எபிசோடுகள் ரெக்கார்டு செய்யப்படாது.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ரெக்கார்டிங் திட்டமிடப்பட்டுள்ளது. முரண்பாடுகளின் காரணமாக, இந்தத் தொடர் மற்றும் பிற தொடரின் <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> எபிசோடுகள் ரெக்கார்டு செய்யப்படாது.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ரெக்கார்டிங்குகள் திட்டமிடப்பட்டுள்ளன. முரண்பாடுகளின் காரணமாக, பிற தொடரின் ஒரு எபிசோடு ரெக்கார்டு செய்யப்படாது.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ரெக்கார்டிங் திட்டமிடப்பட்டுள்ளது. முரண்பாடுகளின் காரணமாக, பிற தொடரின் ஒரு எபிசோடு ரெக்கார்டு செய்யப்படாது.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ரெக்கார்டிங்குகள் திட்டமிடப்பட்டுள்ளன. முரண்பாடுகளின் காரணமாக, பிற தொடரின் <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> எபிசோடுகள் ரெக்கார்டு செய்யப்படாது.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> தொடருக்கு <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ரெக்கார்டிங் திட்டமிடப்பட்டுள்ளது. முரண்பாடுகளின் காரணமாக, பிற தொடரின் <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> எபிசோடுகள் ரெக்கார்டு செய்யப்படாது.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"ரெக்கார்டு செய்த நிகழ்ச்சி இல்லை."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"தொடர்புடைய ரெக்கார்டிங்குகள்"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(நிகழ்ச்சி விளக்கம் இல்லை)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"தொடர் ரெக்கார்டிங்கை நிறுத்தவா?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"ரெக்கார்டு செய்யப்பட எபிசோடுகள் தொடர்ந்து DVR நூலகத்தில் இருக்கும்."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"நிறுத்து"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"இப்போது எந்த எபிசோடுகளும் நேரலையில் இல்லை."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"எபிசோடுகள் இல்லை.\nஅவை கிடைக்கும் போது ரெக்கார்டு செய்யப்படும்."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d நிமிடங்கள்)</item>
diff --git a/res/values-te-rIN-v23/strings.xml b/res/values-te-v23/strings.xml
index ac59e7af..ac59e7af 100644
--- a/res/values-te-rIN-v23/strings.xml
+++ b/res/values-te-v23/strings.xml
diff --git a/res/values-te-rIN/arrays.xml b/res/values-te/arrays.xml
index de6abf32..de6abf32 100644
--- a/res/values-te-rIN/arrays.xml
+++ b/res/values-te/arrays.xml
diff --git a/res/values-te-rIN/rating_system_strings.xml b/res/values-te/rating_system_strings.xml
index 6179802b..6179802b 100644
--- a/res/values-te-rIN/rating_system_strings.xml
+++ b/res/values-te/rating_system_strings.xml
diff --git a/res/values-te-rIN/strings.xml b/res/values-te/strings.xml
index f58294d1..274be2ce 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"మోనో"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"స్టీరియో"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"ప్లే నియంత్రణలు"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"ఛానెల్‌లు"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"ఇటీవలి ఛానెళ్లు"</string>
<string name="menu_title_options" msgid="7184594626814914022">"టీవీ ఎంపికలు"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP ఎంపికలు"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"ఈ ఛానెల్ యొక్క ప్లే నియంత్రణలు అందుబాటులో లేవు"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"ప్లే చేస్తుంది లేదా పాజ్ చేస్తుంది"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"ఫాస్ట్ ఫార్వార్డ్ చేస్తుంది"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"సంవృత శీర్షికలు"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"ప్రదర్శన మోడ్"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"ఆన్‌లో ఉంది"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"ఆఫ్‌లో ఉంది"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"బహుళ-ఆడియో"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"మరిన్ని ఛానెల్‌లను పొందండి"</string>
<string name="options_item_settings" msgid="7623205838542400074">"సెట్టింగ్‌లు"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"మూలం"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"మార్చు"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"ఆన్‌లో ఉంది"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"ఆఫ్‌లో ఉంది"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"ధ్వని"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"ప్రధానమైనది"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP విండో"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"లేఅవుట్"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"దిగువ కుడివైపు"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ఎగువ కుడివైపు"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ఎగువ ఎడమవైపు"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"దిగువ ఎడమవైపు"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"పక్కపక్కన"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"పరిమాణం"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"పెద్దది"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"చిన్నది"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"ఇన్‌పుట్ మూలం"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"టీవీ (యాంటెన్నా/కేబుల్)"</string>
<string name="no_program_information" msgid="1049844207745145132">"కార్యక్రమ సమాచారం లేదు"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"సమాచారం లేదు"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"బ్లాక్ చేసిన ఛానెల్"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"భాష తెలియదు"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"ఉపశీర్షికలు %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"భాష తెలియదు"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"సంవృత శీర్షికలు"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"ఆఫ్ చేయి"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"ఆకృతీకరణను అనుకూలీకరించు"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"ఆ పిన్ తప్పు. మళ్లీ ప్రయత్నించండి."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"మళ్లీ ప్రయత్నించండి, పిన్ సరిపోలలేదు"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"మీ జిప్ కోడ్‌ను నమోదు చేయండి."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"ప్రత్యక్ష ప్రసార ఛానెల్‌ల అనువర్తనం టీవీ ఛానెల్‌లకి సంబంధించిన పూర్తి ప్రోగ్రామ్ గైడ్‌ను అందించడానికి జిప్ కోడ్‌ను ఉపయోగిస్తుంది."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"మీ జిప్ కోడ్‌ను నమోదు చేయండి"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"జిప్ కోడ్ చెల్లదు"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"సెట్టింగ్‌లు"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"ఛానెల్‌ జాబితా అనుకూలీకరించండి"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"మీ ప్రోగ్రామ్ గైడ్ కోసం ఛానెల్‌లను ఎంచుకోండి"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"తల్లిదండ్రుల నియంత్రణలు"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"ఓపెన్ సోర్స్ లైసెన్స్‌లు"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"ఓపెన్ సోర్స్ లైసెన్స్‌లు"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"అభిప్రాయాన్ని పంపు"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"సంస్కరణ"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"ఈ ఛానెల్‌ను చూడటానికి, కుడివైపు బటన్ నొక్కి, మీ పిన్‌ని నమోదు చేయండి"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"ఈ ప్రోగ్రామ్‌ని చూడటానికి, కుడివైపు బటన్ నొక్కి, మీ పిన్‌ని నమోదు చేయండి"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"టీవీ మెనుని ప్రాప్యత చేయడానికి "<b>"ఎంచుకోండి నొక్కండి"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"టీవీ ఇన్‌పుట్ కనుగొనబడలేదు"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"టీవీ ఇన్‌పుట్‌ను కనుగొనడం సాధ్యపడదు"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIPకి మద్దతు లేదు"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIPతో చూపబడే ఇన్‌పుట్ ఏదీ అందుబాటులో లేదు"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ట్యూనర్ రకం తగినది కాదు. దయచేసి ట్యూనర్ రకం టీవీ ఇన్‌పుట్ కోసం లైవ్ ఛానెల్‌లు అనువర్తనాన్ని ప్రారంభించండి."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ట్యూన్ విఫలమైంది"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"ఈ చర్యను నిర్వహించడానికి అనువర్తనం ఏదీ కనుగొనబడలేదు."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"సేవ్ చేయి"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"ఒక పర్యాయ రికార్డింగ్‌లు అత్యధిక ప్రాధాన్యతను కలిగి ఉంటాయి"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"రద్దు చేయి"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"రద్దు చేయి"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"విస్మరించు"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"ఆపివేయి"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"రికార్డింగ్ షెడ్యూల్ చూడండి"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"ఈ ఒక్క కార్యక్రమం"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"బదులుగా దీన్ని రికార్డ్ చేయి"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"ఈ రికార్డింగ్‌ను రద్దు చేయి"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"ఇప్పుడే చూడండి"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"రికార్డింగ్‌లను తొలగించు…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"రికార్డ్ చేయవచ్చు"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"రికార్డింగ్ షెడ్యూల్ చేయబడింది"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"రికార్డింగ్ వైరుధ్యం"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"రికార్డ్ అవుతోంది"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"రికార్డింగ్ విఫలమైంది"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"రికార్డింగ్ షెడ్యూళ్లను రూపొందించడానికి కార్యక్రమాలను చదువుతోంది"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"కార్యక్రమాలను చదువుతోంది"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"ఇటీవలి రికార్డింగ్‌లను వీక్షించండి"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> రికార్డింగ్ అసంపూర్ణంగా ఉంది."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> మరియు <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> రికార్డింగ్‌లు అసంపూర్ణంగా ఉన్నాయి."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> మరియు <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> రికార్డింగ్‌లు అసంపూర్ణంగా ఉన్నాయి."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"తగినంత నిల్వ లేని కారణంగా, <xliff:g id="PROGRAMNAME">%1$s</xliff:g> రికార్డింగ్ పూర్తి కాలేదు."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"తగినంత నిల్వ లేని కారణంగా, <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> మరియు <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> రికార్డింగ్‌లు పూర్తి కాలేదు."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"తగినంత నిల్వ లేని కారణంగా, <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> మరియు <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> రికార్డింగ్‌లు పూర్తి కాలేదు."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"కార్యక్రమాలను చదువుతోంది"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVRకు మరింత నిల్వ అవసరం"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"మీరు DVRతో కార్యక్రమాలను రికార్డ్ చేయగలుగుతారు. అయితే, ప్రస్తుతం DVR పని చేయడానికి మీ పరికరంలో తగినంత నిల్వ ఖాళీ లేదు. దయచేసి <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB లేదా అంతకంటే ఎక్కువ ఖాళీ స్థలం గల బయటి డ్రైవ్‌ను కనెక్ట్ చేసి, ఆపై దాన్ని పరికర నిల్వగా ఫార్మాట్ చేయడానికి సూచనలను అనుసరించండి."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"తగినంత నిల్వ లేదు"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"తగినంత నిల్వ లేనందున ఈ కార్యక్రమం రికార్డ్ చేయబడదు. ఇప్పటికే ఉన్న కొన్ని రికార్డింగ్‌లను తొలగించడానికి ప్రయత్నించండి."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"నిల్వ కనిపించడం లేదు"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR ద్వారా ఉపయోగించబడిన కొంత నిల్వ కనిపించడం లేదు. దయచేసి DVRని పునఃప్రారంభించడానికి మీరు ఇంతకుముందు ఉపయోగించిన బయటి డిస్క్‌ను కనెక్ట్ చేయండి. లేదంటే, అది అందుబాటులో లేని పక్షంలో మీరు ఆ నిల్వను విస్మరించమని ఎంచుకోవచ్చు."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"నిల్వను విస్మరించాలా?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"మీ మొత్తం రికార్డ్ చేసిన కంటెంట్‌ను మరియు షెడ్యూల్‌లను కోల్పోతారు."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"రికార్డింగ్ ఆపివేయాలా?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"రికార్డ్ అయిన కంటెంట్ సేవ్ చేయబడుతుంది."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> యొక్క రికార్డింగ్‌కి ఈ కార్యక్రమంతో వైరుధ్యం తలెత్తినందున అది ఆపివేయబడుతుంది. రికార్డ్ చేసిన కంటెంట్ సేవ్ చేయబడుతుంది."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"రికార్డింగ్ షెడ్యూల్ చేయబడింది కానీ మిగిలిన వాటితో వైరుధ్యాలను కలిగి ఉంది"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"రికార్డింగ్ ప్రారంభమైంది, కానీ వైరుధ్యాలను కలిగి ఉంది"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> రికార్డ్ చేయబడుతుంది."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"ఇదే కార్యక్రమం ఇప్పటికే <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>కి రికార్డ్ చేయడానికి షెడ్యూల్ చేయబడింది."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"ఇప్పటికే రికార్డ్ అయింది"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"ఈ ప్రోగ్రామ్ ఇప్పటికే రికార్డ్ అయింది. ఇది DVR లైబ్రరీలో అందుబాటులో ఉంది."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"సిరీస్ రికార్డింగ్ షెడ్యూల్ చేయబడింది"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> రికార్డింగ్‌లు షెడ్యూల్ చేయబడ్డాయి.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> రికార్డింగ్ షెడ్యూల్ చేయబడింది.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> రికార్డింగ్‌లు షెడ్యూల్ చేయబడ్డాయి. వైరుధ్యాల కారణంగా వాటిలో <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> రికార్డ్ చేయబడవు.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> రికార్డింగ్ షెడ్యూల్ చేయబడింది. వైరుధ్యాల కారణంగా ఇది రికార్డ్ చేయబడదు.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> రికార్డింగ్‌లు షెడ్యూల్ చేయబడ్డాయి. వైరుధ్యాల కారణంగా ఈ సిరీస్ మరియు మరో సిరీస్‌లోని <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ఎపిసోడ్‌లు రికార్డ్ చేయబడవు.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> రికార్డింగ్ షెడ్యూల్ చేయబడింది. వైరుధ్యాల కారణంగా ఈ సిరీస్ మరియు మరో సిరీస్‌లోని <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ఎపిసోడ్‌లు రికార్డ్ చేయబడవు.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> రికార్డింగ్‌లు షెడ్యూల్ చేయబడ్డాయి. వైరుధ్యాల కారణంగా మరో సిరీస్‌లోని 1 ఎపిసోడ్ రికార్డ్ చేయబడదు.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> రికార్డింగ్ షెడ్యూల్ చేయబడింది. వైరుధ్యాల కారణంగా మరో సిరీస్‌లోని 1 ఎపిసోడ్ రికార్డ్ చేయబడదు.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> రికార్డింగ్‌లు షెడ్యూల్ చేయబడ్డాయి. వైరుధ్యాల కారణంగా మరో సిరీస్‌లోని <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ఎపిసోడ్‌లు రికార్డ్ చేయబడవు.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g>కి <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> రికార్డింగ్ షెడ్యూల్ చేయబడింది. వైరుధ్యాల కారణంగా మరో సిరీస్‌లోని <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ఎపిసోడ్‌లు రికార్డ్ చేయబడవు.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"రికార్డ్ చేసిన కార్యక్రమం కనుగొనబడలేదు."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"సంబంధిత రికార్డింగ్‌లు"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(కార్యక్రమం వివరణ లేదు)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"సిరీస్ రికార్డింగ్‌ను ఆపివేయాలా?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"రికార్డ్ అయిన ఎపిసోడ్‌లు DVR లైబ్రరీలో అలాగే అందుబాటులో ఉంటాయి."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"ఆపివేయి"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ప్రస్తుతం ఎపిసోడ్‌లు ఏవీ ప్రసారంలో లేవు."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"ఎపిసోడ్‌లు ఏవీ అందుబాటులో లేవు.\nఇవి అందుబాటులోకి వచ్చిన వెంటనే రికార్డ్ చేయబడతాయి."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d నిమిషాలు)</item>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 86f4a317..8424e9bb 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"โมโน"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"สเตอริโอ"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"การควบคุมการเล่น"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"ช่อง"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"ช่องล่าสุด"</string>
<string name="menu_title_options" msgid="7184594626814914022">"ตัวเลือกทีวี"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"ตัวเลือกของ PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"ไม่มีการควบคุมการเล่นสำหรับช่องนี้"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"เล่นหรือหยุดชั่วคราว"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"กรอไปข้างหน้า"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"คำบรรยาย"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"โหมดการแสดงผล"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"เปิด"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"ปิด"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"หลายเสียง"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"รับชมช่องต่างๆ มากขึ้น"</string>
<string name="options_item_settings" msgid="7623205838542400074">"การตั้งค่า"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"แหล่งที่มา"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"สลับ"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"เปิด"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"ปิด"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"เสียง"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"หลัก"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"หน้าต่าง PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"การจัดวาง"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"ขวาล่าง"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"ขวาบน"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"ซ้ายบน"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"ซ้ายล่าง"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"แสดงคู่กัน"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"ขนาด"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"ใหญ่"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"เล็ก"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"แหล่งที่มาอินพุต"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (สายอากาศ/เคเบิล)"</string>
<string name="no_program_information" msgid="1049844207745145132">"ไม่มีข้อมูลโปรแกรม"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"ไม่มีข้อมูล"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"ช่องที่ถูกบล็อก"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"ภาษาที่ไม่รู้จัก"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"คำอธิบายภาพ %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"ภาษาที่ไม่รู้จัก"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"คำบรรยาย"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"ปิด"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"กำหนดค่าการจัดรูปแบบ"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN ไม่ถูกต้อง ลองอีกครั้ง"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"ลองอีกครั้ง PIN ไม่ตรงกัน"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"ป้อนรหัสไปรษณีย์ของคุณ"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"แอป Live TV จะใช้รหัสไปรษณีย์สำหรับการจัดส่งคู่มือรายการทีวีช่องต่างๆ ฉบับเต็ม"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"ป้อนรหัสไปรษณีย์ของคุณ"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"รหัสไปรษณีย์ไม่ถูกต้อง"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"การตั้งค่า"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"กำหนดค่ารายการช่อง"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"เลือกช่องสำหรับคู่มือรายการทีวีของคุณ"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"การควบคุมโดยผู้ปกครอง"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"ใบอนุญาตโอเพนซอร์ส"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"ใบอนุญาตโอเพนซอร์ส"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"ส่งความคิดเห็น"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"เวอร์ชัน"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"หากต้องการดูช่องนี้ ให้กดขวาและป้อน PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"หากต้องการดูโปรแกรมนี้ ให้กดขวาและป้อน PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"กด \"เลือก\""</b>" เพื่อเข้าถึงเมนู TV"</string>
<string name="msg_no_input" msgid="3897674146985427865">"ไม่พบอินพุต TV"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"ไม่พบอินพุต TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"ไม่สนับสนุน PIP"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"ไม่มีอินพุตที่พร้อมใช้งานซึ่งสามารถแสดงด้วย PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"ประเภทตัวรับสัญญาณไม่เหมาะสม โปรดเปิดแอป Live TV สำหรับอินพุต TV ที่เป็นประเภทตัวรับสัญญาณ"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"การรับสัญญาณล้มเหลว"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"ไม่พบแอปสำหรับการทำงานนี้"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"บันทึก"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"การบันทึกครั้งเดียวมีความสำคัญสูงสุด"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"ยกเลิก"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"ยกเลิก"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"ไม่จำ"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"หยุด"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"ดูกำหนดการบันทึก"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"โปรแกรมนี้เท่านั้น"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"บันทึกรายการนี้แทน"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"ยกเลิกการบันทึกนี้"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"ดูตอนนี้"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"ลบรายการที่บันทึกไว้…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"สามารถบันทึกได้"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"กำหนดเวลาบันทึกแล้ว"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"ตารางบันทึกชนกัน"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"กำลังบันทึก"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"การบันทึกล้มเหลว"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"กำลังอ่านรายการเพื่อสร้างกำหนดเวลาการบันทึก"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"กำลังอ่านรายการ"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"ดูการบันทึกล่าสุด"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"การบันทึก <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ไม่สมบูรณ์"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"การบันทึก <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> และ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ไม่สมบูรณ์"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"การบันทึก <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> และ <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ไม่สมบูรณ์"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"การบันทึก <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ไม่สมบูรณ์ เนื่องจากพื้นที่เก็บข้อมูลไม่เพียงพอ"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"การบันทึก <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> และ <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ไม่สมบูรณ์ เนื่องจากพื้นที่เก็บข้อมูลไม่เพียงพอ"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"การบันทึก <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> และ <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> ไม่สมบูรณ์ เนื่องจากพื้นที่เก็บข้อมูลไม่เพียงพอ"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"กำลังอ่านรายการ"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR ต้องการพื้นที่เก็บข้อมูลเพิ่มเติม"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"คุณจะสามารถบันทึกรายการด้วย DVR ได้ อย่างไรก็ตาม ตอนนี้อุปกรณ์ของคุณมีพื้นที่เก็บข้อมูลไม่เพียงพอสำหรับให้ DVR ทำงาน โปรดเชื่อมต่อไดรฟ์ภายนอกที่มีขนาด <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB ขึ้นไป และทำตามขั้นตอนเพื่อฟอร์แมตไดรฟ์ให้เป็นพื้นที่เก็บข้อมูลของอุปกรณ์"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"พื้นที่เก็บข้อมูลไม่เพียงพอ"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"ไม่สามารถบันทึกรายการนี้ได้เนื่องจากพื้นที่เก็บข้อมูลไม่เพียงพอ โปรดลองลบบางรายการที่บันทึกไว้"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"พื้นที่เก็บข้อมูลหายไป"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"พื้นที่เก็บข้อมูลบางส่วนที่ DVR ใช้หายไป โปรดเชื่อมต่อไดรฟ์ภายนอกที่คุณใช้ก่อนเปิดใช้ DVR อีกครั้ง หรือคุณอาจเลือกไม่จำพื้นที่เก็บข้อมูลหากพื้นที่เก็บข้อมูลไม่พร้อมใช้งานอีกต่อไป"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"ไม่จำพื้นที่เก็บข้อมูลใช่ไหม"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"เนื้อหาและกำหนดการทั้งหมดที่คุณบันทึกไว้จะหายไป"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"หยุดบันทึกใช่ไหม"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ระบบจะเก็บเนื้อหาที่บันทึกไว้"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"การบันทึก <xliff:g id="PROGRAMNAME">%1$s</xliff:g> จะหยุดลงเนื่องจากตารางบันทึกชนกับรายการนี้ เนื้อหาที่บันทึกแล้วจะได้รับการเก็บไว้"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"กำหนดการบันทึกรายการชนกัน"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"เริ่มบันทึกรายการแล้ว แต่กำหนดการชนกัน"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"ระบบจะบันทึก <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"มีกำหนดบันทึกรายการเดียวกันนี้แล้วเวลา <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"บันทึกไว้แล้ว"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"บันทึกรายการนี้ไว้แล้ว สามารถดูได้ที่ห้องสมุด DVR"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"กำหนดเวลาบันทึกซีรีส์แล้ว"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_3">%2$s</xliff:g></item>
- <item quantity="one">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_1">%2$s</xliff:g></item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_3">%2$s</xliff:g> <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> รายการจะไม่มีการบันทึกเนื่องจากตารางบันทึกชนกัน</item>
- <item quantity="one">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> จะไม่มีการบันทึกเนื่องจากเนื่องจากตารางบันทึกชนกัน</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ซีรีส์นี้และซีรีส์อื่น <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ตอนจะไม่มีการบันทึกเนื่องจากตารางบันทึกชนกัน</item>
- <item quantity="one">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ซีรีส์นี้และซีรีส์อื่น <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ตอนจะไม่มีการบันทึกเนื่องจากตารางบันทึกชนกัน</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_3">%2$s</xliff:g> ซีรีส์อื่น 1 ตอนจะไม่มีการบันทึกเนื่องจากตารางบันทึกชนกัน</item>
- <item quantity="one">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ซีรีส์อื่น 1 ตอนจะไม่มีการบันทึกเนื่องจากตารางบันทึกชนกัน</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_4">%2$s</xliff:g> ซีรีส์อื่น <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ตอนจะไม่มีการบันทึกเนื่องจากตารางบันทึกชนกัน</item>
- <item quantity="one">กำหนดเวลาบันทึกแล้ว <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> รายการสำหรับ <xliff:g id="SERIESNAME_1">%2$s</xliff:g> ซีรีส์อื่น <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ตอนจะไม่มีการบันทึกเนื่องจากตารางบันทึกชนกัน</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"ไม่พบโปรแกรมที่บันทึกไว้"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"การบันทึกที่เกี่ยวข้อง"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(ไม่มีรายละเอียดรายการ)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"หยุดบันทึกซีรีส์ไหม"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"ตอนที่บันทึกไว้จะยังคงอยู่ในไลบรารี DVR"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"หยุด"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ไม่มีตอนใดออกอากาศในตอนนี้"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"ไม่มีตอนที่พร้อมรับชม\nระบบจะเริ่มบันทึกเมื่อมีตอนที่พร้อมรับชม"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d นาที)</item>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index bd944ba8..a925aee6 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Mga kontrol sa Play"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Mga Channel"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Kamakailang channel"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Opsyon sa TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Mga opsyon sa PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Hindi available para sa channel na ito ang mga kontrol ng laro"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"I-play o i-pause"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"I-fast forward"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Closed captions"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Display mode"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Naka-on"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Naka-off"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Multi-audio"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Higit pa channel"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Mga Setting"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Pinagmulan"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Pagpalitin"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Naka-on"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Naka-off"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Tunog"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Pangunahin"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP window"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Layout"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Kanang ibaba"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Kanang itaas"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Kaliwang itaas"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Kaliwang ibaba"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Magkatabi"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Laki"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Malaki"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Maliit"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Pinagmulan ng input"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antenna/cable)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Walang impormasyon ng programa"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Walang impormasyon"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Naka-block na channel"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Hindi kilalang wika"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Mga closed caption %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Hindi kilalang wika"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Mga closed caption"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Naka-off"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Customize formatting"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Mali ang PIN na iyon. Subukang muli."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Subukang muli, hindi tumutugma ang PIN"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Ilagay ang iyong ZIP Code."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Gagamitin ng app na Mga Live Channel ang ZIP Code upang magbigay ng kumpletong gabay sa programa para sa mga channel sa TV."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Ilagay ang iyong ZIP Code"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Di-wasto ang ZIP Code"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Mga Setting"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"I-customize lista ng channel"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Pumili ng mga channel para sa gabay sa programa"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Mga kontrol ng magulang"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Mga open source na lisensya"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Mga lisensyang open source"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Magpadala ng feedback"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Bersyon"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Upang mapanood ang channel na ito, pindutin ang Kanan at ilagay ang iyong PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Upang mapanood ang programang ito, pindutin ang Kanan at ilagay ang iyong PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Pindutin ang SELECT"</b>" upang i-access ang menu ng TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Walang nahanap na TV input"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Hindi mahanap ang TV input"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"Hindi sinusuportahan ang PIP"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Walang available na input na maipapakita sa PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Hindi naaangkop ang uri ng tuner. Pakilunsad ang app na Mga Live na Channel para sa uri ng tuner na input ng TV."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Hindi na-tune"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Walang nakitang app na gagawa sa aksyong ito."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"I-save"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Ang mga isang beses na pagre-record ang may pinakamataas na priyoridad"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Kanselahin"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Kanselahin"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Kalimutan"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Ihinto"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Tingnan, iskedyul ng recording"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Ang isang programang ito"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Ito na lang ang i-record"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Kanselahin ang pag-record na ito"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Panoorin ngayon"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"I-delete ang mga recording…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Mare-record"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Nakaiskedyul ang recording"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"May conflict sa pagre-record"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Nagre-record"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Hindi na-record"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Nagbabasa ng mga program upang makagawa ng mga iskedyul ng pagre-record"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Binabasa ang mga programa"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Tingnan ang mga kamakailang recording"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Hindi natapos ang pag-record sa <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Hindi natapos ang mga pag-record sa <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> at <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Hindi natapos ang mga pag-record sa <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> at <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Hindi natapos ang pag-record sa <xliff:g id="PROGRAMNAME">%1$s</xliff:g> dahil sa hindi sapat na storage."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Hindi natapos ang mga pag-record sa <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> at <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> dahil sa hindi sapat na storage."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Hindi natapos ang mga pag-record sa <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> at <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> dahil sa hindi sapat na storage."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Binabasa ang mga programa"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Kailangan ng DVR ng higit pang storage"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Makakapag-record ka ng mga program gamit ang DVR. Gayunpaman, walang sapat na storage sa iyong device ngayon upang gumana ang DVR. Mangyaring magkonekta ng external drive na <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB o mas malaki at sundin ang mga hakbang upang i-format ito bilang storage ng device."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Hindi sapat ang storage"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Hindi mare-record ang program na ito dahil walang sapat na storage. Subukang mag-delete ng ilang dati nang recording."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Nawawala ang storage"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"May nawawalang bahagi ng storage na ginagamit ng DVR. Pakikonekta ang external na drive na ginamit mo dati upang muling i-enable ang DVR. O kaya, maaari mo ring piliing kalimutan ang storage kung hindi na ito available."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Kalimutan ang storage?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Mawawala ang lahat ng na-record mong content at iskedyul."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Ihinto ang pagre-record?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Mase-save ang na-record na content."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Ihihinto na ang pag-record ng <xliff:g id="PROGRAMNAME">%1$s</xliff:g> dahil kasabay ito ng palabas na ito. Ise-save ang na-record na content."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Naiskedyul na ang pagre-record ngunit may mga hindi pagkakatugma"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Nagsimula na ang pagre-record ngunit may mga hindi pagkakatugma"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Mare-record ang <xliff:g id="PROGRAMNAME">%1$s</xliff:g>."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Naiskedyul na ang parehong programa na ma-record sa <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Na-record na"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Na-record na ang programang ito. Available ito sa DVR library."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Naiskedyul na ang pag-record ng series"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recording ang naiskedyul para sa <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> na recording ang naiskedyul para sa <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recording ang naiskedyul para sa <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Hindi mare-record ang <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> sa mga ito dahil sa may mga nakaiskedyul na.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> na recording ang naiskedyul para sa <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. Hindi mare-record ang <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> sa mga ito dahil sa may mga nakaiskedyul na.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recording ang naiskedyul para sa <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episode ng series na ito at ng iba pang series ang hindi mare-record dahil may mga nakaiskedyul na.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> na recording ang naiskedyul para sa <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> na episode ng series na ito at ng iba pang series ang hindi mare-record dahil may mga nakaiskedyul na.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> recording ang naiskedyul para sa <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 episode ng iba pang series ang hindi mare-record dahil sa may mga nakaiskedyul na.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> na recording ang naiskedyul para sa <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 episode ng iba pang series ang hindi mare-record dahil sa may mga nakaiskedyul na.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> recording ang naiskedyul para sa <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> episode ng iba pang series ang hindi mare-record dahil sa may mga nakaiskedyul na.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> na recording ang naiskedyul para sa <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> na episode ng iba pang series ang hindi mare-record dahil sa may mga nakaiskedyul na.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Hindi nakita ang na-record na programa."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Mga nauugnay na recording"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Walang paglalarawan ng program)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Gusto mo bang ihinto ang pagre-record ng mga serye?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Mananatiling available sa library ng DVR ang mga na-record na episode."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Ihinto"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Walang ipinapalabas na episode ngayon."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Walang available na mga episode.\nMare-record ang mga ito kapag available na ang mga ito."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d minuto)</item>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index df1e3c70..8162fbfa 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Oynatma denetimleri"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanallar"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Son kanallar"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV seçenekleri"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP seçenekleri"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Bu kanal için oynatma denetimleri kullanılamıyor"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Oynat veya duraklat"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"İleri sar"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Altyazılar"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Görüntü modu"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Açık"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Kapalı"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Çoklu ses"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Daha çok kanal al"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Ayarlar"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Kaynak"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Değiştir"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Açık"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Kapalı"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Ses"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Ana"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP penceresi"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Düzen"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Sağ alt"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Sağ üst"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Sol üst"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Sol alt"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Yan yana"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Boyut"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Büyük"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Küçük"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Giriş kaynağı"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (anten/kablo)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Hiçbir program bilgisi yok"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Bilgi yok"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Engellenen kanal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Bilinmeyen dil"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Altyazılar %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Bilinmeyen dil"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Altyazılar"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Kapalı"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Biçimi özelleştir"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Girdiğiniz PIN hatalıydı. Tekrar deneyin."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Tekrar deneyin, PIN eşleşmiyor"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Posta Kodunuzu girin."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Canlı Kanallar uygulaması, TV kanalları için eksiksiz bir program rehberi sunmak üzere Posta Kodu\'nu kullanacaktır."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Posta Kodunuzu girin"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Geçersiz Posta Kodu"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Ayarlar"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Kanal listesini özelleştir"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Program rehberiniz için kanalları seçin"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Ebeveyn denetimleri"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Açık kaynak lisansları"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Açık kaynak lisansları"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Geri bildirim gönder"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Sürüm"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Bu kanalı izlemek için Sağ tuşuna basın ve PIN\'inizi girin"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Bu programı izlemek için Sağ tuşuna basın ve PIN\'inizi girin"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"TV menüsüne erişmek için "<b>"SEÇ\'e basın"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"TV girişi bulunamadı"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV girişi bulunamadı"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP desteklenmiyor"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP ile göstermeye uygun giriş yok"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Kanal tarayıcı türü uygun değil. TV girişi kanal tarayıcı türü için lütfen Canlı Yayın Kanalları uygulamasını başlatın."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Tarama işlemi başarısız oldu"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Bu işlemi gerçekleştirecek uygulama bulunamadı."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Kaydet"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Bir kerelik kayıtlar en yüksek önceliğe sahip"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"İptal"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"İptal"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Unut"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Durdur"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Kayıt programını görüntüle"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Yalnızca bu program"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Onun yerine bunu kaydet"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Bu kaydı iptal et"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Şimdi izle"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Kayıtları sil…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Kaydedilebilir"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Kayıt programlandı"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Kayıt çakışması"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Kaydediliyor"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Kaydedilemedi"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Kayıt planlarını oluşturmak için programlar okunuyor"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Program bilgisi okunuyor"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Son kayıtları görüntüleyin"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> kaydı tam değil."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ve <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> kayıtları tam değil."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ve <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> kayıtları tam değil."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Kullanılabilir depolama alanı yeterli olmadığından <xliff:g id="PROGRAMNAME">%1$s</xliff:g> kaydı tamamlanamadı."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Kullanılabilir depolama alanı yeterli olmadığından <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ve <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> kayıtları tamamlanamadı."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Kullanılabilir depolama alanı yeterli olmadığından <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ve <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> kayıtları tamamlanamadı."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Program bilgisi okunuyor"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR için daha fazla depolama alanı gerekiyor"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Programları DVR ile kaydedebileceksiniz. Ancak şu anda cihazınızda DVR\'nin çalışması için yeterli miktarda boş depolama alanı yok. Lütfen <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB veya daha büyük kapasiteye sahip harici sürücü bağlayın ve bu sürücüyü cihaz depolama alanı olarak biçimlendirmek için adımları uygulayın."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Yeterli depolama alanı yok"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Yeterli depolama alanı olmadığı için bu program kaydedilmeyecek. Mevcut kayıtlardan bazılarını silmeyi deneyin."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Kayıp depolama birimi"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"DVR tarafından kullanılan bazı depolama alanları kayıp. DVR\'yi yeniden etkinleştirmeden önce lütfen kullandığınız harici sürücüyü bağlayın. Ayrıca bu depolama alanı artık kullanılmıyorsa unutulmasını da seçebilirsiniz."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Depolama alanı unutulsun mu?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Kaydedilen tüm içeriğiniz ve programlarınız kaybolacaktır."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Kayıt durudurulsun mu?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Kaydedilen içerik saklanacak."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> kaydı, bu programla çakıştığından durdurulacak. Kaydedilen içerik saklanacak."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Kayıt programlandı, ancak çakışmalar var"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Kayıt işlemi başladı, ancak çakışmalar var"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> kaydedilecek."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Aynı program şu tarihte ve saatte kaydedilecek şekilde zaten programlandı: <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Zaten kaydedildi"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Bu program zaten kaydedildi. DVR kitaplığında bulabilirsiniz."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Dizi kaydı programlandı"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> kayıt programlandı.</item>
- <item quantity="one"> <xliff:g id="SERIESNAME_1">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> kayıt programlandı.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> kayıt programlandı. Çakışma nedeniyle bu kayıtların <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> tanesi yapılmayacak.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> kayıt programlandı. Çakışma nedeniyle bu kayıt yapılmayacak.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> kayıt programlandı. Çakışma nedeniyle bu dizinin ve diğer dizilerin <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> bölümü kaydedilmeyecek.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> kayıt programlandı. Çakışma nedeniyle bu dizinin ve diğer dizilerin <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> bölümü kaydedilmeyecek.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> kayıt programlandı. Çakışma nedeniyle diğer dizinin 1 bölümü kaydedilmeyecek.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> kayıt programlandı. Çakışma nedeniyle diğer dizinin 1 bölümü kaydedilmeyecek.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> kayıt programlandı. Çakışma nedeniyle diğer dizinin <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> bölümü kaydedilmeyecek.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> için <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> kayıt programlandı. Çakışma nedeniyle diğer dizinin <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> bölümü kaydedilmeyecek.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Kaydedilen program bulunamadı."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"İlgili kayıtlar"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Program açıklaması yok)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Dizinin kaydı durdurulsun mu?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Kaydedilen bölümler DVR kitaplığında kalmaya devam edecektir."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Durdur"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Şu anda yayınlanan bir bölüm yok."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Kaydedilebilecek bir bölüm yok.\nBölümler kullanıma sunulduğunda kaydedilecektir."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d dakika)</item>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index e644fd02..b9d91a7a 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"моно"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"стерео"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Керування відтворенням"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Канали"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Останні канали"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Опції ТБ"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Опції PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Елементи керування відтворенням, яких немає в цьому каналі"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Відтворити або призупинити"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Перемотати вперед"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Субтитри"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Режим показу"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Увімкнено"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Вимкнено"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Кілька аудіо"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Більше каналів"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Налаштування"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Джерело"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Заміна"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Увімкнено"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Вимкнено"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Звук"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Основне вікно"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Вікно PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Схема"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Унизу праворуч"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Угорі праворуч"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Угорі ліворуч"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Унизу ліворуч"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Поруч"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Розмір"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Великий розмір"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Малий розмір"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Джерело сигналу"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"ТБ (ефірне або кабельне)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Немає інформації про програму"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Немає інформації."</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Заблокований канал"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Невідома мова"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Субтитри (%1$d)"</string>
+ <string name="default_language" msgid="4122326459624337928">"Невідома мова"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Субтитри"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Вимкнути"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Налаштувати формат"</string>
@@ -120,10 +139,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Цей PIN-код неправильний. Повторіть спробу."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN-коди не збігаються. Повторіть спробу"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Введіть поштовий індекс."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Додаток Телеканали показує повну програму телепередач на основі поштового індексу."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Введіть поштовий індекс"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Недійсний поштовий індекс"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Налаштування"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Налаштувати список каналів"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Вибрати канали для програми телепередач"</string>
@@ -132,7 +147,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Батьківський контроль"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Ліцензії відкритого коду"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Ліцензії ПЗ з відкритим кодом"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Надіслати відгук"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Версія"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Щоб дивитися цей канал, натисніть стрілку праворуч і введіть PIN-код"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Щоб дивитися цю телепередачу, натисніть стрілку праворуч і введіть PIN-код"</string>
@@ -175,6 +189,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Натисніть \"ВИБРАТИ\""</b>", щоб відкрити меню телевізора."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Не знайдено джерел вхідного телесигналу"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Не вдається знайти джерело вхідного телесигналу"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP не підтримується"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Немає джерел вхідного сигналу для PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Тюнер не підтримується. Щоб використовувати тюнер, запустіть додаток Live TV."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Не вдалося налаштувати"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Не знайдено додатка для цієї дії."</string>
@@ -263,6 +279,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Зберегти"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Одноразові записи мають найвищий пріоритет"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Скасувати"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Скасувати"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Забути"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Припинити"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Переглянути розклад запису"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Лише ця передача"</string>
@@ -272,29 +290,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Натомість записати цю передачу"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Скасувати цей запис"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Дивитися"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Видалити записи…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Можна записати"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Запис заплановано"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Конфлікт запису"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Запис"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Не записано"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Читаються назви передач для створення розкладів"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Читання інформації про передачі"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Переглянути нещодавні записи"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Запис передачі \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" не завершено."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Запис передач \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\" і \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" не завершено."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Запис передач \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\", \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" і \"<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>\" не завершено."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Запис передачі \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" не завершено. Замало місця."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Запис передач \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\" і \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" не завершено. Замало місця."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Запис передач \"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>\", \"<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>\" і \"<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>\" не завершено. Замало місця."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Читання даних програм"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"Пристрою DVR потрібно більше пам’яті"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"За допомогою пристрою DVR можна записувати програми, однак на ньому недостатньо пам’яті. Підключіть зовнішній диск ємністю <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> Гб або більше та дотримуйтеся вказівок, щоб відформатувати його як пам’ять пристрою."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Замало пам’яті"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Замало пам’яті. Цю передачу не буде записано. Спробуйте видалити деякі наявні записи."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Немає пам’яті"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Немає деякої пам’яті, яку використовує DVR. Щоб знову ввімкнути DVR, під’єднайте зовнішній диск, який ви використовували раніше. Можна також забути пам’ять, якщо вона недоступна."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Забути пам’ять?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Увесь записаний вміст і розклади буде втрачено."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Припинити запис?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Записаний вміст буде збережено."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Запис серіалу \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" буде зупинено через конфлікти з ним. Записаний вміст буде збережено."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Запис заплановано, однак є конфлікти"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Запис почався, однак є конфлікти"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"Програму \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" буде записано."</string>
@@ -314,37 +328,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Цю передачу вже заплановано записати о <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Уже записано"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Цю передачу вже записано. Вона доступна в бібліотеці DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Заплановано запис серіалу"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> запис серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\".</item>
- <item quantity="few">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записи серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\".</item>
- <item quantity="many">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записів серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\".</item>
- <item quantity="other">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> запису серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\".</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> запис серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Через конфлікти не буде записано <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> із них.</item>
- <item quantity="few">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записи серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Через конфлікти не буде записано <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> з них.</item>
- <item quantity="many">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записів серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Через конфлікти не буде записано <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> із них.</item>
- <item quantity="other">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> запису серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Через конфлікти не буде записано <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> із них.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one">Заплановано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> запис серіалу \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Через конфлікти не буде записано стільки серій цього й іншого серіалів: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="few">Заплановано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записи серіалу \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Через конфлікти не буде записано стільки серій цього й іншого серіалів: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="many">Заплановано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записів серіалу \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Через конфлікти не буде записано стільки серій цього й іншого серіалів: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="other">Заплановано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> запису серіалу \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Через конфлікти не буде записано стільки серій цього й іншого серіалів: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> запис серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Через конфлікти не буде записано 1 серію іншого серіалу.</item>
- <item quantity="few">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записи серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Через конфлікти не буде записано 1 серію іншого серіалу.</item>
- <item quantity="many">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> записів серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Через конфлікти не буде записано 1 серію іншого серіалу.</item>
- <item quantity="other">Заплановано <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> запису серіалу \"<xliff:g id="SERIESNAME_3">%2$s</xliff:g>\". Через конфлікти не буде записано 1 серію іншого серіалу.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one">Заплановано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> запис серіалу \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Через конфлікти не буде записано стільки серій іншого серіалу: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="few">Заплановано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записи серіалу \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Через конфлікти не буде записано стільки серій іншого серіалу: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="many">Заплановано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> записів серіалу \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Через конфлікти не буде записано стільки серій іншого серіалу: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- <item quantity="other">Заплановано <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> запису серіалу \"<xliff:g id="SERIESNAME_4">%2$s</xliff:g>\". Через конфлікти не буде записано стільки серій іншого серіалу: <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g>.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Не вдалося знайти записані програми."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Пов’язані записи"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Немає опису програми)"</string>
@@ -371,7 +362,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Припинити запис серій?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Записані серії можна переглянути в бібліотеці DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Припинити"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Зараз серії не транслюються."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Немає серій.\nСерії буде записано, щойно вони з’являться."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d хвилина)</item>
diff --git a/res/values-ur-rPK-v23/strings.xml b/res/values-ur-v23/strings.xml
index 22ec8b49..22ec8b49 100644
--- a/res/values-ur-rPK-v23/strings.xml
+++ b/res/values-ur-v23/strings.xml
diff --git a/res/values-ur-rPK/arrays.xml b/res/values-ur/arrays.xml
index f54b4914..f54b4914 100644
--- a/res/values-ur-rPK/arrays.xml
+++ b/res/values-ur/arrays.xml
diff --git a/res/values-ur-rPK/rating_system_strings.xml b/res/values-ur/rating_system_strings.xml
index 07f99a99..07f99a99 100644
--- a/res/values-ur-rPK/rating_system_strings.xml
+++ b/res/values-ur/rating_system_strings.xml
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur/strings.xml
index e4674e9f..47fcb2ad 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"مونو"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"اسٹیریو"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"پلے کنٹرولز"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"چینلز"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"حالیہ چینلز"</string>
<string name="menu_title_options" msgid="7184594626814914022">"‏TV کے اختیارات"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"‏PIP کے اختیارات"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"چلانے کے کنٹرولز اس چینل کیلئے غیر دستیاب ہیں"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"چلائیں یا موقوف کریں"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"تیزی سے فارورڈ کریں"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"سب ٹائٹلز"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"ڈسپلے وضع"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"آن"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"آف"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"کثیر آڈیو"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"مزید چینلز حاصل کریں"</string>
<string name="options_item_settings" msgid="7623205838542400074">"ترتیبات"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"ماخذ"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"تبادلہ کریں"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"آن"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"آف"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"آواز"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"مرکزی"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"‏PIP ونڈو"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"لے آؤٹ"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"نیچے دائیں"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"اوپری دائیں"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"اوپری بائیں"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"نیچے بائیں"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"سمت بہ سمت"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"سائز"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"بڑا"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"چھوٹا"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"ان پٹ ماخذ"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"‏TV (اینٹینا/کیبل)"</string>
<string name="no_program_information" msgid="1049844207745145132">"پروگرام کی معلومات نہیں"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"کوئی معلومات نہیں ہے"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"مسدود چینل"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"نامعلوم زبان"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"‏سب ٹائٹلز ‎%1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"نامعلوم زبان"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"سب ٹائٹلز"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"آف"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"فارمیٹنگ کسٹمائز کریں"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"‏وہ PIN غلط تھا۔ دوبارہ کوشش کریں۔"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"‏دوبارہ کوشش کریں، PIN مماثل نہیں ہے"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"اپنا زپ کوڈ درج کریں۔"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"‏لائیو چینلز ایپ TV چینلز کیلئے ایک مکمل پروگرام گائیڈ فراہم کرنے کیلئے زپ کوڈ استعمال کرے گی۔"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"اپنا زپ کوڈ درج کریں"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"غلط زپ کوڈ"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"ترتیبات"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"چینل فہرست حسب ضرورت بنائیں"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"اپنی پروگرام گائیڈ کیلئے چینلز منتخب کریں"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"پیرنٹل کنٹرولز"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"اوپن سورس لائسنسز"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"اوپن سورس لائسنسز"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"تاثرات بھیجیں"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"ورژن"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"‏یہ چینل دیکھنے کیلئے Right دبائیں اور اپنا PIN درج کریں"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"‏یہ پروگرام دیکھنے کیلئے Right دبائیں اور اپنا PIN درج کریں"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"‏TV مینو تک رسائی حاصل کرنے کیلئے "<b>"منتخب کریں کو دبائیں"</b>"۔"</string>
<string name="msg_no_input" msgid="3897674146985427865">"‏کوئی TV ان پٹ نہیں ملا"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"‏TV ان پٹ تلاش نہیں کیا جا سکتا"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"‏PIP تعاون یافتہ نہیں ہے"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"‏ایسا کوئی ان پٹ دستیاب نہیں ہے جسے PIP کے ساتھ دکھایا جا سکے"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"‏ٹیونر کی قسم مناسب نہیں ہے۔ براہ کرم ٹیونر کی قسم والے TV ان پٹ کیلئے لائیو چینلز ایپ شروع کریں۔"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"ٹیون کرنا ناکام ہوگیا"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"اس کارروائی کو نمٹانے کیلئے کوئی ایپ نہیں ملی۔"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"محفوظ کریں"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"یک وقتی ریکارڈنگز کو سب سے اعلی ترجیح حاصل ہوتی ہے"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"منسوخ کریں"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"منسوخ کریں"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"بھول جائیں"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"روکیں"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"ریکارڈنگ کا شیڈول ملاحظہ کریں"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"یہ واحد پروگرام"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"اس کی بجائے یہ ریکارڈ کریں"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"اس ریکارڈنگ کو منسوخ کریں"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"ابھی دیکھیں"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"ریکارڈنگز حذف کریں…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"قابل ریکارڈ"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"ریکارڈنگ کا شیڈول"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"ریکارڈنگ شیڈول میں تصادم"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"ریکارڈ ہو رہا ہے"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"ریکارڈنگ ناکام ہو گئی"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"ریکارڈنگ کے شیڈولز بنانے کیلئے پروگرام پڑھے جا رہے ہیں"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"پروگرامز پڑھے جا رہے ہیں"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"حالیہ ریکارڈنگز ملاحظہ کریں"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> کی ریکارڈنگ نامکمل ہے۔"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> اور <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> کی ریکارڈنگز نامکمل ہیں۔"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>، <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> اور <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> کی ریکارڈنگز نامکمل ہیں۔"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"ناکافی اسٹوریج کی وجہ سے <xliff:g id="PROGRAMNAME">%1$s</xliff:g> کی ریکارڈنگ مکمل نہیں ہوئی۔"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"ناکافی اسٹوریج کی وجہ سے <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> اور <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> کی ریکارڈنگز مکمل نہیں ہوئیں۔"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"ناکافی اسٹوریج کی وجہ سے <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>، <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> اور <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> کی ریکارڈنگز مکمل نہیں ہوئیں۔"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"پروگرامز پڑھے جا رہے ہیں"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"‏DVR کو مزید اسٹوریج درکار ہے"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"‏آپ DVR کے ساتھ پروگرامز ریکارڈ کر سکیں گے۔ تاہم آپ کے آلہ پر DVR کے کام کرنے کیلئے ابھی کافی اسٹوریج نہیں ہے۔ براہ کرم ایک بیرونی ڈرائیو منسلک کریں جو GB <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> یا اس سے بڑی ہو اور اسے آلہ کی اسٹوریج کے بطور فارمیٹ کرنے کیلئے مراحل کی پیروی کریں۔"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"اسٹوریج کافی نہیں ہے"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"یہ پروگرام ریکارڈ نہیں ہوگا کیونکہ اسٹوریج کافی نہیں ہے۔ کچھ موجودہ ریکارڈنگز حذف کرنے کی کوشش کریں۔"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"اسٹوریج غائب ہے"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"‏DVR کی استعمال کردہ کچھ اسٹوریج غائب ہے۔ براہ کرم وہ بیرونی ڈرائیو جو آپ نے پہلے DVR کو دوبارہ فعال کرنے کیلئے استعمال کی تھی، منسلک کریں۔ متبادل طور پر، اگر یہ مزید دستیاب نہ ہو تو آپ اسٹوریج کو بھولنے کا انتخاب کر سکتے ہیں۔"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"اسٹوریج کو بھول جائیں؟"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"آپ کا تمام ریکارڈ کردہ مواد اور شیڈولز ضائع ہو جائیں گے۔"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"ریکارڈنگ روکیں؟"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ریکارڈ شدہ مواد محفوظ ہو جائے گا۔"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> کی ریکارڈنگ روک دی جائے گی کیونکہ یہ اس پروگرام کے ساتھ متضاد ہے۔ ریکارڈ کردہ مواد محفوظ ہو جائے گا۔"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"ریکارڈنگ کا شیڈول لیکن تضادات"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"ریکارڈنگ شروع ہو گئی ہے لیکن اس میں تضادات ہیں"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ریکارڈ ہوجائے گا۔"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"اسی پروگرام کا پہلے ہی <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> بجے ریکارڈ ہونے کیلئے شیڈول بنا ہوا ہے۔"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"پہلے سے ریکارڈ شدہ"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"‏یہ پروگرام پہلے سے ہی ریکارڈ شدہ ہے۔ یہ DVR لائبریری میں دستیاب ہے۔"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"سیریز کی ریکارڈنگ کا شیڈول بن گیا ہے"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ریکارڈنگز کا شیڈول بن گیا ہے۔</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ریکارڈنگ کا شیڈول بن گیا ہے۔</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ریکارڈنگز کا شیڈول بن گیا ہے۔ تضادات کی وجہ سے ان میں سے <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> ریکارڈ نہیں ہوں گی۔</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ریکارڈنگ کا شیڈول بن گیا ہے۔ تضادات کی وجہ سے اس کی ریکارڈنگ نہیں ہو گی۔</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ریکارڈنگز کا شیڈول بن گیا ہے۔ تضادات کی وجہ سے اس سیریز اور دیگر سیریز کی <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> اقساط ریکارڈ نہیں ہوں گی۔</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ریکارڈنگ کا شیڈول بن گیا ہے۔ تضادات کی وجہ سے اس سیریز اور دیگر سیریز کی <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> اقساط ریکارڈ نہیں ہوں گی۔</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ریکارڈنگز کا شیڈول بن گیا ہے۔ تضادات کی وجہ سے دیگر سیریز کی 1 قسط ریکارڈ نہیں ہو گی۔</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ریکارڈنگ کا شیڈول بن گیا ہے۔ تضادات کی وجہ سے دیگر سیریز کی 1 قسط ریکارڈ نہیں ہو گی۔</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ریکارڈنگز کا شیڈول بن گیا ہے۔ تضادات کی وجہ سے دیگر سیریز کی <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> اقساط ریکارڈ نہیں ہوں گی۔</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> کیلئے <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ریکارڈنگ کا شیڈول بن گیا ہے۔ تضادات کی وجہ سے دیگر سیریز کی <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> اقساط ریکارڈ نہیں ہوں گی۔</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"ریکارڈ شدہ پروگرام نہیں ملا۔"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"متعلقہ ریکارڈنگز"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(پروگرام کی کوئی تفصیل نہیں)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"سیریز ریکارڈنگ روکیں؟"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"‏ریکارڈ شدہ ایپی سوڈز DVR لائبریری میں دستیاب رہیں گے۔"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"روکیں"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"ابھی کوئی ایپی سوڈ آن ائیر نہیں ہے۔"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"کوئی ایپی سوڈز دستیاب نہیں۔\nایک بار دستیاب ہوجائے تو ان کو ریکارڈ کیا جائے گا۔"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">‏(%1$d منٹ)</item>
diff --git a/res/values-uz-rUZ-v23/strings.xml b/res/values-uz-v23/strings.xml
index 9d1c1de7..9d1c1de7 100644
--- a/res/values-uz-rUZ-v23/strings.xml
+++ b/res/values-uz-v23/strings.xml
diff --git a/res/values-uz-rUZ/arrays.xml b/res/values-uz/arrays.xml
index 71619002..71619002 100644
--- a/res/values-uz-rUZ/arrays.xml
+++ b/res/values-uz/arrays.xml
diff --git a/res/values-uz-rUZ/rating_system_strings.xml b/res/values-uz/rating_system_strings.xml
index 91d82748..91d82748 100644
--- a/res/values-uz-rUZ/rating_system_strings.xml
+++ b/res/values-uz/rating_system_strings.xml
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz/strings.xml
index d2c390b6..55a0324f 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Boshqaruv"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kanallar"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"So‘nggi kanallar"</string>
<string name="menu_title_options" msgid="7184594626814914022">"TV sozlamalari"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP sozlamalari"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Ushbu kanal uchun ijro etish boshqaruvlari mavjud emas"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Ijro yoki pauza"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Oldinga tezkor o‘tkazish"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Taglavhalar"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Ekran rejimi"</string>
<string name="options_item_pip" msgid="3951350386626879645">"Kadr ustida kadr"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Yoniq"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"O‘chiq"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Ko‘p kanalli"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Boshqa kanallar"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Sozlamalar"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Manba"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Almashtirish"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Yoniq"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"O‘chiq"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Ovoz"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Asosiy oyna"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP oynasi"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Joylashuvi"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Pastda o‘ngda"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Tepada o‘ngda"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Tepada chapda"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Pastda chapda"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Yonma-yon"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"O‘lchami"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Katta"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Kichik"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Kirish manbasi"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (antenna/kabel)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Dastur haqida ma’l. yo‘q"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Ma’lumot yo‘q"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Bloklangan kanal"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Noma’lum til"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Taglavhalar %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Noma’lum til"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Taglavhalar"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"O‘chiq"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Formatlarni sozlash"</string>
@@ -78,7 +97,7 @@
<string name="option_toggle_parental_controls_on" msgid="9122851821454622696">"Yoniq"</string>
<string name="option_toggle_parental_controls_off" msgid="7797910199040440618">"O‘chiq"</string>
<string name="option_channels_locked" msgid="5797855082297549907">"Kanallar bloklandi"</string>
- <string name="option_channels_lock_all" msgid="6594512884477342940">"Hammasini bloklash"</string>
+ <string name="option_channels_lock_all" msgid="6594512884477342940">"Barchasini bloklash"</string>
<string name="option_channels_unlock_all" msgid="6839513296447567623">"Blokdan chiqarish"</string>
<string name="option_channels_subheader_hidden" msgid="4669425935426972078">"Berkitilgan kanallar"</string>
<string name="option_program_restrictions" msgid="241342023067364108">"Yosh cheklovlari"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN-kod noto‘g‘ri, qaytadan urining."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Qaytadan urinib ko‘ring, PIN-kod noto‘g‘ri"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Pochta indeksini kiriting."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Jonli efir ilovasi TV kanallari uchun to‘liq teledasturlarni taqdim etish uchun pochta indeksidan foydalanadi."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Pochta indeksini kiriting"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Pochta indeksi xato"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Sozlamalar"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Ro‘yxatni sozlash"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Teledastur uchun kanallarni tanlash"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Ota-ona nazorati"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Ochiq kodli DT litsenziyalari"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Ochiq kodli DT litsenziyalari"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Fikr-mulohaza yuborish"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Versiyasi"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Bu kanalni ko‘rish uchun o‘ngga qaragan chiziqni bosing va PIN kodni kiriting"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Bu dasturni ko‘rish uchun o‘ngga qaragan chiziqni bosing va PIN kodni kiriting"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"TV menyusiga kirish uchun "<b>"TANLASH tugmasini bosing"</b>"."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Hech qanday TV-kirish topilmadi"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"TV-kirishni topib bo‘lmadi"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP qo‘llab-quvvatlanmaydi"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"PIP bilan ko‘rsatish uchun hech qanday manba yo‘q"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Tyuner turi mos kelmaydi. Agar TV-kirishdan foydalanayotgan bo‘lsangiz, “Jonli efir” ilovasini ishga tushiring."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Sozlashni amalga oshirib bo‘lmadi."</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Bu amalni bajara oladigan ilova topilmadi."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Saqlash"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Bir martalik yozuvlarning muhimlilik darajasi yuqori"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Bekor q-sh"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Bekor qilish"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"O‘chirib tashlash"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"To‘xtatish"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Yozib olish jadvalini ko‘rish"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Faqat bu dastur"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Bu dasturni yozib olish"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Bu yozib olishni bekor qilish"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Tomosha qilish"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Yozuvlarni o‘chirish…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Yozib olish mumkin"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Yozib olish rejalashtirildi"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Yozib olish taymerida ziddiyat"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Yozib olish"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Yozib olib bo‘lmadi"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Yozib olish jadvallarini yaratish uchun dasturlar o‘qib chiqilmoqda"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Dasturlar o‘qib chiqilmoqda"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Oxirgi yozuvlarni ko‘rish"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"“<xliff:g id="PROGRAMNAME">%1$s</xliff:g>” to‘liq yozib olinmadi."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"“<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>” va “<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>” to‘liq yozib olinmadi."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"“<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>”, “<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>” va “<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>” to‘liq yozib olinmadi."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Xotirada joy kamligi tufayli “<xliff:g id="PROGRAMNAME">%1$s</xliff:g>” to‘liq yozib olinmadi."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Xotirada joy kamligi tufayli “<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>” va “<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>” to‘liq yozib olinmadi."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Xotirada joy kamligi tufayli “<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>”, “<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>” va “<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>” to‘liq yozib olinmadi."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Dasturlar o‘qib chiqilmoqda"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR uchun ko‘proq joy kerak"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Dasturlarni DVR orqali yozib olish mumkin. Lekin hozir DVR ishlashi uchun qurilmangizda yetarli joy qolmadi. <xliff:g id="STORAGE_SIZE">%1$s</xliff:g> GB va undan katta hajmli tashqi xotira qurilmasini ulang va qurilma xotirasi sifatida formatlash uchun ko‘rsatmalarga amal qiling."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Xotirada joy yetarli emas"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Joy yetarli bo‘lmagani uchun bu dasturni yozib bo‘lmaydi. Eski yozuvlarni bir nechtasini o‘chirib tashlab ko‘ring."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Xotira mavjud emas"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Xotira topilmadi. Videomagnitofonni qayta yoqishdan oldin tashqi xotirani ulang yoki undan foydalanib bo‘lmasa, xotirani o‘chirib tashlang."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Xotira o‘chirib tashlansinmi?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Barcha yozib olingan kontentlar va jadvallar o‘chib ketadi."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Yozib olish to‘xtatilsinmi?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Yozib olingan kontent saqlab qo‘yiladi."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Bu dastur bilan ixtilof borligi uchun “<xliff:g id="PROGRAMNAME">%1$s</xliff:g>” dasturini yozib olish to‘xtatiladi. Yozib olingan qismi saqlab olinadi."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Yozib olish rejalashtirildi, lekin ixtiloflar bor"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Yozib olish jadvalida ixtiloflar bor"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"“<xliff:g id="PROGRAMNAME">%1$s</xliff:g>” dasturi yozib olinadi."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Bu dasturni allaqachon <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> da yozib olish rejalashtirilgan."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Dastur allaqachon yozib olingan"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Bu dastur allaqachon yozib olingan. U DVR kutubxonasida saqlanadi."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Seriallarni yozib olish rejalashtirildi"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ta yozuv rejalashtirilgan.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ta yozuv rejalashtirilgan.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ta yozuv rejalashtirilgan. Ixtiloflar borligi uchun ulardan <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> tasi yozib olinmaydi.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ta yozuv rejalashtirilgan. Ixtiloflar borligi uchun u yozib olinmaydi.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ta yozuv rejalashtirilgan. Ixtiloflar borligi uchun bu serialning <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ta qismi va boshqa seriallar yozib olinmaydi.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ta yozuv rejalashtirilgan. Ixtiloflar borligi uchun bu serialning <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ta qismi va boshqa seriallar yozib olinmaydi.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="SERIESNAME_3">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ta yozuv rejalashtirilgan. Ixtiloflar borligi uchun boshqa seriallarning 1 ta qismi yozib olinmaydi.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ta yozuv rejalashtirilgan. Ixtiloflar borligi uchun boshqa seriallarning 1 ta qismi yozib olinmaydi.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="SERIESNAME_4">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ta yozuv rejalashtirilgan. Ixtiloflar borligi uchun boshqa seriallarning <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> ta qismi yozib olinmaydi.</item>
- <item quantity="one"><xliff:g id="SERIESNAME_1">%2$s</xliff:g> uchun <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> ta yozuv rejalashtirilgan. Ixtiloflar borligi uchun boshqa seriallarning <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> ta qismi yozib olinmaydi.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Yozib olingan dasturni topib bo‘lmadi."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Aloqador yozuvlar"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Dastur haqida ma’lumot yo‘q)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Yozib olish to‘xtatilsinmi?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Yozib olingan qismlar DVR kutubxonasida saqlanadi."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"To‘xtatish"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Hozir hech qaysi serial qismi efirga uzatilmayapti."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Hali serial qismi chiqmagan.\nEfirga chiqishi bilan yozib olinadi."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d daqiqa)</item>
diff --git a/res/values-v23/strings.xml b/res/values-v23/strings.xml
new file mode 100644
index 00000000..4809682a
--- /dev/null
+++ b/res/values-v23/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR 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">
+ <!-- Title of the channels row in the main menu. [CHAR LIMIT=NONE] -->
+ <string name="menu_title_channels">Channels</string>
+</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 9ed3df48..a8c4ab09 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"đơn âm"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"âm thanh nổi"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Điều khiển phát"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Kênh"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Kênh gần đây"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Tùy chọn TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Tùy chọn PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Điều khiển phát không có sẵn cho kênh này"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Phát hoặc tạm dừng"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Tua đi"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Phụ đề"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Chế độ hiển thị"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Bật"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Tắt"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Âm thanh đa kênh"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Tải thêm kênh"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Cài đặt"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Nguồn"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Hoán đổi"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Bật"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Tắt"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Âm thanh"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Cửa sổ chính"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Cửa sổ PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Bố cục"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Phía dưới cùng bên phải"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Phía trên cùng bên phải"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Phía trên cùng bên trái"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Phía dưới cùng bên trái"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"Cạnh nhau"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Kích thước"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Lớn"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Nhỏ"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Nguồn đầu vào"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"TV (ăng-ten/cáp)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Không có thông tin chương trình"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Không có thông tin"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Kênh bị chặn"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Ngôn ngữ không xác định"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Phụ đề chi tiết %1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Tiếng không xác định"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Phụ đề"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Tắt"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Tùy chỉnh định dạng"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Mã PIN đó không đúng. Hãy thử lại."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Hãy thử lại, mã PIN không khớp"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Nhập mã ZIP của bạn."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Ứng dụng Kênh trực tiếp sẽ sử dụng mã ZIP để cung cấp hướng dẫn chương trình đầy đủ cho các kênh truyền hình."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Nhập mã ZIP của bạn"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Mã ZIP không hợp lệ"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Cài đặt"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Tùy chỉnh danh sách kênh"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Chọn kênh cho hướng dẫn chương trình của bạn"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Kiểm soát của phụ huynh"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Giấy phép nguồn mở"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Giấy phép nguồn mở"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Gửi phản hồi"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Phiên bản"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Để xem kênh này, hãy nhấn vào Quyền và nhập mã PIN của bạn"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Để xem chương trình này, hãy nhấn vào Quyền và nhập mã PIN của bạn"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Nhấn CHỌN"</b>" để truy cập menu TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Không tìm thấy đầu vào TV nào"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Không tìm thấy đầu vào TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP không được hỗ trợ"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Không có đầu vào có thể hiển thị với PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"Loại bộ dò ko phù hợp. Hãy chạy ứng dụng Kênh trực tiếp cho đầu vào TV loại bộ dò."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Không dò được"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Không tìm thấy ứng dụng nào để xử lý tác vụ này."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Lưu"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Ghi một lần có mức độ ưu tiên cao nhất"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Hủy"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Hủy"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Quên"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Dừng"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Xem lịch ghi"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Chương trình duy nhất này"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Ghi chương trình này để thay thế"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Hủy lịch ghi này"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Xem ngay bây giờ"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Xóa bản ghi…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Có thể ghi được"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Đã lên lịch ghi"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Lịch ghi xung đột"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Đang ghi"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Ghi không thành công"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Đang đọc các chương trình để tạo lịch ghi"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Đang đọc chương trình"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Xem bản ghi gần đây"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Quá trình ghi <xliff:g id="PROGRAMNAME">%1$s</xliff:g> không hoàn thành."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Quá trình ghi <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> và <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> không hoàn thành."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Quá trình ghi <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> và <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> không hoàn thành."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Quá trình ghi <xliff:g id="PROGRAMNAME">%1$s</xliff:g> đã không hoàn thành do không đủ bộ nhớ."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Quá trình ghi <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> và <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> đã không hoàn thành do không đủ bộ nhớ."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Quá trình ghi <xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> và <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> đã không hoàn thành do không đủ bộ nhớ."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Đang đọc chương trình"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR cần thêm bộ nhớ"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Bạn sẽ có thể ghi các chương trình với DVR. Tuy nhiên không có đủ bộ nhớ trên thiết bị của bạn bây giờ để DVR hoạt động. Vui lòng kết nối ổ đĩa ngoài <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB hoặc lớn hơn và làm theo các bước để định dạng ổ đĩa ngoài làm thiết bị lưu trữ."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Không đủ bộ nhớ"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Chương trình này sẽ không được ghi vì không có đủ bộ nhớ. Hãy thử xóa một số bản ghi hiện có."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Thiếu bộ nhớ"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Một số bộ nhớ được DVR sử dụng bị thiếu. Vui lòng kết nối các ổ đĩa ngoài bạn đã sử dụng trước đó để bật lại DVR. Ngoài ra bạn còn có thể chọn để quên bộ nhớ nếu bộ nhớ không còn nữa."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Quên bộ nhớ?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Tất cả nội dung đã ghi và lịch ghi của bạn sẽ bị mất."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Dừng ghi?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Nội dung đã ghi sẽ được lưu."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Quá trình ghi <xliff:g id="PROGRAMNAME">%1$s</xliff:g> sẽ bị dừng lại vì mâu thuẫn với chương trình này. Nội dung đã ghi sẽ được lưu."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Đã lên lịch ghi nhưng có xung đột"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Đã bắt đầu ghi nhưng có xung đột"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> sẽ được ghi."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Chương trình tương tự đã được lên lịch để ghi lúc <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Đã được ghi"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Chương trình này đã được ghi. Chương trình có sẵn trong thư viện DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Đã lên lịch ghi loạt phim"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_1">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> trong số chúng sẽ không được ghi do xung đột.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. Bản ghi sẽ không được ghi do xung đột.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> tập của loạt phim này và các loạt phim khác sẽ không được ghi do xung đột.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> tập của loạt phim này và các loạt phim khác sẽ không được ghi do xung đột.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 tập của loạt phim khác sẽ không được ghi do xung đột.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. 1 tập của loạt phim khác sẽ không được ghi do xung đột.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> tập của loạt phim khác sẽ không được ghi do xung đột.</item>
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> bản ghi đã được lên lịch cho <xliff:g id="SERIESNAME_1">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> tập của loạt phim khác sẽ không được ghi do xung đột.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Không tìm thấy chương trình nào được ghi."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Bản ghi liên quan"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Không có mô tả chương trình)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Dừng ghi loạt phim?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Các tập đã ghi sẽ vẫn có sẵn trong thư viện DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Dừng"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Không có tập nào đang chiếu bây giờ."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Không có sẵn tập nào.\nChúng sẽ được ghi khi có sẵn."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d phút)</item>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 752419d6..e3d8ea08 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"单声道"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"立体声"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"播放控件"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"频道"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"最近观看的频道"</string>
<string name="menu_title_options" msgid="7184594626814914022">"电视选项"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP 选项"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"此频道无法使用播放控件"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"播放或暂停"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"快进"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"字幕"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"显示模式"</string>
<string name="options_item_pip" msgid="3951350386626879645">"PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"开启"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"关闭"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"多音频"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"获取更多频道"</string>
<string name="options_item_settings" msgid="7623205838542400074">"设置"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"来源"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"切换"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"开启"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"关闭"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"声音"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"主窗口"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"PIP 窗口"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"布局"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"右下方"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"右上方"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"左上方"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"左下方"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"并排"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"尺寸"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"大"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"小"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"输入源"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"电视(天线/有线)"</string>
<string name="no_program_information" msgid="1049844207745145132">"没有节目信息"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"无信息"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"已屏蔽的频道"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"未知语言"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"字幕(%1$d)"</string>
+ <string name="default_language" msgid="4122326459624337928">"未知语言"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"字幕"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"关闭"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"自定义格式"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"PIN码不正确,请重试。"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN码不匹配,请重试"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"请输入您的邮政编码。"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"直播频道应用将使用邮政编码提供完整的电视频道收视指南。"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"请输入您的邮政编码"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"邮政编码无效"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"设置"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"自定义频道列表"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"为您的收视指南选择频道"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"家长控制"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"开放源代码许可"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"开放源代码许可"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"发送反馈"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"版本"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"要观看此频道,请按“向右”按钮,然后输入您的PIN码"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"要观看此节目,请按“向右”按钮,然后输入您的PIN码"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"按“选择”"</b>"可访问电视菜单。"</string>
<string name="msg_no_input" msgid="3897674146985427865">"未检测到电视输入设备"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"找不到该电视输入设备"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"不支持 PIP"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"没有可通过 PIP 方式显示的输入"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"不支持调谐器类型。请启动支持调谐器类型电视输入端口的“直播频道”应用。"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"调谐失败"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"未找到可处理此操作的应用。"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"保存"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"一次性录制内容具有最高优先级"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"取消"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"取消"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"移除"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"停止"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"查看录制时间表"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"只录这一集节目"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"改录这个节目"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"取消这项录制安排"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"立即观看"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"删除录制的节目…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"可录制"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"已排定录制时间"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"录制冲突"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"正在录制"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"录制失败"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"正在读取节目以创建录制时间安排表"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"正在读取节目"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"查看最近的录制内容"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>的录制没有完成。"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>和<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>的录制没有完成。"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>、<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>和<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>的录制没有完成。"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"由于存储空间不足,<xliff:g id="PROGRAMNAME">%1$s</xliff:g>的录制没有完成。"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"由于存储空间不足,<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>和<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>的录制没有完成。"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"由于存储空间不足,<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>、<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>和<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>的录制没有完成。"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"正在读取节目"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR 需要更多存储空间"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"您将可以使用 DVR 录制节目,但目前您设备上的存储空间不足,因此无法使用 DVR。请连接存储空间不小于 <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB 的外部驱动器,然后按照相关步骤将其格式化为设备的存储空间。"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"存储空间不足"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"由于存储空间不足,系统将不会录制此节目。请尝试删除部分已录制的节目。"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"无法访问存储空间"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"无法访问 DVR 使用的部分存储空间。请连接您先前使用的外部驱动器,以重新启用 DVR。如果存储空间已无法再使用,您也可以选择忽略该存储空间。"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"要移除此存储空间吗?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"您的所有录制内容和录制安排计划都将丢失。"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"要停止录制吗?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"系统将保存已录制的内容。"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"系统将停止录制《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》,因为它与此节目存在冲突。系统将保存已录制的内容。"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"已排定录制时间,但录制时间存在冲突"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"已开始录制,但存在冲突"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"系统将会录制《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》。"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"已安排在以下时间录制同一节目:<xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>。"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"已录制"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"此节目已完成录制并保存在 DVR 媒体库中。"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"已排定剧集录制时间"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">已为《<xliff:g id="SERIESNAME_3">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 项录制计划。</item>
- <item quantity="one">已为《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 项录制计划。</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">已为《<xliff:g id="SERIESNAME_3">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 项录制计划。由于存在冲突,系统将无法录制其中 <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> 集节目。</item>
- <item quantity="one">已为《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 项录制计划。由于存在冲突,系统将无法录制这集节目。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">已为《<xliff:g id="SERIESNAME_4">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> 项录制计划。由于存在冲突,系统将无法录制此剧集和其他剧集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> 集节目。</item>
- <item quantity="one">已为《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 项录制计划。由于存在冲突,系统将无法录制此剧集和其他剧集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> 集节目。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">已为《<xliff:g id="SERIESNAME_3">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 项录制计划。由于存在冲突,系统将无法录制其他剧集的 1 集节目。</item>
- <item quantity="one">已为《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 项录制计划。由于存在冲突,系统将无法录制其他剧集的 1 集节目。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">已为《<xliff:g id="SERIESNAME_4">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> 项录制计划。由于存在冲突,系统将无法录制其他剧集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> 集节目。</item>
- <item quantity="one">已为《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 项录制计划。由于存在冲突,系统将无法录制其他剧集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> 集节目。</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"未找到录制的节目。"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"相关录制内容"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(没有节目说明)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"要停止创建剧集录制时间表吗?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"已录制的剧集仍会保存到 DVR 媒体库中。"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"停止"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"目前没有任何正在播出的剧集。"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"没有已录制的剧集。\n一旦有剧集可供录制,系统将立即开始录制。"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d 分钟)</item>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 8748b65d..5fe984d5 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"單聲道"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"立體聲"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"播放控制"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"頻道"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"最近觀看的頻道"</string>
<string name="menu_title_options" msgid="7184594626814914022">"電視選項"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"PIP 選項"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"播放控制功能不適用於此頻道"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"播放或暫停"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"向前快轉"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"隱藏式字幕"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"顯示模式"</string>
<string name="options_item_pip" msgid="3951350386626879645">"子母畫面"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"開啟"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"關閉"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"多聲道"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"取得更多頻道"</string>
<string name="options_item_settings" msgid="7623205838542400074">"設定"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"來源"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"切換"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"開啟"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"關閉"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"音效"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"主視窗"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"子母畫面視窗"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"版面配置"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"右下方"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"右上方"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"左上方"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"左下方"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"並排"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"大小"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"大"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"小"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"輸入源"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"電視 (天線/連接線)"</string>
<string name="no_program_information" msgid="1049844207745145132">"沒有節目資訊"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"無資訊"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"已封鎖的頻道"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"不明語言"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"隱藏式字幕 (%1$d)"</string>
+ <string name="default_language" msgid="4122326459624337928">"不明語言"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"隱藏式字幕"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"關閉"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"自訂格式"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"該 PIN 錯誤,請再試一次。"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN 碼不符,請再試一次"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"請輸入郵遞區號。"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"「直播頻道」應用程式會利用郵遞區號,提供電視頻道的完整電視節目指南。"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"請輸入郵遞區號"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"郵遞區號無效"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"設定"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"自訂頻道清單"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"選擇頻道以建立電視節目指南"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"家長監控設定"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"開放原始碼授權"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"開放原始碼授權"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"傳送意見"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"版本"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"按向右鍵並輸入您的 PIN,以觀看這個頻道"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"按向右鍵並輸入您的 PIN,以觀看這個節目"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"按 [選擇]"</b>" 前往 [電視選單]。"</string>
<string name="msg_no_input" msgid="3897674146985427865">"找不到電視輸入"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"找不到電視輸入"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"PIP 不受支援"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"沒有可供 PIP 顯示的輸入"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"調諧器類型不適用;請啟動調諧器類型電視輸入專用的「直播頻道」應用程式。"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"調校失敗"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"找不到可以處理這項操作的應用程式。"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"儲存"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"單次錄影享有最高優先級別"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"取消"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"取消"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"刪除"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"停止"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"查看錄影時間表"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"只錄影這一集"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"改為錄影此節目"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"取消此錄影"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"立即觀看"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"刪除錄影節目…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"可錄影"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"已排定錄影時間"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"錄影時間有衝突"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"正在錄影"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"錄影失敗"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"正在讀取節目以建立錄影時間表"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"正在讀取節目"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"查看最近的錄影"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》未完成錄影。"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"《<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>》和《<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>》未完成錄影。"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"《<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>》、《<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>》和《<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>》未完成錄影。"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"由於儲存空間不足,因此《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》未完成錄影。"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"由於儲存空間不足,因此《<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>》和《<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>》未完成錄影。"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"由於儲存空間不足,因此《<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>》、《<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>》和《<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>》未完成錄影。"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"正在讀取節目"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR 需要更多儲存空間"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"您可以使用 DVR 錄影節目,但裝置目前的儲存空間不足,因此無法使用 DVR。請連接 <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB 或以上的外置硬碟,然後按步驟格式化,以用作裝置儲存空間。"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"儲存空間不足"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"由於儲存空間不足,因此無法錄影此節目。請嘗試刪除部分現有的錄影節目。"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"無法存取儲存空間"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"系統存取部分 DVR 使用的儲存空間。請連接您先前使用的外置磁碟,然後重新啟用 DVR。如果儲存空間已無法使用,您亦可選擇刪除儲存空間。"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"要刪除儲存空間嗎?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"所有已錄影的內容和時間表將會遺失。"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"要停止錄影嗎?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"系統將儲存已錄影的內容。"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"由於《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》的錄影時間與此節目有衝突,因此系統將停止錄影並儲存已錄影的內容。"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"已預定錄影時間,但與錄影時間有衝突"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"已開始錄影,但與其他預定錄影時間有衝突"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"系統將錄影《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》。"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"已預定在 <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>錄影相同的節目。"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"已錄影"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"系統已錄影此節目並儲存在 DVR 媒體庫中。"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"已預定劇集錄影時間"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_3">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 個錄影時間。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_3">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 個錄影時間。由於發生衝突,因此系統將不會錄影其中 <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> 集節目。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。由於發生衝突,因此系統將不會錄影該節目。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_4">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> 個錄影時間。由於發生衝突,因此系統將不會錄影此劇集和其他劇集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> 集節目。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。由於發生衝突,因此系統將不會錄影此劇集和其他劇集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> 集節目。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_3">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 個錄影時間。由於發生衝突,因此系統將不會錄影其他劇集的 1 集節目。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。由於發生衝突,因此系統將不會錄影其他劇集的 1 集節目。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_4">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> 個錄影時間。由於發生衝突,因此系統將不會錄影其他劇集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> 集節目。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》預定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。由於發生衝突,因此系統將不會錄影其他劇集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> 集節目。</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"找不到已錄影的節目。"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"相關錄影"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(沒有節目說明)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"要停止錄影劇集嗎?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"已錄影的劇集仍將保留在 DVR 媒體庫中。"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"停止"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"目前沒有任何正在播出的劇集。"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"沒有可供錄影的劇集。\n系統會在劇集播出時立即錄影。"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d 分鐘)</item>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 460f442b..e33998ba 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"單聲道"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"立體聲"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"播放控制介面"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"頻道"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"最近觀看的頻道"</string>
<string name="menu_title_options" msgid="7184594626814914022">"電視選項"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"子母畫面選項"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"這個頻道無法使用播放控制介面"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"播放或暫停"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"快轉"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"字幕"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"顯示模式"</string>
<string name="options_item_pip" msgid="3951350386626879645">"子母畫面"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"開啟"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"關閉"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"多聲道"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"取得更多頻道"</string>
<string name="options_item_settings" msgid="7623205838542400074">"設定"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"來源"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"切換"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"開啟"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"關閉"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"音效"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"主視窗"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"子母畫面視窗"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"版面配置"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"右下角"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"右上角"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"左上角"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"左下角"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"並排"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"尺寸"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"大"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"小"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"輸入來源"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"電視 (有線/無線)"</string>
<string name="no_program_information" msgid="1049844207745145132">"沒有節目資訊"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"無資訊"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"封鎖的頻道"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"不明語言"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"隱藏式輔助字幕 (%1$d)"</string>
+ <string name="default_language" msgid="4122326459624337928">"不明語言"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"字幕"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"關閉"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"自訂格式設定"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"該 PIN 錯誤,請再試一次。"</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"PIN 碼不符,請再試一次"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"請輸入你的郵遞區號。"</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"直播頻道應用程式會利用郵遞區號提供完整的電視頻道節目指南。"</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"請輸入你的郵遞區號"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"無效的郵遞區號"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"設定"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"自訂頻道清單"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"為您的節目指南選擇頻道"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"家長監護"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"開放原始碼授權"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"開放原始碼授權"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"提供意見"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"版本"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"如要觀看這個頻道,請按向右鍵並輸入您的 PIN"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"如要觀看這個節目,請按向右鍵並輸入您的 PIN"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307">"按 [選取]"<b></b>" 即可使用 [電視選單]。"</string>
<string name="msg_no_input" msgid="3897674146985427865">"找不到電視輸入裝置"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"找不到電視輸入裝置"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"不支援子母畫面"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"沒有可透過子母畫面顯示的輸入來源"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"協調器類型不適合;請啟動協調器類型電視輸入裝置專用的 Live TV 應用程式。"</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"協調失敗"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"找不到可以處理這個動作的應用程式。"</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"儲存"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"只排定錄製一次的項目優先順序最高"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"取消"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"取消"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"移除"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"停止"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"查看錄影時間表"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"只錄這一集"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"改錄這個節目"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"取消這項錄影預約"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"立即觀看"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"刪除錄影檔案…"</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"可錄影"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"已排定錄影時間"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"錄影衝突"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"錄製中"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"錄製失敗"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"正在讀取節目以建立錄影時間表"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"正在讀取節目資訊"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"查看最近的錄製項目"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》未錄製完成。"</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"《<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>》和《<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>》未錄製完成。"</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"《<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>》、《<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>》和《<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>》未錄製完成。"</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"儲存空間不足,因此《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》未錄製完成。"</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"儲存空間不足,因此《<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>》和《<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>》未錄製完成。"</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"儲存空間不足,因此《<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>》、《<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g>》和《<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g>》未錄製完成。"</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"正在讀取節目"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"DVR 需要更多儲存空間"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"你可以利用 DVR 錄製節目,但目前裝置儲存空間不足,因此無法使用 DVR。請連接 <xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB 以上的外接式磁碟,然後按照相關步驟將該磁碟格式化為裝置儲存空間。"</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"儲存空間不足"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"儲存空間不足,因此無法錄製這個節目。請嘗試刪除一些現有的錄影檔案。"</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"無法存取儲存空間"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"無法存取部分 DVR 使用的儲存空間。請連接你先前使用的外接式磁碟以重新啟用 DVR。如果儲存空間已無法使用,你也可以選擇移除儲存空間。"</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"要移除儲存空間嗎?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"所有錄製內容和錄影時間表都不會保存下來。"</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"要停止錄影嗎?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"系統將儲存已錄製的內容。"</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"由於「<xliff:g id="PROGRAMNAME">%1$s</xliff:g>」與這個節目發生衝突,因此系統將停止錄製。已錄製的內容會保留下來。"</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"已排定錄影時間,但錄影時間發生衝突"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"已開始錄影,但發生衝突"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"系統將會錄製《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》。"</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"同一個節目已預約在 <xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g> 錄影。"</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"已錄影"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"這個節目已完成錄影並儲存在 DVR 媒體庫中。"</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"已排定影集錄製時間"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_3">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 個錄影時間。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_3">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 個錄影時間。由於發生時間衝突,因此系統將不會錄製其中 <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> 集節目。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。由於發生時間衝突,因此系統將不會錄製這集節目。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_4">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> 個錄影時間。由於發生時間衝突,因此系統將不會錄製這個影集和其他影集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> 集節目。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。由於發生時間衝突,因此系統將不會錄製這個影集和其他影集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> 集節目。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_3">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> 個錄影時間。由於發生時間衝突,因此系統將不會錄製其他影集的 1 集節目。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。由於發生時間衝突,因此系統將不會錄製其他影集的 1 集節目。</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="other">已為《<xliff:g id="SERIESNAME_4">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> 個錄影時間。由於發生時間衝突,因此系統將不會錄製其他影集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> 集節目。</item>
- <item quantity="one">已為《<xliff:g id="SERIESNAME_1">%2$s</xliff:g>》排定 <xliff:g id="NUMBEROFRECORDINGS_0">%1$d</xliff:g> 個錄影時間。由於發生時間衝突,因此系統將不會錄製其他影集的 <xliff:g id="NUMBEROFCONFLICTEPISODES_2">%3$d</xliff:g> 集節目。</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"找不到錄製的節目。"</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"相關錄影"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(無節目說明)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"要停止建立影集錄製時間表嗎?"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"錄製完畢的集數會保存在 DVR 媒體庫中。"</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"停止"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"目前未播出任何劇集。"</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"目前沒有可供觀看的集數。\n系統會在節目播出時立即錄影。"</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="other">(%1$d 分鐘)</item>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 7edc27e4..ff1cfb3d 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -20,8 +20,9 @@
<string name="audio_channel_mono" msgid="8812941280022167428">"i-mono"</string>
<string name="audio_channel_stereo" msgid="5798223286366598036">"i-stereo"</string>
<string name="menu_title_play_controls" msgid="2490237359425190652">"Izilawuli zokudlala"</string>
- <string name="menu_title_channels" msgid="1949045451672990132">"Iziteshi"</string>
+ <string name="menu_title_channels" msgid="1801845517674690003">"Iziteshi zakamuva"</string>
<string name="menu_title_options" msgid="7184594626814914022">"Izinketho ze-TV"</string>
+ <string name="menu_title_pip_options" msgid="4252934960762407689">"Izinketho ze-PIP"</string>
<string name="play_controls_unavailable" msgid="8900698593131693148">"Izilawuli zokudlala azitholakali kulesi siteshi"</string>
<string name="play_controls_description_play_pause" msgid="7225542861669250558">"Dlala noma umise isikhashana"</string>
<string name="play_controls_description_fast_forward" msgid="4414963867482448652">"Ukudlulisa ngokushesha"</string>
@@ -34,15 +35,33 @@
<string name="options_item_closed_caption" msgid="5945274655046367170">"Amazwibela avaliwe"</string>
<string name="options_item_display_mode" msgid="7989243076748680140">"Imodi yesibonisi"</string>
<string name="options_item_pip" msgid="3951350386626879645">"I-PIP"</string>
+ <string name="options_item_pip_on" msgid="4647247480009077381">"Vuliwe"</string>
+ <string name="options_item_pip_off" msgid="8799500161592387451">"Valiwe"</string>
<string name="options_item_multi_audio" msgid="5118851311937896923">"Umsindo omningi"</string>
<string name="options_item_more_channels" msgid="971040969622943300">"Thola iziteshi eziningi"</string>
<string name="options_item_settings" msgid="7623205838542400074">"Izilungiselelo"</string>
+ <string name="pip_options_item_source" msgid="1050948525825308652">"Umthombo"</string>
+ <string name="pip_options_item_swap" msgid="7245362207353732048">"Shintsha"</string>
+ <string name="pip_options_item_swap_on" msgid="5647182616484983505">"Vuliwe"</string>
+ <string name="pip_options_item_swap_off" msgid="3023597229417709768">"Valiwe"</string>
+ <string name="pip_options_item_sound" msgid="3107034283791231648">"Umsindo"</string>
+ <string name="pip_options_item_sound_main" msgid="1063937534112558691">"Isisekelo"</string>
+ <string name="pip_options_item_sound_pip_window" msgid="435064142351853008">"Iwindil le-PIP"</string>
+ <string name="pip_options_item_layout" msgid="5126206342060967651">"Isakhiwo"</string>
+ <string name="pip_options_item_layout_bottom_right" msgid="5256839015192920238">"Phansi ngakwesokudla"</string>
+ <string name="pip_options_item_layout_top_right" msgid="3585067214787055279">"Phezulu ngakwesokudla"</string>
+ <string name="pip_options_item_layout_top_left" msgid="2173997010201637462">"Phezulu ngakwesokunxele"</string>
+ <string name="pip_options_item_layout_bottom_left" msgid="1727197877968915329">"Phansi ngakwesokunxele"</string>
+ <string name="pip_options_item_layout_side_by_side" msgid="9009784972740915779">"ingxenye nenxenye"</string>
+ <string name="pip_options_item_size" msgid="5662894110243750158">"Usayizi"</string>
+ <string name="pip_options_item_size_big" msgid="6303301565563444718">"Kukhulu"</string>
+ <string name="pip_options_item_size_small" msgid="7393731186585004206">"Kuncane"</string>
+ <string name="side_panel_title_pip_input_source" msgid="8722544967592970296">"Umthombo wokufaka"</string>
<string name="input_long_label_for_tuner" msgid="3423514011918382209">"I-TV (I-antenna/Intambo)"</string>
<string name="no_program_information" msgid="1049844207745145132">"Alukho ulwazi lohlelo"</string>
<string name="program_title_for_no_information" msgid="384451471906070101">"Alukho ulwazi"</string>
<string name="program_title_for_blocked_channel" msgid="5358005891746983819">"Isiteshi esivinjiwe"</string>
- <string name="multi_audio_unknown_language" msgid="8639884627225598143">"Ulimi olungaziwa"</string>
- <string name="closed_caption_unknown_language" msgid="4745445516930229353">"Imibhalo engezansi evaliwe engu-%1$d"</string>
+ <string name="default_language" msgid="4122326459624337928">"Ulimi olungaziwa"</string>
<string name="side_panel_title_closed_caption" msgid="2513905054082568780">"Amazwibela avaliwe"</string>
<string name="closed_caption_option_item_off" msgid="4824009036785647753">"Valiwe"</string>
<string name="closed_caption_system_settings" msgid="1856974607743827178">"Yenza ngokwezifiso ukufometha"</string>
@@ -116,10 +135,6 @@
</plurals>
<string name="pin_toast_wrong" msgid="2126295626095048746">"Leyo phini ayilungile. Zama futhi."</string>
<string name="pin_toast_not_match" msgid="4283624338659521768">"Zama futhi, iphinikhodi ayifani"</string>
- <string name="postal_code_guidance_title" msgid="4144793072363879833">"Faka ikhodi yakho ye-ZIP."</string>
- <string name="postal_code_guidance_description" msgid="4224511147377561572">"Uhlelo lokusebenza lweziteshi ezibukhoma luzosebenzisa ikhodi ye-ZIP ukuze lunikeze umhlahlandlela wohlelo ophelele weziteshi ze-TV."</string>
- <string name="postal_code_action_description" msgid="4428720607051109105">"Faka ikhodi yakho ye-ZIP"</string>
- <string name="postal_code_invalid_warning" msgid="923373584458340746">"Ikhodi ye-ZIP engavumelekile"</string>
<string name="side_panel_title_settings" msgid="8244327316510918755">"Izilungiselelo"</string>
<string name="settings_channel_source_item_customize_channels" msgid="6115770679732624593">"Yenza ngezifiso uhlu lweziteshi"</string>
<string name="settings_channel_source_item_customize_channels_description" msgid="8966243790328235580">"Khetha iziteshi zomhlahlandlela wohlelo lwakho"</string>
@@ -128,7 +143,6 @@
<string name="settings_parental_controls" msgid="5449397921700749317">"Ukulawula kwabazali"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"Amalayisense womthombo ovulekile"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"Amalayisense womthombo ovulekile"</string>
- <string name="settings_send_feedback" msgid="6897217561193701829">"Thumela impendulo"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"Inguqulo"</string>
<string name="tvview_channel_locked" msgid="6486375335718400728">"Ukuze ubuke lesi siteshi, cindezela Kwesokudla uphinde ufake i-PIN yakho"</string>
<string name="tvview_content_locked" msgid="391823084917017730">"Ukuze ubuke lolu hlelo, cindezela Kwesokudla uphinde ufake i-PIN yakho"</string>
@@ -167,6 +181,8 @@
<string name="intro_description" msgid="7806473686446937307"><b>"Cindezela okuthi KHETHA"</b>" ukuze ufinyelele imenyu ye-TV."</string>
<string name="msg_no_input" msgid="3897674146985427865">"Akukho kokufaka kwe-TV okutholakele"</string>
<string name="msg_no_specific_input" msgid="2688885987104249852">"Ayikwazi ukuthola kokufaka kwe-TV"</string>
+ <string name="msg_no_pip_support" msgid="161508628996629445">"I-PIP ayisekelwe"</string>
+ <string name="msg_no_available_input_by_pip" msgid="7038191654524679666">"Akutholakali okokufaka okungaboniswa nge-PIP"</string>
<string name="msg_not_passthrough_input" msgid="4502101097091087411">"uhlobo le-Tuner alufanelekile; Sicela uqalise uhlelo lokusebenza leziteshi ezibukhoma lokufakwayo kwe-TV yohlobo le-tuner."</string>
<string name="msg_tune_failed" msgid="3277419551849972252">"Ukushuna kwehlulekile"</string>
<string name="msg_missing_app" msgid="8291542072400042076">"Alukho uhlelo lokusebenza olutholakalele ukuphatha lesi senzo."</string>
@@ -243,6 +259,8 @@
<string name="dvr_priority_button_action_save" msgid="4773524273649733008">"Londoloza"</string>
<string name="dvr_priority_action_one_time_recording" msgid="8174297042282719478">"Ukurekhoda kwesikhathi esisodwa kunokubaluleka okuphezulu kakhulu"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"Khansela"</string>
+ <string name="dvr_action_error_cancel" msgid="6822474458738023531">"Khansela"</string>
+ <string name="dvr_action_error_forget_storage" msgid="5869994565663655638">"Khohlwa"</string>
<string name="dvr_action_stop" msgid="1378723485295471381">"Misa"</string>
<string name="dvr_action_view_schedules" msgid="7442990695392774263">"Buka ishejuli yokurekhoda"</string>
<string name="dvr_action_record_episode" msgid="8596182676610326327">"Lolu hlelo olulodwa"</string>
@@ -252,29 +270,25 @@
<string name="dvr_action_record_instead" msgid="6821164728752215738">"Rekhoda lokhu esikhundleni"</string>
<string name="dvr_action_record_cancel" msgid="8644254745772185288">"Khansela lokhu kurekhoda"</string>
<string name="dvr_action_watch_now" msgid="7181211920959075976">"Bukela njengamanje"</string>
- <string name="dvr_action_delete_recordings" msgid="850785346795261671">"Susa ukurekhodwa..."</string>
<string name="dvr_epg_program_recordable" msgid="609229576209476903">"Okungarekhodeka"</string>
<string name="dvr_epg_program_recording_scheduled" msgid="1367741844291055016">"Ukurekhoda kushejuliwe"</string>
<string name="dvr_epg_program_recording_conflict" msgid="4827911748865195373">"Ukungqubuzana kokurekhoda"</string>
<string name="dvr_epg_program_recording_in_progress" msgid="2158340443975313745">"Iyarekhoda"</string>
<string name="dvr_epg_program_recording_failed" msgid="5589124519442328896">"Ukurekhoda kuhlulekile"</string>
<string name="dvr_schedule_progress_message_reading_programs" msgid="6502513156469172313">"Ifunda izinhlelo ukuze idale amashejuli okurekhoda"</string>
- <string name="dvr_series_progress_message_reading_programs" msgid="2961615820635219355">"Izinhlelo ezifundayo"</string>
- <string name="dvr_error_insufficient_space_action_view_recent_recordings" msgid="137918938589787623">"Buka ukurekhoda kwakamuva"</string>
- <string name="dvr_error_insufficient_space_title_one_recording" msgid="759510175792505150">"Ukurekhoda kwe-<xliff:g id="PROGRAMNAME">%1$s</xliff:g> akuphelele."</string>
- <string name="dvr_error_insufficient_space_title_two_recordings" msgid="5518578722556227631">"Ukurekhoda kwe-<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ne-<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> akuphelele."</string>
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings" msgid="5104901174884754363">"Ukurekhoda kwe-<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> and <xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> akuphelele."</string>
- <string name="dvr_error_insufficient_space_description_one_recording" msgid="9092549220659026111">"Ukurekhoda kwe-<xliff:g id="PROGRAMNAME">%1$s</xliff:g> akuqedanga ngenxa yesitoreji esingaphelele."</string>
- <string name="dvr_error_insufficient_space_description_two_recordings" msgid="7712799694720979003">"Ukurekhoda kwe-<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g> ne-<xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> akuqedanga ngenxa yesitoreji esingaphelele."</string>
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings" msgid="7877855707777832128">"Ukurekhoda kwe-<xliff:g id="PROGRAMNAME_1">%1$s</xliff:g>, <xliff:g id="PROGRAMNAME_2">%2$s</xliff:g> ne-<xliff:g id="PROGRAMNAME_3">%3$s</xliff:g> akuqedanga ngenxa yesitoreji esingaphelele."</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs" msgid="7221275889560136115">"Izinhlelo ezifundayo"</string>
+ <!-- no translation found for dvr_series_schedules_progress_message_updating_programs (6670286486601662465) -->
+ <skip />
<string name="dvr_error_small_sized_storage_title" msgid="5020225460011469011">"I-DVR idinga isitoreji esiningi"</string>
<string name="dvr_error_small_sized_storage_description" msgid="8909789097974895119">"Uzokwazi ukurekhoda izinhlelo nge-DVR. Kodwa asikho isitoreji esanele kudivayisi yakho manje ukuze i-DVR isebenze. Sicela uxhume idrayivu yangaphandle engu-<xliff:g id="STORAGE_SIZE">%1$s</xliff:g>GB noma enkulu bese ulandela izinyathelo uyifomethe njengesitoreji sedivayisi."</string>
- <string name="dvr_error_no_free_space_title" msgid="881897873932403512">"Indawo yokubeka ayanele"</string>
- <string name="dvr_error_no_free_space_description" msgid="6406038381803431564">"Lolu hlelo ngeke lirekhodwe ngoba asikho isitoreji esanele. Zama ukususa ukurekhoda okukhona."</string>
<string name="dvr_error_missing_storage_title" msgid="691914341845362669">"Isitoreji esilahlekile"</string>
+ <string name="dvr_error_missing_storage_description" msgid="1036680750969954236">"Esinye sesitoreji esisetshenziswa yi-DVR silahlekile. Sicela uxhume idrayivu engaphandle oyisebenzise ngaphambilini ukuze uphinde unike amandla i-DVR. Okunye, ungakhetha ukukhohlwa isitoreji uma singasatholakali."</string>
+ <string name="dvr_error_forget_storage_title" msgid="4996547357826788002">"Khohlwa isitoreji?"</string>
+ <string name="dvr_error_forget_storage_description" msgid="3973761741009546142">"Konke okuqukethwe kwakho okurekhodiwe namashejuli azolahleka."</string>
<string name="dvr_stop_recording_dialog_title" msgid="2587018956502704278">"Misa ukurekhoda?"</string>
<string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Okuqukethwe okurekhodiwe kuzolondolozwa."</string>
- <string name="dvr_stop_recording_dialog_description_on_conflict" msgid="7876857267536083760">"Ukurekhodwa kwe-<xliff:g id="PROGRAMNAME">%1$s</xliff:g> kuzomiswa ngoba kugqubuzana nalolu hlelo. Okuqukethwe okurekhodiwe ngeke kulondolozwe."</string>
+ <!-- no translation found for dvr_stop_recording_dialog_description_on_conflict (7876857267536083760) -->
+ <skip />
<string name="dvr_program_conflict_dialog_title" msgid="109323740107060379">"Ukurekhoda kushejuliwe kodwa kunokugqubuzana"</string>
<string name="dvr_channel_conflict_dialog_title" msgid="7461033430572027786">"Ukurekhoda kuqalile kodwa kunokugxubuzana"</string>
<string name="dvr_program_conflict_dialog_description_prefix" msgid="5520062013211648196">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> izorekhodwa."</string>
@@ -292,27 +306,14 @@
<string name="dvr_already_scheduled_dialog_description" msgid="8170126125996414810">"Uhlelo olufanayo seluvele luhlelwe ukurekhodwa ngo-<xliff:g id="PROGRAMSTARTTIME">%1$s</xliff:g>."</string>
<string name="dvr_already_recorded_dialog_title" msgid="2760294707162057216">"Sekuvele kurekhodiwe"</string>
<string name="dvr_already_recorded_dialog_description" msgid="8966051583682746434">"Lolu hlelo seluvele lurekhodiwe. Lutholakala kulabhulali ye-DVR."</string>
- <string name="dvr_series_recording_dialog_title" msgid="3521956660855853797">"Ukurekhodwa kochungechunge kuhleliwe"</string>
- <plurals name="dvr_series_scheduled_no_conflict" formatted="false" msgid="6909096418632555251">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_3">%2$s</xliff:g>.</item>
- </plurals>
- <plurals name="dvr_series_recording_scheduled_only_this_series_conflict" formatted="false" msgid="2341548158607418515">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> kwazo ngeke kurekhodwe ngenxa yokushayisana.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_3">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTRECORDINGS">%3$d</xliff:g> kwazo ngeke kurekhodwe ngenxa yokushayisana.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict" formatted="false" msgid="6123651855499916154">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> iziqephu zalo chungechunge nolunye uchungechunge ngeke zirekhodwe ngenxa yokushayisana.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> iziqephu zalo chungechunge nolunye uchungechunge ngeke zirekhodwe ngenxa yokushayisana.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict" formatted="false" msgid="8628389493339609682">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 isiqephu solunye uchungechunge ngeke sirekhodwe ngenxa yokushayisana.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_2">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_3">%2$s</xliff:g>. 1 isiqephu solunye uchungechunge ngeke sirekhodwe ngenxa yokushayisana.</item>
- </plurals>
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts" formatted="false" msgid="1601104768354168073">
- <item quantity="one"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> iziqephu zolunye uchungechunge ngeke zize zirekhodwe ngenxa yokushayisana.</item>
- <item quantity="other"><xliff:g id="NUMBEROFRECORDINGS_3">%1$d</xliff:g> ukurekhodwa kushejulelwe i-<xliff:g id="SERIESNAME_4">%2$s</xliff:g>. <xliff:g id="NUMBEROFCONFLICTEPISODES_5">%3$d</xliff:g> iziqephu zolunye uchungechunge ngeke zize zirekhodwe ngenxa yokushayisana.</item>
- </plurals>
+ <!-- no translation found for dvr_series_recording_dialog_title (3521956660855853797) -->
+ <skip />
+ <!-- no translation found for dvr_series_recording_scheduled_no_conflict (2796926724821316879) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_this_series_conflict (2800805130979023066) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_one_conflict (3632394665556633158) -->
+ <!-- no translation found for dvr_series_recording_scheduled_this_and_other_series_conflict (2331412040101938479) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_one_conflict (5213169239215104024) -->
+ <!-- no translation found for dvr_series_recording_scheduled_only_other_series_conflict (5159645486201045330) -->
<string name="dvr_program_not_found" msgid="3282879532038010202">"Uhlelo olurekhodiwe alutholakali."</string>
<string name="dvr_playback_related_recordings" msgid="6978658039329924961">"Ukurekhodwa okuhlobene"</string>
<string name="dvr_msg_no_program_description" msgid="2521723281247322645">"(Ayikho incazelo yohlelo)"</string>
@@ -335,7 +336,6 @@
<string name="dvr_series_schedules_stop_dialog_title" msgid="4975886236535334420">"Misa ukurekhodwa kochungechunge"</string>
<string name="dvr_series_schedules_stop_dialog_description" msgid="7547266283366940085">"Iziqephu ezirekhodiwe zizohlala zitholakala kulabhulali ye-DVR."</string>
<string name="dvr_series_schedules_stop_dialog_action_stop" msgid="2351839914865142478">"Misa"</string>
- <string name="dvr_series_schedules_stopped_empty_state" msgid="1464244804664395151">"Azikho iziqephu ezisemoyeni okwamanje."</string>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Azikho iziqephu ezitholakalayo.\nZizorekhodwa uma zitholakala."</string>
<plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
<item quantity="one">(%1$d amaminithi)</item>
diff --git a/res/values/attr.xml b/res/values/attr.xml
new file mode 100644
index 00000000..1261ea41
--- /dev/null
+++ b/res/values/attr.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES 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="CurrentProgramState" >
+ <attr name="state_current_program" format="boolean" />
+ </declare-styleable>
+ <declare-styleable name="ProgramTooWideState" >
+ <attr name="state_program_too_wide" format="boolean" />
+ </declare-styleable>
+</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
deleted file mode 100644
index a26a9ef2..00000000
--- a/res/values/attrs.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2015 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES 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="CurrentProgramState" >
- <attr name="state_current_program" format="boolean" />
- </declare-styleable>
- <declare-styleable name="ProgramTooWideState" >
- <attr name="state_program_too_wide" format="boolean" />
- </declare-styleable>
- <!-- XML attributes that describe the
- {@link com.android.tv.dvr.ui.FadeBackground FadeBackground} transition. The
- attributes of the {@link android.R.styleable#Transition Transition} resource are available
- in addition to the specific attributes of FadeBackground described here. -->
- <declare-styleable name="FadeBackground">
- <!-- Equivalent to <code>transitionVisibilityMode</code>, fadingMode works only with the
- FadeBackground transition. -->
- <attr name="fadingMode">
- <!-- FadeBackground will only fade appearing items in. -->
- <enum name="fade_in" value="1" />
- <!-- FadeBackground will only fade disappearing items out. -->
- <enum name="fade_out" value="2" />
- </attr>
- </declare-styleable>
-
- <!-- XML attributes that describe the
- {@link com.android.tv.menu.widget.PlaybackProgressBar PlaybackProgressBar} widget.
- The attributes of the {@link com.android.internal.R.styleable.View View} resources are
- available in addition to the specific attributes of PlaybackProgressBar described here. -->
- <declare-styleable name="PlaybackProgressBar">
- <!-- Drawable used for the progress mode. -->
- <attr name="progressDrawable" format="reference" />
- </declare-styleable>
-</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index c3cbc22c..b6b40563 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -109,7 +109,6 @@
<!-- TV view -->
<color name="tvview_block_text_color">#80EEEEEE</color>
- <color name="tvview_block_image_color_filter">#99000000</color>
<!-- Channel banner -->
<color name="channel_banner_text_color">#FFEEEEEE</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index fc8eb009..8d9e45e1 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -193,7 +193,7 @@
<dimen name="program_guide_table_header_row_height">40dp</dimen>
<dimen name="program_guide_table_header_row_font_size">16sp</dimen>
<dimen name="program_guide_table_header_row_fade_length">24dp</dimen>
- <dimen name="program_guide_table_header_row_overlap">-72dp</dimen>
+ <dimen name="program_guide_table_header_row_overlap">-52dp</dimen>
<dimen name="program_guide_table_item_row_height">64dp</dimen>
<dimen name="program_guide_table_item_padding">16dp</dimen>
<dimen name="program_guide_table_item_compound_drawable_padding">8dp</dimen>
@@ -244,9 +244,23 @@
<dimen name="shrunken_tvview_block_icon_height">60dp</dimen>
<dimen name="shrunken_tvview_block_vertical_spacing">24dp</dimen>
+ <!-- PIP view -->
+ <dimen name="pipview_margin_horizontal">56dp</dimen>
+ <dimen name="pipview_margin_top">27dp</dimen>
+ <dimen name="pipview_margin_bottom">27dp</dimen>
+ <dimen name="pipview_small_size_width">240dp</dimen>
+ <dimen name="pipview_small_size_height">135dp</dimen>
+ <dimen name="pipview_large_size_width">384dp</dimen>
+ <dimen name="pipview_large_size_height">216dp</dimen>
+
+ <!-- PAP View -->
+ <dimen name="papview_margin_horizontal">20dp</dimen>
+ <dimen name="papview_spacing">24dp</dimen>
+
<!-- Edit channels -->
<dimen name="shrunken_tvview_margin_start">56dp</dimen>
<dimen name="shrunken_tvview_margin_end">32dp</dimen>
+ <dimen name="shrunken_tvview_height">288dp</dimen>
<!-- Channel banner -->
<dimen name="channel_banner_width">696dp</dimen>
@@ -260,7 +274,7 @@
<dimen name="channel_banner_channel_logo_height">44dp</dimen>
<dimen name="channel_banner_channel_logo_margin_start">8dp</dimen>
<dimen name="channel_banner_input_logo_size">16dp</dimen>
- <dimen name="channel_banner_program_description_width">456dp</dimen>
+ <dimen name="channel_banner_program_description_width">536dp</dimen>
<dimen name="channel_banner_program_large_text_size">28sp</dimen>
<dimen name="channel_banner_program_medium_text_size">20sp</dimen>
<dimen name="channel_banner_program_large_margin_top">-10sp</dimen>
@@ -276,7 +290,6 @@
<!-- Input banner -->
<dimen name="input_banner_item_height">48dp</dimen>
- <dimen name="input_banner_item_label_max_width">324dp</dimen>
<!-- Keypad channel switch -->
<dimen name="keypad_channel_switch_channel_number_text_size">
@@ -323,7 +336,9 @@
<!-- DVR screens -->
<eat-comment />
- <!-- DVR schedules list -->
+ <dimen name="dvr_card_layout_width">196dp</dimen>
+
+ <!--DVR schedules list-->
<dimen name="dvr_schedules_layout_padding">132dp</dimen>
<dimen name="dvr_schedules_row_divider_height">1dp</dimen>
<dimen name="dvr_schedules_item_width">960dp</dimen>
@@ -334,7 +349,9 @@
<dimen name="dvr_schedules_item_time_start_padding">32dp</dimen>
<dimen name="dvr_schedules_item_time_margin">14dp</dimen>
<dimen name="dvr_schedules_item_info_top_margin">15dp</dimen>
+ <dimen name="dvr_schedules_item_conflict_info_top_margin">12dp</dimen>
<dimen name="dvr_schedules_item_conflict_info_bottom_margin">15dp</dimen>
+ <dimen name="dvr_schedules_item_schedule_width">56dp</dimen>
<dimen name="dvr_schedules_item_delete_width">46dp</dimen>
<dimen name="dvr_schedules_item_section_margin">32dp</dimen>
<dimen name="dvr_schedules_item_icon_size">18dp</dimen>
@@ -344,29 +361,26 @@
<dimen name="dvr_schedules_header_margin_bottom">24dp</dimen>
<dimen name="dvr_schedules_header_subtitle_margin_top">5dp</dimen>
<dimen name="dvr_schedules_header_icon_container_width">143dp</dimen>
+ <dimen name="dvr_schedules_header_icon_size">32dp</dimen>
<dimen name="dvr_schedules_header_icon_horizontal_margin">12dp</dimen>
<dimen name="dvr_schedules_warning_icon_padding">4dp</dimen>
- <!-- DVR Library -->
- <dimen name="dvr_library_expanded_row_height">175dp</dimen>
- <dimen name="dvr_library_card_image_layout_width">144dp</dimen>
- <dimen name="dvr_library_card_image_layout_height">108dp</dimen>
- <dimen name="dvr_library_card_progress_height">2dp</dimen>
- <dimen name="dvr_library_card_folded_title_height">20dp</dimen>
- <dimen name="dvr_library_card_expanded_title_height">36.5dp</dimen>
+ <!-- card width - margin-->
+ <dimen name="dvr_card_image_layout_width">192dp</dimen>
+ <dimen name="dvr_card_image_layout_height">108dp</dimen>
+ <dimen name="dvr_card_progress_height">2dp</dimen>
<!-- DVR playback fragment -->
- <dimen name="dvr_related_recordings_width">108dp</dimen>
- <dimen name="dvr_related_recordings_height">81dp</dimen>
+ <dimen name="dvr_related_recordings_width">146dp</dimen>
+ <dimen name="dvr_related_recordings_height">82dp</dimen>
<!-- This value is used to adjust position of DVR playback controls row when there is no
program description -->
<dimen name="dvr_playback_controls_extra_padding_top">27.5dp</dimen>
<!-- This value is used to adjust position of DVR playback overlay fragment when there is no
related recordings -->
- <dimen name="dvr_playback_overlay_padding_top_no_related_row">48dp</dimen>
- <!-- This value is used to adjust position of DVR playback overlay fragment when there is
- secondary controls row -->
- <dimen name="dvr_playback_overlay_padding_top_no_secondary_row">36dp</dimen>
+ <dimen name="dvr_playback_fragment_extra_padding_top">48dp</dimen>
+ <dimen name="lb_playback_controls_padding_top">265dp</dimen>
+ <dimen name="lb_playback_controls_padding_bottom">40dp</dimen>
<!-- details fragment -->
<dimen name="dvr_details_poster_width">219dp</dimen>
diff --git a/res/values/google-services.xml b/res/values/google-services.xml
new file mode 100755
index 00000000..379a3453
--- /dev/null
+++ b/res/values/google-services.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="firebase_database_url" translatable="false">https://live-channels-1237.firebaseio.com</string>
+ <string name="gcm_defaultSenderId" translatable="false">399597460505</string>
+ <string name="google_api_key" translatable="false">AIzaSyDK2BtNulo2ltWIogD64y1hBWKrdg9Sa7k</string>
+ <string name="google_crash_reporting_api_key" translatable="false">AIzaSyDK2BtNulo2ltWIogD64y1hBWKrdg9Sa7k</string>
+ <string name="google_app_id" translatable="false">1:399597460505:android:6c699100869b1467</string>
+</resources>
diff --git a/res/values/integers.xml b/res/values/integers.xml
index aa68465e..81ccbeb7 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -87,6 +87,4 @@
<!-- DVR library -->
<integer name="dvr_details_full_text_animation_duration">500</integer>
- <integer name="dvr_card_title_max_lines_folded">1</integer>
- <integer name="dvr_card_title_max_lines">2</integer>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a1f438fa..a58f2d36 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -63,9 +63,11 @@
The play means a playback of video and audio. [CHAR LIMIT=NONE] -->
<string name="menu_title_play_controls">Play controls</string>
<!-- Title of the channels row in the main menu. [CHAR LIMIT=NONE] -->
- <string name="menu_title_channels">Channels</string>
+ <string name="menu_title_channels">Recent channels</string>
<!-- Title of the TV option row in the main menu. [CHAR LIMIT=NONE] -->
<string name="menu_title_options">TV options</string>
+ <!-- Title of the PIP option row in the main menu. [CHAR LIMIT=NONE] -->
+ <string name="menu_title_pip_options">PIP options</string>
<!-- Play speed of 2X, 3X, 4X, 5X -->
<string name="play_controls_speed" translatable="false">%1$dX</string>
@@ -99,6 +101,12 @@
<string name="options_item_display_mode">Display mode</string>
<!-- Label of "PIP (Picture in picture)" item in the TV option row. [CHAR LIMIT=17] -->
<string name="options_item_pip">PIP</string>
+ <!-- Description of the "PIP" item in the TV option row indicating that the currently the PIP
+ is turned on. [CHAR LIMIT=17] -->
+ <string name="options_item_pip_on">On</string>
+ <!-- Description of the "PIP" item in the TV option row indicating that the currently the PIP
+ is turned off. [CHAR LIMIT=20] -->
+ <string name="options_item_pip_off">Off</string>
<!-- Label of "Multi audio" item in the TV option row. [CHAR LIMIT=17] -->
<string name="options_item_multi_audio">Multi-audio</string>
<!-- Label of "Get more channels" item in the TV option row. [CHAR LIMIT=17] -->
@@ -108,6 +116,54 @@
<!-- Label of "Settings" item in the TV option row. [CHAR LIMIT=17] -->
<string name="options_item_settings">Settings</string>
+ <!-- Label of "Source" item in the PIP option row. The item enables the user to select
+ a specific input (e.g. HDMI 1) for the PIP window. [CHAR LIMIT=17] -->
+ <string name="pip_options_item_source">Source</string>
+ <!-- Label of "Swap" item in the PIP option row.
+ After swapping, the main window and PIP window will show the channels of each other. [CHAR LIMIT=17] -->
+ <string name="pip_options_item_swap">Swap</string>
+ <!-- Description of the "Swap" item in the PIP option row indicating that the currently the
+ windows are swapped. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_swap_on">On</string>
+ <!-- Description of the "Swap" item in the PIP option row indicating that the currently the
+ windows are not swapped. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_swap_off">Off</string>
+ <!-- Label of "Sound" item in the PIP option row. [CHAR LIMIT=17] -->
+ <string name="pip_options_item_sound">Sound</string>
+ <!-- Description of the "Sound" item in the PIP option row indicating that the current sound
+ source is main window. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_sound_main">Main</string>
+ <!-- Description of the "Sound" item in the PIP option row indicating that the current sound
+ source is PIP window. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_sound_pip_window">PIP window</string>
+ <!-- Label of "Layout" item in the PIP option row. [CHAR LIMIT=17] -->
+ <string name="pip_options_item_layout">Layout</string>
+ <!-- Description of the "Layout" item in the PIP option row indicating that the current PIP
+ window is at the bottom right corner of the screen. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_layout_bottom_right">Bottom right</string>
+ <!-- Description of the "Layout" item in the PIP option row indicating that the current PIP
+ window is at the top right corner of the screen. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_layout_top_right">Top right</string>
+ <!-- Description of the "Layout" item in the PIP option row indicating that the current PIP
+ window is at the top left corner of the screen. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_layout_top_left">Top left</string>
+ <!-- Description of the "Layout" item in the PIP option row indicating that the current PIP
+ window is at the bottom left corner of the screen. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_layout_bottom_left">Bottom left</string>
+ <!-- Description of the "Layout" item in the PIP option row indicating that the current PIP
+ layout is side-by-side (i.e. Picture and Picture). [CHAR LIMIT=20] -->
+ <string name="pip_options_item_layout_side_by_side">Side by side</string>
+ <!-- Label of "Size" item in the PIP option row. [CHAR LIMIT=17] -->
+ <string name="pip_options_item_size">Size</string>
+ <!-- Description of the "Size" item in the PIP option row indicating that the current PIP size
+ is big. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_size_big">Big</string>
+ <!-- Description of the "Size" item in the PIP option row indicating that the current PIP size
+ is small. [CHAR LIMIT=20] -->
+ <string name="pip_options_item_size_small">Small</string>
+
+ <!-- Title of "Input source" option to select an input for PIP. [CHAR LIMIT=30] -->
+ <string name="side_panel_title_pip_input_source">Input source</string>
<!-- Label of a unified input for tuner type inputs. [CHAR LIMIT=30] -->
<string name="input_long_label_for_tuner">TV (antenna/cable)</string>
@@ -119,11 +175,8 @@
<!-- Program title for blocked channel [CHAR LIMIT=23] -->
<string name="program_title_for_blocked_channel">Blocked channel</string>
- <!-- Default string for unknown language used in "Multi Audio" options. [CHAR LIMIT=30] -->
- <string name="multi_audio_unknown_language">Unknown language</string>
-
- <!-- Default string for unknown language used in "Closed Caption" options. [CHAR LIMIT=30] -->
- <string name="closed_caption_unknown_language">Closed captions %1$d</string>
+ <!-- Default string for unknown language used in "Closed Caption" and "Multi Audio" options. [CHAR LIMIT=30] -->
+ <string name="default_language">Unknown language</string>
<!-- Inside "Closed captions" option side panel -->
<eat-comment />
@@ -318,15 +371,6 @@
<!-- Toast message when an user couldn't pass the PIN confirmation. [CHAR LIMIT=NONE] -->
<string name="pin_toast_not_match">Try again, PIN doesn\'t match</string>
- <!-- Title of postal/zip code input guided step fragment [CHAR LIMIT=30] -->
- <string name="postal_code_guidance_title">Enter your ZIP Code.</string>
- <!-- Description of postal/zip code input guided step fragment [CHAR LIMIT=NONE] -->
- <string name="postal_code_guidance_description">Live TV app will use the ZIP Code to provide a complete program guide for the TV channels.</string>
- <!-- Description of postal/zip code input edit text view to prompt users entering ZIP Code [CHAR LIMIT=30] -->
- <string name="postal_code_action_description">Enter your ZIP Code</string>
- <!-- Warning message shown in description field of postal/zip code input edit text view when user enters an invalid ZIP Code and presses Done [CHAR LIMIT=30] -->
- <string name="postal_code_invalid_warning">Invalid ZIP Code</string>
-
<!-- menu for "Settings" option -->
<eat-comment />
<!-- Title of "Settings" option. [CHAR LIMIT=30] -->
@@ -347,8 +391,6 @@
<string name="settings_menu_licenses">Open source licenses</string>
<!--Title for a dialog box that shows licenses for open source code used in the app [CHAR LIMIT=35] -->
<string name="dialog_title_licenses">Open source licenses</string>
- <!-- Menu item to send feedback [CHAR LIMIT=30] -->
- <string name="settings_send_feedback">Send feedback</string>
<!-- Menu item that shows the application version(eg 1.2.03-final) as a second line below this title [CHAR LIMIT=35] -->
<string name="settings_menu_version">Version</string>
@@ -444,6 +486,10 @@
<string name="msg_no_input">No TV input found</string>
<!-- Error message when a specific TV input isn't installed. [CHAR LIMIT=NONE] -->
<string name="msg_no_specific_input">Cannot find the TV input</string>
+ <!-- Error message when PIP is not supported. [CHAR LIMIT=NONE] -->
+ <string name="msg_no_pip_support">PIP is not supported</string>
+ <!-- Error message when there is no available input. [CHAR LIMIT=NONE] -->
+ <string name="msg_no_available_input_by_pip">There is no available input which can be shown with PIP</string>
<!-- Error message when the selected TV input is a tuner type TV input, not a pass-through type
input. Tuner type inputs such as built-in tuner, external usb tuner, network tuner or
virtual IPTV tuner provide live channels to tune to. As opposed to tuner type input,
@@ -473,23 +519,15 @@
<!-- Debug Options -->
<string name="menu_developer_options" translatable="false">Developer options</string>
<string name="dev_item_watch_history" translatable="false">Watch history</string>
- <string name="dev_item_dvr_history" translatable="false">DVR history</string>
<string name="dev_item_fetch_epg" translatable="false">Fetch program guide</string>
+ <string name="dev_item_send_feedback" translatable="false">Send feedback</string>
<string name="dev_item_store_ts_on" translatable="false">Store TS for debugging: On</string>
<string name="dev_item_store_ts_off" translatable="false">Store TS for debugging: Off</string>
<string name="dev_item_store_ts_description" translatable="false">Store some TS data before exceptions/crash for debugging.</string>
- <!-- The state of the schedules which is in DVR history. -->
- <string name="dvr_history_dialog_state_fail" translatable="false">[Fail]</string>
- <string name="dvr_history_dialog_state_success" translatable="false">[Success]</string>
- <string name="dvr_history_dialog_state_clip" translatable="false">[Clip]</string>
-
<!-- Title of Recently watched dialog. It is used for debug purpose. -->
<string name="recently_watched" translatable="false">Recently watched</string>
- <!-- Title of DVR history dialog. -->
- <string name="dvr_history_dialog_title" translatable="false">DVR history</string>
-
<!-- EPG Search strings. -->
<!-- Remove translatable="false" once UI is finalized -->
<string name="search_result_no_result" translatable="false">No result</string>
@@ -510,6 +548,13 @@
<string name="epg_dvr_dialog_message_remove_recording_schedule" translatable="false">Cancel recording</string>
<!-- Dialog message to ask to stop the current recording. -->
<string name="epg_dvr_dialog_message_stop_recording" translatable="false">Stop recording</string>
+ <!-- Item label to schedule program recording. -->
+ <string name="epg_dvr_record_program" translatable="false">Record program</string>
+ <!-- Item label to schedule whole season recording of a TV show. -->
+ <string name="epg_dvr_record_season" translatable="false">Record season</string>
+ <!-- Item label to delete a recording schedule when a recording scheduled program is
+ clicked in EPG. -->
+ <string name="epg_dvr_delete_program" translatable="false">Delete schedule</string>
<!-- Menu item label to start DVR manager UI. -->
<string name="channels_item_dvr">Recordings &amp; schedules</string>
@@ -541,10 +586,15 @@
<string name="dvr_main_series">Series</string>
<!-- Header of DVR tab label for recorded programs list without any genre [CHAR LIMIT=20] -->
<string name="dvr_main_others">Others</string>
+ <string name="dvr_msg_no_recording_on_the_row" translatable="false">None</string>
+ <string name="dvr_msg_channel_unknown" translatable="false">Channel unknown</string>
+ <string name="dvr_msg_no_available_tuners_for_recording_channel" translatable="false">No available tuners to record this channel.</string>
+ <string name="dvr_msg_channel_already_recording" translatable="false">The channel is already being recorded.</string>
<!-- Toast message that the current channel cannot be recorded. -->
<string name="dvr_msg_cannot_record_channel">The channel cannot be recorded.</string>
<!-- Toast message that the current program cannot be recorded. -->
<string name="dvr_msg_cannot_record_program">The program cannot be recorded.</string>
+ <string name="dvr_msg_no_item_in_browse" translatable="false">There is no item.</string>
<!-- Toast message that a new recording schedule has been created from the user action. -->
<string name="dvr_msg_program_scheduled"><xliff:g id="programName" example="Big bang theory">%1$s</xliff:g> has been scheduled to be recorded</string>
<!-- Toast message that a new recording schedule of the current program has been created
@@ -581,6 +631,9 @@
<!-- DVR detailed page -->
<eat-comment />
+ <string name="dvr_detail_cancel" translatable="false">Cancel recording</string>
+ <string name="dvr_detail_stop_keep" translatable="false">Stop and keep recording</string>
+ <string name="dvr_detail_stop_delete" translatable="false">Stop and delete recording</string>
<!-- Button label to play recorded programs from beginning.
Displayed when there's no watched history available. [CHAR LIMIT=15] -->
<string name="dvr_detail_watch">Watch</string>
@@ -656,12 +709,18 @@
<!-- DVR epg strings -->
<eat-comment />
+ <string name="dvr_action_tune" translatable="false">Tune</string>
<!-- The action to cancel and close the dialog. [CHAR LIMIT=10] -->
<string name="dvr_action_cancel">Cancel</string>
<string name="dvr_action_delete_schedule" translatable="false">Delete schedule</string>
<string name="dvr_action_record_program" translatable="false">Record program</string>
- <!-- The action to forget DVR storage which is missing currently. invoke android internal storage settings activity. -->
- <string name="dvr_action_error_storage_settings" translatable="false">Open storage settings</string>
+ <string name="dvr_action_record_one_episode" translatable="false">Record this episode only</string>
+ <string name="dvr_action_error_done" translatable="false">Done</string>
+ <string name="dvr_action_error_open_dvr" translatable="false">Open DVR</string>
+ <!-- The action to cancel forgetting DVR storage. -->
+ <string name="dvr_action_error_cancel">Cancel</string>
+ <!-- The action to forget DVR storage which is missing currently -->
+ <string name="dvr_action_error_forget_storage">Forget</string>
<!-- The action to stop recording. [CHAR LIMIT=10] -->
<string name="dvr_action_stop">Stop</string>
<!-- The action to open the activity which shows all the schedules.[CHAR LIMIT=32] -->
@@ -690,8 +749,6 @@
<string name="dvr_action_record_cancel">Cancel this recording</string>
<!-- The title of the action to show the details of the recorded program. [CHAR LIMIT=32] -->
<string name="dvr_action_watch_now">Watch now</string>
- <!-- The title of the action to open the DVR library to delete some recorded programs. [CHAR LIMIT=32] -->
- <string name="dvr_action_delete_recordings">Delete recordings&#8230;</string>
<!-- Dvr label in epg to indicate the program is recordable. [CHAR LIMIT=30] -->
<string name="dvr_epg_program_recordable">Recordable</string>
<!-- Dvr label in epg to indicate the program is scheduled to be recorded. [CHAR LIMIT=30] -->
@@ -709,36 +766,24 @@
recording schedules. -->
<string name="dvr_schedule_progress_message_reading_programs">Reading programs to create recording schedules</string>
<!-- A popup message which informs that Live TV is reading program information. -->
- <string name="dvr_series_progress_message_reading_programs">Reading programs</string>
- <!-- Dialog action which let user view the recent recordings. -->
- <string name="dvr_error_insufficient_space_action_view_recent_recordings">View recent recordings</string>
- <!-- Dialog title which means there is one recording doesn't complete. -->
- <string name="dvr_error_insufficient_space_title_one_recording">The recording of <xliff:g id="programName" example="Friends">%1$s</xliff:g> is incomplete.</string>
- <!-- Dialog title which means there are two recordings don't complete. -->
- <string name="dvr_error_insufficient_space_title_two_recordings">The recordings of <xliff:g id="programName_1" example="Friends">%1$s</xliff:g> and <xliff:g id="programName_2" example="Friends">%2$s</xliff:g> are incomplete.</string>
- <!-- Dialog title which means there are three or more recordings don't complete.-->
- <string name="dvr_error_insufficient_space_title_three_or_more_recordings">The recordings of <xliff:g id="programName_1" example="Friends">%1$s</xliff:g>, <xliff:g id="programName_2" example="Friends">%2$s</xliff:g> and <xliff:g id="programName_3" example="Friends">%3$s</xliff:g> are incomplete.</string>
- <!-- Description which means there is one recording didn't complete due to no sufficient space.
- -->
- <string name="dvr_error_insufficient_space_description_one_recording">The recording of <xliff:g id="programName" example="Friends">%1$s</xliff:g> didn\'t complete due to insufficient storage.</string>
- <!-- Description which means there are two recordings didn't complete due to no sufficient
- space. -->
- <string name="dvr_error_insufficient_space_description_two_recordings">The recordings of <xliff:g id="programName_1" example="Friends">%1$s</xliff:g> and <xliff:g id="programName_2" example="Friends">%2$s</xliff:g> didn\'t complete due to insufficient storage.</string>
- <!-- Description which means there are three or more recordings didn't complete due to no
- sufficient space.-->
- <string name="dvr_error_insufficient_space_description_three_or_more_recordings">The recordings of <xliff:g id="programName_1" example="Friends">%1$s</xliff:g>, <xliff:g id="programName_2" example="Friends">%2$s</xliff:g> and <xliff:g id="programName_3" example="Friends">%3$s</xliff:g> didn\'t complete due to insufficient storage.</string>
+ <string name="dvr_series_schedules_progress_message_reading_programs">Reading programs</string>
+ <!-- A popup message which informs that Live TV is updating series recording. -->
+ <string name="dvr_series_schedules_progress_message_updating_programs">Updating series recording</string>
+ <string name="dvr_error_insufficient_space_title" translatable="false">Insufficient storage space</string>
+ <string name="dvr_error_insufficient_space_description" translatable="false">No sufficient storage space for recording. Please clean up the storage.</string>
<!-- Dialog title which will be shown when the current storage is too small for DVR. -->
<string name="dvr_error_small_sized_storage_title">DVR needs more storage</string>
- <!-- Dialog description which will be shown when the current storage is too small for DVR. -->
+ <!-- Dialog description which will be shown when tthe current storage is too small for DVR. -->
<string name="dvr_error_small_sized_storage_description">You will be able to record programs with DVR. However there is not enough storage on your device now for DVR to work. Please connect an external drive that is <xliff:g id="storage size" example="10GB">%1$s</xliff:g>GB or larger and follow the steps to format it as device storage.</string>
- <!-- Dialog title which will be shown when there is no free space on the current storage for DVR. -->
- <string name="dvr_error_no_free_space_title">Not enough storage</string>
- <!-- Dialog description which will be shown when there is no free space on the current storage for DVR. -->
- <string name="dvr_error_no_free_space_description">This program will not be recorded because there is not enough storage. Try deleting some existing recordings.</string>
<!-- Dialog title which will be shown when the current DVR storage is not accessible. -->
<string name="dvr_error_missing_storage_title">Missing storage</string>
<!-- Dialog description which will be shown when the current DVR storage is not accessible. -->
- <string name="dvr_error_missing_storage_description" translatable="false">Some of the storage used by DVR is missing. Please connect the external drive you used before to re-enable DVR. Alternately, you can forget the storage in the storage settings, if it\'s no longer available.</string>
+ <string name="dvr_error_missing_storage_description">Some of the storage used by DVR is missing. Please connect the external drive you used before to re-enable DVR. Alternately, you can choose to forget the storage if it\'s no longer available.</string>
+ <!-- Dialog title which will be shown when you confirmed to forget the current DVR storage. -->
+ <string name="dvr_error_forget_storage_title">Forget storage?</string>
+ <!-- Dialog description which will be shown when you confirmed to forget the current DVR
+ storage. -->
+ <string name="dvr_error_forget_storage_description">All your recorded content and schedules will be lost.</string>
<!-- The recording being requested to play is not existent in storage. It may be deleted. -->
<string name="dvr_toast_recording_deleted" translatable="false">The recording seems to be deleted.</string>
@@ -802,44 +847,50 @@
<string name="dvr_already_recorded_dialog_description">This program has already been recorded. It’s available in the DVR library.</string>
<!-- The title of dialog that notifies the user the series recording has been scheduled. -->
<string name="dvr_series_recording_dialog_title">Series recording scheduled</string>
- <!-- The description of the dialog which notifies how many schedules have been added for the
- series. -->
- <plurals name="dvr_series_scheduled_no_conflict">
- <item quantity="one"><xliff:g id="numberOfRecordings" example="1">%1$d</xliff:g> recording has been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>.</item>
- <item quantity="other"><xliff:g id="numberOfRecordings" example="5">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>.</item>
+ <!-- The description of the dialog which notifies how many schedules has been added
+ for series recording.-->
+ <plurals name="dvr_series_recording_scheduled_no_conflict">
+ <item quantity="one">%1$d recording has been scheduled for %2$s.</item>
+ <item quantity="other">%1$d recordings have been scheduled for %2$s.</item>
</plurals>
- <!-- The description of the dialog which notifies how many schedules have been added for the
- series. But some episodes of this series won't be recorded due to conflict with
- other schedules. -->
+ <!-- The description of the dialog which notifies how many schedules has been added
+ for series recording. But some of them won't be recorded due to conflicts. -->
<plurals name="dvr_series_recording_scheduled_only_this_series_conflict">
- <item quantity="one"><xliff:g id="numberOfRecordings" example="1">%1$d</xliff:g> recording has been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>. It will not be recorded due to conflicts.</item>
- <item quantity="other"><xliff:g id="numberOfRecordings" example="5">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>. <xliff:g id="numberOfConflictRecordings" example="2">%3$d</xliff:g> of them will not be recorded due to conflicts.</item>
+ <item quantity="one">%1$d recording has been scheduled for %2$s. %3$d of them will not be recorded due to conflicts.</item>
+ <item quantity="other">%1$d recordings have been scheduled for %2$s. %3$d of them will not be recorded due to conflicts.</item>
</plurals>
- <!-- The description of the dialog which notifies how many schedules have been added for the
- series. But some episodes of this and other series won't be recorded due to the episodes
- of this series conflict with other schedules and the episodes of other series conflict
+ <!-- The description of the dialog which notifies how many schedules has been added
+ for series recording. But only 1 episode of other series won't be recorded due to conflict
with this series. -->
- <plurals name="dvr_series_scheduled_this_and_other_series_conflict">
- <item quantity="one"><xliff:g id="numberOfRecordings" example="1">%1$d</xliff:g> recording has been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>. <xliff:g id="numberOfConflictEpisodes" example="1">%3$d</xliff:g> episodes of this series and other series will not be recorded due to conflicts.</item>
- <item quantity="other"><xliff:g id="numberOfRecordings" example="5">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>. <xliff:g id="numberOfConflictEpisodes" example="2">%3$d</xliff:g> episodes of this series and other series will not be recorded due to conflicts.</item>
+ <plurals name="dvr_series_recording_scheduled_this_and_other_series_one_conflict">
+ <item quantity="one">%1$d recording has been scheduled for %2$s. 1 episode of this series and other series will not be recorded due to conflicts.</item>
+ <item quantity="other">%1$d recordings have been scheduled for %2$s. 1 episode of this series and other series will not be recorded due to conflicts.</item>
</plurals>
- <!-- The description of the dialog which notifies how many schedules have been added for the
- series. But only 1 episode of other series won't be recorded due to conflict
- with this series. -->
- <plurals name="dvr_series_scheduled_only_other_series_one_conflict">
- <item quantity="one"><xliff:g id="numberOfRecordings" example="1">%1$d</xliff:g> recording has been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>. 1 episode of other series will not be recorded due to conflicts.</item>
- <item quantity="other"><xliff:g id="numberOfRecordings" example="5">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>. 1 episode of other series will not be recorded due to conflicts.</item>
+ <!-- The description of the dialog which notifies how many schedules has been added
+ for series recording. But some episodes of other series won't be recorded due to conflict
+ with this. -->
+ <plurals name="dvr_series_recording_scheduled_this_and_other_series_conflict">
+ <item quantity="one">%1$d recording has been scheduled for %2$s. %3$d episodes of this series and other series will not be recorded due to conflicts.</item>
+ <item quantity="other">%1$d recordings have been scheduled for %2$s. %3$d episodes of this series and other series will not be recorded due to conflicts.</item>
+ </plurals>
+ <!-- The description of the dialog which notifies how many schedules has been added
+ for series recording. But only 1 episode of other series won't be recorded due to conflict
+ with this series but no conflicts in this series. -->
+ <plurals name="dvr_series_recording_scheduled_only_other_series_one_conflict">
+ <item quantity="one">%1$d recording has been scheduled for %2$s. 1 episode of other series will not be recorded due to conflicts.</item>
+ <item quantity="other">%1$d recordings have been scheduled for %2$s. 1 episode of other series will not be recorded due to conflicts.</item>
</plurals>
- <!-- The description of the dialog which notifies how many schedules have been added for the
- series. But some episodes of other series won't be recorded due to conflict with this
- series. -->
- <plurals name="dvr_series_scheduled_only_other_series_many_conflicts">
- <item quantity="one"><xliff:g id="numberOfRecordings" example="1">%1$d</xliff:g> recording has been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>. <xliff:g id="numberOfConflictEpisodes" example="1">%3$d</xliff:g> episodes of other series will not be recorded due to conflicts.</item>
- <item quantity="other"><xliff:g id="numberOfRecordings" example="5">%1$d</xliff:g> recordings have been scheduled for <xliff:g id="seriesName" example="Friends">%2$s</xliff:g>. <xliff:g id="numberOfConflictEpisodes" example="2">%3$d</xliff:g> episodes of other series will not be recorded due to conflicts.</item>
+ <!-- The description of the dialog which notifies how many schedules has been added
+ for series recording. But some of other series won't be recorded due to conflict with this
+ series but no conflicts in this series . -->
+ <plurals name="dvr_series_recording_scheduled_only_other_series_conflict">
+ <item quantity="one">%1$d recording has been scheduled for %2$s. %3$d episodes of other series will not be recorded due to conflicts.</item>
+ <item quantity="other">%1$d recordings have been scheduled for %2$s. %3$d episodes of other series will not be recorded due to conflicts.</item>
</plurals>
<!-- DVR playback strings -->
<eat-comment />
+ <string name="dvr_now_playing_card_no_title" translatable="false">Recorded Program</string>
<!-- DVR playback activity's warning about the recorded program is not found. -->
<string name="dvr_program_not_found">Recorded program not found.</string>
<!-- Label used in DVR playback activity as the header of the row of related recordings. [CHAR LIMIT=32] -->
@@ -851,6 +902,11 @@
<eat-comment />
<string name="dvr_recording_till_format" translatable="false">Recording till <xliff:g id="recordingEndTime" example="9:00pm">%1$s</xliff:g></string>
+ <!-- Account Selection strings -->
+ <eat-comment />
+ <string name="account_selected" translatable="false">%1$s is the selected account</string>
+ <string name="no_account_selected" translatable="false">No account available</string>
+
<!-- DVR schedule list strings -->
<eat-comment/>
<!-- Description of list's header about how many recordings in the recording list. -->
@@ -888,8 +944,6 @@
<string name="dvr_series_schedules_stop_dialog_description">Recorded episodes will remain available in the DVR library.</string>
<!-- Action to stop creating the schedules for the series. -->
<string name="dvr_series_schedules_stop_dialog_action_stop">Stop</string>
- <!-- Description of no episodes in stopped series recording. -->
- <string name="dvr_series_schedules_stopped_empty_state">No episodes are on air now.</string>
<!-- Description of no episodes in series recording, and the episodes will be recorded once
they are available. -->
<string name="dvr_series_schedules_empty_state">No episodes are available.\nThey will be recorded once they are available.</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 84885f13..3a34af52 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -92,7 +92,7 @@
<item name="android:textSize">14sp</item>
<item name="android:textColor">@color/lb_basic_card_title_text_color</item>
<item name="android:fontFamily">sans-serif-condensed</item>
- <item name="android:maxLines">@integer/dvr_card_title_max_lines_folded</item>
+ <item name="android:singleLine">true</item>
<item name="android:ellipsize">end</item>
</style>
@@ -143,7 +143,7 @@
<item name="android:layout_height">60dp</item>
</style>
- <style name="TV.Dvr.GuidedActionsListStyle" parent="Widget.Leanback.GuidedActionsListStyle">
+ <style name="TV.Dvr.GuidedActionsListStyle" parent="Widget.Setup.GuidedActionsListStyle">
<item name="android:layout_marginTop">51dp</item>
<item name="android:layout_marginBottom">10dp</item>
<item name="android:layout_marginEnd">56dp</item>
@@ -151,8 +151,11 @@
<style name="TV.Dvr.GuidedActionItemContainerStyle" parent="Widget.Setup.GuidedActionItemContainerStyle">
<item name="android:layout_height">48dp</item>
+ <item name="android:layout_marginTop">7dp</item>
+ <item name="android:paddingBottom">15dp</item>
<item name="android:paddingEnd">16dp</item>
<item name="android:paddingStart">16dp</item>
+ <item name="android:paddingTop">14dp</item>
</style>
<style name="TV.Dvr.GuidedActionItemContainerStyle.Twoline.Action" parent="TV.Dvr.GuidedActionItemContainerStyle">
diff --git a/res/values/themes.xml b/res/values/themes.xml
index ae9cd289..9be64eb8 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -114,7 +114,5 @@
<style name="Theme.TV.Dvr.Browse.Details" parent="Theme.Leanback.Details">
<item name="detailsDescriptionTitleStyle">@style/TV.Dvr.Browse.DetailsDescriptionTitleStyle</item>
- <item name="android:windowSharedElementEnterTransition">@transition/dvr_details_shared_element_enter_transition</item>
- <item name="android:windowSharedElementReturnTransition">@transition/dvr_details_shared_element_return_transition</item>
</style>
</resources>
diff --git a/src/com/android/tv/Features.java b/src/com/android/tv/Features.java
index d8b7ae26..7e8e3689 100644
--- a/src/com/android/tv/Features.java
+++ b/src/com/android/tv/Features.java
@@ -27,18 +27,11 @@ import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.VisibleForTesting;
import android.support.v4.os.BuildCompat;
-import android.text.TextUtils;
-import android.util.Log;
import com.android.tv.common.feature.Feature;
import com.android.tv.common.feature.GServiceFeature;
import com.android.tv.common.feature.PropertyFeature;
-import com.android.tv.config.RemoteConfig;
-import com.android.tv.util.LocationUtils;
import com.android.tv.util.PermissionUtils;
-import com.android.tv.util.Utils;
-
-import java.util.Locale;
/**
* List of {@link Feature} for the Live TV App.
@@ -46,9 +39,6 @@ import java.util.Locale;
* <p>Remove the {@code Feature} once it is launched.
*/
public final class Features {
- private static final String TAG = "Features";
- private static final boolean DEBUG = false;
-
/**
* UI for opting in to analytics.
*
@@ -71,11 +61,6 @@ public final class Features {
@Override
public boolean isEnabled(Context context) {
- if (Utils.isDeveloper()) {
- // we enable tuner for developers to test tuner in any platform.
- return true;
- }
-
// This is special handling just for USB Tuner.
// It does not require any N API's but relies on a improvements in N for AC3 support
// After release, change class to this to just be {@link BuildCompat#isAtLeastN()}.
@@ -84,25 +69,6 @@ public final class Features {
};
- /**
- * Use network tuner if it is available and there is no other tuner types.
- */
- public static final Feature NETWORK_TUNER =
- new Feature() {
- @Override
- public boolean isEnabled(Context context) {
- if (!TUNER.isEnabled(context)) {
- return false;
- }
- if (Utils.isDeveloper()) {
- // Network tuner will be enabled for developers.
- return true;
- }
- return Locale.US.getCountry().equalsIgnoreCase(
- LocationUtils.getCurrentCountry(context));
- }
- };
-
private static final String GSERVICE_KEY_UNHIDE = "live_channels_unhide";
/**
* A flag which indicates that LC app is unhidden even when there is no input.
@@ -130,36 +96,6 @@ public final class Features {
};
/**
- * Use AC3 software decode.
- */
- public static final Feature AC3_SOFTWARE_DECODE =
- new Feature() {
- private final String[] SUPPORTED_COUNTRIES = {
- };
-
- private Boolean mEnabled;
-
- @Override
- public boolean isEnabled(Context context) {
- if (mEnabled == null) {
- if (mEnabled == null) {
- // We will not cache the result of fallback solution.
- String country = LocationUtils.getCurrentCountry(context);
- for (int i = 0; i < SUPPORTED_COUNTRIES.length; ++i) {
- if (SUPPORTED_COUNTRIES[i].equalsIgnoreCase(country)) {
- return true;
- }
- }
- if (DEBUG) Log.d(TAG, "AC3 flag false after country check");
- return false;
- }
- }
- if (DEBUG) Log.d(TAG, "AC3 flag " + mEnabled);
- return mEnabled;
- }
- };
-
- /**
* Enable a conflict dialog between currently watched channel and upcoming recording.
*/
public static final Feature SHOW_UPCOMING_CONFLICT_DIALOG = OFF;
diff --git a/src/com/android/tv/InputSessionManager.java b/src/com/android/tv/InputSessionManager.java
index faf76555..e4b0f456 100644
--- a/src/com/android/tv/InputSessionManager.java
+++ b/src/com/android/tv/InputSessionManager.java
@@ -37,6 +37,7 @@ import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
+import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
import com.android.tv.ui.TunableTvView;
import com.android.tv.ui.TunableTvView.OnTuneListener;
@@ -72,8 +73,6 @@ public class InputSessionManager {
Collections.synchronizedSet(new ArraySet<>());
private final Set<OnTvViewChannelChangeListener> mOnTvViewChannelChangeListeners =
new ArraySet<>();
- private final Set<OnRecordingSessionChangeListener> mOnRecordingSessionChangeListeners =
- new ArraySet<>();
public InputSessionManager(Context context) {
mContext = context.getApplicationContext();
@@ -114,9 +113,6 @@ public class InputSessionManager {
RecordingSession session = new RecordingSession(inputId, tag, callback, handler, endTimeMs);
mRecordingSessions.add(session);
if (DEBUG) Log.d(TAG, "Recording session created: " + session);
- for (OnRecordingSessionChangeListener listener : mOnRecordingSessionChangeListeners) {
- listener.onRecordingSessionChange(true, mRecordingSessions.size());
- }
return session;
}
@@ -127,9 +123,6 @@ public class InputSessionManager {
mRecordingSessions.remove(session);
session.release();
if (DEBUG) Log.d(TAG, "Recording session released: " + session);
- for (OnRecordingSessionChangeListener listener : mOnRecordingSessionChangeListeners) {
- listener.onRecordingSessionChange(false, mRecordingSessions.size());
- }
}
/**
@@ -155,17 +148,9 @@ public class InputSessionManager {
}
}
- /** Adds the {@link OnRecordingSessionChangeListener}. */
- public void addOnRecordingSessionChangeListener(OnRecordingSessionChangeListener listener) {
- mOnRecordingSessionChangeListeners.add(listener);
- }
-
- /** Removes the {@link OnRecordingSessionChangeListener}. */
- public void removeRecordingSessionChangeListener(OnRecordingSessionChangeListener listener) {
- mOnRecordingSessionChangeListeners.remove(listener);
- }
-
- /** Returns the current {@link TvView} channel. */
+ /**
+ * Returns the current {@link TvView} channel.
+ */
@MainThread
public Uri getCurrentTvViewChannelUri() {
for (TvViewSession session : mTvViewSessions) {
@@ -561,9 +546,4 @@ public class InputSessionManager {
public interface OnTvViewChannelChangeListener {
void onTvViewChannelChange(@Nullable Uri channelUri);
}
-
- /** Called when recording session is created or destroyed. */
- public interface OnRecordingSessionChangeListener {
- void onRecordingSessionChange(boolean create, int count);
- }
}
diff --git a/src/com/android/tv/MainActivity.java b/src/com/android/tv/MainActivity.java
index 94006b72..58850b5f 100644
--- a/src/com/android/tv/MainActivity.java
+++ b/src/com/android/tv/MainActivity.java
@@ -29,6 +29,7 @@ import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Point;
import android.hardware.display.DisplayManager;
import android.media.AudioManager;
import android.media.MediaMetadata;
@@ -70,6 +71,7 @@ import android.view.accessibility.AccessibilityManager;
import android.widget.FrameLayout;
import android.widget.Toast;
+import com.android.tv.analytics.DurationTimer;
import com.android.tv.analytics.SendChannelStatusRunnable;
import com.android.tv.analytics.SendConfigInfoRunnable;
import com.android.tv.analytics.Tracker;
@@ -89,14 +91,14 @@ import com.android.tv.data.ProgramDataManager;
import com.android.tv.data.StreamInfo;
import com.android.tv.data.WatchedHistoryManager;
import com.android.tv.data.epg.EpgFetcher;
-import com.android.tv.dialog.HalfSizedDialogFragment;
import com.android.tv.dialog.PinDialogFragment;
import com.android.tv.dialog.SafeDismissDialogFragment;
+import com.android.tv.dvr.ConflictChecker;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.recorder.ConflictChecker;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.ui.DvrStopRecordingFragment;
-import com.android.tv.dvr.ui.DvrUiHelper;
+import com.android.tv.dvr.ui.HalfSizedDialogFragment;
import com.android.tv.experiments.Experiments;
import com.android.tv.menu.Menu;
import com.android.tv.onboarding.OnboardingActivity;
@@ -105,11 +107,9 @@ import com.android.tv.parental.ParentalControlSettings;
import com.android.tv.receiver.AudioCapabilitiesReceiver;
import com.android.tv.recommendation.NotificationService;
import com.android.tv.search.ProgramGuideSearchFragment;
-import com.android.tv.tuner.TunerInputController;
import com.android.tv.tuner.TunerPreferences;
import com.android.tv.tuner.setup.TunerSetupActivity;
import com.android.tv.tuner.tvinput.TunerTvInputService;
-import com.android.tv.tuner.util.PostalCodeUtils;
import com.android.tv.ui.AppLayerTvView;
import com.android.tv.ui.ChannelBannerView;
import com.android.tv.ui.InputBannerView;
@@ -119,7 +119,6 @@ import com.android.tv.ui.SelectInputView.OnInputSelectedCallback;
import com.android.tv.ui.TunableTvView;
import com.android.tv.ui.TunableTvView.BlockScreenType;
import com.android.tv.ui.TunableTvView.OnTuneListener;
-import com.android.tv.ui.TuningBlockView;
import com.android.tv.ui.TvOverlayManager;
import com.android.tv.ui.TvViewUiManager;
import com.android.tv.ui.sidepanel.ClosedCaptionFragment;
@@ -131,20 +130,21 @@ import com.android.tv.ui.sidepanel.SettingsFragment;
import com.android.tv.ui.sidepanel.SideFragment;
import com.android.tv.util.AccountHelper;
import com.android.tv.util.CaptionSettings;
-import com.android.tv.util.Debug;
-import com.android.tv.util.DurationTimer;
import com.android.tv.util.ImageCache;
import com.android.tv.util.ImageLoader;
import com.android.tv.util.OnboardingUtils;
import com.android.tv.util.PermissionUtils;
+import com.android.tv.util.PipInputManager;
+import com.android.tv.util.PipInputManager.PipInput;
import com.android.tv.util.RecurringRunner;
+import com.android.tv.util.SearchManagerHelper;
import com.android.tv.util.SetupUtils;
import com.android.tv.util.SystemProperties;
import com.android.tv.util.TvInputManagerHelper;
import com.android.tv.util.TvSettings;
+import com.android.tv.util.TvSettings.PipSound;
import com.android.tv.util.TvTrackInfoUtils;
import com.android.tv.util.Utils;
-import com.android.tv.util.ViewCache;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -181,12 +181,8 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private static final float FRAME_RATE_FOR_FILM = 23.976f;
private static final float FRAME_RATE_EPSILON = 0.1f;
- private static PlaybackState MEDIA_SESSION_STATE_PLAYING = new PlaybackState.Builder()
- .setState(PlaybackState.STATE_PLAYING, PlaybackState.PLAYBACK_POSITION_UNKNOWN, 1.0f)
- .build();
- private static PlaybackState MEDIA_SESSION_STATE_STOPPED = new PlaybackState.Builder()
- .setState(PlaybackState.STATE_STOPPED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, 0.0f)
- .build();
+ private static final float MEDIA_SESSION_STOPPED_SPEED = 0.0f;
+ private static final float MEDIA_SESSION_PLAYING_SPEED = 1.0f;
private static final int PERMISSIONS_REQUEST_READ_TV_LISTINGS = 1;
@@ -231,12 +227,12 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private static final int MSG_CHANNEL_DOWN_PRESSED = 1000;
private static final int MSG_CHANNEL_UP_PRESSED = 1001;
+ private static final int MSG_UPDATE_CHANNEL_BANNER_BY_INFO_UPDATE = 1002;
@Retention(RetentionPolicy.SOURCE)
@IntDef({UPDATE_CHANNEL_BANNER_REASON_FORCE_SHOW, UPDATE_CHANNEL_BANNER_REASON_TUNE,
UPDATE_CHANNEL_BANNER_REASON_TUNE_FAST, UPDATE_CHANNEL_BANNER_REASON_UPDATE_INFO,
- UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK,
- UPDATE_CHANNEL_BANNER_REASON_UPDATE_STREAM_INFO})
+ UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK})
private @interface ChannelBannerUpdateReason {}
/**
* Updates channel banner because the channel banner is forced to show.
@@ -258,10 +254,6 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
* Updates channel banner because the current watched channel is locked or unlocked.
*/
private static final int UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK = 5;
- /**
- * Updates channel banner because of stream info updating.
- */
- private static final int UPDATE_CHANNEL_BANNER_REASON_UPDATE_STREAM_INFO = 6;
private static final int TVVIEW_SET_MAIN_TIMEOUT_MS = 3000;
@@ -269,13 +261,12 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
// Delay 1 second in order not to interrupt the first tune.
private static final long LAZY_INITIALIZATION_DELAY = TimeUnit.SECONDS.toMillis(1);
- private static final int UNDEFINED_TRACK_INDEX = -1;
-
private AccessibilityManager mAccessibilityManager;
private ChannelDataManager mChannelDataManager;
private ProgramDataManager mProgramDataManager;
private TvInputManagerHelper mTvInputManagerHelper;
private ChannelTuner mChannelTuner;
+ private PipInputManager mPipInputManager;
private final TvOptionsManager mTvOptionsManager = new TvOptionsManager(this);
private TvViewUiManager mTvViewUiManager;
private TimeShiftManager mTimeShiftManager;
@@ -287,6 +278,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private View mContentView;
private TunableTvView mTvView;
+ private TunableTvView mPipView;
private Bundle mTuneParams;
private boolean mChannelBannerHiddenBySideFragment;
// TODO: Move the scene views into TvTransitionManager or TvOverlayManager.
@@ -311,6 +303,10 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private AudioManager mAudioManager;
private int mAudioFocusStatus;
private boolean mTunePending;
+ private boolean mPipEnabled;
+ private Channel mPipChannel;
+ private boolean mPipSwap;
+ @PipSound private int mPipSound = TvSettings.PIP_SOUND_MAIN; // Default
private boolean mDebugNonFullSizeScreen;
private boolean mActivityResumed;
private boolean mActivityStarted;
@@ -335,6 +331,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private boolean mIsCurrentChannelUnblockedByUser;
private boolean mWasChannelUnblockedBeforeShrunkenByUser;
private Channel mChannelBeforeShrunkenTvView;
+ private Channel mPipChannelBeforeShrunkenTvView;
private boolean mIsCompletingShrunkenTvView;
// TODO: Need to consider the case that TIS explicitly request PIN code while TV view is
@@ -353,6 +350,9 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private RecurringRunner mSendConfigInfoRecurringRunner;
private RecurringRunner mChannelStatusRecurringRunner;
+ // A caller which started this activity. (e.g. TvSearch)
+ private String mSource;
+
private final Handler mHandler = new MainActivityHandler(this);
private final Set<OnActionClickListener> mOnActionClickListeners = new ArraySet<>();
@@ -372,13 +372,15 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
if (!mActivityResumed && mVisibleBehind) {
// ACTION_SCREEN_ON is usually called after onResume. But, if media is played
// under launcher with requestVisibleBehind(true), onResume will not be called.
- // In this case, we need to resume TvView explicitly.
+ // In this case, we need to resume TvView and PipView explicitly.
resumeTvIfNeeded();
+ resumePipIfNeeded();
}
} else if (intent.getAction().equals(
TvInputManager.ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED)) {
if (DEBUG) Log.d(TAG, "Received parental control settings change");
- checkChannelLockNeeded(mTvView, null);
+ checkChannelLockNeeded(mTvView);
+ checkChannelLockNeeded(mPipView);
applyParentalControlSettings();
}
}
@@ -405,11 +407,10 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
new ChannelTuner.Listener() {
@Override
public void onLoadFinished() {
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log(
- "MainActivity.mChannelTunerListener.onLoadFinished");
SetupUtils.getInstance(MainActivity.this).markNewChannelsBrowsable();
if (mActivityResumed) {
resumeTvIfNeeded();
+ resumePipIfNeeded();
}
mKeypadChannelSwitchView.setChannels(mChannelTuner.getBrowsableChannelList());
}
@@ -429,12 +430,13 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
};
- private final Runnable mRestoreMainViewRunnable = new Runnable() {
- @Override
- public void run() {
- restoreMainTvView();
- }
- };
+ private final Runnable mRestoreMainViewRunnable =
+ new Runnable() {
+ @Override
+ public void run() {
+ restoreMainTvView();
+ }
+ };
private ProgramGuideSearchFragment mSearchFragment;
private final TvInputCallback mTvInputCallback = new TvInputCallback() {
@@ -454,14 +456,11 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
boolean parentalControlEnabled = mTvInputManagerHelper.getParentalControlSettings()
.isParentalControlsEnabled();
mTvView.onParentalControlChanged(parentalControlEnabled);
+ mPipView.onParentalControlChanged(parentalControlEnabled);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
- // Restarts the global duration timer to avoid the case that TvApplication starts much
- // earlier than MainActivity.
- Debug.getTimer(Debug.TAG_START_UP_TIMER).start();
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log("MainActivity.onCreate restarts timer");
if (DEBUG) Log.d(TAG,"onCreate()");
TvApplication.setCurrentRunningProcess(this, true);
super.onCreate(savedInstanceState);
@@ -479,14 +478,32 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
return;
}
+ // Check this permission for the EPG fetch.
+ // TODO: check {@link shouldShowRequestPermissionRationale}.
+ // While testing, no way to allow the permission when the dialog shows up. So we'd better
+ // not show the dialog.
+ if (!TvCommonUtils.isRunningInTest() && Utils.hasInternalTvInputs(this, true)
+ && checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
+ != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[] {android.Manifest.permission.ACCESS_COARSE_LOCATION},
+ PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
+ }
+
+ DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
+ Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ Point size = new Point();
+ display.getSize(size);
+ int screenWidth = size.x;
+ int screenHeight = size.y;
+ mDefaultRefreshRate = display.getRefreshRate();
+
setContentView(R.layout.activity_tv);
- TvApplication tvApplication = (TvApplication) getApplication();
- mProgramDataManager = tvApplication.getProgramDataManager();
- mTvInputManagerHelper = tvApplication.getTvInputManagerHelper();
+ mContentView = findViewById(android.R.id.content);
mTvView = (TunableTvView) findViewById(R.id.main_tunable_tv_view);
- mTvView.initialize((AppLayerTvView) findViewById(R.id.main_tv_view),
- (TuningBlockView) findViewById(R.id.tuning_block), mProgramDataManager,
- mTvInputManagerHelper);
+ int shrunkenTvViewHeight = getResources().getDimensionPixelSize(
+ R.dimen.shrunken_tvview_height);
+ mTvView.initialize((AppLayerTvView) findViewById(R.id.main_tv_view), false, screenHeight,
+ shrunkenTvViewHeight);
mTvView.setOnUnhandledInputEventListener(new OnUnhandledInputEventListener() {
@Override
public boolean onUnhandledInputEvent(InputEvent event) {
@@ -509,6 +526,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
return false;
}
});
+
long channelId = Utils.getLastWatchedChannelId(this);
String inputId = Utils.getLastWatchedTunerInputId(this);
if (!isPassthroughInput && inputId != null
@@ -516,34 +534,27 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mTvView.warmUpInput(inputId, TvContract.buildChannelUri(channelId));
}
- // Check this permission for the EPG fetch.
- // TODO: check {@link shouldShowRequestPermissionRationale}.
- // While testing, no way to allow the permission when the dialog shows up. So we'd better
- // not show the dialog.
- if (!TvCommonUtils.isRunningInTest() && Utils.hasInternalTvInputs(this, true)
- && TextUtils.isEmpty(PostalCodeUtils.getLastPostalCode(this))
- && checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
- != PackageManager.PERMISSION_GRANTED) {
- requestPermissions(new String[] {android.Manifest.permission.ACCESS_COARSE_LOCATION},
- PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
- }
-
+ TvApplication tvApplication = (TvApplication) getApplication();
tvApplication.getMainActivityWrapper().onMainActivityCreated(this);
if (BuildConfig.ENG && SystemProperties.ALLOW_STRICT_MODE.getValue()) {
Toast.makeText(this, "Using Strict Mode for eng builds", Toast.LENGTH_SHORT).show();
}
mTracker = tvApplication.getTracker();
+ mTvInputManagerHelper = tvApplication.getTvInputManagerHelper();
if (Features.TUNER.isEnabled(this)) {
mTvInputManagerHelper.addCallback(mTvInputCallback);
}
mTunerInputId = TunerTvInputService.getInputId(this);
mChannelDataManager = tvApplication.getChannelDataManager();
+ mProgramDataManager = tvApplication.getProgramDataManager();
mProgramDataManager.addOnCurrentProgramUpdatedListener(Channel.INVALID_ID,
mOnCurrentProgramUpdatedListener);
mProgramDataManager.setPrefetchEnabled(true);
mChannelTuner = new ChannelTuner(mChannelDataManager, mTvInputManagerHelper);
mChannelTuner.addListener(mChannelTunerListener);
mChannelTuner.start();
+ mPipInputManager = new PipInputManager(this, mTvInputManagerHelper, mChannelTuner);
+ mPipInputManager.start();
mMemoryManageables.add(mProgramDataManager);
mMemoryManageables.add(ImageCache.getInstance());
mMemoryManageables.add(TvContentRatingCache.getInstance());
@@ -573,9 +584,9 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
});
- DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
- Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
- mDefaultRefreshRate = display.getRefreshRate();
+ mPipView = (TunableTvView) findViewById(R.id.pip_tunable_tv_view);
+ mPipView.initialize((AppLayerTvView) findViewById(R.id.pip_tv_view), true, screenHeight,
+ shrunkenTvViewHeight);
if (!PermissionUtils.hasAccessWatchedHistory(this)) {
WatchedHistoryManager watchedHistoryManager = new WatchedHistoryManager(
@@ -583,10 +594,12 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
watchedHistoryManager.start();
mTvView.setWatchedHistoryManager(watchedHistoryManager);
}
- mTvViewUiManager = new TvViewUiManager(this, mTvView,
+ mTvViewUiManager = new TvViewUiManager(this, mTvView, mPipView,
(FrameLayout) findViewById(android.R.id.content), mTvOptionsManager);
- mContentView = findViewById(android.R.id.content);
+ mPipView.setFixedSurfaceSize(screenWidth / 2, screenHeight / 2);
+ mPipView.setBlockScreenType(TunableTvView.BLOCK_SCREEN_TYPE_SHRUNKEN_TV_VIEW);
+
ViewGroup sceneContainer = (ViewGroup) findViewById(R.id.scene_container);
mChannelBannerView = (ChannelBannerView) getLayoutInflater().inflate(
R.layout.channel_banner, sceneContainer, false);
@@ -628,7 +641,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
});
mSearchFragment = new ProgramGuideSearchFragment();
- mOverlayManager = new TvOverlayManager(this, mChannelTuner, mTvView, mTvOptionsManager,
+ mOverlayManager = new TvOverlayManager(this, mChannelTuner, mTvView,
mKeypadChannelSwitchView, mChannelBannerView, inputBannerView,
selectInputView, sceneContainer, mSearchFragment);
@@ -679,7 +692,6 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mDvrConflictChecker = new ConflictChecker(this);
}
initForTest();
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log("MainActivity.onCreate end");
}
@Override
@@ -714,7 +726,9 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
case PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& Experiments.CLOUD_EPG.get()) {
- EpgFetcher.getInstance(this).startImmediately(false);
+ EpgFetcher.getInstance(this).startImmediately();
+ } else {
+ EpgFetcher.getInstance(this).stop();
}
break;
}
@@ -784,14 +798,14 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
Intent notificationIntent = new Intent(this, NotificationService.class);
notificationIntent.setAction(NotificationService.ACTION_SHOW_RECOMMENDATION);
startService(notificationIntent);
- TunerInputController.executeNetworkTunerDiscoveryAsyncTask(this);
}
@Override
protected void onResume() {
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log("MainActivity.onResume start");
if (DEBUG) Log.d(TAG, "onResume()");
super.onResume();
+ // Refresh the remote config, it is throttled automatically.
+ TvApplication.getSingletons(this).getRemoteConfig().fetch(null);
if (!PermissionUtils.hasAccessAllEpg(this)
&& checkSelfPermission(PERMISSION_READ_TV_LISTINGS)
!= PackageManager.PERMISSION_GRANTED) {
@@ -816,16 +830,12 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
// visible behind.
requestVisibleBehind(true);
}
- Set<String> failedScheduledRecordingInfoSet =
- Utils.getFailedScheduledRecordingInfoSet(getApplicationContext());
- if (Utils.hasRecordingFailedReason(
- getApplicationContext(), TvInputManager.RECORDING_ERROR_INSUFFICIENT_SPACE)
- && !failedScheduledRecordingInfoSet.isEmpty()) {
+ if (Utils.hasRecordingFailedReason(getApplicationContext(),
+ TvInputManager.RECORDING_ERROR_INSUFFICIENT_SPACE)) {
runAfterAttachedToWindow(new Runnable() {
@Override
public void run() {
- DvrUiHelper.showDvrInsufficientSpaceErrorDialog(MainActivity.this,
- failedScheduledRecordingInfoSet);
+ DvrUiHelper.showDvrInsufficientSpaceErrorDialog(MainActivity.this);
}
});
}
@@ -833,6 +843,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
if (mChannelTuner.areAllChannelsLoaded()) {
SetupUtils.getInstance(this).markNewChannelsBrowsable();
resumeTvIfNeeded();
+ resumePipIfNeeded();
}
mOverlayManager.showMenuWithTimeShiftPauseIfNeeded();
@@ -870,7 +881,6 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
if (mDvrConflictChecker != null) {
mDvrConflictChecker.start();
}
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log("MainActivity.onResume end");
}
@Override
@@ -883,6 +893,9 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mActivityResumed = false;
mOverlayManager.hideOverlays(TvOverlayManager.FLAG_HIDE_OVERLAYS_DEFAULT);
mTvView.setBlockScreenType(TunableTvView.BLOCK_SCREEN_TYPE_NO_UI);
+ if (mPipEnabled) {
+ mTvViewUiManager.hidePipForPause();
+ }
mBackKeyPressed = false;
mShowLockedChannelsTemporarily = false;
mShouldTuneToTunerChannel = false;
@@ -890,7 +903,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mAudioFocusStatus = AudioManager.AUDIOFOCUS_LOSS;
mAudioManager.abandonAudioFocus(this);
if (mMediaSession.isActive()) {
- setMediaSessionActiveAndPlaybackState(false);
+ mMediaSession.setActive(false);
}
mTracker.sendScreenView("");
} else {
@@ -949,6 +962,21 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mTvView.setBlockScreenType(getDesiredBlockScreenType());
}
+ private void resumePipIfNeeded() {
+ if (mPipEnabled && !(mPipView.isPlaying() && mPipView.isShown())) {
+ if (mPipInputManager.areInSamePipInput(
+ mChannelTuner.getCurrentChannel(), mPipChannel)) {
+ enablePipView(false, false);
+ } else {
+ if (!mPipView.isPlaying()) {
+ startPip(false);
+ } else {
+ mTvViewUiManager.showPipForResume();
+ }
+ }
+ }
+ }
+
private void startTv(Uri channelUri) {
if (DEBUG) Log.d(TAG, "startTv Uri=" + channelUri);
if ((channelUri == null || !TvContract.isChannelUriForPassthroughInput(channelUri))
@@ -999,9 +1027,9 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
}
- mTvView.start();
+ mTvView.start(mTvInputManagerHelper);
setVolumeByAudioFocusStatus();
- tune(true);
+ tune();
}
@Override
@@ -1044,6 +1072,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private void stopAll(boolean keepVisibleBehind) {
mOverlayManager.hideOverlays(TvOverlayManager.FLAG_HIDE_OVERLAYS_WITHOUT_ANIMATION);
stopTv("stopAll()", keepVisibleBehind);
+ stopPip();
}
public TvInputManagerHelper getTvInputManagerHelper() {
@@ -1116,6 +1145,10 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
return mProgramDataManager;
}
+ public PipInputManager getPipInputManager() {
+ return mPipInputManager;
+ }
+
public TvOptionsManager getTvOptionsManager() {
return mTvOptionsManager;
}
@@ -1239,11 +1272,19 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mChannelBeforeShrunkenTvView = mTvView.getCurrentChannel();
mWasChannelUnblockedBeforeShrunkenByUser = mIsCurrentChannelUnblockedByUser;
mAllowedRatingBeforeShrunken = mLastAllowedRatingForCurrentChannel;
+
+ if (willMainViewBeTunerInput && mChannelTuner.isCurrentChannelPassthrough()
+ && mPipEnabled) {
+ mPipChannelBeforeShrunkenTvView = mPipChannel;
+ enablePipView(false, false);
+ } else {
+ mPipChannelBeforeShrunkenTvView = null;
+ }
mTvViewUiManager.startShrunkenTvView();
if (showLockedChannelsTemporarily) {
mShowLockedChannelsTemporarily = true;
- checkChannelLockNeeded(mTvView, null);
+ checkChannelLockNeeded(mTvView);
}
mTvView.setBlockScreenType(getDesiredBlockScreenType());
@@ -1279,15 +1320,23 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mIsCompletingShrunkenTvView = false;
mIsCurrentChannelUnblockedByUser = mWasChannelUnblockedBeforeShrunkenByUser;
mTvView.setBlockScreenType(getDesiredBlockScreenType());
+ if (mPipChannelBeforeShrunkenTvView != null) {
+ enablePipView(true, false);
+ mPipChannelBeforeShrunkenTvView = null;
+ }
}
};
mTvViewUiManager.fadeOutTvView(tuneAction);
// Will automatically fade-in when video becomes available.
} else {
- checkChannelLockNeeded(mTvView, null);
+ checkChannelLockNeeded(mTvView);
mIsCompletingShrunkenTvView = false;
mIsCurrentChannelUnblockedByUser = mWasChannelUnblockedBeforeShrunkenByUser;
mTvView.setBlockScreenType(getDesiredBlockScreenType());
+ if (mPipChannelBeforeShrunkenTvView != null) {
+ enablePipView(true, false);
+ mPipChannelBeforeShrunkenTvView = null;
+ }
}
}
@@ -1314,7 +1363,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mChannelTuner.moveToAdjacentBrowsableChannel(true);
}
if (mTunePending) {
- tune(true);
+ tune();
}
} else {
mInputIdUnderSetup = null;
@@ -1439,6 +1488,11 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
});
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Uri uri = intent.getData();
+ try {
+ mSource = uri.getQueryParameter(Utils.PARAM_SOURCE);
+ } catch (UnsupportedOperationException e) {
+ // ignore this exception.
+ }
// When the URI points to the programs (directory, not an individual item), go to the
// program guide. The intention here is to respond to
// "content://android.media.tv/program", not "content://android.media.tv/program/XXX".
@@ -1514,20 +1568,38 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
private void setVolumeByAudioFocusStatus() {
- if (mTvView.isPlaying()) {
+ if (mPipSound == TvSettings.PIP_SOUND_MAIN) {
+ setVolumeByAudioFocusStatus(mTvView);
+ } else { // mPipSound == TvSettings.PIP_SOUND_PIP_WINDOW
+ setVolumeByAudioFocusStatus(mPipView);
+ }
+ }
+
+ private void setVolumeByAudioFocusStatus(TunableTvView tvView) {
+ SoftPreconditions.checkState(tvView == mTvView || tvView == mPipView);
+ if (tvView.isPlaying()) {
switch (mAudioFocusStatus) {
case AudioManager.AUDIOFOCUS_GAIN:
- mTvView.setStreamVolume(AUDIO_MAX_VOLUME);
+ tvView.setStreamVolume(AUDIO_MAX_VOLUME);
break;
case AudioManager.AUDIOFOCUS_LOSS:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
- mTvView.setStreamVolume(AUDIO_MIN_VOLUME);
+ tvView.setStreamVolume(AUDIO_MIN_VOLUME);
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
- mTvView.setStreamVolume(AUDIO_DUCKING_VOLUME);
+ tvView.setStreamVolume(AUDIO_DUCKING_VOLUME);
break;
}
}
+ if (tvView == mTvView) {
+ if (mPipView != null && mPipView.isPlaying()) {
+ mPipView.setStreamVolume(AUDIO_MIN_VOLUME);
+ }
+ } else { // tvView == mPipView
+ if (mTvView != null && mTvView.isPlaying()) {
+ mTvView.setStreamVolume(AUDIO_MIN_VOLUME);
+ }
+ }
}
private void stopTv() {
@@ -1547,7 +1619,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
mAudioManager.abandonAudioFocus(this);
if (mMediaSession.isActive()) {
- setMediaSessionActiveAndPlaybackState(false);
+ mMediaSession.setActive(false);
}
}
TvApplication.getSingletons(this).getMainActivityWrapper()
@@ -1560,11 +1632,95 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
return mTvView.isPlaying() && mTvView.getCurrentChannel() != null;
}
+ private void startPip(final boolean fromUserInteraction) {
+ if (mPipChannel == null) {
+ Log.w(TAG, "PIP channel id is an invalid id.");
+ return;
+ }
+ if (DEBUG) Log.d(TAG, "startPip() " + mPipChannel);
+ mPipView.start(mTvInputManagerHelper);
+ boolean success = mPipView.tuneTo(mPipChannel, null, new OnTuneListener() {
+ @Override
+ public void onUnexpectedStop(Channel channel) {
+ Log.w(TAG, "The PIP is Unexpectedly stopped");
+ enablePipView(false, false);
+ }
+
+ @Override
+ public void onTuneFailed(Channel channel) {
+ Log.w(TAG, "Fail to start the PIP during channel tuning");
+ if (fromUserInteraction) {
+ Toast.makeText(MainActivity.this, R.string.msg_no_pip_support,
+ Toast.LENGTH_SHORT).show();
+ enablePipView(false, false);
+ }
+ }
+
+ @Override
+ public void onStreamInfoChanged(StreamInfo info) {
+ mTvViewUiManager.updatePipView();
+ mHandler.removeCallbacks(mRestoreMainViewRunnable);
+ restoreMainTvView();
+ }
+
+ @Override
+ public void onChannelRetuned(Uri channel) {
+ if (channel == null) {
+ return;
+ }
+ Channel currentChannel =
+ mChannelDataManager.getChannel(ContentUris.parseId(channel));
+ if (currentChannel == null) {
+ Log.e(TAG, "onChannelRetuned is called from PIP input but can't find a channel"
+ + " with the URI " + channel);
+ return;
+ }
+ if (isChannelChangeKeyDownReceived()) {
+ // Ignore this message if the user is changing the channel.
+ return;
+ }
+ mPipChannel = currentChannel;
+ mPipView.setCurrentChannel(mPipChannel);
+ }
+
+ @Override
+ public void onContentBlocked() {
+ updateMediaSession();
+ }
+
+ @Override
+ public void onContentAllowed() {
+ updateMediaSession();
+ }
+ });
+ if (!success) {
+ Log.w(TAG, "Fail to start the PIP");
+ return;
+ }
+ if (fromUserInteraction) {
+ checkChannelLockNeeded(mPipView);
+ }
+ // Explicitly make the PIP view main to make the selected input an HDMI-CEC active source.
+ mPipView.setMain();
+ scheduleRestoreMainTvView();
+ mTvViewUiManager.onPipStart();
+ setVolumeByAudioFocusStatus();
+ }
+
private void scheduleRestoreMainTvView() {
mHandler.removeCallbacks(mRestoreMainViewRunnable);
mHandler.postDelayed(mRestoreMainViewRunnable, TVVIEW_SET_MAIN_TIMEOUT_MS);
}
+ private void stopPip() {
+ if (DEBUG) Log.d(TAG, "stopPip");
+ if (mPipView.isPlaying()) {
+ mPipView.stop();
+ mPipSwap = false;
+ mTvViewUiManager.onPipStop();
+ }
+ }
+
/**
* Says {@code text} when accessibility is turned on.
*/
@@ -1579,7 +1735,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
}
- private void tune(boolean updateChannelBanner) {
+ private void tune() {
if (DEBUG) Log.d(TAG, "tune()");
mTuneDurationTimer.start();
@@ -1669,6 +1825,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
if (!isUnderShrunkenTvView()) {
mLastAllowedRatingForCurrentChannel = null;
}
+ mHandler.removeMessages(MSG_UPDATE_CHANNEL_BANNER_BY_INFO_UPDATE);
// For every tune, we need to inform the tuned channel or input to a user,
// if Talkback is turned on.
sendAccessibilityText(!mChannelTuner.isCurrentChannelPassthrough() ?
@@ -1695,13 +1852,8 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
TvApplication.getSingletons(this).getMainActivityWrapper()
.notifyCurrentChannelChange(this, channel);
}
- // We have to provide channel here instead of using TvView's channel, because TvView's
- // channel might be null when there's tuner conflict. In that case, TvView will resets
- // its current channel onConnectionFailed().
- checkChannelLockNeeded(mTvView, channel);
- if (updateChannelBanner) {
- updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_TUNE);
- }
+ checkChannelLockNeeded(mTvView);
+ updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_TUNE);
if (mActivityResumed) {
// requestVisibleBehind should be called after onResume() is called. But, when
// launcher is over the TV app and the screen is turned off and on, tune() can
@@ -1745,18 +1897,19 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private void updateMediaSession() {
if (getCurrentChannel() == null) {
- setMediaSessionActiveAndPlaybackState(false);
+ mMediaSession.setActive(false);
return;
}
// If the channel is blocked, display a lock and a short text on the Now Playing Card
if (mTvView.isScreenBlocked() || mTvView.getBlockedContentRating() != null) {
+ setMediaSessionPlaybackState(false);
Bitmap art = BitmapFactory.decodeResource(
getResources(), R.drawable.ic_message_lock_preview);
updateMediaMetadata(
getResources().getString(R.string.channel_banner_locked_channel_title), art);
- setMediaSessionActiveAndPlaybackState(true);
+ mMediaSession.setActive(true);
return;
}
@@ -1771,11 +1924,13 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
cardTitleText = getCurrentChannelName();
}
updateMediaMetadata(cardTitleText, null);
+ setMediaSessionPlaybackState(true);
+
if (posterArtUri == null) {
posterArtUri = TvContract.buildChannelLogoUri(getCurrentChannelId()).toString();
}
updatePosterArt(getCurrentChannel(), currentProgram, cardTitleText, null, posterArtUri);
- setMediaSessionActiveAndPlaybackState(true);
+ mMediaSession.setActive(true);
}
private void updatePosterArt(Channel currentChannel, Program currentProgram,
@@ -1862,17 +2017,12 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
}
- private void setMediaSessionActiveAndPlaybackState(boolean isPlaying) {
- if (isPlaying) {
- mMediaSession.setActive(true);
- // setMediaSessionPlaybackState has to be called after calling mMediaSession.setActive
- // b/31933276
- mMediaSession.setPlaybackState(MEDIA_SESSION_STATE_PLAYING);
- } else {
- mMediaSession.setPlaybackState(MEDIA_SESSION_STATE_STOPPED);
- mMediaSession.setActive(false);
- }
-
+ private void setMediaSessionPlaybackState(boolean isPlaying) {
+ PlaybackState.Builder builder = new PlaybackState.Builder();
+ builder.setState(isPlaying ? PlaybackState.STATE_PLAYING : PlaybackState.STATE_STOPPED,
+ PlaybackState.PLAYBACK_POSITION_UNKNOWN,
+ isPlaying ? MEDIA_SESSION_PLAYING_SPEED : MEDIA_SESSION_STOPPED_SPEED);
+ mMediaSession.setPlaybackState(builder.build());
}
private void addToRecentChannels(long channelId) {
@@ -1892,27 +2042,33 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
return mRecentChannels;
}
- private void checkChannelLockNeeded(TunableTvView tvView, Channel currentChannel) {
- if (currentChannel == null) {
- currentChannel = tvView.getCurrentChannel();
- }
- if (tvView.isPlaying() && currentChannel != null) {
+ private void checkChannelLockNeeded(TunableTvView tvView) {
+ Channel channel = tvView.getCurrentChannel();
+ if (tvView.isPlaying() && channel != null) {
if (getParentalControlSettings().isParentalControlsEnabled()
- && currentChannel.isLocked()
+ && channel.isLocked()
&& !mShowLockedChannelsTemporarily
&& !(isUnderShrunkenTvView()
- && currentChannel.equals(mChannelBeforeShrunkenTvView)
+ && channel.equals(mChannelBeforeShrunkenTvView)
&& mWasChannelUnblockedBeforeShrunkenByUser)) {
- if (DEBUG) Log.d(TAG, "Channel " + currentChannel.getId() + " is locked");
- blockOrUnblockScreen(tvView, true);
+ if (DEBUG) Log.d(TAG, "Channel " + channel.getId() + " is locked");
+ blockScreen(tvView);
} else {
- blockOrUnblockScreen(tvView, false);
+ unblockScreen(tvView);
}
}
}
- private void blockOrUnblockScreen(TunableTvView tvView, boolean blockOrUnblock) {
- tvView.blockOrUnblockScreen(blockOrUnblock);
+ private void blockScreen(TunableTvView tvView) {
+ tvView.blockScreen();
+ if (tvView == mTvView) {
+ updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK);
+ updateMediaSession();
+ }
+ }
+
+ private void unblockScreen(TunableTvView tvView) {
+ tvView.unblockScreen();
if (tvView == mTvView) {
updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK);
updateMediaSession();
@@ -1933,59 +2089,36 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private void updateChannelBannerAndShowIfNeeded(@ChannelBannerUpdateReason int reason) {
if(DEBUG) Log.d(TAG, "updateChannelBannerAndShowIfNeeded(reason=" + reason + ")");
- if (isChannelChangeKeyDownReceived() && reason != UPDATE_CHANNEL_BANNER_REASON_TUNE
- && reason != UPDATE_CHANNEL_BANNER_REASON_TUNE_FAST) {
- // Tuning is still ongoing, no need to update banner for other reasons
- return;
- }
if (!mChannelTuner.isCurrentChannelPassthrough()) {
int lockType = ChannelBannerView.LOCK_NONE;
- if (reason == UPDATE_CHANNEL_BANNER_REASON_TUNE_FAST) {
- if (getParentalControlSettings().isParentalControlsEnabled()
- && getCurrentChannel().isLocked()) {
- lockType = ChannelBannerView.LOCK_CHANNEL_INFO;
- } else {
- // Do not show detailed program information while fast-tuning.
- lockType = ChannelBannerView.LOCK_PROGRAM_DETAIL;
- }
- } else if (reason == UPDATE_CHANNEL_BANNER_REASON_TUNE) {
- if (getParentalControlSettings().isParentalControlsEnabled()) {
- if (getCurrentChannel().isLocked()) {
- lockType = ChannelBannerView.LOCK_CHANNEL_INFO;
- } else {
- // If parental control is turned on,
- // assumes that program is locked by default and waits for onContentAllowed.
- lockType = ChannelBannerView.LOCK_PROGRAM_DETAIL;
- }
- }
- } else if (mTvView.isScreenBlocked()) {
+ if (mTvView.isScreenBlocked()) {
lockType = ChannelBannerView.LOCK_CHANNEL_INFO;
} else if (mTvView.getBlockedContentRating() != null
|| (getParentalControlSettings().isParentalControlsEnabled()
- && !mTvView.isVideoOrAudioAvailable())) {
+ && !mTvView.isVideoAvailable())) {
// If the parental control is enabled, do not show the program detail until the
// video becomes available.
lockType = ChannelBannerView.LOCK_PROGRAM_DETAIL;
}
+ if (lockType == ChannelBannerView.LOCK_NONE) {
+ if (reason == UPDATE_CHANNEL_BANNER_REASON_TUNE_FAST) {
+ // Do not show detailed program information while fast-tuning.
+ lockType = ChannelBannerView.LOCK_PROGRAM_DETAIL;
+ } else if (reason == UPDATE_CHANNEL_BANNER_REASON_TUNE
+ && getParentalControlSettings().isParentalControlsEnabled()) {
+ // If parental control is turned on,
+ // assumes that program is locked by default and waits for onContentAllowed.
+ lockType = ChannelBannerView.LOCK_PROGRAM_DETAIL;
+ }
+ }
// If lock type is not changed, we don't need to update channel banner by parental
// control.
- int previousLockType = mChannelBannerView.setLockType(lockType);
- if (previousLockType == lockType
+ if (!mChannelBannerView.setLockType(lockType)
&& reason == UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK) {
return;
- } else if (reason == UPDATE_CHANNEL_BANNER_REASON_UPDATE_STREAM_INFO) {
- mChannelBannerView.updateStreamInfo(mTvView);
- // If parental control is enabled, we shows program description when the video is
- // available, instead of tuning. Therefore we need to check it here if the program
- // description is previously hidden by parental control.
- if (previousLockType == ChannelBannerView.LOCK_PROGRAM_DETAIL &&
- lockType != ChannelBannerView.LOCK_PROGRAM_DETAIL) {
- mChannelBannerView.updateViews(false);
- }
- } else {
- mChannelBannerView.updateViews(reason == UPDATE_CHANNEL_BANNER_REASON_TUNE
- || reason == UPDATE_CHANNEL_BANNER_REASON_TUNE_FAST);
}
+
+ mChannelBannerView.updateViews(mTvView);
}
boolean needToShowBanner = (reason == UPDATE_CHANNEL_BANNER_REASON_FORCE_SHOW
|| reason == UPDATE_CHANNEL_BANNER_REASON_TUNE
@@ -2064,7 +2197,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
if (bestTrack != null) {
String selectedTrack = getSelectedTrack(TvTrackInfo.TYPE_AUDIO);
if (!bestTrack.getId().equals(selectedTrack)) {
- selectTrack(TvTrackInfo.TYPE_AUDIO, bestTrack, UNDEFINED_TRACK_INDEX);
+ selectTrack(TvTrackInfo.TYPE_AUDIO, bestTrack);
} else {
mTvOptionsManager.onMultiAudioChanged(
Utils.getMultiAudioString(this, bestTrack, false));
@@ -2077,7 +2210,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private void applyClosedCaption() {
List<TvTrackInfo> tracks = getTracks(TvTrackInfo.TYPE_SUBTITLE);
if (tracks == null) {
- mTvOptionsManager.onClosedCaptionsChanged(null, UNDEFINED_TRACK_INDEX);
+ mTvOptionsManager.onClosedCaptionsChanged(null);
return;
}
@@ -2086,19 +2219,17 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
String selectedTrackId = getSelectedTrack(TvTrackInfo.TYPE_SUBTITLE);
TvTrackInfo alternativeTrack = null;
- int alternativeTrackIndex = UNDEFINED_TRACK_INDEX;
if (enabled) {
String language = mCaptionSettings.getLanguage();
String trackId = mCaptionSettings.getTrackId();
- for (int i = 0; i < tracks.size(); i++) {
- TvTrackInfo track = tracks.get(i);
+ for (TvTrackInfo track : tracks) {
if (Utils.isEqualLanguage(track.getLanguage(), language)) {
if (track.getId().equals(trackId)) {
if (!track.getId().equals(selectedTrackId)) {
- selectTrack(TvTrackInfo.TYPE_SUBTITLE, track, i);
+ selectTrack(TvTrackInfo.TYPE_SUBTITLE, track);
} else {
// Already selected. Update the option string only.
- mTvOptionsManager.onClosedCaptionsChanged(track, i);
+ mTvOptionsManager.onClosedCaptionsChanged(track);
}
if (DEBUG) {
Log.d(TAG, "Subtitle Track Selected {id=" + track.getId()
@@ -2107,16 +2238,14 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
return;
} else if (alternativeTrack == null) {
alternativeTrack = track;
- alternativeTrackIndex = i;
}
}
}
if (alternativeTrack != null) {
if (!alternativeTrack.getId().equals(selectedTrackId)) {
- selectTrack(TvTrackInfo.TYPE_SUBTITLE, alternativeTrack, alternativeTrackIndex);
+ selectTrack(TvTrackInfo.TYPE_SUBTITLE, alternativeTrack);
} else {
- mTvOptionsManager
- .onClosedCaptionsChanged(alternativeTrack, alternativeTrackIndex);
+ mTvOptionsManager.onClosedCaptionsChanged(alternativeTrack);
}
if (DEBUG) {
Log.d(TAG, "Subtitle Track Selected {id=" + alternativeTrack.getId()
@@ -2126,11 +2255,11 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
}
if (selectedTrackId != null) {
- selectTrack(TvTrackInfo.TYPE_SUBTITLE, null, UNDEFINED_TRACK_INDEX);
+ selectTrack(TvTrackInfo.TYPE_SUBTITLE, null);
if (DEBUG) Log.d(TAG, "Subtitle Track Unselected");
return;
}
- mTvOptionsManager.onClosedCaptionsChanged(null, UNDEFINED_TRACK_INDEX);
+ mTvOptionsManager.onClosedCaptionsChanged(null);
}
/**
@@ -2145,6 +2274,12 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
}
+ public void showSearchActivity() {
+ // HACK: Once we moved the window layer to TYPE_APPLICATION_SUB_PANEL,
+ // the voice button doesn't work. So we directly call the voice action.
+ SearchManagerHelper.getInstance(this).launchAssistAction();
+ }
+
public void showProgramGuideSearchFragment() {
getFragmentManager().beginTransaction().replace(R.id.fragment_container, mSearchFragment)
.addToBackStack(null).commit();
@@ -2160,11 +2295,13 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
@Override
protected void onDestroy() {
if (DEBUG) Log.d(TAG, "onDestroy()");
- SideFragment.releaseRecycledViewPool();
- ViewCache.getInstance().clear();
+ SideFragment.releasePreloadedRecycledViews();
if (mTvView != null) {
mTvView.release();
}
+ if (mPipView != null) {
+ mPipView.release();
+ }
if (mChannelTuner != null) {
mChannelTuner.removeListener(mChannelTunerListener);
mChannelTuner.stop();
@@ -2177,6 +2314,9 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mProgramDataManager.setPrefetchEnabled(false);
}
}
+ if (mPipInputManager != null) {
+ mPipInputManager.stop();
+ }
if (mOverlayManager != null) {
mOverlayManager.release();
}
@@ -2200,11 +2340,8 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mChannelStatusRecurringRunner.stop();
mChannelStatusRecurringRunner = null;
}
- if (mTvInputManagerHelper != null) {
- mTvInputManagerHelper.clearTvInputLabels();
- if (Features.TUNER.isEnabled(this)) {
- mTvInputManagerHelper.removeCallback(mTvInputCallback);
- }
+ if (mTvInputManagerHelper != null && Features.TUNER.isEnabled(this)) {
+ mTvInputManagerHelper.removeCallback(mTvInputCallback);
}
super.onDestroy();
}
@@ -2273,6 +2410,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
* G debug: refresh cloud epg
* I KEYCODE_TV_INPUT
* O debug: show display mode option
+ * P debug: togglePipView
* S KEYCODE_CAPTIONS: select subtitle
* W debug: toggle screen size
* V KEYCODE_MEDIA_RECORD debug: record the current channel for 30 sec
@@ -2284,9 +2422,8 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
finishChannelChangeIfNeeded();
if (event.getKeyCode() == KeyEvent.KEYCODE_SEARCH) {
- // Prevent MainActivity from being closed by onVisibleBehindCanceled()
- mOtherActivityLaunched = true;
- return false;
+ showSearchActivity();
+ return true;
}
switch (mOverlayManager.onKeyUp(keyCode, event)) {
case KEY_EVENT_HANDLER_RESULT_DISPATCH_TO_OVERLAY:
@@ -2335,7 +2472,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_RIGHT:
- if (!mTvView.isVideoOrAudioAvailable()
+ if (!mTvView.isVideoAvailable()
&& mTvView.getVideoUnavailableReason()
== TunableTvView.VIDEO_UNAVAILABLE_REASON_NO_RESOURCE) {
DvrUiHelper.startSchedulesActivityForTuneConflict(this,
@@ -2354,7 +2491,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
@Override
public void done(boolean success) {
if (success) {
- blockOrUnblockScreen(mTvView, false);
+ unblockScreen(mTvView);
mIsCurrentChannelUnblockedByUser = true;
}
}
@@ -2441,17 +2578,22 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
Toast.makeText(this, R.string.dvr_msg_cannot_record_program,
Toast.LENGTH_SHORT).show();
} else {
+ if (!DvrUiHelper.checkStorageStatusAndShowErrorMessage(this,
+ currentChannel.getInputId())) {
+ return true;
+ }
Program program = mProgramDataManager
.getCurrentProgram(currentChannel.getId());
- DvrUiHelper.checkStorageStatusAndShowErrorMessage(this,
- currentChannel.getInputId(), new Runnable() {
- @Override
- public void run() {
- DvrUiHelper.requestRecordingCurrentProgram(
- MainActivity.this,
- currentChannel, program, false);
- }
- });
+ if (program == null) {
+ DvrUiHelper
+ .showChannelRecordDurationOptions(this, currentChannel);
+ } else if (DvrUiHelper.handleCreateSchedule(this, program)) {
+ String msg = getString(
+ R.string.dvr_msg_current_program_scheduled,
+ program.getTitle(), Utils.toTimeString(
+ program.getEndTimeUtcMillis(), false));
+ Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
+ }
}
} else {
DvrUiHelper.showStopRecordingDialog(this, currentChannel.getId(),
@@ -2501,6 +2643,10 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
return true;
}
+ case KeyEvent.KEYCODE_P: {
+ togglePipView();
+ return true;
+ }
case KeyEvent.KEYCODE_CTRL_LEFT:
case KeyEvent.KEYCODE_CTRL_RIGHT: {
mUseKeycodeBlacklist = !mUseKeycodeBlacklist;
@@ -2535,6 +2681,22 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
@Override
+ public void onBackPressed() {
+ // The activity should be returned to the caller of this activity
+ // when the mSource is not null.
+ if (!mOverlayManager.getSideFragmentManager().isActive() && isPlaying()
+ && mSource == null) {
+ // If back key would exit TV app,
+ // show McLauncher instead so we can get benefit of McLauncher's shyMode.
+ Intent startMain = new Intent(Intent.ACTION_MAIN);
+ startMain.addCategory(Intent.CATEGORY_HOME);
+ startActivity(startMain);
+ } else {
+ super.onBackPressed();
+ }
+ }
+
+ @Override
public void onUserInteraction() {
super.onUserInteraction();
if (mOverlayManager != null) {
@@ -2563,6 +2725,65 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
}
+ public void togglePipView() {
+ enablePipView(!mPipEnabled, true);
+ mOverlayManager.getMenu().update();
+ }
+
+ public boolean isPipEnabled() {
+ return mPipEnabled;
+ }
+
+ public void tuneToChannelForPip(Channel channel) {
+ if (!mPipEnabled) {
+ throw new IllegalStateException("tuneToChannelForPip is called when PIP is off");
+ }
+ if (mPipChannel.equals(channel)) {
+ return;
+ }
+ mPipChannel = channel;
+ startPip(true);
+ }
+
+ private void enablePipView(boolean enable, boolean fromUserInteraction) {
+ if (enable == mPipEnabled) {
+ return;
+ }
+ if (enable) {
+ List<PipInput> pipAvailableInputs = mPipInputManager.getPipInputList(true);
+ if (pipAvailableInputs.isEmpty()) {
+ Toast.makeText(this, R.string.msg_no_available_input_by_pip, Toast.LENGTH_SHORT)
+ .show();
+ return;
+ }
+ // TODO: choose the last pip input.
+ Channel pipChannel = pipAvailableInputs.get(0).getChannel();
+ if (pipChannel != null) {
+ mPipEnabled = true;
+ mPipChannel = pipChannel;
+ startPip(fromUserInteraction);
+ mTvViewUiManager.restorePipSize();
+ mTvViewUiManager.restorePipLayout();
+ mTvOptionsManager.onPipChanged(mPipEnabled);
+ } else {
+ Toast.makeText(this, R.string.msg_no_available_input_by_pip, Toast.LENGTH_SHORT)
+ .show();
+ }
+ } else {
+ mPipEnabled = false;
+ mPipChannel = null;
+ // Recover the stream volume of the main TV view, if needed.
+ if (mPipSound == TvSettings.PIP_SOUND_PIP_WINDOW) {
+ setVolumeByAudioFocusStatus(mTvView);
+ mPipSound = TvSettings.PIP_SOUND_MAIN;
+ mTvOptionsManager.onPipSoundChanged(mPipSound);
+ }
+ stopPip();
+ mTvViewUiManager.restoreDisplayMode(false);
+ mTvOptionsManager.onPipChanged(mPipEnabled);
+ }
+ }
+
private boolean isChannelChangeKeyDownReceived() {
return mHandler.hasMessages(MSG_CHANNEL_UP_PRESSED)
|| mHandler.hasMessages(MSG_CHANNEL_DOWN_PRESSED);
@@ -2590,6 +2811,10 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
if (SystemProperties.LOG_KEYEVENT.getValue()) {
Log.d(TAG, "dispatchKeyEventToSession(" + event + ")");
}
+ if (mPipEnabled && mChannelTuner.isCurrentChannelPassthrough()) {
+ // If PIP is enabled, key events will be used by UI.
+ return false;
+ }
boolean handled = false;
if (mTvView != null) {
handled = mTvView.dispatchKeyEvent(event);
@@ -2607,15 +2832,21 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
private boolean isKeyEventBlocked() {
- // If the current channel is a passthrough channel, we don't handle the key events in TV
- // activity. Instead, the key event will be handled by the passthrough TV input.
- return mChannelTuner.isCurrentChannelPassthrough();
+ // If the current channel is passthrough channel without a PIP view,
+ // we always don't handle the key events in TV activity. Instead, the key event will
+ // be handled by the passthrough TV input.
+ return mChannelTuner.isCurrentChannelPassthrough() && !mPipEnabled;
}
private void tuneToLastWatchedChannelForTunerInput() {
if (!mChannelTuner.isCurrentChannelPassthrough()) {
return;
}
+ if (mPipEnabled) {
+ if (!mPipChannel.isPassthrough()) {
+ enablePipView(false, true);
+ }
+ }
stopTv();
startTv(null);
}
@@ -2626,16 +2857,16 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mTvView.reset();
}
} else {
+ if (mPipEnabled && mPipInputManager.areInSamePipInput(channel, mPipChannel)) {
+ enablePipView(false, true);
+ }
if (!mTvView.isPlaying()) {
startTv(channel.getUri());
} else if (channel.equals(mTvView.getCurrentChannel())) {
updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_TUNE);
- } else if (channel == mChannelTuner.getCurrentChannel()) {
- // Channel banner is already updated in moveToAdjacentChannel
- tune(false);
} else if (mChannelTuner.moveToChannel(channel)) {
// Channel banner would be updated inside of tune.
- tune(true);
+ tune();
} else {
showSettingsFragment();
}
@@ -2657,11 +2888,90 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
}
+ public Channel getPipChannel() {
+ return mPipChannel;
+ }
+
+ /**
+ * Swap the main and the sub screens while in the PIP mode.
+ */
+ public void swapPip() {
+ if (!mPipEnabled || mTvView == null || mPipView == null) {
+ Log.e(TAG, "swapPip() - not in PIP");
+ mPipSwap = false;
+ return;
+ }
+
+ Channel channel = mTvView.getCurrentChannel();
+ boolean tvViewBlocked = mTvView.isScreenBlocked();
+ boolean pipViewBlocked = mPipView.isScreenBlocked();
+ if (channel == null || !mTvView.isPlaying()) {
+ // If the TV view is not currently playing or its current channel is null, swapping here
+ // basically means disabling the PIP mode and getting back to the full screen since
+ // there's no point of keeping a blank PIP screen at the bottom which is not tune-able.
+ enablePipView(false, true);
+ mOverlayManager.hideOverlays(TvOverlayManager.FLAG_HIDE_OVERLAYS_DEFAULT);
+ mPipSwap = false;
+ return;
+ }
+
+ // Reset the TV view and tune the PIP view to the previous channel of the TV view.
+ mTvView.reset();
+ mPipView.reset();
+ Channel oldPipChannel = mPipChannel;
+ tuneToChannelForPip(channel);
+ if (tvViewBlocked) {
+ mPipView.blockScreen();
+ } else {
+ mPipView.unblockScreen();
+ }
+
+ if (oldPipChannel != null) {
+ // Tune the TV view to the previous PIP channel.
+ tuneToChannel(oldPipChannel);
+ }
+ if (pipViewBlocked) {
+ mTvView.blockScreen();
+ } else {
+ mTvView.unblockScreen();
+ }
+ if (mPipSound == TvSettings.PIP_SOUND_MAIN) {
+ setVolumeByAudioFocusStatus(mTvView);
+ } else { // mPipSound == TvSettings.PIP_SOUND_PIP_WINDOW
+ setVolumeByAudioFocusStatus(mPipView);
+ }
+ mPipSwap = !mPipSwap;
+ mTvOptionsManager.onPipSwapChanged(mPipSwap);
+ }
+
+ /**
+ * Toggle where the sound is coming from when the user is watching the PIP.
+ */
+ public void togglePipSoundMode() {
+ if (!mPipEnabled || mTvView == null || mPipView == null) {
+ Log.e(TAG, "togglePipSoundMode() - not in PIP");
+ return;
+ }
+ if (mPipSound == TvSettings.PIP_SOUND_MAIN) {
+ setVolumeByAudioFocusStatus(mPipView);
+ mPipSound = TvSettings.PIP_SOUND_PIP_WINDOW;
+ } else { // mPipSound == TvSettings.PIP_SOUND_PIP_WINDOW
+ setVolumeByAudioFocusStatus(mTvView);
+ mPipSound = TvSettings.PIP_SOUND_MAIN;
+ }
+ restoreMainTvView();
+ mTvOptionsManager.onPipSoundChanged(mPipSound);
+ }
+
/**
* Set the main TV view which holds HDMI-CEC active source based on the sound mode
*/
private void restoreMainTvView() {
- mTvView.setMain();
+ if (mPipSound == TvSettings.PIP_SOUND_MAIN) {
+ mTvView.setMain();
+ } else { // mPipSound == TvSettings.PIP_SOUND_PIP_WINDOW
+ mPipView.setMain();
+ }
}
@Override
@@ -2671,8 +2981,9 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mAudioFocusStatus = AudioManager.AUDIOFOCUS_LOSS;
mAudioManager.abandonAudioFocus(this);
if (mMediaSession.isActive()) {
- setMediaSessionActiveAndPlaybackState(false);
+ mMediaSession.setActive(false);
}
+ stopPip();
mVisibleBehind = false;
if (!mOtherActivityLaunched && Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
// Workaround: in M, onStop is not called, even though it should be called after
@@ -2701,13 +3012,13 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
return mTvView.getSelectedTrack(type);
}
- private void selectTrack(int type, TvTrackInfo track, int trackIndex) {
+ private void selectTrack(int type, TvTrackInfo track) {
mTvView.selectTrack(type, track == null ? null : track.getId());
if (type == TvTrackInfo.TYPE_AUDIO) {
mTvOptionsManager.onMultiAudioChanged(track == null ? null :
Utils.getMultiAudioString(this, track, false));
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
- mTvOptionsManager.onClosedCaptionsChanged(track, trackIndex);
+ mTvOptionsManager.onClosedCaptionsChanged(track);
}
}
@@ -2852,7 +3163,6 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
if (mActivityStarted) {
initAnimations();
initSideFragments();
- initMenuItemViews();
}
}
}, LAZY_INITIALIZATION_DELAY);
@@ -2864,11 +3174,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
}
private void initSideFragments() {
- SideFragment.preloadItemViews(this);
- }
-
- private void initMenuItemViews() {
- mOverlayManager.getMenu().preloadItemViews();
+ SideFragment.preloadRecycledViews(this);
}
@Override
@@ -2901,6 +3207,10 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
sendMessageDelayed(Message.obtain(msg), getDelay(startTime));
mainActivity.moveToAdjacentChannel(true, true);
break;
+ case MSG_UPDATE_CHANNEL_BANNER_BY_INFO_UPDATE:
+ mainActivity.updateChannelBannerAndShowIfNeeded(
+ UPDATE_CHANNEL_BANNER_REASON_UPDATE_INFO);
+ break;
}
}
@@ -2915,12 +3225,14 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private class MyOnTuneListener implements OnTuneListener {
boolean mUnlockAllowedRatingBeforeShrunken = true;
boolean mWasUnderShrunkenTvView;
+ long mStreamInfoUpdateTimeThresholdMs;
Channel mChannel;
public MyOnTuneListener() { }
private void onTune(Channel channel, boolean wasUnderShrukenTvView) {
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log("MainActivity.MyOnTuneListener.onTune");
+ mStreamInfoUpdateTimeThresholdMs =
+ System.currentTimeMillis() + FIRST_STREAM_INFO_UPDATE_DELAY_MILLIS;
mChannel = channel;
mWasUnderShrunkenTvView = wasUnderShrukenTvView;
}
@@ -2946,9 +3258,20 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mTracker.sendChannelTuneTime(info.getCurrentChannel(),
mTuneDurationTimer.reset());
}
- if (info.isVideoOrAudioAvailable() && mChannel == getCurrentChannel()) {
- updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_UPDATE_STREAM_INFO);
+ // If updateChannelBanner() is called without delay, the stream info seems flickering
+ // when the channel is quickly changed.
+ if (!mHandler.hasMessages(MSG_UPDATE_CHANNEL_BANNER_BY_INFO_UPDATE)
+ && info.isVideoAvailable()) {
+ if (System.currentTimeMillis() > mStreamInfoUpdateTimeThresholdMs) {
+ updateChannelBannerAndShowIfNeeded(
+ UPDATE_CHANNEL_BANNER_REASON_UPDATE_INFO);
+ } else {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MSG_UPDATE_CHANNEL_BANNER_BY_INFO_UPDATE),
+ mStreamInfoUpdateTimeThresholdMs - System.currentTimeMillis());
+ }
}
+
applyDisplayRefreshRate(info.getVideoFrameRate());
mTvViewUiManager.updateTvView();
applyMultiAudio();
@@ -2985,9 +3308,6 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
@Override
public void onContentBlocked() {
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log(
- "MainActivity.MyOnTuneListener.onContentBlocked removes timer");
- Debug.removeTimer(Debug.TAG_START_UP_TIMER);
mTuneDurationTimer.reset();
TvContentRating rating = mTvView.getBlockedContentRating();
// When tuneTo was called while TV view was shrunken, if the channel id is the same
@@ -2999,10 +3319,8 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mUnlockAllowedRatingBeforeShrunken = isUnderShrunkenTvView();
mTvView.unblockContent(rating);
}
- if (!isChannelChangeKeyDownReceived()) {
- mChannelBannerView.setBlockingContentRating(rating);
- updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK);
- }
+ mChannelBannerView.setBlockingContentRating(rating);
+ updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK);
mTvViewUiManager.fadeInTvView();
}
@@ -3011,10 +3329,8 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
if (!isUnderShrunkenTvView()) {
mUnlockAllowedRatingBeforeShrunken = false;
}
- if (!isChannelChangeKeyDownReceived()) {
- mChannelBannerView.setBlockingContentRating(null);
- updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK);
- }
+ mChannelBannerView.setBlockingContentRating(null);
+ updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK);
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/SetupPassthroughActivity.java b/src/com/android/tv/SetupPassthroughActivity.java
index 6459693b..8a263a26 100644
--- a/src/com/android/tv/SetupPassthroughActivity.java
+++ b/src/com/android/tv/SetupPassthroughActivity.java
@@ -44,72 +44,64 @@ public class SetupPassthroughActivity extends Activity {
private TvInputInfo mTvInputInfo;
private Intent mActivityAfterCompletion;
- private boolean mEpgFetcherDuringScan;
@Override
public void onCreate(Bundle savedInstanceState) {
- if (DEBUG) Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
+ Intent intent = getIntent();
+ SoftPreconditions.checkState(
+ intent.getAction().equals(TvCommonConstants.INTENT_ACTION_INPUT_SETUP));
ApplicationSingletons appSingletons = TvApplication.getSingletons(this);
TvInputManagerHelper inputManager = appSingletons.getTvInputManagerHelper();
- Intent intent = getIntent();
String inputId = intent.getStringExtra(TvCommonConstants.EXTRA_INPUT_ID);
mTvInputInfo = inputManager.getTvInputInfo(inputId);
+ if (DEBUG) Log.d(TAG, "TvInputId " + inputId + " / TvInputInfo " + mTvInputInfo);
+ if (mTvInputInfo == null) {
+ Log.w(TAG, "There is no input with the ID " + inputId + ".");
+ finish();
+ return;
+ }
+ Intent setupIntent = intent.getExtras().getParcelable(TvCommonConstants.EXTRA_SETUP_INTENT);
+ if (DEBUG) Log.d(TAG, "Setup activity launch intent: " + setupIntent);
+ if (setupIntent == null) {
+ Log.w(TAG, "The input (" + mTvInputInfo.getId() + ") doesn't have setup.");
+ finish();
+ return;
+ }
+ SetupUtils.grantEpgPermission(this, mTvInputInfo.getServiceInfo().packageName);
mActivityAfterCompletion = intent.getParcelableExtra(
TvCommonConstants.EXTRA_ACTIVITY_AFTER_COMPLETION);
- boolean needToFetchEpg = Utils.isInternalTvInput(this, mTvInputInfo.getId())
- && Experiments.CLOUD_EPG.get();
- if (needToFetchEpg) {
- // In case when the activity is restored, this flag should be restored as well.
- mEpgFetcherDuringScan = true;
+ if (DEBUG) Log.d(TAG, "Activity after completion " + mActivityAfterCompletion);
+ // If EXTRA_SETUP_INTENT is not removed, an infinite recursion happens during
+ // setupIntent.putExtras(intent.getExtras()).
+ Bundle extras = intent.getExtras();
+ extras.remove(TvCommonConstants.EXTRA_SETUP_INTENT);
+ setupIntent.putExtras(extras);
+ try {
+ startActivityForResult(setupIntent, REQUEST_START_SETUP_ACTIVITY);
+ } catch (ActivityNotFoundException e) {
+ Log.e(TAG, "Can't find activity: " + setupIntent.getComponent());
+ finish();
+ return;
}
- if (savedInstanceState == null) {
- SoftPreconditions.checkState(
- intent.getAction().equals(TvCommonConstants.INTENT_ACTION_INPUT_SETUP));
- if (DEBUG) Log.d(TAG, "TvInputId " + inputId + " / TvInputInfo " + mTvInputInfo);
- if (mTvInputInfo == null) {
- Log.w(TAG, "There is no input with the ID " + inputId + ".");
- finish();
- return;
- }
- Intent setupIntent =
- intent.getExtras().getParcelable(TvCommonConstants.EXTRA_SETUP_INTENT);
- if (DEBUG) Log.d(TAG, "Setup activity launch intent: " + setupIntent);
- if (setupIntent == null) {
- Log.w(TAG, "The input (" + mTvInputInfo.getId() + ") doesn't have setup.");
- finish();
- return;
- }
- SetupUtils.grantEpgPermission(this, mTvInputInfo.getServiceInfo().packageName);
- if (DEBUG) Log.d(TAG, "Activity after completion " + mActivityAfterCompletion);
- // If EXTRA_SETUP_INTENT is not removed, an infinite recursion happens during
- // setupIntent.putExtras(intent.getExtras()).
- Bundle extras = intent.getExtras();
- extras.remove(TvCommonConstants.EXTRA_SETUP_INTENT);
- setupIntent.putExtras(extras);
- try {
- startActivityForResult(setupIntent, REQUEST_START_SETUP_ACTIVITY);
- } catch (ActivityNotFoundException e) {
- Log.e(TAG, "Can't find activity: " + setupIntent.getComponent());
- finish();
- return;
- }
- if (needToFetchEpg) {
- EpgFetcher.getInstance(this).onChannelScanStarted();
- }
+ if (Utils.isInternalTvInput(this, mTvInputInfo.getId()) && Experiments.CLOUD_EPG.get()) {
+ EpgFetcher.getInstance(this).stop();
}
}
@Override
+ protected void onDestroy() {
+ if (mTvInputInfo != null && Utils.isInternalTvInput(this, mTvInputInfo.getId())
+ && Experiments.CLOUD_EPG.get()) {
+ EpgFetcher.getInstance(this).start();
+ }
+ super.onDestroy();
+ }
+
+ @Override
public void onActivityResult(int requestCode, final int resultCode, final Intent data) {
- if (DEBUG) Log.d(TAG, "onActivityResult");
boolean setupComplete = requestCode == REQUEST_START_SETUP_ACTIVITY
&& resultCode == Activity.RESULT_OK;
- // Tells EpgFetcher that channel source setup is finished.
- if (mEpgFetcherDuringScan) {
- EpgFetcher.getInstance(this).onChannelScanFinished();
- mEpgFetcherDuringScan = false;
- }
if (!setupComplete) {
setResult(resultCode, data);
finish();
@@ -130,4 +122,4 @@ public class SetupPassthroughActivity extends Activity {
}
});
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/TimeShiftManager.java b/src/com/android/tv/TimeShiftManager.java
index e1024705..2d6d45c4 100644
--- a/src/com/android/tv/TimeShiftManager.java
+++ b/src/com/android/tv/TimeShiftManager.java
@@ -887,11 +887,10 @@ public class TimeShiftManager {
}
long fetchStartTimeMs = Utils.floorTime(startTimeMs, MAX_DUMMY_PROGRAM_DURATION);
- long fetchEndTimeMs = Utils.ceilTime(endTimeMs + PREFETCH_DURATION_FOR_NEXT,
- MAX_DUMMY_PROGRAM_DURATION);
- boolean needToLoad = addDummyPrograms(fetchStartTimeMs, fetchEndTimeMs);
+ boolean needToLoad = addDummyPrograms(fetchStartTimeMs,
+ endTimeMs + PREFETCH_DURATION_FOR_NEXT);
if (needToLoad) {
- Range<Long> period = Range.create(fetchStartTimeMs, fetchEndTimeMs);
+ Range<Long> period = Range.create(fetchStartTimeMs, endTimeMs);
mProgramLoadQueue.add(period);
startTaskIfNeeded();
}
@@ -1013,7 +1012,7 @@ public class TimeShiftManager {
for (int i = 0, j = 0; i < mPrograms.size() && j < loadedPrograms.size(); ++j) {
Program loadedProgram = loadedPrograms.get(j);
// Skip previous programs.
- while (program.getEndTimeUtcMillis() <= loadedProgram.getStartTimeUtcMillis()) {
+ while (program.getEndTimeUtcMillis() < loadedProgram.getStartTimeUtcMillis()) {
// Reached end of mPrograms.
if (++i == mPrograms.size()) {
return;
diff --git a/src/com/android/tv/TvApplication.java b/src/com/android/tv/TvApplication.java
index 159df7b6..0e18a259 100644
--- a/src/com/android/tv/TvApplication.java
+++ b/src/com/android/tv/TvApplication.java
@@ -37,7 +37,6 @@ import android.util.Log;
import android.view.KeyEvent;
import com.android.tv.analytics.Analytics;
-import com.android.tv.util.Debug;
import com.android.tv.analytics.StubAnalytics;
import com.android.tv.analytics.StubAnalytics;
import com.android.tv.analytics.Tracker;
@@ -54,10 +53,10 @@ import com.android.tv.data.ProgramDataManager;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrDataManagerImpl;
import com.android.tv.dvr.DvrManager;
+import com.android.tv.dvr.DvrRecordingService;
import com.android.tv.dvr.DvrScheduleManager;
import com.android.tv.dvr.DvrStorageStatusManager;
import com.android.tv.dvr.DvrWatchedPositionManager;
-import com.android.tv.dvr.recorder.DvrRecordingService;
import com.android.tv.tuner.TunerPreferences;
import com.android.tv.tuner.tvinput.TunerTvInputService;
import com.android.tv.tuner.util.TunerInputInfoUtils;
@@ -107,8 +106,6 @@ public class TvApplication extends Application implements ApplicationSingletons
@Override
public void onCreate() {
- Debug.getTimer(Debug.TAG_START_UP_TIMER).start();
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log("TvApplication.onCreate start");
super.onCreate();
SharedPreferencesUtils.initialize(this, new Runnable() {
@Override
@@ -152,13 +149,13 @@ public class TvApplication extends Application implements ApplicationSingletons
mAnalytics = StubAnalytics.getInstance(this);
}
mTracker = mAnalytics.getDefaultTracker();
- getTvInputManagerHelper();
+ mTvInputManagerHelper = new TvInputManagerHelper(this);
+ mTvInputManagerHelper.start();
// In SetupFragment, transitions are set in the constructor. Because the fragment can be
// created in Activity.onCreate() by the framework, SetupAnimationHelper should be
// initialized here before Activity.onCreate() is called.
SetupAnimationHelper.initialize(this);
Log.i(TAG, "Started Live TV " + mVersionName);
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log("TvApplication.onCreate end");
}
private void setCurrentRunningProcess(boolean isMainProcess) {
@@ -170,10 +167,8 @@ public class TvApplication extends Application implements ApplicationSingletons
if (CommonFeatures.DVR.isEnabled(this)) {
mDvrStorageStatusManager = new DvrStorageStatusManager(this, mRunningInMainProcess);
}
- // Fetch remote config
- getSingletons(this).getRemoteConfig().fetch(null);
if (mRunningInMainProcess) {
- getTvInputManagerHelper().addCallback(new TvInputCallback() {
+ mTvInputManagerHelper.addCallback(new TvInputCallback() {
@Override
public void onInputAdded(String inputId) {
if (Features.TUNER.isEnabled(TvApplication.this) && TextUtils.equals(inputId,
@@ -273,7 +268,7 @@ public class TvApplication extends Application implements ApplicationSingletons
@Override
public ChannelDataManager getChannelDataManager() {
if (mChannelDataManager == null) {
- mChannelDataManager = new ChannelDataManager(this, getTvInputManagerHelper());
+ mChannelDataManager = new ChannelDataManager(this, mTvInputManagerHelper);
mChannelDataManager.start();
}
return mChannelDataManager;
@@ -319,10 +314,6 @@ public class TvApplication extends Application implements ApplicationSingletons
*/
@Override
public TvInputManagerHelper getTvInputManagerHelper() {
- if (mTvInputManagerHelper == null) {
- mTvInputManagerHelper = new TvInputManagerHelper(this);
- mTvInputManagerHelper.start();
- }
return mTvInputManagerHelper;
}
diff --git a/src/com/android/tv/TvOptionsManager.java b/src/com/android/tv/TvOptionsManager.java
index 493e039c..7871cbe7 100644
--- a/src/com/android/tv/TvOptionsManager.java
+++ b/src/com/android/tv/TvOptionsManager.java
@@ -18,13 +18,14 @@ package com.android.tv;
import android.content.Context;
import android.media.tv.TvTrackInfo;
-import android.support.annotation.IntDef;
import android.util.SparseArray;
import com.android.tv.data.DisplayMode;
+import com.android.tv.util.TvSettings;
+import com.android.tv.util.TvSettings.PipLayout;
+import com.android.tv.util.TvSettings.PipSize;
+import com.android.tv.util.TvSettings.PipSound;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.util.Locale;
/**
@@ -32,34 +33,39 @@ import java.util.Locale;
* captions and display mode. Can be also used to create MenuAction items to control such options.
*/
public class TvOptionsManager {
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({OPTION_CLOSED_CAPTIONS, OPTION_DISPLAY_MODE, OPTION_SYSTEMWIDE_PIP, OPTION_MULTI_AUDIO,
- OPTION_MORE_CHANNELS, OPTION_DEVELOPER, OPTION_SETTINGS})
- public @interface OptionType {}
public static final int OPTION_CLOSED_CAPTIONS = 0;
public static final int OPTION_DISPLAY_MODE = 1;
- public static final int OPTION_SYSTEMWIDE_PIP = 2;
- public static final int OPTION_MULTI_AUDIO = 3;
- public static final int OPTION_MORE_CHANNELS = 4;
- public static final int OPTION_DEVELOPER = 5;
- public static final int OPTION_SETTINGS = 6;
+ public static final int OPTION_IN_APP_PIP = 2;
+ public static final int OPTION_SYSTEMWIDE_PIP = 3;
+ public static final int OPTION_MULTI_AUDIO = 4;
+ public static final int OPTION_MORE_CHANNELS = 5;
+ public static final int OPTION_DEVELOPER = 6;
+ public static final int OPTION_SETTINGS = 7;
+
+ public static final int OPTION_PIP_INPUT = 100;
+ public static final int OPTION_PIP_SWAP = 101;
+ public static final int OPTION_PIP_SOUND = 102;
+ public static final int OPTION_PIP_LAYOUT = 103 ;
+ public static final int OPTION_PIP_SIZE = 104;
private final Context mContext;
private final SparseArray<OptionChangedListener> mOptionChangedListeners = new SparseArray<>();
private String mClosedCaptionsLanguage;
private int mDisplayMode;
+ private boolean mPip;
private String mMultiAudio;
+ private String mPipInput;
+ private boolean mPipSwap;
+ @PipSound private int mPipSound;
+ @PipLayout private int mPipLayout;
+ @PipSize private int mPipSize;
public TvOptionsManager(Context context) {
mContext = context;
}
- /**
- * Returns a suitable displayed string for the given option type under current settings.
- * @param option the type of option, should be one of {@link OptionType}.
- */
- public String getOptionString(@OptionType int option) {
+ public String getOptionString(int option) {
switch (option) {
case OPTION_CLOSED_CAPTIONS:
if (mClosedCaptionsLanguage == null) {
@@ -71,48 +77,101 @@ public class TvOptionsManager {
.isDisplayModeAvailable(mDisplayMode)
? DisplayMode.getLabel(mDisplayMode, mContext)
: DisplayMode.getLabel(DisplayMode.MODE_NORMAL, mContext);
+ case OPTION_IN_APP_PIP:
+ return mContext.getString(
+ mPip ? R.string.options_item_pip_on : R.string.options_item_pip_off);
case OPTION_MULTI_AUDIO:
return mMultiAudio;
+ case OPTION_PIP_INPUT:
+ return mPipInput;
+ case OPTION_PIP_SWAP:
+ return mContext.getString(mPipSwap ? R.string.pip_options_item_swap_on
+ : R.string.pip_options_item_swap_off);
+ case OPTION_PIP_SOUND:
+ if (mPipSound == TvSettings.PIP_SOUND_MAIN) {
+ return mContext.getString(R.string.pip_options_item_sound_main);
+ } else if (mPipSound == TvSettings.PIP_SOUND_PIP_WINDOW) {
+ return mContext.getString(R.string.pip_options_item_sound_pip_window);
+ }
+ break;
+ case OPTION_PIP_LAYOUT:
+ if (mPipLayout == TvSettings.PIP_LAYOUT_BOTTOM_RIGHT) {
+ return mContext.getString(R.string.pip_options_item_layout_bottom_right);
+ } else if (mPipLayout == TvSettings.PIP_LAYOUT_TOP_RIGHT) {
+ return mContext.getString(R.string.pip_options_item_layout_top_right);
+ } else if (mPipLayout == TvSettings.PIP_LAYOUT_TOP_LEFT) {
+ return mContext.getString(R.string.pip_options_item_layout_top_left);
+ } else if (mPipLayout == TvSettings.PIP_LAYOUT_BOTTOM_LEFT) {
+ return mContext.getString(R.string.pip_options_item_layout_bottom_left);
+ } else if (mPipLayout == TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) {
+ return mContext.getString(R.string.pip_options_item_layout_side_by_side);
+ }
+ break;
+ case OPTION_PIP_SIZE:
+ if (mPipSize == TvSettings.PIP_SIZE_BIG) {
+ return mContext.getString(R.string.pip_options_item_size_big);
+ } else if (mPipSize == TvSettings.PIP_SIZE_SMALL) {
+ return mContext.getString(R.string.pip_options_item_size_small);
+ }
+ break;
}
return "";
}
- /**
- * Handles changing selection of closed caption.
- */
- public void onClosedCaptionsChanged(TvTrackInfo track, int trackIndex) {
- mClosedCaptionsLanguage = (track == null) ?
- null : (track.getLanguage() != null) ? track.getLanguage()
- : mContext.getString(R.string.closed_caption_unknown_language, trackIndex + 1);
+ public void onClosedCaptionsChanged(TvTrackInfo track) {
+ mClosedCaptionsLanguage = (track == null) ? null
+ : (track.getLanguage() != null) ? track.getLanguage()
+ : mContext.getString(R.string.default_language);
notifyOptionChanged(OPTION_CLOSED_CAPTIONS);
}
- /**
- * Handles changing selection of display mode.
- */
public void onDisplayModeChanged(int displayMode) {
mDisplayMode = displayMode;
notifyOptionChanged(OPTION_DISPLAY_MODE);
}
- /**
- * Handles changing selection of multi-audio.
- */
+ public void onPipChanged(boolean pip) {
+ mPip = pip;
+ notifyOptionChanged(OPTION_IN_APP_PIP);
+ }
+
public void onMultiAudioChanged(String multiAudio) {
mMultiAudio = multiAudio;
notifyOptionChanged(OPTION_MULTI_AUDIO);
}
- private void notifyOptionChanged(@OptionType int option) {
+ public void onPipInputChanged(String pipInput) {
+ mPipInput = pipInput;
+ notifyOptionChanged(OPTION_PIP_INPUT);
+ }
+
+ public void onPipSwapChanged(boolean pipSwap) {
+ mPipSwap = pipSwap;
+ notifyOptionChanged(OPTION_PIP_SWAP);
+ }
+
+ public void onPipSoundChanged(@PipSound int pipSound) {
+ mPipSound = pipSound;
+ notifyOptionChanged(OPTION_PIP_SOUND);
+ }
+
+ public void onPipLayoutChanged(@PipLayout int pipLayout) {
+ mPipLayout = pipLayout;
+ notifyOptionChanged(OPTION_PIP_LAYOUT);
+ }
+
+ public void onPipSizeChanged(@PipSize int pipSize) {
+ mPipSize = pipSize;
+ notifyOptionChanged(OPTION_PIP_SIZE);
+ }
+
+ private void notifyOptionChanged(int option) {
OptionChangedListener listener = mOptionChangedListeners.get(option);
if (listener != null) {
- listener.onOptionChanged(option, getOptionString(option));
+ listener.onOptionChanged(getOptionString(option));
}
}
- /**
- * Sets listeners to changes of the given option type.
- */
public void setOptionChangedListener(int option, OptionChangedListener listener) {
mOptionChangedListeners.put(option, listener);
}
@@ -121,6 +180,6 @@ public class TvOptionsManager {
* An interface used to monitor option changes.
*/
public interface OptionChangedListener {
- void onOptionChanged(@OptionType int optionType, String newString);
+ void onOptionChanged(String newOption);
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/util/DurationTimer.java b/src/com/android/tv/analytics/DurationTimer.java
index b6221496..ad2d91f8 100644
--- a/src/com/android/tv/util/DurationTimer.java
+++ b/src/com/android/tv/analytics/DurationTimer.java
@@ -14,30 +14,17 @@
* limitations under the License.
*/
-package com.android.tv.util;
+package com.android.tv.analytics;
import android.os.SystemClock;
-import android.util.Log;
-
-import com.android.tv.common.BuildConfig;
/**
* Times a duration.
*/
public final class DurationTimer {
- private static final String TAG = "DurationTimer";
public static final long TIME_NOT_SET = -1;
private long startTimeMs = TIME_NOT_SET;
- private String mTag = TAG;
- private boolean mLogEngOnly;
-
- public DurationTimer() { }
-
- public DurationTimer(String tag, boolean logEngOnly) {
- mTag = tag;
- mLogEngOnly = logEngOnly;
- }
/**
* Returns true if the timer is running.
@@ -72,13 +59,4 @@ public final class DurationTimer {
startTimeMs = TIME_NOT_SET;
return duration;
}
-
- /**
- * Adds information and duration time to the log.
- */
- public void log(String message) {
- if (isRunning() && (!mLogEngOnly || BuildConfig.ENG)) {
- Log.i(mTag, message + " : " + getDuration() + "ms");
- }
- }
}
diff --git a/src/com/android/tv/data/Channel.java b/src/com/android/tv/data/Channel.java
index 4da56311..30f84236 100644
--- a/src/com/android/tv/data/Channel.java
+++ b/src/com/android/tv/data/Channel.java
@@ -52,16 +52,6 @@ public final class Channel {
public static final int LOAD_IMAGE_TYPE_APP_LINK_POSTER_ART = 3;
/**
- * Compares the channel numbers of channels which belong to the same input.
- */
- public static final Comparator<Channel> CHANNEL_NUMBER_COMPARATOR = new Comparator<Channel>() {
- @Override
- public int compare(Channel lhs, Channel rhs) {
- return ChannelNumber.compare(lhs.getDisplayNumber(), rhs.getDisplayNumber());
- }
- };
-
- /**
* When a TIS doesn't provide any information about app link, and it doesn't have a leanback
* launch intent, there will be no app link card for the TIS.
*/
@@ -97,15 +87,9 @@ public final class Channel {
TvContract.Channels.COLUMN_APP_LINK_ICON_URI,
TvContract.Channels.COLUMN_APP_LINK_POSTER_ART_URI,
TvContract.Channels.COLUMN_APP_LINK_INTENT_URI,
- TvContract.Channels.COLUMN_INTERNAL_PROVIDER_FLAG2, // Only used in bundled input
};
/**
- * Channel number delimiter between major and minor parts.
- */
- public static final char CHANNEL_NUMBER_DELIMITER = '-';
-
- /**
* Creates {@code Channel} object from cursor.
*
* <p>The query that created the cursor MUST use {@link #PROJECTION}
@@ -119,7 +103,7 @@ public final class Channel {
channel.mPackageName = Utils.intern(cursor.getString(index++));
channel.mInputId = Utils.intern(cursor.getString(index++));
channel.mType = Utils.intern(cursor.getString(index++));
- channel.mDisplayNumber = normalizeDisplayNumber(cursor.getString(index++));
+ channel.mDisplayNumber = cursor.getString(index++);
channel.mDisplayName = cursor.getString(index++);
channel.mDescription = cursor.getString(index++);
channel.mVideoFormat = Utils.intern(cursor.getString(index++));
@@ -130,29 +114,17 @@ public final class Channel {
channel.mAppLinkIconUri = cursor.getString(index++);
channel.mAppLinkPosterArtUri = cursor.getString(index++);
channel.mAppLinkIntentUri = cursor.getString(index++);
- if (Utils.isBundledInput(channel.mInputId)) {
- channel.mRecordingProhibited = cursor.getInt(index++) != 0;
- }
return channel;
}
/**
- * Replaces the channel number separator with dash('-').
+ * Creates a {@link Channel} object from the DVR database.
*/
- public static String normalizeDisplayNumber(String string) {
- if (!TextUtils.isEmpty(string)) {
- int length = string.length();
- for (int i = 0; i < length; i++) {
- char c = string.charAt(i);
- if (c == '.' || Character.isWhitespace(c)
- || Character.getType(c) == Character.DASH_PUNCTUATION) {
- StringBuilder sb = new StringBuilder(string);
- sb.setCharAt(i, CHANNEL_NUMBER_DELIMITER);
- return sb.toString();
- }
- }
- }
- return string;
+ public static Channel fromDvrCursor(Cursor c) {
+ Channel channel = new Channel();
+ int index = -1;
+ channel.mDvrId = c.getLong(++index);
+ return channel;
}
/** ID of this channel. Matches to BaseColumns._ID. */
@@ -175,10 +147,8 @@ public final class Channel {
private String mAppLinkIntentUri;
private Intent mAppLinkIntent;
private int mAppLinkType;
- private String mLogoUri;
- private boolean mRecordingProhibited;
- private boolean mChannelLogoExist;
+ private long mDvrId;
private Channel() {
// Do nothing.
@@ -260,14 +230,10 @@ public final class Channel {
}
/**
- * Returns channel logo uri which is got from cloud, it's used only for ChannelLogoFetcher.
+ * Returns an ID in DVR database.
*/
- public String getLogoUri() {
- return mLogoUri;
- }
-
- public boolean isRecordingProhibited() {
- return mRecordingProhibited;
+ public long getDvrId() {
+ return mDvrId;
}
/**
@@ -313,13 +279,6 @@ public final class Channel {
}
/**
- * Sets channel logo uri which is got from cloud.
- */
- public void setLogoUri(String logoUri) {
- mLogoUri = logoUri;
- }
-
- /**
* Check whether {@code other} has same read-only channel info as this. But, it cannot check two
* channels have same logos. It also excludes browsable and locked, because two fields are
* changed by TV app.
@@ -339,8 +298,7 @@ public final class Channel {
&& mAppLinkColor == other.mAppLinkColor
&& Objects.equals(mAppLinkIconUri, other.mAppLinkIconUri)
&& Objects.equals(mAppLinkPosterArtUri, other.mAppLinkPosterArtUri)
- && Objects.equals(mAppLinkIntentUri, other.mAppLinkIntentUri)
- && Objects.equals(mRecordingProhibited, other.mRecordingProhibited);
+ && Objects.equals(mAppLinkIntentUri, other.mAppLinkIntentUri);
}
@Override
@@ -357,8 +315,7 @@ public final class Channel {
+ ", isPassthrough=" + mIsPassthrough
+ ", browsable=" + mBrowsable
+ ", locked=" + mLocked
- + ", appLinkText=" + mAppLinkText
- + ", recordingProhibited=" + mRecordingProhibited + "}";
+ + ", appLinkText=" + mAppLinkText + "}";
}
void copyFrom(Channel other) {
@@ -383,8 +340,6 @@ public final class Channel {
mAppLinkIntentUri = other.mAppLinkIntentUri;
mAppLinkIntent = other.mAppLinkIntent;
mAppLinkType = other.mAppLinkType;
- mRecordingProhibited = other.mRecordingProhibited;
- mChannelLogoExist = other.mChannelLogoExist;
}
/**
@@ -434,6 +389,8 @@ public final class Channel {
mChannel.mDisplayName = "name";
mChannel.mDescription = "description";
mChannel.mBrowsable = true;
+ mChannel.mLocked = false;
+ mChannel.mIsPassthrough = false;
}
public Builder(Channel other) {
@@ -465,7 +422,7 @@ public final class Channel {
@VisibleForTesting
public Builder setDisplayNumber(String displayNumber) {
- mChannel.mDisplayNumber = normalizeDisplayNumber(displayNumber);
+ mChannel.mDisplayNumber = displayNumber;
return this;
}
@@ -528,11 +485,6 @@ public final class Channel {
return this;
}
- public Builder setRecordingProhibited(boolean recordingProhibited) {
- mChannel.mRecordingProhibited = recordingProhibited;
- return this;
- }
-
public Channel build() {
Channel channel = new Channel();
channel.copyFrom(mChannel);
@@ -572,21 +524,6 @@ public final class Channel {
}
/**
- * Sets if the channel logo exists. This method should be only called from
- * {@link ChannelDataManager}.
- */
- void setChannelLogoExist(boolean exist) {
- mChannelLogoExist = exist;
- }
-
- /**
- * Returns if channel logo exists.
- */
- public boolean channelLogoExists() {
- return mChannelLogoExist;
- }
-
- /**
* Returns the type of app link for this channel.
* It returns {@link #APP_LINK_TYPE_CHANNEL} if the channel has a non null app link text and
* a valid app link intent, it returns {@link #APP_LINK_TYPE_APP} if the input service which
@@ -718,4 +655,4 @@ public final class Channel {
return label;
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/data/ChannelDataManager.java b/src/com/android/tv/data/ChannelDataManager.java
index eb3871fc..6f9ea6d7 100644
--- a/src/com/android/tv/data/ChannelDataManager.java
+++ b/src/com/android/tv/data/ChannelDataManager.java
@@ -21,14 +21,10 @@ import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
-import android.content.res.AssetFileDescriptor;
import android.database.ContentObserver;
-import android.database.sqlite.SQLiteException;
import android.media.tv.TvContract;
import android.media.tv.TvContract.Channels;
import android.media.tv.TvInputManager.TvInputCallback;
-import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -47,8 +43,6 @@ import com.android.tv.util.PermissionUtils;
import com.android.tv.util.TvInputManagerHelper;
import com.android.tv.util.Utils;
-import java.io.FileNotFoundException;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -198,6 +192,7 @@ public class ChannelDataManager {
mStarted = false;
mDbLoadFinished = false;
+ ChannelLogoFetcher.stopFetchingChannelLogos();
mInputManager.removeCallback(mTvInputCallback);
mContentResolver.unregisterContentObserver(mChannelObserver);
mHandler.removeCallbacksAndMessages(null);
@@ -595,36 +590,6 @@ public class ChannelDataManager {
}
}
- private class checkChannelLogoExistTask extends AsyncTask<Void, Void, Boolean> {
- private final Channel mChannel;
-
- public checkChannelLogoExistTask(Channel channel) {
- mChannel = channel;
- }
-
- @Override
- protected Boolean doInBackground(Void... params) {
- boolean result = false;
- try {
- AssetFileDescriptor f = mContext.getContentResolver().openAssetFileDescriptor(
- TvContract.buildChannelLogoUri(mChannel.getId()), "r");
- result = true;
- f.close();
- } catch (SQLiteException | IOException | NullPointerException e) {
- // File not found or asset file not found.
- }
- return result;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- ChannelWrapper wrapper = mChannelWrapperMap.get(mChannel.getId());
- if (wrapper != null) {
- wrapper.mChannel.setChannelLogoExist(result);
- }
- }
- }
-
private final class QueryAllChannelsTask extends AsyncDbTask.AsyncChannelQueryTask {
public QueryAllChannelsTask(ContentResolver contentResolver) {
@@ -660,8 +625,6 @@ public class ChannelDataManager {
boolean newlyAdded = !removedChannelIds.remove(channelId);
ChannelWrapper channelWrapper;
if (newlyAdded) {
- new checkChannelLogoExistTask(channel)
- .executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
channelWrapper = new ChannelWrapper(channel);
mChannelWrapperMap.put(channel.getId(), channelWrapper);
if (!channelWrapper.mInputRemoved) {
@@ -677,9 +640,9 @@ public class ChannelDataManager {
// {@link #applyUpdatedValuesToDb} is called. Therefore, the value
// between DB and ChannelDataManager could be different for a while.
// Therefore, we'll keep the values in ChannelDataManager.
+ channelWrapper.mChannel.copyFrom(channel);
channel.setBrowsable(oldChannel.isBrowsable());
channel.setLocked(oldChannel.isLocked());
- channelWrapper.mChannel.copyFrom(channel);
if (!channelWrapper.mInputRemoved) {
channelUpdated = true;
updatedChannelWrappers.add(channelWrapper);
@@ -730,6 +693,7 @@ public class ChannelDataManager {
r.run();
}
mPostRunnablesAfterChannelUpdate.clear();
+ ChannelLogoFetcher.startFetchingChannelLogos(mContext);
}
}
diff --git a/src/com/android/tv/data/ChannelLogoFetcher.java b/src/com/android/tv/data/ChannelLogoFetcher.java
index 256ecdb2..5a549f83 100644
--- a/src/com/android/tv/data/ChannelLogoFetcher.java
+++ b/src/com/android/tv/data/ChannelLogoFetcher.java
@@ -16,68 +16,155 @@
package com.android.tv.data;
-import android.content.ContentProviderOperation;
import android.content.Context;
-import android.content.OperationApplicationException;
-import android.content.SharedPreferences;
+import android.database.Cursor;
import android.graphics.Bitmap.CompressFormat;
import android.media.tv.TvContract;
+import android.media.tv.TvContract.Channels;
import android.net.Uri;
import android.os.AsyncTask;
-import android.os.RemoteException;
-import android.support.annotation.AnyThread;
+import android.support.annotation.WorkerThread;
import android.text.TextUtils;
import android.util.Log;
-import com.android.tv.common.SharedPreferencesUtils;
+import com.android.tv.util.AsyncDbTask;
import com.android.tv.util.BitmapUtils;
import com.android.tv.util.BitmapUtils.ScaledBitmapInfo;
import com.android.tv.util.PermissionUtils;
+import java.io.BufferedReader;
import java.io.IOException;
+import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
-import java.util.Map;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
/**
- * Fetches channel logos from the cloud into the database. It's for the channels which have no logos
- * or need update logos. This class is thread safe.
+ * Utility class for TMS data.
+ * This class is thread safe.
*/
public class ChannelLogoFetcher {
private static final String TAG = "ChannelLogoFetcher";
private static final boolean DEBUG = false;
- private static final String PREF_KEY_IS_FIRST_TIME_FETCH_CHANNEL_LOGO =
- "is_first_time_fetch_channel_logo";
+ /**
+ * The name of the file which contains the TMS data.
+ * The file has multiple records and each of them is a string separated by '|' like
+ * STATION_NAME|SHORT_NAME|CALL_SIGN|LOGO_URI.
+ */
+ private static final String TMS_US_TABLE_FILE = "tms_us.table";
+ private static final String TMS_KR_TABLE_FILE = "tms_kr.table";
+ private static final String FIELD_SEPARATOR = "\\|";
+ private static final String NAME_SEPARATOR_FOR_TMS = "\\(|\\)|\\{|\\}|\\[|\\]";
+ private static final String NAME_SEPARATOR_FOR_DB = "\\W";
+ private static final int INDEX_NAME = 0;
+ private static final int INDEX_SHORT_NAME = 1;
+ private static final int INDEX_CALL_SIGN = 2;
+ private static final int INDEX_LOGO_URI = 3;
+
+ private static final String COLUMN_CHANNEL_LOGO = "logo";
+ private static final Object sLock = new Object();
+ private static final Set<Long> sChannelIdBlackListSet = new HashSet<>();
+ private static LoadChannelTask sQueryTask;
private static FetchLogoTask sFetchTask;
/**
- * Fetches the channel logos from the cloud data and insert them into TvProvider.
+ * Fetch the channel logos from TMS data and insert them into TvProvider.
* The previous task is canceled and a new task starts.
*/
- @AnyThread
- public static synchronized void startFetchingChannelLogos(
- Context context, List<Channel> channels) {
+ public static void startFetchingChannelLogos(Context context) {
if (!PermissionUtils.hasAccessAllEpg(context)) {
// TODO: support this feature for non-system LC app. b/23939816
return;
}
- if (sFetchTask != null) {
- sFetchTask.cancel(true);
+ synchronized (sLock) {
+ stopFetchingChannelLogos();
+ if (DEBUG) Log.d(TAG, "Request to start fetching logos.");
+ sQueryTask = new LoadChannelTask(context);
+ sQueryTask.executeOnDbThread();
}
- if (DEBUG) Log.d(TAG, "Request to start fetching logos.");
- if (channels == null || channels.isEmpty()) {
- return;
+ }
+
+ /**
+ * Stops the current fetching tasks. This can be called when the Activity pauses.
+ */
+ public static void stopFetchingChannelLogos() {
+ synchronized (sLock) {
+ if (DEBUG) Log.d(TAG, "Request to stop fetching logos.");
+ if (sQueryTask != null) {
+ sQueryTask.cancel(true);
+ sQueryTask = null;
+ }
+ if (sFetchTask != null) {
+ sFetchTask.cancel(true);
+ sFetchTask = null;
+ }
}
- sFetchTask = new FetchLogoTask(context, channels);
- sFetchTask.execute();
}
private ChannelLogoFetcher() {
}
+ private static final class LoadChannelTask extends AsyncDbTask<Void, Void, List<Channel>> {
+ private final Context mContext;
+
+ public LoadChannelTask(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ protected List<Channel> doInBackground(Void... arg) {
+ // Load channels which doesn't have channel logos.
+ if (DEBUG) Log.d(TAG, "Starts loading the channels from DB");
+ String[] projection =
+ new String[] { Channels._ID, Channels.COLUMN_DISPLAY_NAME };
+ String selection = COLUMN_CHANNEL_LOGO + " IS NULL AND "
+ + Channels.COLUMN_PACKAGE_NAME + "=?";
+ String[] selectionArgs = new String[] { mContext.getPackageName() };
+ try (Cursor c = mContext.getContentResolver().query(Channels.CONTENT_URI,
+ projection, selection, selectionArgs, null)) {
+ if (c == null) {
+ Log.e(TAG, "Query returns null cursor", new RuntimeException());
+ return null;
+ }
+ List<Channel> channels = new ArrayList<>();
+ while (!isCancelled() && c.moveToNext()) {
+ long channelId = c.getLong(0);
+ if (sChannelIdBlackListSet.contains(channelId)) {
+ continue;
+ }
+ channels.add(new Channel.Builder().setId(c.getLong(0))
+ .setDisplayName(c.getString(1).toUpperCase(Locale.getDefault()))
+ .build());
+ }
+ return channels;
+ }
+ }
+
+ @Override
+ protected void onPostExecute(List<Channel> channels) {
+ synchronized (sLock) {
+ if (DEBUG) {
+ int count = channels == null ? 0 : channels.size();
+ Log.d(TAG, count + " channels are loaded");
+ }
+ if (sQueryTask == this) {
+ sQueryTask = null;
+ if (channels != null && !channels.isEmpty()) {
+ sFetchTask = new FetchLogoTask(mContext, channels);
+ sFetchTask.execute();
+ }
+ }
+ }
+ }
+ }
+
private static final class FetchLogoTask extends AsyncTask<Void, Void, Void> {
private final Context mContext;
private final List<Channel> mChannels;
@@ -93,53 +180,83 @@ public class ChannelLogoFetcher {
if (DEBUG) Log.d(TAG, "Fetching the channel logos has been canceled");
return null;
}
- List<Channel> channelsToUpdate = new ArrayList<>();
- List<Channel> channelsToRemove = new ArrayList<>();
- // Updates or removes the logo by comparing the logo uri which is got from the cloud
- // and the stored one. And we assume that the data got form the cloud is 100%
- // correct and completed.
- SharedPreferences sharedPreferences =
- mContext.getSharedPreferences(
- SharedPreferencesUtils.SHARED_PREF_CHANNEL_LOGO_URIS,
- Context.MODE_PRIVATE);
- SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit();
- Map<String, ?> uncheckedChannels = sharedPreferences.getAll();
- boolean isFirstTimeFetchChannelLogo = sharedPreferences.getBoolean(
- PREF_KEY_IS_FIRST_TIME_FETCH_CHANNEL_LOGO, true);
- // Iterating channels.
- for (Channel channel : mChannels) {
- String channelIdString = Long.toString(channel.getId());
- String storedChannelLogoUri = (String) uncheckedChannels.remove(channelIdString);
- if (!TextUtils.isEmpty(channel.getLogoUri())
- && !TextUtils.equals(storedChannelLogoUri, channel.getLogoUri())) {
- channelsToUpdate.add(channel);
- sharedPreferencesEditor.putString(channelIdString, channel.getLogoUri());
- } else if (TextUtils.isEmpty(channel.getLogoUri())
- && (!TextUtils.isEmpty(storedChannelLogoUri)
- || isFirstTimeFetchChannelLogo)) {
- channelsToRemove.add(channel);
- sharedPreferencesEditor.remove(channelIdString);
+ // Load the TMS table data.
+ if (DEBUG) Log.d(TAG, "Loads TMS data");
+ Map<String, String> channelNameLogoUriMap = new HashMap<>();
+ try {
+ channelNameLogoUriMap.putAll(readTmsFile(mContext, TMS_US_TABLE_FILE));
+ if (isCancelled()) {
+ if (DEBUG) Log.d(TAG, "Fetching the channel logos has been canceled");
+ return null;
}
+ channelNameLogoUriMap.putAll(readTmsFile(mContext, TMS_KR_TABLE_FILE));
+ } catch (IOException e) {
+ Log.e(TAG, "Loading TMS data failed.", e);
+ return null;
}
-
- // Removes non existing channels from SharedPreferences.
- for (String channelId : uncheckedChannels.keySet()) {
- sharedPreferencesEditor.remove(channelId);
+ if (isCancelled()) {
+ if (DEBUG) Log.d(TAG, "Fetching the channel logos has been canceled");
+ return null;
}
- // Updates channel logos.
- for (Channel channel : channelsToUpdate) {
+ // Iterating channels.
+ for (Channel channel : mChannels) {
if (isCancelled()) {
if (DEBUG) Log.d(TAG, "Fetching the channel logos has been canceled");
return null;
}
- // Downloads the channel logo.
- String logoUri = channel.getLogoUri();
+ // Download the channel logo.
+ if (TextUtils.isEmpty(channel.getDisplayName())) {
+ if (DEBUG) {
+ Log.d(TAG, "The channel with ID (" + channel.getId()
+ + ") doesn't have the display name.");
+ }
+ sChannelIdBlackListSet.add(channel.getId());
+ continue;
+ }
+ String channelName = channel.getDisplayName().trim();
+ String logoUri = channelNameLogoUriMap.get(channelName);
+ if (TextUtils.isEmpty(logoUri)) {
+ if (DEBUG) {
+ Log.d(TAG, "Can't find a logo URI for channel '" + channelName + "'");
+ }
+ // Find the candidate names. If the channel name is CNN-HD, then find CNNHD
+ // and CNN. Or if the channel name is KQED+, then find KQED.
+ String[] splitNames = channelName.split(NAME_SEPARATOR_FOR_DB);
+ if (splitNames.length > 1) {
+ StringBuilder sb = new StringBuilder();
+ for (String splitName : splitNames) {
+ sb.append(splitName);
+ }
+ logoUri = channelNameLogoUriMap.get(sb.toString());
+ if (DEBUG) {
+ if (TextUtils.isEmpty(logoUri)) {
+ Log.d(TAG, "Can't find a logo URI for channel '" + sb.toString()
+ + "'");
+ }
+ }
+ }
+ if (TextUtils.isEmpty(logoUri)
+ && splitNames[0].length() != channelName.length()) {
+ logoUri = channelNameLogoUriMap.get(splitNames[0]);
+ if (DEBUG) {
+ if (TextUtils.isEmpty(logoUri)) {
+ Log.d(TAG, "Can't find a logo URI for channel '" + splitNames[0]
+ + "'");
+ }
+ }
+ }
+ }
+ if (TextUtils.isEmpty(logoUri)) {
+ sChannelIdBlackListSet.add(channel.getId());
+ continue;
+ }
ScaledBitmapInfo bitmapInfo = BitmapUtils.decodeSampledBitmapFromUriString(
mContext, logoUri, Integer.MAX_VALUE, Integer.MAX_VALUE);
if (bitmapInfo == null) {
Log.e(TAG, "Failed to load bitmap. {channelName=" + channel.getDisplayName()
+ ", " + "logoUri=" + logoUri + "}");
+ sChannelIdBlackListSet.add(channel.getId());
continue;
}
if (isCancelled()) {
@@ -147,15 +264,12 @@ public class ChannelLogoFetcher {
return null;
}
- // Inserts the logo to DB.
+ // Insert the logo to DB.
Uri dstLogoUri = TvContract.buildChannelLogoUri(channel.getId());
try (OutputStream os = mContext.getContentResolver().openOutputStream(dstLogoUri)) {
bitmapInfo.bitmap.compress(CompressFormat.PNG, 100, os);
} catch (IOException e) {
Log.e(TAG, "Failed to write " + logoUri + " to " + dstLogoUri, e);
- // Removes it from the shared preference for the failed channels to make it
- // retry next time.
- sharedPreferencesEditor.remove(Long.toString(channel.getId()));
continue;
}
if (DEBUG) {
@@ -163,30 +277,63 @@ public class ChannelLogoFetcher {
+ dstLogoUri + "}");
}
}
+ if (DEBUG) Log.d(TAG, "Fetching logos has been finished successfully.");
+ return null;
+ }
- // Removes the logos for the channels that have logos before but now
- // their logo uris are null.
- boolean deleteChannelLogoFailed = false;
- if (!channelsToRemove.isEmpty()) {
- ArrayList<ContentProviderOperation> ops = new ArrayList<>();
- for (Channel channel : channelsToRemove) {
- ops.add(ContentProviderOperation.newDelete(
- TvContract.buildChannelLogoUri(channel.getId())).build());
- }
- try {
- mContext.getContentResolver().applyBatch(TvContract.AUTHORITY, ops);
- } catch (RemoteException | OperationApplicationException e) {
- deleteChannelLogoFailed = true;
- Log.e(TAG, "Error deleting obsolete channels", e);
+ @WorkerThread
+ private Map<String, String> readTmsFile(Context context, String fileName)
+ throws IOException {
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(
+ context.getAssets().open(fileName)))) {
+ Map<String, String> channelNameLogoUriMap = new HashMap<>();
+ String line;
+ while ((line = reader.readLine()) != null && !isCancelled()) {
+ String[] data = line.split(FIELD_SEPARATOR);
+ if (data.length != INDEX_LOGO_URI + 1) {
+ if (DEBUG) Log.d(TAG, "Invalid or comment row: " + line);
+ continue;
+ }
+ addChannelNames(channelNameLogoUriMap,
+ data[INDEX_NAME].toUpperCase(Locale.getDefault()),
+ data[INDEX_LOGO_URI]);
+ addChannelNames(channelNameLogoUriMap,
+ data[INDEX_SHORT_NAME].toUpperCase(Locale.getDefault()),
+ data[INDEX_LOGO_URI]);
+ addChannelNames(channelNameLogoUriMap,
+ data[INDEX_CALL_SIGN].toUpperCase(Locale.getDefault()),
+ data[INDEX_LOGO_URI]);
}
+ return channelNameLogoUriMap;
}
- if (isFirstTimeFetchChannelLogo && !deleteChannelLogoFailed) {
- sharedPreferencesEditor.putBoolean(
- PREF_KEY_IS_FIRST_TIME_FETCH_CHANNEL_LOGO, false);
+ }
+
+ private void addChannelNames(Map<String, String> channelNameLogoUriMap, String channelName,
+ String logoUri) {
+ if (!TextUtils.isEmpty(channelName)) {
+ channelNameLogoUriMap.put(channelName, logoUri);
+ // Find the candidate names.
+ // If the name is like "W05AAD (W05AA-D)", then split the names into "W05AAD" and
+ // "W05AA-D"
+ String[] splitNames = channelName.split(NAME_SEPARATOR_FOR_TMS);
+ if (splitNames.length > 1) {
+ for (String name : splitNames) {
+ name = name.trim();
+ if (channelNameLogoUriMap.get(name) == null) {
+ channelNameLogoUriMap.put(name, logoUri);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ synchronized (sLock) {
+ if (sFetchTask == this) {
+ sFetchTask = null;
+ }
}
- sharedPreferencesEditor.commit();
- if (DEBUG) Log.d(TAG, "Fetching logos has been finished successfully.");
- return null;
}
}
}
diff --git a/src/com/android/tv/data/ChannelNumber.java b/src/com/android/tv/data/ChannelNumber.java
index 29054aa5..59021609 100644
--- a/src/com/android/tv/data/ChannelNumber.java
+++ b/src/com/android/tv/data/ChannelNumber.java
@@ -17,38 +17,37 @@
package com.android.tv.data;
import android.support.annotation.NonNull;
-import android.text.TextUtils;
import android.view.KeyEvent;
-import com.android.tv.util.StringUtils;
-
-import java.util.Objects;
-
/**
* A convenience class to handle channel number.
*/
public final class ChannelNumber implements Comparable<ChannelNumber> {
+ public static final String PRIMARY_CHANNEL_DELIMITER = "-";
+ public static final String[] CHANNEL_DELIMITERS = {"-", ".", " "};
+
private static final int[] CHANNEL_DELIMITER_KEYCODES = {
KeyEvent.KEYCODE_MINUS, KeyEvent.KEYCODE_NUMPAD_SUBTRACT, KeyEvent.KEYCODE_PERIOD,
KeyEvent.KEYCODE_NUMPAD_DOT, KeyEvent.KEYCODE_SPACE
};
- /** The major part of the channel number. */
public String majorNumber;
- /** The flag which indicates whether it has a delimiter or not. */
public boolean hasDelimiter;
- /** The major part of the channel number. */
public String minorNumber;
public ChannelNumber() {
reset();
}
+ public ChannelNumber(String major, boolean hasDelimiter, String minor) {
+ setChannelNumber(major, hasDelimiter, minor);
+ }
+
public void reset() {
setChannelNumber("", false, "");
}
- private void setChannelNumber(String majorNumber, boolean hasDelimiter, String minorNumber) {
+ public void setChannelNumber(String majorNumber, boolean hasDelimiter, String minorNumber) {
this.majorNumber = majorNumber;
this.hasDelimiter = hasDelimiter;
this.minorNumber = minorNumber;
@@ -57,7 +56,7 @@ public final class ChannelNumber implements Comparable<ChannelNumber> {
@Override
public String toString() {
if (hasDelimiter) {
- return majorNumber + Channel.CHANNEL_NUMBER_DELIMITER + minorNumber;
+ return majorNumber + PRIMARY_CHANNEL_DELIMITER + minorNumber;
}
return majorNumber;
}
@@ -76,22 +75,6 @@ public final class ChannelNumber implements Comparable<ChannelNumber> {
return major - opponentMajor;
}
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof ChannelNumber) {
- ChannelNumber channelNumber = (ChannelNumber) obj;
- return TextUtils.equals(majorNumber, channelNumber.majorNumber)
- && TextUtils.equals(minorNumber, channelNumber.minorNumber)
- && hasDelimiter == channelNumber.hasDelimiter;
- }
- return super.equals(obj);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(majorNumber, hasDelimiter, minorNumber);
- }
-
public static boolean isChannelNumberDelimiterKey(int keyCode) {
for (int delimiterKeyCode : CHANNEL_DELIMITER_KEYCODES) {
if (delimiterKeyCode == keyCode) {
@@ -101,22 +84,22 @@ public final class ChannelNumber implements Comparable<ChannelNumber> {
return false;
}
- /**
- * Returns the ChannelNumber instance.
- * <p>
- * Note that all the channel number argument should be normalized by
- * {@link Channel#normalizeDisplayNumber}. The channels retrieved from
- * {@link ChannelDataManager} are already normalized.
- */
public static ChannelNumber parseChannelNumber(String number) {
if (number == null) {
return null;
}
ChannelNumber ret = new ChannelNumber();
- int indexOfDelimiter = number.indexOf(Channel.CHANNEL_NUMBER_DELIMITER);
+ int indexOfDelimiter = -1;
+ for (String delimiter : CHANNEL_DELIMITERS) {
+ indexOfDelimiter = number.indexOf(delimiter);
+ if (indexOfDelimiter >= 0) {
+ break;
+ }
+ }
if (indexOfDelimiter == 0 || indexOfDelimiter == number.length() - 1) {
return null;
- } else if (indexOfDelimiter < 0) {
+ }
+ if (indexOfDelimiter < 0) {
ret.majorNumber = number;
if (!isInteger(ret.majorNumber)) {
return null;
@@ -132,31 +115,25 @@ public final class ChannelNumber implements Comparable<ChannelNumber> {
return ret;
}
- /**
- * Compares the channel numbers.
- * <p>
- * Note that all the channel number arguments should be normalized by
- * {@link Channel#normalizeDisplayNumber}. The channels retrieved from
- * {@link ChannelDataManager} are already normalized.
- */
public static int compare(String lhs, String rhs) {
ChannelNumber lhsNumber = parseChannelNumber(lhs);
ChannelNumber rhsNumber = parseChannelNumber(rhs);
- // Null first
if (lhsNumber == null && rhsNumber == null) {
- return StringUtils.compare(lhs, rhs);
+ return 0;
} else if (lhsNumber == null /* && rhsNumber != null */) {
return -1;
- } else if (rhsNumber == null) {
+ } else if (lhsNumber != null && rhsNumber == null) {
return 1;
}
return lhsNumber.compareTo(rhsNumber);
}
- private static boolean isInteger(String string) {
+ public static boolean isInteger(String string) {
try {
Integer.parseInt(string);
- } catch(NumberFormatException | NullPointerException e) {
+ } catch(NumberFormatException e) {
+ return false;
+ } catch(NullPointerException e) {
return false;
}
return true;
diff --git a/src/com/android/tv/data/InternalDataUtils.java b/src/com/android/tv/data/InternalDataUtils.java
index e33ca18f..6054f089 100644
--- a/src/com/android/tv/data/InternalDataUtils.java
+++ b/src/com/android/tv/data/InternalDataUtils.java
@@ -21,7 +21,7 @@ import android.text.TextUtils;
import android.util.Log;
import com.android.tv.data.Program.CriticScore;
-import com.android.tv.dvr.data.RecordedProgram;
+import com.android.tv.dvr.RecordedProgram;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
diff --git a/src/com/android/tv/data/StreamInfo.java b/src/com/android/tv/data/StreamInfo.java
index 709863cf..fe461f14 100644
--- a/src/com/android/tv/data/StreamInfo.java
+++ b/src/com/android/tv/data/StreamInfo.java
@@ -38,9 +38,5 @@ public interface StreamInfo {
int getAudioChannelCount();
boolean hasClosedCaption();
boolean isVideoAvailable();
- /**
- * Returns true, if video or audio is available.
- */
- boolean isVideoOrAudioAvailable();
int getVideoUnavailableReason();
}
diff --git a/src/com/android/tv/data/epg/EpgFetcher.java b/src/com/android/tv/data/epg/EpgFetcher.java
index ddd68ad7..3b093b6a 100644
--- a/src/com/android/tv/data/epg/EpgFetcher.java
+++ b/src/com/android/tv/data/epg/EpgFetcher.java
@@ -16,11 +16,13 @@
package com.android.tv.data.epg;
+import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ContentProviderOperation;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.location.Address;
import android.media.tv.TvContentRating;
@@ -44,11 +46,9 @@ import com.android.tv.TvApplication;
import com.android.tv.common.WeakHandler;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
-import com.android.tv.data.ChannelLogoFetcher;
import com.android.tv.data.InternalDataUtils;
import com.android.tv.data.Lineup;
import com.android.tv.data.Program;
-import com.android.tv.tuner.util.PostalCodeUtils;
import com.android.tv.util.LocationUtils;
import com.android.tv.util.RecurringRunner;
import com.android.tv.util.Utils;
@@ -56,10 +56,8 @@ import com.android.tv.util.Utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Locale;
-import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@@ -71,27 +69,14 @@ public class EpgFetcher {
private static final boolean DEBUG = false;
private static final int MSG_FETCH_EPG = 1;
- private static final int MSG_FAST_FETCH_EPG = 2;
private static final long EPG_PREFETCH_RECURRING_PERIOD_MS = TimeUnit.HOURS.toMillis(4);
private static final long EPG_READER_INIT_WAIT_MS = TimeUnit.MINUTES.toMillis(1);
private static final long LOCATION_INIT_WAIT_MS = TimeUnit.SECONDS.toMillis(10);
private static final long LOCATION_ERROR_WAIT_MS = TimeUnit.HOURS.toMillis(1);
- private static final long NO_INFO_FETCHED_WAIT_MS = TimeUnit.SECONDS.toMillis(10);
private static final long PROGRAM_QUERY_DURATION = TimeUnit.DAYS.toMillis(30);
- private static final long PROGRAM_FETCH_SHORT_DURATION_SEC = TimeUnit.HOURS.toSeconds(3);
- private static final long PROGRAM_FETCH_LONG_DURATION_SEC = TimeUnit.DAYS.toSeconds(2)
- + EPG_PREFETCH_RECURRING_PERIOD_MS / 1000;
-
- // This equals log2(EPG_PREFETCH_RECURRING_PERIOD_MS / NO_INFO_FETCHED_WAIT_MS + 1),
- // since we will double waiting time every other trial, therefore this limit the maximum
- // waiting time less than half of EPG_PREFETCH_RECURRING_PERIOD_MS.
- private static final int NO_INFO_RETRY_LIMIT = 31 - Integer.numberOfLeadingZeros(
- (int) (EPG_PREFETCH_RECURRING_PERIOD_MS / NO_INFO_FETCHED_WAIT_MS + 1));
-
private static final int BATCH_OPERATION_COUNT = 100;
- private static final int QUERY_CHANNEL_COUNT = 50;
private static final String SUPPORTED_COUNTRY_CODE = Locale.US.getCountry();
private static final String CONTENT_RATING_SEPARATOR = ",";
@@ -111,11 +96,8 @@ public class EpgFetcher {
private EpgFetcherHandler mHandler;
private RecurringRunner mRecurringRunner;
private boolean mStarted;
- private boolean mScanningChannels;
- private int mFetchRetryCount;
private long mLastEpgTimestamp = -1;
- // @GuardedBy("this")
private String mLineupId;
public static synchronized EpgFetcher getInstance(Context context) {
@@ -140,33 +122,21 @@ public class EpgFetcher {
@Override
public void onLoadFinished() {
if (DEBUG) Log.d(TAG, "ChannelDataManager.onLoadFinished()");
- if (!mScanningChannels) {
- handleChannelChanged();
- }
+ handleChannelChanged();
}
@Override
public void onChannelListUpdated() {
if (DEBUG) Log.d(TAG, "ChannelDataManager.onChannelListUpdated()");
- if (!mScanningChannels) {
- handleChannelChanged();
- }
+ handleChannelChanged();
}
@Override
public void onChannelBrowsableChanged() {
if (DEBUG) Log.d(TAG, "ChannelDataManager.onChannelBrowsableChanged()");
- if (!mScanningChannels) {
- handleChannelChanged();
- }
+ handleChannelChanged();
}
});
- // Warm up to get address, because the first call of getCurrentAddress is usually failed.
- try {
- LocationUtils.getCurrentAddress(mContext);
- } catch (SecurityException | IOException e) {
- // Do nothing
- }
}
private void handleChannelChanged() {
@@ -175,9 +145,7 @@ public class EpgFetcher {
stop();
}
} else {
- if (canStart()) {
- start();
- }
+ start();
}
}
@@ -205,14 +173,17 @@ public class EpgFetcher {
if (!TextUtils.isEmpty(getLastLineupId())) {
return true;
}
- if (!TextUtils.isEmpty(PostalCodeUtils.getLastPostalCode(mContext))) {
- return true;
+ if (mContext.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
+ != PackageManager.PERMISSION_GRANTED) {
+ if (DEBUG) Log.d(TAG, "No permission to check the current location.");
+ return false;
}
+
try {
Address address = LocationUtils.getCurrentAddress(mContext);
if (address != null
&& !TextUtils.equals(address.getCountryCode(), SUPPORTED_COUNTRY_CODE)) {
- Log.i(TAG, "Country not supported: " + address.getCountryCode());
+ if (DEBUG) Log.d(TAG, "Country not supported: " + address.getCountryCode());
return false;
}
} catch (SecurityException e) {
@@ -226,13 +197,9 @@ public class EpgFetcher {
/**
* Starts fetching EPG.
- *
- * @param resetNextRunTime if true, next run time is reset, so EPG will be fetched
- * {@link #EPG_PREFETCH_RECURRING_PERIOD_MS} later.
- * otherwise, EPG is fetched when this method is called.
*/
@MainThread
- private void startInternal(boolean resetNextRunTime) {
+ public void start() {
if (DEBUG) Log.d(TAG, "start()");
if (mStarted) {
if (DEBUG) Log.d(TAG, "EpgFetcher thread already started.");
@@ -248,35 +215,19 @@ public class EpgFetcher {
mHandler = new EpgFetcherHandler(handlerThread.getLooper(), this);
mRecurringRunner = new RecurringRunner(mContext, EPG_PREFETCH_RECURRING_PERIOD_MS,
new EpgRunner(), null);
- mRecurringRunner.start(resetNextRunTime);
+ mRecurringRunner.start();
if (DEBUG) Log.d(TAG, "EpgFetcher thread started successfully.");
}
- @MainThread
- public void start() {
- if (System.currentTimeMillis() - getLastUpdatedEpgTimestamp() >
- EPG_PREFETCH_RECURRING_PERIOD_MS) {
- startImmediately(false);
- } else {
- startInternal(false);
- }
- }
-
/**
* Starts fetching EPG immediately if possible without waiting for the timer.
- *
- * @param clearStoredLineupId if true, stored lineup id will be clear before fetching EPG.
*/
@MainThread
- public void startImmediately(boolean clearStoredLineupId) {
- startInternal(true);
+ public void startImmediately() {
+ start();
if (mStarted) {
- if (clearStoredLineupId) {
- if (DEBUG) Log.d(TAG, "Clear stored lineup id: " + mLineupId);
- setLastLineupId(null);
- }
if (DEBUG) Log.d(TAG, "Starting fetcher immediately");
- postFetchRequest(true, 0);
+ fetchEpg();
}
}
@@ -295,71 +246,48 @@ public class EpgFetcher {
mHandler.getLooper().quit();
}
- /**
- * Notifies EPG fetcher that channel scanning is started.
- */
- @MainThread
- public void onChannelScanStarted() {
- stop();
- mScanningChannels = true;
+ private void fetchEpg() {
+ fetchEpg(0);
}
- /**
- * Notifies EPG fetcher that channel scanning is finished.
- */
- @MainThread
- public void onChannelScanFinished() {
- mScanningChannels = false;
- start();
- }
-
- private void postFetchRequest(boolean fastFetch, long delay) {
- int msg = fastFetch ? MSG_FAST_FETCH_EPG : MSG_FETCH_EPG;
- mHandler.removeMessages(msg);
- mHandler.sendEmptyMessageDelayed(msg, delay);
+ private void fetchEpg(long delay) {
+ mHandler.removeMessages(MSG_FETCH_EPG);
+ mHandler.sendEmptyMessageDelayed(MSG_FETCH_EPG, delay);
}
private void onFetchEpg() {
- onFetchEpg(false);
- }
-
- private void onFetchEpg(boolean fastFetch) {
if (DEBUG) Log.d(TAG, "Start fetching EPG.");
if (!mEpgReader.isAvailable()) {
- Log.i(TAG, "EPG reader is not temporarily available.");
- postFetchRequest(fastFetch, EPG_READER_INIT_WAIT_MS);
+ if (DEBUG) Log.d(TAG, "EPG reader is not temporarily available.");
+ fetchEpg(EPG_READER_INIT_WAIT_MS);
return;
}
String lineupId = getLastLineupId();
if (lineupId == null) {
+ Address address;
try {
- PostalCodeUtils.updatePostalCode(mContext);
+ address = LocationUtils.getCurrentAddress(mContext);
} catch (IOException e) {
- if (TextUtils.isEmpty(PostalCodeUtils.getLastPostalCode(mContext))) {
- if (DEBUG) Log.d(TAG, "Couldn't get the current location.", e);
- postFetchRequest(fastFetch, LOCATION_ERROR_WAIT_MS);
- return;
- }
+ if (DEBUG) Log.d(TAG, "Couldn't get the current location.", e);
+ fetchEpg(LOCATION_ERROR_WAIT_MS);
+ return;
} catch (SecurityException e) {
- if (TextUtils.isEmpty(PostalCodeUtils.getLastPostalCode(mContext))) {
- Log.w(TAG, "No permission to get the current location.");
- return;
- }
- } catch (PostalCodeUtils.NoPostalCodeException e) {
- Log.i(TAG, "Failed to get the current postal code.");
- postFetchRequest(fastFetch, LOCATION_INIT_WAIT_MS);
+ Log.w(TAG, "No permission to get the current location.");
return;
}
- String postalCode = PostalCodeUtils.getLastPostalCode(mContext);
- if (DEBUG) Log.d(TAG, "The current postal code is " + postalCode);
+ if (address == null) {
+ if (DEBUG) Log.d(TAG, "Null address returned.");
+ fetchEpg(LOCATION_INIT_WAIT_MS);
+ return;
+ }
+ if (DEBUG) Log.d(TAG, "Current location is " + address);
- lineupId = pickLineupForPostalCode(postalCode);
+ lineupId = getLineupForAddress(address);
if (lineupId != null) {
- Log.i(TAG, "Selecting the lineup " + lineupId);
+ if (DEBUG) Log.d(TAG, "Saving lineup " + lineupId + "found for " + address);
setLastLineupId(lineupId);
} else {
- Log.i(TAG, "Failed to get lineup id");
- retryFetchEpg(fastFetch);
+ if (DEBUG) Log.d(TAG, "No lineup found for " + address);
return;
}
}
@@ -371,109 +299,48 @@ public class EpgFetcher {
return;
}
+ boolean updated = false;
List<Channel> channels = mEpgReader.getChannels(lineupId);
- if (channels.isEmpty()) {
- Log.i(TAG, "Failed to get EPG channels.");
- retryFetchEpg(fastFetch);
- return;
- }
- mFetchRetryCount = 0;
- if (!fastFetch) {
- for (Channel channel : channels) {
- if (!mStarted) {
- break;
- }
- List<Program> programs = new ArrayList<>(mEpgReader.getPrograms(channel.getId()));
- Collections.sort(programs);
- Log.i(TAG, "Fetched " + programs.size() + " programs for channel " + channel);
- updateEpg(channel.getId(), programs);
+ for (Channel channel : channels) {
+ List<Program> programs = new ArrayList<>(mEpgReader.getPrograms(channel.getId()));
+ Collections.sort(programs);
+ if (DEBUG) {
+ Log.d(TAG, "Fetched " + programs.size() + " programs for channel " + channel);
+ }
+ if (updateEpg(channel.getId(), programs)) {
+ updated = true;
}
- setLastUpdatedEpgTimestamp(epgTimestamp);
- } else {
- handleFastFetch(channels, PROGRAM_FETCH_SHORT_DURATION_SEC);
- if (DEBUG) Log.d(TAG, "First fast fetch Done.");
- handleFastFetch(channels, PROGRAM_FETCH_LONG_DURATION_SEC);
- if (DEBUG) Log.d(TAG, "Second fast fetch Done.");
}
- if (!fastFetch) {
- mHandler.removeMessages(MSG_FETCH_EPG);
- }
+ final boolean epgUpdated = updated;
+ setLastUpdatedEpgTimestamp(epgTimestamp);
+ mHandler.removeMessages(MSG_FETCH_EPG);
if (DEBUG) Log.d(TAG, "Fetching EPG is finished.");
- // Start to fetch channel logos after epg fetching finished.
- ChannelLogoFetcher.startFetchingChannelLogos(mContext, channels);
- }
-
- private void retryFetchEpg(boolean fastFetch) {
- if (mFetchRetryCount < NO_INFO_RETRY_LIMIT) {
- postFetchRequest(fastFetch, NO_INFO_FETCHED_WAIT_MS * 1 << mFetchRetryCount);
- mFetchRetryCount++;
- } else {
- mFetchRetryCount = 0;
- }
}
- private void handleFastFetch(List<Channel> channels, long duration) {
- List<Long> channelIds = new ArrayList<>(channels.size());
- for (Channel channel : channels) {
- channelIds.add(channel.getId());
- }
- Map<Long, List<Program>> allPrograms = new HashMap<>();
- List<Long> queryChannelIds = new ArrayList<>(QUERY_CHANNEL_COUNT);
- for (Long channelId : channelIds) {
- queryChannelIds.add(channelId);
- if (queryChannelIds.size() >= QUERY_CHANNEL_COUNT) {
- allPrograms.putAll(
- new HashMap<>(mEpgReader.getPrograms(queryChannelIds, duration)));
- queryChannelIds.clear();
+ @Nullable
+ private String getLineupForAddress(Address address) {
+ String lineup = null;
+ if (TextUtils.equals(address.getCountryCode(), SUPPORTED_COUNTRY_CODE)) {
+ String postalCode = address.getPostalCode();
+ if (!TextUtils.isEmpty(postalCode)) {
+ lineup = getLineupForPostalCode(postalCode);
}
}
- if (!queryChannelIds.isEmpty()) {
- allPrograms.putAll(
- new HashMap<>(mEpgReader.getPrograms(queryChannelIds, duration)));
- }
- for (Channel channel : channels) {
- List<Program> programs = allPrograms.get(channel.getId());
- if (programs == null) continue;
- Collections.sort(programs);
- Log.i(TAG, "Fast fetched " + programs.size() + " programs for channel " + channel);
- updateEpg(channel.getId(), programs);
- }
+ return lineup;
}
@Nullable
- private String pickLineupForPostalCode(String postalCode) {
+ private String getLineupForPostalCode(String postalCode) {
List<Lineup> lineups = mEpgReader.getLineups(postalCode);
- int maxCount = 0;
- String maxLineupId = null;
for (Lineup lineup : lineups) {
- int count = getMatchedChannelCount(lineup.id);
- Log.i(TAG, lineup.name + " (" + lineup.id + ") - " + count + " matches");
- if (count > maxCount) {
- maxCount = count;
- maxLineupId = lineup.id;
+ // TODO(EPG): handle more than OTA digital
+ if (lineup.type == Lineup.LINEUP_BROADCAST_DIGITAL) {
+ if (DEBUG) Log.d(TAG, "Setting lineup to " + lineup.name + "(" + lineup.id + ")");
+ return lineup.id;
}
}
- return maxLineupId;
- }
-
- private int getMatchedChannelCount(String lineupId) {
- // Construct a list of display numbers for existing channels.
- List<Channel> channels = mChannelDataManager.getChannelList();
- if (channels.isEmpty()) {
- if (DEBUG) Log.d(TAG, "No existing channel to compare");
- return 0;
- }
- List<String> numbers = new ArrayList<>(channels.size());
- for (Channel c : channels) {
- // We only support local channels from physical tuners.
- if (c.isPhysicalTunerChannel()) {
- numbers.add(c.getDisplayNumber());
- }
- }
-
- numbers.retainAll(mEpgReader.getChannelNumbers(lineupId));
- return numbers.size();
+ return null;
}
private long getLastUpdatedEpgTimestamp() {
@@ -490,16 +357,16 @@ public class EpgFetcher {
KEY_LAST_UPDATED_EPG_TIMESTAMP, timestamp).commit();
}
- synchronized private String getLastLineupId() {
+ private String getLastLineupId() {
if (mLineupId == null) {
mLineupId = PreferenceManager.getDefaultSharedPreferences(mContext)
.getString(KEY_LAST_LINEUP_ID, null);
}
- if (DEBUG) Log.d(TAG, "Last lineup is " + mLineupId);
+ if (DEBUG) Log.d(TAG, "Last lineup_id " + mLineupId);
return mLineupId;
}
- synchronized private void setLastLineupId(String lineupId) {
+ private void setLastLineupId(String lineupId) {
mLineupId = lineupId;
PreferenceManager.getDefaultSharedPreferences(mContext).edit()
.putString(KEY_LAST_LINEUP_ID, lineupId).commit();
@@ -514,9 +381,19 @@ public class EpgFetcher {
long startTimeMs = System.currentTimeMillis();
long endTimeMs = startTimeMs + PROGRAM_QUERY_DURATION;
List<Program> oldPrograms = queryPrograms(channelId, startTimeMs, endTimeMs);
+ Program currentOldProgram = oldPrograms.size() > 0 ? oldPrograms.get(0) : null;
int oldProgramsIndex = 0;
int newProgramsIndex = 0;
-
+ // Skip the past programs. They will be automatically removed by the system.
+ if (currentOldProgram != null) {
+ long oldStartTimeUtcMillis = currentOldProgram.getStartTimeUtcMillis();
+ for (Program program : newPrograms) {
+ if (program.getEndTimeUtcMillis() > oldStartTimeUtcMillis) {
+ break;
+ }
+ newProgramsIndex++;
+ }
+ }
// Compare the new programs with old programs one by one and update/delete the old one
// or insert new program if there is no matching program in the database.
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
@@ -562,7 +439,7 @@ public class EpgFetcher {
}
if (addNewProgram) {
ops.add(ContentProviderOperation
- .newInsert(Programs.CONTENT_URI)
+ .newInsert(TvContract.Programs.CONTENT_URI)
.withValues(toContentValues(newProgram))
.build());
}
@@ -624,25 +501,27 @@ public class EpgFetcher {
@SuppressWarnings("deprecation")
private static ContentValues toContentValues(Program program) {
ContentValues values = new ContentValues();
- values.put(Programs.COLUMN_CHANNEL_ID, program.getChannelId());
- putValue(values, Programs.COLUMN_TITLE, program.getTitle());
- putValue(values, Programs.COLUMN_EPISODE_TITLE, program.getEpisodeTitle());
+ values.put(TvContract.Programs.COLUMN_CHANNEL_ID, program.getChannelId());
+ putValue(values, TvContract.Programs.COLUMN_TITLE, program.getTitle());
+ putValue(values, TvContract.Programs.COLUMN_EPISODE_TITLE, program.getEpisodeTitle());
if (BuildCompat.isAtLeastN()) {
- putValue(values, Programs.COLUMN_SEASON_DISPLAY_NUMBER, program.getSeasonNumber());
- putValue(values, Programs.COLUMN_EPISODE_DISPLAY_NUMBER, program.getEpisodeNumber());
+ putValue(values, TvContract.Programs.COLUMN_SEASON_DISPLAY_NUMBER,
+ program.getSeasonNumber());
+ putValue(values, TvContract.Programs.COLUMN_EPISODE_DISPLAY_NUMBER,
+ program.getEpisodeNumber());
} else {
- putValue(values, Programs.COLUMN_SEASON_NUMBER, program.getSeasonNumber());
- putValue(values, Programs.COLUMN_EPISODE_NUMBER, program.getEpisodeNumber());
+ putValue(values, TvContract.Programs.COLUMN_SEASON_NUMBER, program.getSeasonNumber());
+ putValue(values, TvContract.Programs.COLUMN_EPISODE_NUMBER, program.getEpisodeNumber());
}
- putValue(values, Programs.COLUMN_SHORT_DESCRIPTION, program.getDescription());
- putValue(values, Programs.COLUMN_LONG_DESCRIPTION, program.getLongDescription());
- putValue(values, Programs.COLUMN_POSTER_ART_URI, program.getPosterArtUri());
- putValue(values, Programs.COLUMN_THUMBNAIL_URI, program.getThumbnailUri());
+ putValue(values, TvContract.Programs.COLUMN_SHORT_DESCRIPTION, program.getDescription());
+ putValue(values, TvContract.Programs.COLUMN_POSTER_ART_URI, program.getPosterArtUri());
+ putValue(values, TvContract.Programs.COLUMN_THUMBNAIL_URI, program.getThumbnailUri());
String[] canonicalGenres = program.getCanonicalGenres();
if (canonicalGenres != null && canonicalGenres.length > 0) {
- putValue(values, Programs.COLUMN_CANONICAL_GENRE, Genres.encode(canonicalGenres));
+ putValue(values, TvContract.Programs.COLUMN_CANONICAL_GENRE,
+ Genres.encode(canonicalGenres));
} else {
- putValue(values, Programs.COLUMN_CANONICAL_GENRE, "");
+ putValue(values, TvContract.Programs.COLUMN_CANONICAL_GENRE, "");
}
TvContentRating[] ratings = program.getContentRatings();
if (ratings != null && ratings.length > 0) {
@@ -651,13 +530,14 @@ public class EpgFetcher {
sb.append(CONTENT_RATING_SEPARATOR);
sb.append(ratings[i].flattenToString());
}
- putValue(values, Programs.COLUMN_CONTENT_RATING, sb.toString());
+ putValue(values, TvContract.Programs.COLUMN_CONTENT_RATING, sb.toString());
} else {
- putValue(values, Programs.COLUMN_CONTENT_RATING, "");
+ putValue(values, TvContract.Programs.COLUMN_CONTENT_RATING, "");
}
- values.put(Programs.COLUMN_START_TIME_UTC_MILLIS, program.getStartTimeUtcMillis());
- values.put(Programs.COLUMN_END_TIME_UTC_MILLIS, program.getEndTimeUtcMillis());
- putValue(values, Programs.COLUMN_INTERNAL_PROVIDER_DATA,
+ values.put(TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS,
+ program.getStartTimeUtcMillis());
+ values.put(TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS, program.getEndTimeUtcMillis());
+ putValue(values, TvContract.Programs.COLUMN_INTERNAL_PROVIDER_DATA,
InternalDataUtils.serializeInternalProviderData(program));
return values;
}
@@ -689,9 +569,6 @@ public class EpgFetcher {
case MSG_FETCH_EPG:
epgFetcher.onFetchEpg();
break;
- case MSG_FAST_FETCH_EPG:
- epgFetcher.onFetchEpg(true);
- break;
default:
super.handleMessage(msg);
break;
@@ -702,7 +579,7 @@ public class EpgFetcher {
private class EpgRunner implements Runnable {
@Override
public void run() {
- postFetchRequest(false, 0);
+ fetchEpg();
}
}
}
diff --git a/src/com/android/tv/data/epg/EpgReader.java b/src/com/android/tv/data/epg/EpgReader.java
index 95cd933e..4f3b6f52 100644
--- a/src/com/android/tv/data/epg/EpgReader.java
+++ b/src/com/android/tv/data/epg/EpgReader.java
@@ -22,10 +22,9 @@ import android.support.annotation.WorkerThread;
import com.android.tv.data.Channel;
import com.android.tv.data.Lineup;
import com.android.tv.data.Program;
-import com.android.tv.dvr.data.SeriesInfo;
+import com.android.tv.dvr.SeriesInfo;
import java.util.List;
-import java.util.Map;
/**
* An interface used to retrieve the EPG data. This class should be used in worker thread.
@@ -44,37 +43,21 @@ public interface EpgReader {
long getEpgTimestamp();
/**
- * Returns the lineups list.
- */
- List<Lineup> getLineups(@NonNull String postalCode);
-
- /**
- * Returns the list of channel numbers (unsorted) for the given lineup. The result is used to
- * choose the most appropriate lineup among others by comparing the channel numbers of the
- * existing channels on the device.
- */
- List<String> getChannelNumbers(@NonNull String lineupId);
-
- /**
- * Returns the list of channels for the given lineup. The returned channels should map into the
- * existing channels on the device. This method is usually called after selecting the lineup.
+ * Returns the channels list.
*/
List<Channel> getChannels(@NonNull String lineupId);
/**
- * Returns the programs for the given channel. Must call {@link #getChannels(String)}
- * beforehand. Note that the {@code Program} doesn't have valid program ID because it's not
- * retrieved from TvProvider.
+ * Returns the lineups list.
*/
- List<Program> getPrograms(long channelId);
+ List<Lineup> getLineups(@NonNull String postalCode);
/**
- * Returns the programs for the given channels.
+ * Returns the programs for the given channel. The result is sorted by the start time.
* Note that the {@code Program} doesn't have valid program ID because it's not retrieved from
* TvProvider.
- * This method is only used to get programs for a short duration typically.
*/
- Map<Long, List<Program>> getPrograms(List<Long> channelIds, long duration);
+ List<Program> getPrograms(long channelId);
/**
* Returns the series information for the given series ID.
diff --git a/src/com/android/tv/data/epg/StubEpgReader.java b/src/com/android/tv/data/epg/StubEpgReader.java
index 220daf22..64093f89 100644
--- a/src/com/android/tv/data/epg/StubEpgReader.java
+++ b/src/com/android/tv/data/epg/StubEpgReader.java
@@ -21,11 +21,10 @@ import android.content.Context;
import com.android.tv.data.Channel;
import com.android.tv.data.Lineup;
import com.android.tv.data.Program;
-import com.android.tv.dvr.data.SeriesInfo;
+import com.android.tv.dvr.SeriesInfo;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
/**
* A stub class to read EPG.
@@ -45,17 +44,12 @@ public class StubEpgReader implements EpgReader{
}
@Override
- public List<Lineup> getLineups(String postalCode) {
- return Collections.emptyList();
- }
-
- @Override
- public List<String> getChannelNumbers(String lineupId) {
+ public List<Channel> getChannels(String lineupId) {
return Collections.emptyList();
}
@Override
- public List<Channel> getChannels(String lineupId) {
+ public List<Lineup> getLineups(String postalCode) {
return Collections.emptyList();
}
@@ -65,11 +59,6 @@ public class StubEpgReader implements EpgReader{
}
@Override
- public Map<Long, List<Program>> getPrograms(List<Long> channelIds, long duration) {
- return Collections.emptyMap();
- }
-
- @Override
public SeriesInfo getSeriesInfo(String seriesId) {
return null;
}
diff --git a/src/com/android/tv/dialog/DvrHistoryDialogFragment.java b/src/com/android/tv/dialog/DvrHistoryDialogFragment.java
deleted file mode 100644
index 2ed98b87..00000000
--- a/src/com/android/tv/dialog/DvrHistoryDialogFragment.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.dialog;
-
-import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.os.Build.VERSION_CODES;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.android.tv.ApplicationSingletons;
-import com.android.tv.R;
-import com.android.tv.TvApplication;
-import com.android.tv.data.Channel;
-import com.android.tv.data.ChannelDataManager;
-import com.android.tv.dvr.DvrDataManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.ScheduledRecording.RecordingState;
-import com.android.tv.util.Utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Displays the DVR history.
- */
-@TargetApi(VERSION_CODES.N)
-public class DvrHistoryDialogFragment extends SafeDismissDialogFragment {
- public static final String DIALOG_TAG = DvrHistoryDialogFragment.class.getSimpleName();
-
- private static final String TRACKER_LABEL = "DVR history";
- private final List<ScheduledRecording> mSchedules = new ArrayList<>();
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- ApplicationSingletons singletons = TvApplication.getSingletons(getContext());
- DvrDataManager dataManager = singletons.getDvrDataManager();
- ChannelDataManager channelDataManager = singletons.getChannelDataManager();
- for (ScheduledRecording schedule : dataManager.getAllScheduledRecordings()) {
- if (!schedule.isInProgress() && !schedule.isNotStarted()) {
- mSchedules.add(schedule);
- }
- }
- mSchedules.sort(ScheduledRecording.START_TIME_COMPARATOR.reversed());
- LayoutInflater inflater = LayoutInflater.from(getContext());
- ArrayAdapter adapter = new ArrayAdapter<ScheduledRecording>(getContext(),
- R.layout.list_item_dvr_history, ScheduledRecording.toArray(mSchedules)) {
- @NonNull
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View view = inflater.inflate(R.layout.list_item_dvr_history, parent, false);
- ScheduledRecording schedule = mSchedules.get(position);
- setText(view, R.id.state, getStateString(schedule.getState()));
- setText(view, R.id.schedule_time, getRecordingTimeText(schedule));
- setText(view, R.id.program_title,
- schedule.getProgramTitleWithEpisodeNumber(getContext()));
- setText(view, R.id.channel_name, getChannelNameText(schedule));
- return view;
- }
-
- private void setText(View view, int id, String text) {
- ((TextView) view.findViewById(id)).setText(text);
- }
-
- private void setText(View view, int id, int text) {
- ((TextView) view.findViewById(id)).setText(text);
- }
-
- @SuppressLint("SwitchIntDef")
- private int getStateString(@RecordingState int state) {
- switch (state) {
- case ScheduledRecording.STATE_RECORDING_CLIPPED:
- return R.string.dvr_history_dialog_state_clip;
- case ScheduledRecording.STATE_RECORDING_FAILED:
- return R.string.dvr_history_dialog_state_fail;
- case ScheduledRecording.STATE_RECORDING_FINISHED:
- return R.string.dvr_history_dialog_state_success;
- default:
- break;
- }
- return 0;
- }
-
- private String getChannelNameText(ScheduledRecording schedule) {
- Channel channel = channelDataManager.getChannel(schedule.getChannelId());
- return channel == null ? null :
- TextUtils.isEmpty(channel.getDisplayName()) ? channel.getDisplayNumber() :
- channel.getDisplayName().trim() + " " + channel.getDisplayNumber();
- }
-
- private String getRecordingTimeText(ScheduledRecording schedule) {
- return Utils.getDurationString(getContext(), schedule.getStartTimeMs(),
- schedule.getEndTimeMs(), true, true, true, 0);
- }
- };
- ListView listView = new ListView(getActivity());
- listView.setAdapter(adapter);
- return new AlertDialog.Builder(getActivity()).setTitle(R.string.dvr_history_dialog_title)
- .setView(listView).create();
- }
-
- @Override
- public String getTrackerLabel() {
- return TRACKER_LABEL;
- }
-}
diff --git a/src/com/android/tv/dialog/FullscreenDialogFragment.java b/src/com/android/tv/dialog/FullscreenDialogFragment.java
index d00422a7..d16202a1 100644
--- a/src/com/android/tv/dialog/FullscreenDialogFragment.java
+++ b/src/com/android/tv/dialog/FullscreenDialogFragment.java
@@ -77,7 +77,7 @@ public class FullscreenDialogFragment extends SafeDismissDialogFragment {
return mTrackerLabel;
}
- private class FullscreenDialog extends Dialog {
+ private class FullscreenDialog extends TvDialog {
public FullscreenDialog(Context context, int theme) {
super(context, theme);
}
diff --git a/src/com/android/tv/dialog/SafeDismissDialogFragment.java b/src/com/android/tv/dialog/SafeDismissDialogFragment.java
index e3390b0a..f671a87d 100644
--- a/src/com/android/tv/dialog/SafeDismissDialogFragment.java
+++ b/src/com/android/tv/dialog/SafeDismissDialogFragment.java
@@ -17,7 +17,11 @@
package com.android.tv.dialog;
import android.app.Activity;
+import android.app.Dialog;
import android.app.DialogFragment;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.KeyEvent;
import com.android.tv.MainActivity;
import com.android.tv.TvApplication;
@@ -35,6 +39,11 @@ public abstract class SafeDismissDialogFragment extends DialogFragment
private Tracker mTracker;
@Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ return new TvDialog(getActivity(), getTheme());
+ }
+
+ @Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mAttached = true;
@@ -83,4 +92,21 @@ public abstract class SafeDismissDialogFragment extends DialogFragment
super.dismiss();
}
}
+
+ protected class TvDialog extends Dialog {
+ public TvDialog(Context context, int theme) {
+ super(context, theme);
+ }
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ // When a dialog is showing, key events are handled by the dialog instead of
+ // MainActivity. Therefore, unless a key is a global key, it should be handled here.
+ if (mAttached && keyCode == KeyEvent.KEYCODE_SEARCH && mActivity != null) {
+ mActivity.showSearchActivity();
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
+ }
+ }
}
diff --git a/src/com/android/tv/dialog/WebDialogFragment.java b/src/com/android/tv/dialog/WebDialogFragment.java
index 171a256b..75f93bb2 100644
--- a/src/com/android/tv/dialog/WebDialogFragment.java
+++ b/src/com/android/tv/dialog/WebDialogFragment.java
@@ -37,7 +37,6 @@ public class WebDialogFragment extends SafeDismissDialogFragment {
private static final String TITLE = "TITLE";
private static final String TRACKER_LABEL = "TRACKER_LABEL";
- private WebView mWebView;
private String mTrackerLabel;
/**
@@ -74,21 +73,13 @@ public class WebDialogFragment extends SafeDismissDialogFragment {
String title = getArguments().getString(TITLE);
getDialog().setTitle(title);
- mWebView = new WebView(getActivity());
- mWebView.setWebViewClient(new WebViewClient());
+ WebView webView = new WebView(getActivity());
+ webView.setWebViewClient(new WebViewClient());
String url = getArguments().getString(URL);
- mWebView.loadUrl(url);
+ webView.loadUrl(url);
Log.d(TAG, "Loading web content from " + url);
- return mWebView;
- }
-
- @Override
- public void onDestroyView() {
- super.onDestroyView();
- if (mWebView != null) {
- mWebView.destroy();
- }
+ return webView;
}
@Override
diff --git a/src/com/android/tv/dvr/BaseDvrDataManager.java b/src/com/android/tv/dvr/BaseDvrDataManager.java
index a8637449..89661df3 100644
--- a/src/com/android/tv/dvr/BaseDvrDataManager.java
+++ b/src/com/android/tv/dvr/BaseDvrDataManager.java
@@ -26,10 +26,7 @@ import android.util.Log;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.common.feature.CommonFeatures;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.ScheduledRecording.RecordingState;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.ScheduledRecording.RecordingState;
import com.android.tv.util.Clock;
import java.util.ArrayList;
@@ -321,41 +318,5 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
}
@Override
- public void checkAndRemoveEmptySeriesRecording(long... seriesRecordingIds) {
- List<SeriesRecording> toRemove = new ArrayList<>();
- for (long rId : seriesRecordingIds) {
- SeriesRecording seriesRecording = getSeriesRecording(rId);
- if (seriesRecording != null && isEmptySeriesRecording(seriesRecording)) {
- toRemove.add(seriesRecording);
- }
- }
- removeSeriesRecording(SeriesRecording.toArray(toRemove));
- }
-
- /**
- * Returns {@code true}, if the series recording is empty and can be removed. If a series
- * recording is in NORMAL state or has recordings or schedules, it is not empty and cannot be
- * removed.
- */
- protected final boolean isEmptySeriesRecording(@NonNull SeriesRecording seriesRecording) {
- if (!seriesRecording.isStopped()) {
- return false;
- }
- long seriesRecordingId = seriesRecording.getId();
- for (ScheduledRecording r : getAvailableScheduledRecordings()) {
- if (r.getSeriesRecordingId() == seriesRecordingId) {
- return false;
- }
- }
- String seriesId = seriesRecording.getSeriesId();
- for (RecordedProgram r : getRecordedPrograms()) {
- if (seriesId.equals(r.getSeriesId())) {
- return false;
- }
- }
- return true;
- }
-
- @Override
public void forgetStorage(String inputId) { }
}
diff --git a/src/com/android/tv/dvr/recorder/ConflictChecker.java b/src/com/android/tv/dvr/ConflictChecker.java
index 8aa90116..201e379e 100644
--- a/src/com/android/tv/dvr/recorder/ConflictChecker.java
+++ b/src/com/android/tv/dvr/ConflictChecker.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import android.annotation.TargetApi;
import android.content.ContentUris;
@@ -37,9 +37,6 @@ import com.android.tv.common.WeakHandler;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
-import com.android.tv.dvr.DvrScheduleManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.ui.DvrUiHelper;
import java.util.ArrayList;
import java.util.HashMap;
diff --git a/src/com/android/tv/dvr/DvrDataManager.java b/src/com/android/tv/dvr/DvrDataManager.java
index 6d400b82..06613667 100644
--- a/src/com/android/tv/dvr/DvrDataManager.java
+++ b/src/com/android/tv/dvr/DvrDataManager.java
@@ -21,10 +21,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Range;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.ScheduledRecording.RecordingState;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.ScheduledRecording.RecordingState;
import java.util.Collection;
import java.util.List;
@@ -214,13 +211,6 @@ public interface DvrDataManager {
Collection<Long> getDisallowedProgramIds();
/**
- * Checks each of the give series recordings to see if it's empty, i.e., it doesn't contains
- * any available schedules or recorded programs, and it's status is
- * {@link SeriesRecording#STATE_SERIES_STOPPED}; and removes those empty series recordings.
- */
- void checkAndRemoveEmptySeriesRecording(long... seriesRecordingIds);
-
- /**
* Listens for the DVR schedules loading finished.
*/
interface OnDvrScheduleLoadFinishedListener {
diff --git a/src/com/android/tv/dvr/DvrDataManagerImpl.java b/src/com/android/tv/dvr/DvrDataManagerImpl.java
index 6d0a9959..46682a48 100644
--- a/src/com/android/tv/dvr/DvrDataManagerImpl.java
+++ b/src/com/android/tv/dvr/DvrDataManagerImpl.java
@@ -42,11 +42,7 @@ import android.util.Range;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.dvr.DvrStorageStatusManager.OnStorageMountChangedListener;
-import com.android.tv.dvr.data.IdGenerator;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.ScheduledRecording.RecordingState;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.ScheduledRecording.RecordingState;
import com.android.tv.dvr.provider.AsyncDvrDbTask.AsyncAddScheduleTask;
import com.android.tv.dvr.provider.AsyncDvrDbTask.AsyncAddSeriesRecordingTask;
import com.android.tv.dvr.provider.AsyncDvrDbTask.AsyncDeleteScheduleTask;
@@ -55,8 +51,6 @@ import com.android.tv.dvr.provider.AsyncDvrDbTask.AsyncDvrQueryScheduleTask;
import com.android.tv.dvr.provider.AsyncDvrDbTask.AsyncDvrQuerySeriesRecordingTask;
import com.android.tv.dvr.provider.AsyncDvrDbTask.AsyncUpdateScheduleTask;
import com.android.tv.dvr.provider.AsyncDvrDbTask.AsyncUpdateSeriesRecordingTask;
-import com.android.tv.dvr.provider.DvrDbSync;
-import com.android.tv.dvr.recorder.SeriesRecordingScheduler;
import com.android.tv.util.AsyncDbTask;
import com.android.tv.util.AsyncDbTask.AsyncRecordedProgramQueryTask;
import com.android.tv.util.Clock;
@@ -273,14 +267,11 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
removeScheduledRecording(ScheduledRecording.toArray(toDelete));
}
IdGenerator.SCHEDULED_RECORDING.setMaxId(maxId);
- if (mRecordedProgramLoadFinished) {
- validateSeriesRecordings();
- }
mDvrLoadFinished = true;
notifyDvrScheduleLoadFinished();
+ mDbSync = new DvrDbSync(mContext, DvrDataManagerImpl.this);
+ mDbSync.start();
if (isInitialized()) {
- mDbSync = new DvrDbSync(mContext, DvrDataManagerImpl.this);
- mDbSync.start();
SeriesRecordingScheduler.getInstance(mContext).start();
}
}
@@ -315,9 +306,6 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
if (uri == null) {
uri = RecordedPrograms.CONTENT_URI;
}
- if (recordedPrograms == null) {
- recordedPrograms = Collections.emptyList();
- }
int match = TvProviderUriMatcher.match(uri);
if (match == TvProviderUriMatcher.MATCH_RECORDED_PROGRAM) {
if (!mRecordedProgramLoadFinished) {
@@ -330,11 +318,7 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
}
mRecordedProgramLoadFinished = true;
notifyRecordedProgramLoadFinished();
- if (isInitialized()) {
- mDbSync = new DvrDbSync(mContext, DvrDataManagerImpl.this);
- mDbSync.start();
- }
- } else if (recordedPrograms.isEmpty()) {
+ } else if (recordedPrograms == null || recordedPrograms.isEmpty()) {
List<RecordedProgram> oldRecordedPrograms =
new ArrayList<>(mRecordedPrograms.values());
mRecordedPrograms.clear();
@@ -371,7 +355,6 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
}
}
if (isInitialized()) {
- validateSeriesRecordings();
SeriesRecordingScheduler.getInstance(mContext).start();
}
} else if (match == TvProviderUriMatcher.MATCH_RECORDED_PROGRAM_ID) {
@@ -380,15 +363,11 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
}
long id = ContentUris.parseId(uri);
if (DEBUG) Log.d(TAG, "changed recorded program #" + id + " to " + recordedPrograms);
- if (recordedPrograms.isEmpty()) {
+ if (recordedPrograms == null || recordedPrograms.isEmpty()) {
mRecordedProgramsForRemovedInput.remove(id);
RecordedProgram old = mRecordedPrograms.remove(id);
if (old != null) {
notifyRecordedProgramsRemoved(old);
- SeriesRecording r = mSeriesId2SeriesRecordings.get(old.getSeriesId());
- if (r != null && isEmptySeriesRecording(r)) {
- removeSeriesRecording(r);
- }
}
} else {
RecordedProgram recordedProgram = recordedPrograms.get(0);
@@ -613,16 +592,10 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
public void removeScheduledRecording(boolean forceRemove, ScheduledRecording... schedules) {
List<ScheduledRecording> schedulesToDelete = new ArrayList<>();
List<ScheduledRecording> schedulesNotToDelete = new ArrayList<>();
- Set<Long> seriesRecordingIdsToCheck = new HashSet<>();
for (ScheduledRecording r : schedules) {
mScheduledRecordings.remove(r.getId());
- getDeletedScheduleMap().remove(r.getProgramId());
+ getDeletedScheduleMap().remove(r.getId());
mProgramId2ScheduledRecordings.remove(r.getProgramId());
- if (r.getSeriesRecordingId() != SeriesRecording.ID_NOT_SET
- && (r.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED
- || r.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS)) {
- seriesRecordingIdsToCheck.add(r.getSeriesRecordingId());
- }
boolean isScheduleForRemovedInput =
mScheduledRecordingsForRemovedInput.remove(r.getProgramId()) != null;
// If it belongs to the series recording and it's not started yet, just mark delete
@@ -641,19 +614,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
}
}
if (mDvrLoadFinished) {
- if (mRecordedProgramLoadFinished) {
- checkAndRemoveEmptySeriesRecording(seriesRecordingIdsToCheck);
- }
notifyScheduledRecordingRemoved(schedules);
}
- Iterator<ScheduledRecording> iterator = schedulesNotToDelete.iterator();
- while (iterator.hasNext()) {
- ScheduledRecording r = iterator.next();
- if (!mSeriesRecordings.containsKey(r.getSeriesRecordingId())) {
- iterator.remove();
- schedulesToDelete.add(r);
- }
- }
if (!schedulesToDelete.isEmpty()) {
new AsyncDeleteScheduleTask(mContext).executeOnDbThread(
ScheduledRecording.toArray(schedulesToDelete));
@@ -707,7 +669,6 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
private void updateScheduledRecording(boolean updateDb, final ScheduledRecording... schedules) {
List<ScheduledRecording> toUpdate = new ArrayList<>();
- Set<Long> seriesRecordingIdsToCheck = new HashSet<>();
for (ScheduledRecording r : schedules) {
if (!SoftPreconditions.checkState(mScheduledRecordings.containsKey(r.getId()), TAG,
"Recording not found for: " + r)) {
@@ -730,13 +691,6 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
if (programId != ScheduledRecording.ID_NOT_SET) {
mProgramId2ScheduledRecordings.put(programId, r);
}
- if (r.getState() == ScheduledRecording.STATE_RECORDING_FAILED
- && r.getSeriesRecordingId() != SeriesRecording.ID_NOT_SET) {
- // If the scheduled recording is failed, it may cause the automatically generated
- // series recording for this schedule becomes invalid (with no future schedules and
- // past recordings.) We should check and remove these series recordings.
- seriesRecordingIdsToCheck.add(r.getSeriesRecordingId());
- }
}
if (toUpdate.isEmpty()) {
return;
@@ -748,17 +702,12 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
if (updateDb) {
new AsyncUpdateScheduleTask(mContext).executeOnDbThread(scheduleArray);
}
- checkAndRemoveEmptySeriesRecording(seriesRecordingIdsToCheck);
removeDeletedSchedules(schedules);
}
@Override
public void updateSeriesRecording(final SeriesRecording... seriesRecordings) {
for (SeriesRecording r : seriesRecordings) {
- if (!SoftPreconditions.checkArgument(mSeriesRecordings.containsKey(r.getId()), TAG,
- "Non Existing Series ID: " + r)) {
- continue;
- }
SeriesRecording old1 = mSeriesRecordings.put(r.getId(), r);
SeriesRecording old2 = mSeriesId2SeriesRecordings.put(r.getSeriesId(), r);
SoftPreconditions.checkArgument(old1.equals(old2), TAG, "Series ID cannot be"
@@ -820,6 +769,14 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
return r.getInputId().equals(inputId);
}
});
+ List<SeriesRecording> movedSeriesRecordings =
+ moveElements(mSeriesRecordingsForRemovedInput, mSeriesRecordings,
+ new Filter<SeriesRecording>() {
+ @Override
+ public boolean filter(SeriesRecording r) {
+ return r.getInputId().equals(inputId);
+ }
+ });
List<RecordedProgram> movedRecordedPrograms =
moveElements(mRecordedProgramsForRemovedInput, mRecordedPrograms,
new Filter<RecordedProgram>() {
@@ -828,21 +785,6 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
return r.getInputId().equals(inputId);
}
});
- List<SeriesRecording> removedSeriesRecordings = new ArrayList<>();
- List<SeriesRecording> movedSeriesRecordings =
- moveElements(mSeriesRecordingsForRemovedInput, mSeriesRecordings,
- new Filter<SeriesRecording>() {
- @Override
- public boolean filter(SeriesRecording r) {
- if (r.getInputId().equals(inputId)) {
- if (!isEmptySeriesRecording(r)) {
- return true;
- }
- removedSeriesRecordings.add(r);
- }
- return false;
- }
- });
if (!movedSchedules.isEmpty()) {
for (ScheduledRecording schedule : movedSchedules) {
mProgramId2ScheduledRecordings.put(schedule.getProgramId(), schedule);
@@ -853,11 +795,6 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
mSeriesId2SeriesRecordings.put(seriesRecording.getSeriesId(), seriesRecording);
}
}
- for (SeriesRecording r : removedSeriesRecordings) {
- mSeriesRecordingsForRemovedInput.remove(r.getId());
- }
- new AsyncDeleteSeriesRecordingTask(mContext).executeOnDbThread(
- SeriesRecording.toArray(removedSeriesRecordings));
// Notify after all the data are moved.
if (!movedSchedules.isEmpty()) {
notifyScheduledRecordingAdded(ScheduledRecording.toArray(movedSchedules));
@@ -874,20 +811,20 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
if (DEBUG) Log.d(TAG, "hideInput " + inputId);
List<ScheduledRecording> movedSchedules =
moveElements(mScheduledRecordings, mScheduledRecordingsForRemovedInput,
- new Filter<ScheduledRecording>() {
- @Override
- public boolean filter(ScheduledRecording r) {
- return r.getInputId().equals(inputId);
- }
- });
+ new Filter<ScheduledRecording>() {
+ @Override
+ public boolean filter(ScheduledRecording r) {
+ return r.getInputId().equals(inputId);
+ }
+ });
List<SeriesRecording> movedSeriesRecordings =
moveElements(mSeriesRecordings, mSeriesRecordingsForRemovedInput,
- new Filter<SeriesRecording>() {
- @Override
- public boolean filter(SeriesRecording r) {
- return r.getInputId().equals(inputId);
- }
- });
+ new Filter<SeriesRecording>() {
+ @Override
+ public boolean filter(SeriesRecording r) {
+ return r.getInputId().equals(inputId);
+ }
+ });
List<RecordedProgram> movedRecordedPrograms =
moveElements(mRecordedPrograms, mRecordedProgramsForRemovedInput,
new Filter<RecordedProgram>() {
@@ -918,15 +855,6 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
}
}
- private void checkAndRemoveEmptySeriesRecording(Set<Long> seriesRecordingIds) {
- int i = 0;
- long[] rIds = new long[seriesRecordingIds.size()];
- for (long rId : seriesRecordingIds) {
- rIds[i++] = rId;
- }
- checkAndRemoveEmptySeriesRecording(rIds);
- }
-
@Override
public void forgetStorage(String inputId) {
List<ScheduledRecording> schedulesToDelete = new ArrayList<>();
@@ -973,25 +901,6 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
}.executeOnDbThread();
}
- private void validateSeriesRecordings() {
- Iterator<SeriesRecording> iter = mSeriesRecordings.values().iterator();
- List<SeriesRecording> removedSeriesRecordings = new ArrayList<>();
- while (iter.hasNext()) {
- SeriesRecording r = iter.next();
- if (isEmptySeriesRecording(r)) {
- iter.remove();
- removedSeriesRecordings.add(r);
- }
- }
- if (!removedSeriesRecordings.isEmpty()) {
- SeriesRecording[] removed = SeriesRecording.toArray(removedSeriesRecordings);
- new AsyncDeleteSeriesRecordingTask(mContext).executeOnDbThread(removed);
- if (mDvrLoadFinished) {
- notifySeriesRecordingRemoved(removed);
- }
- }
- }
-
private final class RecordedProgramsQueryTask extends AsyncRecordedProgramQueryTask {
private final Uri mUri;
diff --git a/src/com/android/tv/dvr/provider/DvrDbSync.java b/src/com/android/tv/dvr/DvrDbSync.java
index 8a0c2d19..df181455 100644
--- a/src/com/android/tv/dvr/provider/DvrDbSync.java
+++ b/src/com/android/tv/dvr/DvrDbSync.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.provider;
+package com.android.tv.dvr;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
@@ -34,11 +34,6 @@ import com.android.tv.TvApplication;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.Program;
import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
-import com.android.tv.dvr.DvrDataManagerImpl;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.recorder.SeriesRecordingScheduler;
import com.android.tv.util.AsyncDbTask.AsyncQueryProgramTask;
import com.android.tv.util.TvProviderUriMatcher;
@@ -62,12 +57,11 @@ import java.util.Set;
*/
@MainThread
@TargetApi(Build.VERSION_CODES.N)
-public class DvrDbSync {
+class DvrDbSync {
private static final String TAG = "DvrDbSync";
private static final boolean DEBUG = false;
private final Context mContext;
- private final DvrManager mDvrManager;
private final DvrDataManagerImpl mDataManager;
private final ChannelDataManager mChannelDataManager;
private final Queue<Long> mProgramIdQueue = new LinkedList<>();
@@ -135,21 +129,17 @@ public class DvrDbSync {
}
};
- public DvrDbSync(Context context, DvrDataManagerImpl dataManager) {
- this(context, dataManager, TvApplication.getSingletons(context).getChannelDataManager(),
- TvApplication.getSingletons(context).getDvrManager(),
- SeriesRecordingScheduler.getInstance(context));
+ DvrDbSync(Context context, DvrDataManagerImpl dataManager) {
+ this(context, dataManager, TvApplication.getSingletons(context).getChannelDataManager());
}
@VisibleForTesting
DvrDbSync(Context context, DvrDataManagerImpl dataManager,
- ChannelDataManager channelDataManager, DvrManager dvrManager,
- SeriesRecordingScheduler seriesRecordingScheduler) {
+ ChannelDataManager channelDataManager) {
mContext = context;
- mDvrManager = dvrManager;
mDataManager = dataManager;
mChannelDataManager = channelDataManager;
- mSeriesRecordingScheduler = seriesRecordingScheduler;
+ mSeriesRecordingScheduler = SeriesRecordingScheduler.getInstance(context);
}
/**
@@ -289,9 +279,10 @@ public class DvrDbSync {
mDataManager.getSeriesRecording(program.getSeriesId());
if (seriesRecording == null) {
// The new program is episodic while the previous one isn't.
- SeriesRecording newSeriesRecording = mDvrManager.addSeriesRecording(
- program, Collections.singletonList(program),
- SeriesRecording.STATE_SERIES_STOPPED);
+ SeriesRecording newSeriesRecording = TvApplication.getSingletons(mContext)
+ .getDvrManager().addSeriesRecording(program,
+ Collections.singletonList(program),
+ SeriesRecording.STATE_SERIES_STOPPED);
builder.setSeriesRecordingId(newSeriesRecording.getId());
needUpdate = true;
} else if (seriesRecording.getId() != schedule.getSeriesRecordingId()) {
@@ -315,9 +306,8 @@ public class DvrDbSync {
// Old program belongs to a series but the new one doesn't.
seriesRecordingsToUpdate.add(seriesRecordingForOldSchedule);
}
- // Change start time only when the recording is not started yet.
- boolean needToChangeStartTime =
- schedule.getState() != ScheduledRecording.STATE_RECORDING_IN_PROGRESS
+ // Change start time only when the recording start time has not passed.
+ boolean needToChangeStartTime = schedule.getStartTimeMs() > currentTimeMs
&& program.getStartTimeUtcMillis() != schedule.getStartTimeMs();
if (needToChangeStartTime) {
builder.setStartTimeMs(program.getStartTimeUtcMillis());
diff --git a/src/com/android/tv/dvr/DvrManager.java b/src/com/android/tv/dvr/DvrManager.java
index 2effe9cf..5fa6f90f 100644
--- a/src/com/android/tv/dvr/DvrManager.java
+++ b/src/com/android/tv/dvr/DvrManager.java
@@ -46,9 +46,7 @@ import com.android.tv.data.Program;
import com.android.tv.dvr.DvrDataManager.OnRecordedProgramLoadFinishedListener;
import com.android.tv.dvr.DvrDataManager.RecordedProgramListener;
import com.android.tv.dvr.DvrScheduleManager.OnInitializeListener;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.SeriesRecording.SeriesState;
import com.android.tv.util.AsyncDbTask;
import com.android.tv.util.Utils;
@@ -236,7 +234,7 @@ public class DvrManager {
* Adds a new series recording and schedules for the programs with the initial state.
*/
public SeriesRecording addSeriesRecording(Program selectedProgram,
- List<Program> programsToSchedule, @SeriesRecording.SeriesState int initialState) {
+ List<Program> programsToSchedule, @SeriesState int initialState) {
Log.i(TAG, "Adding series recording for program " + selectedProgram + ", and schedules: "
+ programsToSchedule);
if (!SoftPreconditions.checkState(mDataManager.isInitialized())) {
@@ -310,7 +308,8 @@ public class DvrManager {
ScheduledRecording scheduleWithSameProgram =
mDataManager.getScheduledRecordingForProgramId(program.getId());
if (scheduleWithSameProgram != null) {
- if (scheduleWithSameProgram.isNotStarted()) {
+ if (scheduleWithSameProgram.getState()
+ == ScheduledRecording.STATE_RECORDING_NOT_STARTED) {
ScheduledRecording r = ScheduledRecording.buildFrom(scheduleWithSameProgram)
.setSeriesRecordingId(series.getId())
.build();
@@ -338,10 +337,10 @@ public class DvrManager {
*/
public void updateSeriesRecording(SeriesRecording series) {
if (SoftPreconditions.checkState(mDataManager.isDvrScheduleLoadFinished())) {
+ SeriesRecordingScheduler scheduler = SeriesRecordingScheduler.getInstance(mAppContext);
+ scheduler.pauseUpdate();
SeriesRecording previousSeries = mDataManager.getSeriesRecording(series.getId());
if (previousSeries != null) {
- // If the channel option of series changed, remove the existing schedules. The new
- // schedules will be added by SeriesRecordingScheduler or by SeriesSettingsFragment.
if (previousSeries.getChannelOption() != series.getChannelOption()
|| (previousSeries.getChannelOption() == SeriesRecording.OPTION_CHANNEL_ONE
&& previousSeries.getChannelId() != series.getChannelId())) {
@@ -351,18 +350,6 @@ public class DvrManager {
for (ScheduledRecording schedule : schedules) {
if (schedule.isNotStarted()) {
schedulesToRemove.add(schedule);
- } else if (schedule.isInProgress()
- && series.getChannelOption() == SeriesRecording.OPTION_CHANNEL_ONE
- && schedule.getChannelId() != series.getChannelId()) {
- stopRecording(schedule);
- }
- }
- List<ScheduledRecording> deletedSchedules =
- new ArrayList<>(mDataManager.getDeletedSchedules());
- for (ScheduledRecording deletedSchedule : deletedSchedules) {
- if (deletedSchedule.getSeriesRecordingId() == series.getId()
- && deletedSchedule.getEndTimeMs() > System.currentTimeMillis()) {
- schedulesToRemove.add(deletedSchedule);
}
}
mDataManager.removeScheduledRecording(true,
@@ -376,7 +363,7 @@ public class DvrManager {
List<ScheduledRecording> schedulesToUpdate = new ArrayList<>();
for (ScheduledRecording schedule
: mDataManager.getScheduledRecordings(series.getId())) {
- if (schedule.isNotStarted() || schedule.isInProgress()) {
+ if (schedule.isNotStarted()) {
schedulesToUpdate.add(ScheduledRecording.buildFrom(schedule)
.setPriority(priority).build());
}
@@ -386,6 +373,7 @@ public class DvrManager {
ScheduledRecording.toArray(schedulesToUpdate));
}
}
+ scheduler.resumeUpdate();
}
}
@@ -412,6 +400,33 @@ public class DvrManager {
}
/**
+ * Returns true, if the series recording can be removed. If a series recording is NORMAL state
+ * or has recordings or schedules, it cannot be removed.
+ */
+ public boolean canRemoveSeriesRecording(long seriesRecordingId) {
+ SeriesRecording seriesRecording = mDataManager.getSeriesRecording(seriesRecordingId);
+ if (seriesRecording == null) {
+ return false;
+ }
+ if (!seriesRecording.isStopped()) {
+ return false;
+ }
+ for (ScheduledRecording r : mDataManager.getAvailableScheduledRecordings()) {
+ if (r.getSeriesRecordingId() == seriesRecordingId) {
+ return false;
+ }
+ }
+ String seriesId = seriesRecording.getSeriesId();
+ SoftPreconditions.checkNotNull(seriesId);
+ for (RecordedProgram r : mDataManager.getRecordedPrograms()) {
+ if (seriesId.equals(r.getSeriesId())) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
* Stops the currently recorded program
*/
public void stopRecording(final ScheduledRecording recording) {
@@ -642,9 +657,6 @@ public class DvrManager {
if (!mDataManager.isDvrScheduleLoadFinished() || channel == null) {
return false;
}
- if (channel.isRecordingProhibited()) {
- return false;
- }
TvInputInfo info = Utils.getTvInputInfoForChannelId(mAppContext, channel.getId());
if (info == null) {
Log.w(TAG, "Could not find TvInputInfo for " + channel);
@@ -668,12 +680,7 @@ public class DvrManager {
if (!mDataManager.isInitialized()) {
return false;
}
- Channel channel = TvApplication.getSingletons(mAppContext).getChannelDataManager()
- .getChannel(program.getChannelId());
- if (channel == null || channel.isRecordingProhibited()) {
- return false;
- }
- TvInputInfo info = Utils.getTvInputInfoForChannelId(mAppContext, channel.getId());
+ TvInputInfo info = Utils.getTvInputInfoForProgram(mAppContext, program);
if (info == null) {
Log.w(TAG, "Could not find TvInputInfo for " + program);
return false;
@@ -726,17 +733,6 @@ public class DvrManager {
return mDataManager.getSeriesRecording(program.getSeriesId());
}
- /**
- * Returns if there are valid items. Valid item contains {@link RecordedProgram},
- * available {@link ScheduledRecording} and {@link SeriesRecording}.
- */
- public boolean hasValidItems() {
- return !(mDataManager.getRecordedPrograms().isEmpty()
- && mDataManager.getStartedRecordings().isEmpty()
- && mDataManager.getNonStartedScheduledRecordings().isEmpty()
- && mDataManager.getSeriesRecordings().isEmpty());
- }
-
@WorkerThread
@VisibleForTesting
// Should be public to use mock DvrManager object.
@@ -844,10 +840,9 @@ public class DvrManager {
}
/**
- * Listener to stop recording request. Should only be internally used inside dvr and its
- * sub-package.
+ * Listener internally used inside dvr package.
*/
- public interface Listener {
+ interface Listener {
void onStopRecordingRequested(ScheduledRecording scheduledRecording);
}
}
diff --git a/src/com/android/tv/dvr/ui/playback/DvrPlaybackActivity.java b/src/com/android/tv/dvr/DvrPlaybackActivity.java
index 2437d1f5..5deda44a 100644
--- a/src/com/android/tv/dvr/ui/playback/DvrPlaybackActivity.java
+++ b/src/com/android/tv/dvr/DvrPlaybackActivity.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.playback;
+package com.android.tv.dvr;
import android.app.Activity;
import android.content.Intent;
@@ -24,7 +24,7 @@ import android.util.Log;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.dvr.data.RecordedProgram;
+import com.android.tv.dvr.ui.DvrPlaybackOverlayFragment;
/**
* Activity to play a {@link RecordedProgram}.
diff --git a/src/com/android/tv/dvr/ui/playback/DvrPlaybackMediaSessionHelper.java b/src/com/android/tv/dvr/DvrPlaybackMediaSessionHelper.java
index 843d2dbe..9759a856 100644
--- a/src/com/android/tv/dvr/ui/playback/DvrPlaybackMediaSessionHelper.java
+++ b/src/com/android/tv/dvr/DvrPlaybackMediaSessionHelper.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.playback;
+package com.android.tv.dvr;
import android.app.Activity;
import android.content.Intent;
@@ -31,16 +31,14 @@ import android.text.TextUtils;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
-import com.android.tv.dvr.DvrWatchedPositionManager;
-import com.android.tv.dvr.data.RecordedProgram;
+import com.android.tv.dvr.ui.DvrPlaybackOverlayFragment;
import com.android.tv.util.ImageLoader;
import com.android.tv.util.TimeShiftUtils;
import com.android.tv.util.Utils;
-class DvrPlaybackMediaSessionHelper {
+public class DvrPlaybackMediaSessionHelper {
private static final String TAG = "DvrPlaybackMediaSessionHelper";
private static final boolean DEBUG = false;
@@ -104,7 +102,6 @@ class DvrPlaybackMediaSessionHelper {
}
if (mMediaSession != null) {
mMediaSession.release();
- mMediaSession = null;
}
}
@@ -182,88 +179,83 @@ class DvrPlaybackMediaSessionHelper {
cardTitleText = (channel != null) ? channel.getDisplayName()
: mActivity.getString(R.string.no_program_information);
}
- final MediaMetadata currentMetadata = updateMetadataTextInfo(program.getId(), cardTitleText,
- program.getDescription(), mProgramDurationMs);
+ updateMediaMetadata(program.getId(), cardTitleText, program.getDescription(),
+ mProgramDurationMs, null, 0);
String posterArtUri = program.getPosterArtUri();
if (posterArtUri == null) {
posterArtUri = TvContract.buildChannelLogoUri(program.getChannelId()).toString();
}
- updatePosterArt(program, currentMetadata, null, posterArtUri);
+ updatePosterArt(program, cardTitleText, program.getDescription(),
+ mProgramDurationMs, null, posterArtUri);
mMediaSession.setActive(true);
}
- private void updatePosterArt(RecordedProgram program, MediaMetadata currentMetadata,
+ private void updatePosterArt(RecordedProgram program, String cardTitleText,
+ String cardSubtitleText, long duration,
@Nullable Bitmap posterArt, @Nullable String posterArtUri) {
if (posterArt != null) {
- updateMetadataImageInfo(program, currentMetadata, posterArt, 0);
+ updateMediaMetadata(program.getId(), cardTitleText,
+ cardSubtitleText, duration, posterArt, 0);
} else if (posterArtUri != null) {
ImageLoader.loadBitmap(mActivity, posterArtUri, mNowPlayingCardWidth,
- mNowPlayingCardHeight,
- new ProgramPosterArtCallback(mActivity, program, currentMetadata));
+ mNowPlayingCardHeight, new ProgramPosterArtCallback(
+ mActivity, program, cardTitleText, cardSubtitleText, duration));
} else {
- updateMetadataImageInfo(program, currentMetadata, null, R.drawable.default_now_card);
+ updateMediaMetadata(program.getId(), cardTitleText,
+ cardSubtitleText, duration, null, R.drawable.default_now_card);
}
}
private class ProgramPosterArtCallback extends
ImageLoader.ImageLoaderCallback<Activity> {
- private final RecordedProgram mRecordedProgram;
- private final MediaMetadata mCurrentMetadata;
+ private RecordedProgram mRecordedProgram;
+ private String mCardTitleText;
+ private String mCardSubtitleText;
+ private long mDuration;
public ProgramPosterArtCallback(Activity activity, RecordedProgram program,
- MediaMetadata metadata) {
+ String cardTitleText, String cardSubtitleText, long duration) {
super(activity);
mRecordedProgram = program;
- mCurrentMetadata = metadata;
+ mCardTitleText = cardTitleText;
+ mCardSubtitleText = cardSubtitleText;
+ mDuration = duration;
}
@Override
public void onBitmapLoaded(Activity activity, @Nullable Bitmap posterArt) {
if (isCurrentProgram(mRecordedProgram)) {
- updatePosterArt(mRecordedProgram, mCurrentMetadata, posterArt, null);
+ updatePosterArt(mRecordedProgram, mCardTitleText,
+ mCardSubtitleText, mDuration, posterArt, null);
}
}
}
- private MediaMetadata updateMetadataTextInfo(final long programId, final String title,
- final String subtitle, final long duration) {
- MediaMetadata.Builder builder = new MediaMetadata.Builder();
- builder.putString(MediaMetadata.METADATA_KEY_MEDIA_ID, Long.toString(programId))
- .putString(MediaMetadata.METADATA_KEY_TITLE, title)
- .putLong(MediaMetadata.METADATA_KEY_DURATION, duration);
- if (subtitle != null) {
- builder.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, subtitle);
- }
- MediaMetadata metadata = builder.build();
- mMediaSession.setMetadata(metadata);
- return metadata;
- }
-
- private void updateMetadataImageInfo(final RecordedProgram program,
- final MediaMetadata currentMetadata, final Bitmap posterArt, final int imageResId) {
- if (mMediaSession != null && (posterArt != null || imageResId != 0)) {
- MediaMetadata.Builder builder = new MediaMetadata.Builder(currentMetadata);
- if (posterArt != null) {
- builder.putBitmap(MediaMetadata.METADATA_KEY_ART, posterArt);
+ private void updateMediaMetadata(final long programId, final String title,
+ final String subtitle, final long duration,
+ final Bitmap posterArt, final int imageResId) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... arg0) {
+ MediaMetadata.Builder builder = new MediaMetadata.Builder();
+ builder.putLong(MediaMetadata.METADATA_KEY_MEDIA_ID, programId)
+ .putString(MediaMetadata.METADATA_KEY_TITLE, title)
+ .putLong(MediaMetadata.METADATA_KEY_DURATION, duration);
+ if (subtitle != null) {
+ builder.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, subtitle);
+ }
+ Bitmap programPosterArt = posterArt;
+ if (programPosterArt == null && imageResId != 0) {
+ programPosterArt =
+ BitmapFactory.decodeResource(mActivity.getResources(), imageResId);
+ }
+ if (programPosterArt != null) {
+ builder.putBitmap(MediaMetadata.METADATA_KEY_ART, programPosterArt);
+ }
mMediaSession.setMetadata(builder.build());
- } else {
- new AsyncTask<Void, Void, Bitmap>() {
- @Override
- protected Bitmap doInBackground(Void... arg0) {
- return BitmapFactory.decodeResource(mActivity.getResources(), imageResId);
- }
-
- @Override
- protected void onPostExecute(Bitmap programPosterArt) {
- if (mMediaSession != null && programPosterArt != null
- && isCurrentProgram(program)) {
- builder.putBitmap(MediaMetadata.METADATA_KEY_ART, programPosterArt);
- mMediaSession.setMetadata(builder.build());
- }
- }
- }.execute();
+ return null;
}
- }
+ }.execute();
}
// An event was triggered by MediaController.TransportControls and must be handled here.
diff --git a/src/com/android/tv/dvr/ui/playback/DvrPlayer.java b/src/com/android/tv/dvr/DvrPlayer.java
index 780bfb2f..5656655c 100644
--- a/src/com/android/tv/dvr/ui/playback/DvrPlayer.java
+++ b/src/com/android/tv/dvr/DvrPlayer.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.playback;
+package com.android.tv.dvr;
import android.media.PlaybackParams;
import android.media.tv.TvContentRating;
@@ -22,16 +22,12 @@ import android.media.tv.TvInputManager;
import android.media.tv.TvTrackInfo;
import android.media.tv.TvView;
import android.media.session.PlaybackState;
-import android.text.TextUtils;
import android.util.Log;
-import com.android.tv.dvr.data.RecordedProgram;
-
-import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
-class DvrPlayer {
+public class DvrPlayer {
private static final String TAG = "DvrPlayer";
private static final boolean DEBUG = false;
@@ -51,19 +47,12 @@ class DvrPlayer {
private long mInitialSeekPositionMs;
private final TvView mTvView;
private DvrPlayerCallback mCallback;
- private OnAspectRatioChangedListener mOnAspectRatioChangedListener;
- private OnContentBlockedListener mOnContentBlockedListener;
- private OnTracksAvailabilityChangedListener mOnTracksAvailabilityChangedListener;
- private OnTrackSelectedListener mOnAudioTrackSelectedListener;
- private OnTrackSelectedListener mOnSubtitleTrackSelectedListener;
- private String mSelectedAudioTrackId;
- private String mSelectedSubtitleTrackId;
+ private AspectRatioChangedListener mAspectRatioChangedListener;
+ private ContentBlockedListener mContentBlockedListener;
private float mAspectRatio = Float.NaN;
private int mPlaybackState = PlaybackState.STATE_NONE;
private long mTimeShiftCurrentPositionMs;
private boolean mPauseOnPrepared;
- private boolean mHasClosedCaption;
- private boolean mHasMultiAudio;
private final PlaybackParams mPlaybackParams = new PlaybackParams();
private final DvrPlayerCallback mEmptyCallback = new DvrPlayerCallback();
private long mStartPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
@@ -86,40 +75,22 @@ class DvrPlayer {
public void onPlaybackEnded() { }
}
- public interface OnAspectRatioChangedListener {
+ public interface AspectRatioChangedListener {
/**
* Called when the Video's aspect ratio is changed.
- *
- * @param videoAspectRatio The aspect ratio of video. 0 stands for unknown ratios.
- * Listeners should handle it carefully.
*/
void onAspectRatioChanged(float videoAspectRatio);
}
- public interface OnContentBlockedListener {
+ public interface ContentBlockedListener {
/**
* Called when the Video's aspect ratio is changed.
*/
void onContentBlocked(TvContentRating rating);
}
- public interface OnTracksAvailabilityChangedListener {
- /**
- * Called when the Video's subtitle or audio tracks are changed.
- */
- void onTracksAvailabilityChanged(boolean hasClosedCaption, boolean hasMultiAudio);
- }
-
- public interface OnTrackSelectedListener {
- /**
- * Called when certain subtitle or audio track is selected.
- */
- void onTrackSelected(String selectedTrackId);
- }
-
public DvrPlayer(TvView tvView) {
mTvView = tvView;
- mTvView.setCaptionEnabled(true);
mPlaybackParams.setSpeed(1.0f);
setTvViewCallbacks();
setCallback(null);
@@ -265,8 +236,6 @@ class DvrPlayer {
mTimeShiftCurrentPositionMs = 0;
mPlaybackParams.setSpeed(1.0f);
mProgram = null;
- mSelectedAudioTrackId = null;
- mSelectedSubtitleTrackId = null;
}
/**
@@ -281,51 +250,17 @@ class DvrPlayer {
}
/**
- * Sets the listener to aspect ratio changing.
- */
- public void setOnAspectRatioChangedListener(OnAspectRatioChangedListener listener) {
- mOnAspectRatioChangedListener = listener;
- }
-
- /**
- * Sets the listener to content blocking.
- */
- public void setOnContentBlockedListener(OnContentBlockedListener listener) {
- mOnContentBlockedListener = listener;
- }
-
- /**
- * Sets the listener to tracks changing.
- */
- public void setOnTracksAvailabilityChangedListener(
- OnTracksAvailabilityChangedListener listener) {
- mOnTracksAvailabilityChangedListener = listener;
- }
-
- /**
- * Sets the listener to tracks of the given type being selected.
- *
- * @param trackType should be either {@link TvTrackInfo#TYPE_AUDIO}
- * or {@link TvTrackInfo#TYPE_SUBTITLE}.
+ * Sets listener to aspect ratio changing.
*/
- public void setOnTrackSelectedListener(int trackType, OnTrackSelectedListener listener) {
- if (trackType == TvTrackInfo.TYPE_AUDIO) {
- mOnAudioTrackSelectedListener = listener;
- } else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
- mOnSubtitleTrackSelectedListener = listener;
- }
+ public void setAspectRatioChangedListener(AspectRatioChangedListener listener) {
+ mAspectRatioChangedListener = listener;
}
/**
- * Gets the listener to tracks of the given type being selected.
+ * Sets listener to content blocking.
*/
- public OnTrackSelectedListener getOnTrackSelectedListener(int trackType) {
- if (trackType == TvTrackInfo.TYPE_AUDIO) {
- return mOnAudioTrackSelectedListener;
- } else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
- return mOnSubtitleTrackSelectedListener;
- }
- return null;
+ public void setContentBlockedListener(ContentBlockedListener listener) {
+ mContentBlockedListener = listener;
}
/**
@@ -371,32 +306,6 @@ class DvrPlayer {
}
/**
- * Returns the subtitle tracks of the current playback.
- */
- public ArrayList<TvTrackInfo> getSubtitleTracks() {
- return new ArrayList<>(mTvView.getTracks(TvTrackInfo.TYPE_SUBTITLE));
- }
-
- /**
- * Returns the audio tracks of the current playback.
- */
- public ArrayList<TvTrackInfo> getAudioTracks() {
- return new ArrayList<>(mTvView.getTracks(TvTrackInfo.TYPE_AUDIO));
- }
-
- /**
- * Returns the ID of the selected track of the given type.
- */
- public String getSelectedTrackId(int trackType) {
- if (trackType == TvTrackInfo.TYPE_AUDIO) {
- return mSelectedAudioTrackId;
- } else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
- return mSelectedSubtitleTrackId;
- }
- return null;
- }
-
- /**
* Returns if playback of the recorded program is started.
*/
public boolean isPlaybackPrepared() {
@@ -404,41 +313,6 @@ class DvrPlayer {
&& mPlaybackState != PlaybackState.STATE_CONNECTING;
}
- /**
- * Selects the given track.
- *
- * @return ID of the selected track.
- */
- String selectTrack(int trackType, TvTrackInfo selectedTrack) {
- String oldSelectedTrackId = getSelectedTrackId(trackType);
- String newSelectedTrackId = selectedTrack == null ? null : selectedTrack.getId();
- if (!TextUtils.equals(oldSelectedTrackId, newSelectedTrackId)) {
- if (selectedTrack == null) {
- mTvView.selectTrack(trackType, null);
- return null;
- } else {
- List<TvTrackInfo> tracks = mTvView.getTracks(trackType);
- if (tracks != null && tracks.contains(selectedTrack)) {
- mTvView.selectTrack(trackType, newSelectedTrackId);
- return newSelectedTrackId;
- } else if (trackType == TvTrackInfo.TYPE_SUBTITLE && oldSelectedTrackId != null) {
- // Track not found, disabled closed caption.
- mTvView.selectTrack(trackType, null);
- return null;
- }
- }
- }
- return oldSelectedTrackId;
- }
-
- private void setSelectedTrackId(int trackType, String trackId) {
- if (trackType == TvTrackInfo.TYPE_AUDIO) {
- mSelectedAudioTrackId = trackId;
- } else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
- mSelectedSubtitleTrackId = trackId;
- }
- }
-
private void setPlaybackSpeed(int speed) {
mPlaybackParams.setSpeed(speed);
mTvView.timeShiftSetPlaybackParams(mPlaybackParams);
@@ -495,60 +369,28 @@ class DvrPlayer {
if (status == TvInputManager.TIME_SHIFT_STATUS_AVAILABLE
&& mPlaybackState == PlaybackState.STATE_CONNECTING) {
mTimeShiftPlayAvailable = true;
- if (mStartPositionMs != TvInputManager.TIME_SHIFT_INVALID_TIME) {
- // onTimeShiftStatusChanged is sometimes called after
- // onTimeShiftStartPositionChanged is called. In this case,
- // resumeToWatchedPositionIfNeeded needs to be called here.
- resumeToWatchedPositionIfNeeded();
- }
}
}
@Override
- public void onTracksChanged(String inputId, List<TvTrackInfo> tracks) {
- boolean hasClosedCaption =
- !mTvView.getTracks(TvTrackInfo.TYPE_SUBTITLE).isEmpty();
- boolean hasMultiAudio = mTvView.getTracks(TvTrackInfo.TYPE_AUDIO).size() > 1;
- if ((hasClosedCaption != mHasClosedCaption || hasMultiAudio != mHasMultiAudio)
- && mOnTracksAvailabilityChangedListener != null) {
- mOnTracksAvailabilityChangedListener
- .onTracksAvailabilityChanged(hasClosedCaption, hasMultiAudio);
- }
- mHasClosedCaption = hasClosedCaption;
- mHasMultiAudio = hasMultiAudio;
- }
-
- @Override
public void onTrackSelected(String inputId, int type, String trackId) {
- if (type == TvTrackInfo.TYPE_AUDIO || type == TvTrackInfo.TYPE_SUBTITLE) {
- setSelectedTrackId(type, trackId);
- OnTrackSelectedListener listener = getOnTrackSelectedListener(type);
- if (listener != null) {
- listener.onTrackSelected(trackId);
- }
- } else if (type == TvTrackInfo.TYPE_VIDEO && trackId != null
- && mOnAspectRatioChangedListener != null) {
- List<TvTrackInfo> trackInfos = mTvView.getTracks(TvTrackInfo.TYPE_VIDEO);
- if (trackInfos != null) {
- for (TvTrackInfo trackInfo : trackInfos) {
- if (trackInfo.getId().equals(trackId)) {
- float videoAspectRatio;
- int videoWidth = trackInfo.getVideoWidth();
- int videoHeight = trackInfo.getVideoHeight();
- if (videoWidth > 0 && videoHeight > 0) {
- videoAspectRatio = trackInfo.getVideoPixelAspectRatio()
- * trackInfo.getVideoWidth() / trackInfo.getVideoHeight();
- } else {
- // Aspect ratio is unknown. Pass the message to listeners.
- videoAspectRatio = 0;
- }
- if (DEBUG) Log.d(TAG, "Aspect Ratio: " + videoAspectRatio);
- if (mAspectRatio != videoAspectRatio || videoAspectRatio == 0) {
- mOnAspectRatioChangedListener
- .onAspectRatioChanged(videoAspectRatio);
- mAspectRatio = videoAspectRatio;
- return;
- }
+ if (trackId == null || type != TvTrackInfo.TYPE_VIDEO
+ || mAspectRatioChangedListener == null) {
+ return;
+ }
+ List<TvTrackInfo> trackInfos = mTvView.getTracks(TvTrackInfo.TYPE_VIDEO);
+ if (trackInfos != null) {
+ for (TvTrackInfo trackInfo : trackInfos) {
+ if (trackInfo.getId().equals(trackId)) {
+ float videoAspectRatio = trackInfo.getVideoPixelAspectRatio()
+ * trackInfo.getVideoWidth() / trackInfo.getVideoHeight();
+ if (DEBUG) Log.d(TAG, "Aspect Ratio: " + videoAspectRatio);
+ if (!Float.isNaN(videoAspectRatio)
+ && mAspectRatio != videoAspectRatio) {
+ mAspectRatioChangedListener
+ .onAspectRatioChanged(videoAspectRatio);
+ mAspectRatio = videoAspectRatio;
+ return;
}
}
}
@@ -557,8 +399,8 @@ class DvrPlayer {
@Override
public void onContentBlocked(String inputId, TvContentRating rating) {
- if (mOnContentBlockedListener != null) {
- mOnContentBlockedListener.onContentBlocked(rating);
+ if (mContentBlockedListener != null) {
+ mContentBlockedListener.onContentBlocked(rating);
}
}
});
diff --git a/src/com/android/tv/dvr/recorder/DvrRecordingService.java b/src/com/android/tv/dvr/DvrRecordingService.java
index 08ffaf86..8c40aaa8 100644
--- a/src/com/android/tv/dvr/recorder/DvrRecordingService.java
+++ b/src/com/android/tv/dvr/DvrRecordingService.java
@@ -14,10 +14,9 @@
* limitations under the License
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import android.app.AlarmManager;
-import android.app.Notification;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
@@ -28,13 +27,9 @@ import android.support.annotation.VisibleForTesting;
import android.util.Log;
import com.android.tv.ApplicationSingletons;
-import com.android.tv.InputSessionManager;
-import com.android.tv.InputSessionManager.OnRecordingSessionChangeListener;
-import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.common.feature.CommonFeatures;
-import com.android.tv.dvr.WritableDvrDataManager;
import com.android.tv.util.Clock;
import com.android.tv.util.RecurringRunner;
@@ -57,8 +52,6 @@ public class DvrRecordingService extends Service {
private static final boolean DEBUG = false;
public static final String HANDLER_THREAD_NAME = "DvrRecordingService-handler";
- private static final int ONGOING_NOTIFICATION_ID = 1;
-
public static void startService(Context context) {
Intent dvrSchedulerIntent = new Intent(context, DvrRecordingService.class);
context.startService(dvrSchedulerIntent);
@@ -69,27 +62,6 @@ public class DvrRecordingService extends Service {
private Scheduler mScheduler;
private HandlerThread mHandlerThread;
- private InputSessionManager mSessionManager;
- private boolean mForeground;
-
- private final OnRecordingSessionChangeListener mOnRecordingSessionChangeListener =
- new OnRecordingSessionChangeListener() {
- @Override
- public void onRecordingSessionChange(final boolean create, final int count) {
- if (create && !mForeground) {
- Notification notification =
- new Notification.Builder(getApplicationContext())
- .setContentTitle(TAG)
- .setSmallIcon(R.drawable.ic_dvr)
- .build();
- startForeground(ONGOING_NOTIFICATION_ID, notification);
- mForeground = true;
- } else if (!create && mForeground && count == 0) {
- stopForeground(STOP_FOREGROUND_REMOVE);
- mForeground = false;
- }
- }
- };
@Override
public void onCreate() {
@@ -98,11 +70,8 @@ public class DvrRecordingService extends Service {
super.onCreate();
SoftPreconditions.checkFeatureEnabled(this, CommonFeatures.DVR, TAG);
ApplicationSingletons singletons = TvApplication.getSingletons(this);
- WritableDvrDataManager dataManager =
- (WritableDvrDataManager) singletons.getDvrDataManager();
- mSessionManager = singletons.getInputSessionManager();
+ WritableDvrDataManager dataManager = (WritableDvrDataManager) singletons.getDvrDataManager();
- mSessionManager.addOnRecordingSessionChangeListener(mOnRecordingSessionChangeListener);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
// mScheduler may have been set for testing.
if (mScheduler == null) {
@@ -136,7 +105,6 @@ public class DvrRecordingService extends Service {
mHandlerThread.quitSafely();
mHandlerThread = null;
}
- mSessionManager.removeRecordingSessionChangeListener(mOnRecordingSessionChangeListener);
super.onDestroy();
}
diff --git a/src/com/android/tv/dvr/DvrScheduleManager.java b/src/com/android/tv/dvr/DvrScheduleManager.java
index b72117aa..a5851a75 100644
--- a/src/com/android/tv/dvr/DvrScheduleManager.java
+++ b/src/com/android/tv/dvr/DvrScheduleManager.java
@@ -24,6 +24,7 @@ import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.util.ArraySet;
+import android.util.LongSparseArray;
import android.util.Range;
import com.android.tv.ApplicationSingletons;
@@ -34,10 +35,7 @@ import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.Program;
import com.android.tv.dvr.DvrDataManager.OnDvrScheduleLoadFinishedListener;
import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
-import com.android.tv.dvr.recorder.InputTaskScheduler;
import com.android.tv.util.CompositeComparator;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
import com.android.tv.util.Utils;
import java.util.ArrayList;
@@ -90,8 +88,9 @@ public class DvrScheduleManager {
private final Map<String, List<ScheduledRecording>> mInputScheduleMap = new HashMap<>();
// The inner map is a hash map from scheduled recording to its conflicting status, i.e.,
// the boolean value true denotes the schedule is just partially conflicting, which means
- // although there's conflict, it might still be recorded partially.
- private final Map<String, Map<Long, ConflictInfo>> mInputConflictInfoMap = new HashMap<>();
+ // although there's conflictit, it might still be recorded partially.
+ private final Map<String, Map<ScheduledRecording, Boolean>> mInputConflictInfoMap =
+ new HashMap<>();
private boolean mInitialized;
@@ -172,9 +171,10 @@ public class DvrScheduleManager {
mInputScheduleMap.remove(inputId);
}
}
- Map<Long, ConflictInfo> conflictInfo = mInputConflictInfoMap.get(inputId);
+ Map<ScheduledRecording, Boolean> conflictInfo =
+ mInputConflictInfoMap.get(inputId);
if (conflictInfo != null) {
- conflictInfo.remove(schedule.getId());
+ conflictInfo.remove(schedule);
if (conflictInfo.isEmpty()) {
mInputConflictInfoMap.remove(inputId);
}
@@ -221,11 +221,21 @@ public class DvrScheduleManager {
mInputScheduleMap.remove(inputId);
}
// Update conflict list as well
- Map<Long, ConflictInfo> conflictInfo = mInputConflictInfoMap.get(inputId);
+ Map<ScheduledRecording, Boolean> conflictInfo =
+ mInputConflictInfoMap.get(inputId);
if (conflictInfo != null) {
- ConflictInfo oldConflictInfo = conflictInfo.get(schedule.getId());
- if (oldConflictInfo != null) {
- oldConflictInfo.schedule = schedule;
+ // Compare ID because ScheduledRecording.equals() doesn't work if the state
+ // is changed.
+ ScheduledRecording oldSchedule = null;
+ for (ScheduledRecording s : conflictInfo.keySet()) {
+ if (s.getId() == schedule.getId()) {
+ oldSchedule = s;
+ break;
+ }
+ }
+ if (oldSchedule != null) {
+ conflictInfo.put(schedule, conflictInfo.get(oldSchedule));
+ conflictInfo.remove(oldSchedule);
}
}
}
@@ -307,25 +317,24 @@ public class DvrScheduleManager {
List<ScheduledRecording> addedConflicts = new ArrayList<>();
List<ScheduledRecording> removedConflicts = new ArrayList<>();
for (String inputId : mInputScheduleMap.keySet()) {
- Map<Long, ConflictInfo> oldConflictInfo = mInputConflictInfoMap.get(inputId);
+ Map<ScheduledRecording, Boolean> oldConflictsInfo = mInputConflictInfoMap.get(inputId);
Map<Long, ScheduledRecording> oldConflictMap = new HashMap<>();
- if (oldConflictInfo != null) {
- for (ConflictInfo conflictInfo : oldConflictInfo.values()) {
- oldConflictMap.put(conflictInfo.schedule.getId(), conflictInfo.schedule);
+ if (oldConflictsInfo != null) {
+ for (ScheduledRecording r : oldConflictsInfo.keySet()) {
+ oldConflictMap.put(r.getId(), r);
}
}
- List<ConflictInfo> conflicts = getConflictingSchedulesInfo(inputId);
- if (conflicts.isEmpty()) {
+ Map<ScheduledRecording, Boolean> conflictInfo = getConflictingSchedulesInfo(inputId);
+ if (conflictInfo.isEmpty()) {
mInputConflictInfoMap.remove(inputId);
} else {
- Map<Long, ConflictInfo> conflictInfos = new HashMap<>();
- for (ConflictInfo conflictInfo : conflicts) {
- conflictInfos.put(conflictInfo.schedule.getId(), conflictInfo);
- if (oldConflictMap.remove(conflictInfo.schedule.getId()) == null) {
- addedConflicts.add(conflictInfo.schedule);
+ mInputConflictInfoMap.put(inputId, conflictInfo);
+ List<ScheduledRecording> conflicts = new ArrayList<>(conflictInfo.keySet());
+ for (ScheduledRecording r : conflicts) {
+ if (oldConflictMap.remove(r.getId()) == null) {
+ addedConflicts.add(r);
}
}
- mInputConflictInfoMap.put(inputId, conflictInfos);
}
removedConflicts.addAll(oldConflictMap.values());
}
@@ -556,7 +565,8 @@ public class DvrScheduleManager {
}
/**
- * Returns list of all conflicting scheduled recordings for the given {@code seriesRecording}
+ * Returns list of all conflicting scheduled recordings with schedules belonging to {@code
+ * seriesRecording}
* recording.
* <p>
* Any empty list means there is no conflicts.
@@ -571,18 +581,9 @@ public class DvrScheduleManager {
if (input == null || !input.canRecord() || input.getTunerCount() <= 0) {
return Collections.emptyList();
}
- List<ScheduledRecording> scheduledRecordingForSeries = mDataManager.getScheduledRecordings(
+ List<ScheduledRecording> schedulesForSeries = mDataManager.getScheduledRecordings(
seriesRecording.getId());
- List<ScheduledRecording> availableScheduledRecordingForSeries = new ArrayList<>();
- for (ScheduledRecording scheduledRecording : scheduledRecordingForSeries) {
- if (scheduledRecording.isNotStarted() || scheduledRecording.isInProgress()) {
- availableScheduledRecordingForSeries.add(scheduledRecording);
- }
- }
- if (availableScheduledRecordingForSeries.isEmpty()) {
- return Collections.emptyList();
- }
- return getConflictingSchedules(input, availableScheduledRecordingForSeries);
+ return getConflictingSchedules(input, schedulesForSeries);
}
/**
@@ -616,16 +617,16 @@ public class DvrScheduleManager {
* the given input.
*/
@NonNull
- private List<ConflictInfo> getConflictingSchedulesInfo(String inputId) {
+ private Map<ScheduledRecording, Boolean> getConflictingSchedulesInfo(String inputId) {
SoftPreconditions.checkState(mInitialized, TAG, "Not initialized yet");
TvInputInfo input = Utils.getTvInputInfoForInputId(mContext, inputId);
SoftPreconditions.checkState(input != null, TAG, "Can't find input for : " + inputId);
if (!mInitialized || input == null) {
- return Collections.emptyList();
+ return Collections.emptyMap();
}
List<ScheduledRecording> schedules = mInputScheduleMap.get(input.getId());
if (schedules == null || schedules.isEmpty()) {
- return Collections.emptyList();
+ return Collections.emptyMap();
}
return getConflictingSchedulesInfo(schedules, input.getTunerCount());
}
@@ -644,8 +645,8 @@ public class DvrScheduleManager {
if (!mInitialized || input == null) {
return false;
}
- Map<Long, ConflictInfo> conflicts = mInputConflictInfoMap.get(input.getId());
- return conflicts != null && conflicts.containsKey(schedule.getId());
+ Map<ScheduledRecording, Boolean> conflicts = mInputConflictInfoMap.get(input.getId());
+ return conflicts != null && conflicts.containsKey(schedule);
}
/**
@@ -663,12 +664,8 @@ public class DvrScheduleManager {
if (!mInitialized || input == null) {
return false;
}
- Map<Long, ConflictInfo> conflicts = mInputConflictInfoMap.get(input.getId());
- if (conflicts != null) {
- ConflictInfo conflictInfo = conflicts.get(schedule.getId());
- return conflictInfo != null && conflictInfo.partialConflict;
- }
- return false;
+ Map<ScheduledRecording, Boolean> conflicts = mInputConflictInfoMap.get(input.getId());
+ return conflicts != null && conflicts.getOrDefault(schedule, false);
}
/**
@@ -816,17 +813,15 @@ public class DvrScheduleManager {
@VisibleForTesting
static List<ScheduledRecording> getConflictingSchedules(
List<ScheduledRecording> schedules, int tunerCount, List<Range<Long>> periods) {
- List<ScheduledRecording> result = new ArrayList<>();
- for (ConflictInfo conflictInfo :
- getConflictingSchedulesInfo(schedules, tunerCount, periods)) {
- result.add(conflictInfo.schedule);
- }
+ List<ScheduledRecording> result = new ArrayList<>(
+ getConflictingSchedulesInfo(schedules, tunerCount, periods).keySet());
+ Collections.sort(result, RESULT_COMPARATOR);
return result;
}
@VisibleForTesting
- static List<ConflictInfo> getConflictingSchedulesInfo(List<ScheduledRecording> schedules,
- int tunerCount) {
+ static Map<ScheduledRecording, Boolean> getConflictingSchedulesInfo(
+ List<ScheduledRecording> schedules, int tunerCount) {
return getConflictingSchedulesInfo(schedules, tunerCount, null);
}
@@ -841,13 +836,13 @@ public class DvrScheduleManager {
* to be partially recorded under the given schedules and tuner count {@code true},
* or not {@code false}.
*/
- private static List<ConflictInfo> getConflictingSchedulesInfo(
+ private static Map<ScheduledRecording, Boolean> getConflictingSchedulesInfo(
List<ScheduledRecording> schedules, int tunerCount, List<Range<Long>> periods) {
List<ScheduledRecording> schedulesToCheck = new ArrayList<>(schedules);
// Sort by the same order as that in InputTaskScheduler.
Collections.sort(schedulesToCheck, InputTaskScheduler.getRecordingOrderComparator());
List<ScheduledRecording> recordings = new ArrayList<>();
- Map<ScheduledRecording, ConflictInfo> conflicts = new HashMap<>();
+ Map<ScheduledRecording, Boolean> conflicts = new HashMap<>();
Map<ScheduledRecording, ScheduledRecording> modified2OriginalSchedules = new HashMap<>();
// Simulate InputTaskScheduler.
while (!schedulesToCheck.isEmpty()) {
@@ -858,29 +853,26 @@ public class DvrScheduleManager {
if (modified2OriginalSchedules.containsKey(schedule)) {
// Schedule has been modified, which means it's already conflicted.
// Modify its state to partially conflicted.
- ScheduledRecording originalSchedule = modified2OriginalSchedules.get(schedule);
- conflicts.put(originalSchedule, new ConflictInfo(originalSchedule, true));
+ conflicts.put(modified2OriginalSchedules.get(schedule), true);
}
} else {
ScheduledRecording candidate = findReplaceableRecording(recordings, schedule);
if (candidate != null) {
if (!modified2OriginalSchedules.containsKey(candidate)) {
- conflicts.put(candidate, new ConflictInfo(candidate, true));
+ conflicts.put(candidate, true);
}
recordings.remove(candidate);
recordings.add(schedule);
if (modified2OriginalSchedules.containsKey(schedule)) {
// Schedule has been modified, which means it's already conflicted.
// Modify its state to partially conflicted.
- ScheduledRecording originalSchedule =
- modified2OriginalSchedules.get(schedule);
- conflicts.put(originalSchedule, new ConflictInfo(originalSchedule, true));
+ conflicts.put(modified2OriginalSchedules.get(schedule), true);
}
} else {
if (!modified2OriginalSchedules.containsKey(schedule)) {
// if schedule has been modified, it's already conflicted.
// No need to add it again.
- conflicts.put(schedule, new ConflictInfo(schedule, false));
+ conflicts.put(schedule, false);
}
long earliestEndTime = getEarliestEndTime(recordings);
if (earliestEndTime < schedule.getEndTimeMs()) {
@@ -920,14 +912,7 @@ public class DvrScheduleManager {
}
}
}
- List<ConflictInfo> result = new ArrayList<>(conflicts.values());
- Collections.sort(result, new Comparator<ConflictInfo>() {
- @Override
- public int compare(ConflictInfo lhs, ConflictInfo rhs) {
- return RESULT_COMPARATOR.compare(lhs.schedule, rhs.schedule);
- }
- });
- return result;
+ return conflicts;
}
private static void removeFinishedRecordings(List<ScheduledRecording> recordings,
@@ -969,17 +954,6 @@ public class DvrScheduleManager {
return earliest;
}
- @VisibleForTesting
- static class ConflictInfo {
- public ScheduledRecording schedule;
- public boolean partialConflict;
-
- ConflictInfo(ScheduledRecording schedule, boolean partialConflict) {
- this.schedule = schedule;
- this.partialConflict = partialConflict;
- }
- }
-
/**
* A listener which is notified the initialization of schedule manager.
*/
@@ -996,9 +970,6 @@ public class DvrScheduleManager {
public interface OnConflictStateChangeListener {
/**
* Called when the conflicting schedules change.
- * <p>
- * Note that this can be called before
- * {@link ScheduledRecordingListener#onScheduledRecordingAdded} is called.
*
* @param conflict {@code true} if the {@code schedules} are the new conflicts, otherwise
* {@code false}.
diff --git a/src/com/android/tv/dvr/recorder/DvrStartRecordingReceiver.java b/src/com/android/tv/dvr/DvrStartRecordingReceiver.java
index 8c6ee145..6d2f0d43 100644
--- a/src/com/android/tv/dvr/recorder/DvrStartRecordingReceiver.java
+++ b/src/com/android/tv/dvr/DvrStartRecordingReceiver.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import com.android.tv.TvApplication;
diff --git a/src/com/android/tv/dvr/DvrStorageStatusManager.java b/src/com/android/tv/dvr/DvrStorageStatusManager.java
index 2d41d732..a653b5f4 100644
--- a/src/com/android/tv/dvr/DvrStorageStatusManager.java
+++ b/src/com/android/tv/dvr/DvrStorageStatusManager.java
@@ -25,7 +25,6 @@ import android.content.IntentFilter;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.media.tv.TvContract;
-import android.media.tv.TvInputInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
@@ -37,11 +36,8 @@ import android.support.annotation.IntDef;
import android.support.annotation.WorkerThread;
import android.util.Log;
-import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.common.feature.CommonFeatures;
-import com.android.tv.tuner.tvinput.TunerTvInputService;
-import com.android.tv.util.TvInputManagerHelper;
import com.android.tv.util.Utils;
import java.io.File;
@@ -298,7 +294,7 @@ public class DvrStorageStatusManager {
storageMounted, storageMountedDir, storageMountedCapacity);
}
- private class CleanUpDbTask extends AsyncTask<Void, Void, Boolean> {
+ private class CleanUpDbTask extends AsyncTask<Void, Void, Void> {
private final ContentResolver mContentResolver;
private CleanUpDbTask() {
@@ -306,15 +302,13 @@ public class DvrStorageStatusManager {
}
@Override
- protected Boolean doInBackground(Void... params) {
+ protected Void doInBackground(Void... params) {
@DvrStorageStatusManager.StorageStatus int storageStatus = getDvrStorageStatus();
if (storageStatus == DvrStorageStatusManager.STORAGE_STATUS_MISSING) {
return null;
}
- if (storageStatus == DvrStorageStatusManager.STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL) {
- return true;
- }
- List<ContentProviderOperation> ops = getDeleteOps();
+ List<ContentProviderOperation> ops = getDeleteOps(storageStatus
+ == DvrStorageStatusManager.STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL);
if (ops == null || ops.isEmpty()) {
return null;
}
@@ -335,28 +329,13 @@ public class DvrStorageStatusManager {
}
@Override
- protected void onPostExecute(Boolean forgetStorage) {
- if (forgetStorage != null && forgetStorage == true) {
- DvrManager dvrManager = TvApplication.getSingletons(mContext).getDvrManager();
- TvInputManagerHelper tvInputManagerHelper =
- TvApplication.getSingletons(mContext).getTvInputManagerHelper();
- List<TvInputInfo> tvInputInfoList =
- tvInputManagerHelper.getTvInputInfos(true, false);
- if (tvInputInfoList == null || tvInputInfoList.isEmpty()) {
- return;
- }
- for (TvInputInfo info : tvInputInfoList) {
- if (Utils.isBundledInput(info.getId())) {
- dvrManager.forgetStorage(info.getId());
- }
- }
- }
+ protected void onPostExecute(Void result) {
if (mCleanUpDbTask == this) {
mCleanUpDbTask = null;
}
}
- private List<ContentProviderOperation> getDeleteOps() {
+ private List<ContentProviderOperation> getDeleteOps(boolean deleteAll) {
List<ContentProviderOperation> ops = new ArrayList<>();
try (Cursor c = mContentResolver.query(
@@ -385,7 +364,7 @@ public class DvrStorageStatusManager {
continue;
}
File recordedProgramDir = new File(dataUri.getPath());
- if (!recordedProgramDir.exists()) {
+ if (deleteAll || !recordedProgramDir.exists()) {
ops.add(ContentProviderOperation.newDelete(
TvContract.buildRecordedProgramUri(Long.parseLong(id))).build());
}
diff --git a/src/com/android/tv/dvr/ui/DvrUiHelper.java b/src/com/android/tv/dvr/DvrUiHelper.java
index 507db6e7..c0d3b0c5 100644
--- a/src/com/android/tv/dvr/ui/DvrUiHelper.java
+++ b/src/com/android/tv/dvr/DvrUiHelper.java
@@ -14,21 +14,19 @@
* limitations under the License.
*/
-package com.android.tv.dvr.ui;
+package com.android.tv.dvr;
import android.annotation.TargetApi;
import android.app.Activity;
-import android.app.ProgressDialog;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.media.tv.TvInputManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.MainThread;
-import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityOptionsCompat;
+import android.text.TextUtils;
import android.widget.ImageView;
import android.widget.Toast;
@@ -38,36 +36,32 @@ import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
import com.android.tv.data.Program;
-import com.android.tv.dialog.HalfSizedDialogFragment;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.DvrStorageStatusManager;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.provider.EpisodicProgramLoadTask;
+import com.android.tv.dvr.ui.DvrDetailsActivity;
+import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrAlreadyRecordedDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrAlreadyScheduledDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrChannelRecordDurationOptionDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrChannelWatchConflictDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrInsufficientSpaceErrorDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrMissingStorageErrorDialogFragment;
-import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrNoFreeSpaceErrorDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrProgramConflictDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrScheduleDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrSmallSizedStorageErrorDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrStopRecordingDialogFragment;
-import com.android.tv.dvr.ui.browse.DvrBrowseActivity;
-import com.android.tv.dvr.ui.browse.DvrDetailsActivity;
-import com.android.tv.dvr.ui.list.DvrSchedulesActivity;
+import com.android.tv.dvr.ui.DvrSchedulesActivity;
+import com.android.tv.dvr.ui.DvrSeriesDeletionActivity;
+import com.android.tv.dvr.ui.DvrSeriesScheduledDialogActivity;
+import com.android.tv.dvr.ui.DvrSeriesSettingsActivity;
+import com.android.tv.dvr.ui.DvrStopRecordingFragment;
+import com.android.tv.dvr.ui.DvrStopSeriesRecordingDialogFragment;
+import com.android.tv.dvr.ui.DvrStopSeriesRecordingFragment;
+import com.android.tv.dvr.ui.HalfSizedDialogFragment;
import com.android.tv.dvr.ui.list.DvrSchedulesFragment;
import com.android.tv.dvr.ui.list.DvrSeriesSchedulesFragment;
-import com.android.tv.util.ToastUtils;
import com.android.tv.util.Utils;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.Set;
/**
* A helper class for DVR UI.
@@ -75,54 +69,94 @@ import java.util.Set;
@MainThread
@TargetApi(Build.VERSION_CODES.N)
public class DvrUiHelper {
- private static String TAG = "DvrUiHelper";
+ /**
+ * Handles the action to create the new schedule. It returns {@code true} if the schedule is
+ * added and there's no additional UI, otherwise {@code false}.
+ */
+ public static boolean handleCreateSchedule(MainActivity activity, Program program) {
+ if (program == null) {
+ return false;
+ }
+ DvrManager dvrManager = TvApplication.getSingletons(activity).getDvrManager();
+ if (!program.isEpisodic()) {
+ // One time recording.
+ dvrManager.addSchedule(program);
+ if (!dvrManager.getConflictingSchedules(program).isEmpty()) {
+ DvrUiHelper.showScheduleConflictDialog(activity, program);
+ return false;
+ }
+ } else {
+ SeriesRecording seriesRecording = dvrManager.getSeriesRecording(program);
+ if (seriesRecording == null || seriesRecording.isStopped()) {
+ DvrUiHelper.showScheduleDialog(activity, program);
+ return false;
+ } else {
+ // Show recorded program rather than the schedule.
+ RecordedProgram recordedProgram = dvrManager.getRecordedProgram(program.getTitle(),
+ program.getSeasonNumber(), program.getEpisodeNumber());
+ if (recordedProgram != null) {
+ DvrUiHelper.showAlreadyRecordedDialog(activity, program);
+ return false;
+ }
+ ScheduledRecording duplicate = dvrManager.getScheduledRecording(program.getTitle(),
+ program.getSeasonNumber(), program.getEpisodeNumber());
+ if (duplicate != null
+ && (duplicate.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED
+ || duplicate.getState()
+ == ScheduledRecording.STATE_RECORDING_IN_PROGRESS)) {
+ DvrUiHelper.showAlreadyScheduleDialog(activity, program);
+ return false;
+ }
+ // Just add the schedule.
+ dvrManager.addSchedule(program);
+ }
+ }
+ return true;
- private static ProgressDialog sProgressDialog = null;
+ }
/**
* Checks if the storage status is good for recording and shows error messages if needed.
*
- * @param recordingRequestRunnable if the storage status is OK to record or users choose to
- * perform the operation anyway, this Runnable will run.
+ * @return true if the storage status is fine to be recorded for {@code inputId}.
*/
- public static void checkStorageStatusAndShowErrorMessage(Activity activity, String inputId,
- Runnable recordingRequestRunnable) {
- if (Utils.isBundledInput(inputId)) {
- switch (TvApplication.getSingletons(activity).getDvrStorageStatusManager()
- .getDvrStorageStatus()) {
- case DvrStorageStatusManager.STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL:
- showDvrSmallSizedStorageErrorDialog(activity);
- return;
- case DvrStorageStatusManager.STORAGE_STATUS_MISSING:
- showDvrMissingStorageErrorDialog(activity);
- return;
- case DvrStorageStatusManager.STORAGE_STATUS_FREE_SPACE_INSUFFICIENT:
- showDvrNoFreeSpaceErrorDialog(activity, recordingRequestRunnable);
- return;
- }
+ public static boolean checkStorageStatusAndShowErrorMessage(Activity activity, String inputId) {
+ if (!Utils.isBundledInput(inputId)) {
+ return true;
+ }
+ DvrStorageStatusManager dvrStorageStatusManager =
+ TvApplication.getSingletons(activity).getDvrStorageStatusManager();
+ int status = dvrStorageStatusManager.getDvrStorageStatus();
+ if (status == DvrStorageStatusManager.STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL) {
+ showDvrSmallSizedStorageErrorDialog(activity);
+ return false;
+ } else if (status == DvrStorageStatusManager.STORAGE_STATUS_MISSING) {
+ showDvrMissingStorageErrorDialog(activity, inputId);
+ return false;
+ } else if (status == DvrStorageStatusManager.STORAGE_STATUS_FREE_SPACE_INSUFFICIENT) {
+ // TODO: handle insufficient storage case.
+ return true;
+ } else {
+ return true;
}
- recordingRequestRunnable.run();
}
/**
* Shows the schedule dialog.
*/
- public static void showScheduleDialog(Activity activity, Program program,
- boolean addCurrentProgramToSeries) {
+ public static void showScheduleDialog(MainActivity activity, Program program) {
if (SoftPreconditions.checkNotNull(program) == null) {
return;
}
Bundle args = new Bundle();
args.putParcelable(DvrHalfSizedDialogFragment.KEY_PROGRAM, program);
- args.putBoolean(DvrScheduleFragment.KEY_ADD_CURRENT_PROGRAM_TO_SERIES,
- addCurrentProgramToSeries);
showDialogFragment(activity, new DvrScheduleDialogFragment(), args, true, true);
}
/**
* Shows the recording duration options dialog.
*/
- public static void showChannelRecordDurationOptions(Activity activity, Channel channel) {
+ public static void showChannelRecordDurationOptions(MainActivity activity, Channel channel) {
if (SoftPreconditions.checkNotNull(channel) == null) {
return;
}
@@ -134,7 +168,7 @@ public class DvrUiHelper {
/**
* Shows the dialog which says that the new schedule conflicts with others.
*/
- public static void showScheduleConflictDialog(Activity activity, Program program) {
+ public static void showScheduleConflictDialog(MainActivity activity, Program program) {
if (program == null) {
return;
}
@@ -158,47 +192,20 @@ public class DvrUiHelper {
/**
* Shows DVR insufficient space error dialog.
*/
- public static void showDvrInsufficientSpaceErrorDialog(MainActivity activity,
- Set<String> failedScheduledRecordingInfoSet) {
- Bundle args = new Bundle();
- ArrayList<String> failedScheduledRecordingInfoArray =
- new ArrayList<>(failedScheduledRecordingInfoSet);
- args.putStringArrayList(DvrInsufficientSpaceErrorFragment.FAILED_SCHEDULED_RECORDING_INFOS,
- failedScheduledRecordingInfoArray);
- showDialogFragment(activity, new DvrInsufficientSpaceErrorDialogFragment(), args);
+ public static void showDvrInsufficientSpaceErrorDialog(MainActivity activity) {
+ showDialogFragment(activity, new DvrInsufficientSpaceErrorDialogFragment(), null);
Utils.clearRecordingFailedReason(activity,
TvInputManager.RECORDING_ERROR_INSUFFICIENT_SPACE);
- Utils.clearFailedScheduledRecordingInfoSet(activity);
- }
-
- /**
- * Shows DVR no free space error dialog.
- *
- * @param recordingRequestRunnable the recording request to be executed when users choose
- * {@link DvrGuidedStepFragment#ACTION_RECORD_ANYWAY}.
- */
- public static void showDvrNoFreeSpaceErrorDialog(Activity activity,
- Runnable recordingRequestRunnable) {
- DvrHalfSizedDialogFragment fragment = new DvrNoFreeSpaceErrorDialogFragment();
- fragment.setOnActionClickListener(new HalfSizedDialogFragment.OnActionClickListener() {
- @Override
- public void onActionClick(long actionId) {
- if (actionId == DvrGuidedStepFragment.ACTION_RECORD_ANYWAY) {
- recordingRequestRunnable.run();
- } else if (actionId == DvrGuidedStepFragment.ACTION_DELETE_RECORDINGS) {
- Intent intent = new Intent(activity, DvrBrowseActivity.class);
- activity.startActivity(intent);
- }
- }
- });
- showDialogFragment(activity, fragment, null);
}
/**
* Shows DVR missing storage error dialog.
*/
- private static void showDvrMissingStorageErrorDialog(Activity activity) {
- showDialogFragment(activity, new DvrMissingStorageErrorDialogFragment(), null);
+ private static void showDvrMissingStorageErrorDialog(Activity activity, String inputId) {
+ SoftPreconditions.checkArgument(!TextUtils.isEmpty(inputId));
+ Bundle args = new Bundle();
+ args.putString(DvrHalfSizedDialogFragment.KEY_INPUT_ID, inputId);
+ showDialogFragment(activity, new DvrMissingStorageErrorDialogFragment(), args);
}
/**
@@ -224,7 +231,7 @@ public class DvrUiHelper {
/**
* Shows "already scheduled" dialog.
*/
- public static void showAlreadyScheduleDialog(Activity activity, Program program) {
+ public static void showAlreadyScheduleDialog(MainActivity activity, Program program) {
if (program == null) {
return;
}
@@ -236,7 +243,7 @@ public class DvrUiHelper {
/**
* Shows "already recorded" dialog.
*/
- public static void showAlreadyRecordedDialog(Activity activity, Program program) {
+ public static void showAlreadyRecordedDialog(MainActivity activity, Program program) {
if (program == null) {
return;
}
@@ -245,87 +252,6 @@ public class DvrUiHelper {
showDialogFragment(activity, new DvrAlreadyRecordedDialogFragment(), args, false, true);
}
- /**
- * Handle the request of recording a current program. It will handle creating schedules and
- * shows the proper dialog and toast message respectively for timed-recording and program
- * recording cases.
- *
- * @param addProgramToSeries denotes whether the program to be recorded should be added into
- * the series recording when users choose to record the entire series.
- */
- public static void requestRecordingCurrentProgram(Activity activity,
- Channel channel, Program program, boolean addProgramToSeries) {
- if (program == null) {
- DvrUiHelper.showChannelRecordDurationOptions(activity, channel);
- } else if (DvrUiHelper.handleCreateSchedule(activity, program, addProgramToSeries)) {
- String msg = activity.getString(R.string.dvr_msg_current_program_scheduled,
- program.getTitle(), Utils.toTimeString(program.getEndTimeUtcMillis(), false));
- Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show();
- }
- }
-
- /**
- * Handle the request of recording a future program. It will handle creating schedules and
- * shows the proper toast message.
- *
- * @param addProgramToSeries denotes whether the program to be recorded should be added into
- * the series recording when users choose to record the entire series.
- */
- public static void requestRecordingFutureProgram(Activity activity,
- Program program, boolean addProgramToSeries) {
- if (DvrUiHelper.handleCreateSchedule(activity, program, addProgramToSeries)) {
- String msg = activity.getString(
- R.string.dvr_msg_program_scheduled, program.getTitle());
- ToastUtils.show(activity, msg, Toast.LENGTH_SHORT);
- }
- }
-
- /**
- * Handles the action to create the new schedule. It returns {@code true} if the schedule is
- * added and there's no additional UI, otherwise {@code false}.
- */
- private static boolean handleCreateSchedule(Activity activity, Program program,
- boolean addProgramToSeries) {
- if (program == null) {
- return false;
- }
- DvrManager dvrManager = TvApplication.getSingletons(activity).getDvrManager();
- if (!program.isEpisodic()) {
- // One time recording.
- dvrManager.addSchedule(program);
- if (!dvrManager.getConflictingSchedules(program).isEmpty()) {
- DvrUiHelper.showScheduleConflictDialog(activity, program);
- return false;
- }
- } else {
- // Show recorded program rather than the schedule.
- RecordedProgram recordedProgram = dvrManager.getRecordedProgram(program.getTitle(),
- program.getSeasonNumber(), program.getEpisodeNumber());
- if (recordedProgram != null) {
- DvrUiHelper.showAlreadyRecordedDialog(activity, program);
- return false;
- }
- ScheduledRecording duplicate = dvrManager.getScheduledRecording(program.getTitle(),
- program.getSeasonNumber(), program.getEpisodeNumber());
- if (duplicate != null
- && (duplicate.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED
- || duplicate.getState()
- == ScheduledRecording.STATE_RECORDING_IN_PROGRESS)) {
- DvrUiHelper.showAlreadyScheduleDialog(activity, program);
- return false;
- }
- SeriesRecording seriesRecording = dvrManager.getSeriesRecording(program);
- if (seriesRecording == null || seriesRecording.isStopped()) {
- DvrUiHelper.showScheduleDialog(activity, program, addProgramToSeries);
- return false;
- } else {
- // Just add the schedule.
- dvrManager.addSchedule(program);
- }
- }
- return true;
- }
-
private static void showDialogFragment(Activity activity,
DvrHalfSizedDialogFragment dialogFragment, Bundle args) {
showDialogFragment(activity, dialogFragment, args, false, false);
@@ -415,66 +341,19 @@ public class DvrUiHelper {
/**
* Shows the series settings activity.
*
- * @param programs list of programs which belong to the series.
+ * @param channelIds Channel ID list which has programs belonging to the series.
*/
public static void startSeriesSettingsActivity(Context context, long seriesRecordingId,
- @Nullable List<Program> programs, boolean removeEmptySeriesSchedule,
- boolean isWindowTranslucent, boolean showViewScheduleOptionInDialog,
- Program currentProgram) {
- SeriesRecording series = TvApplication.getSingletons(context).getDvrDataManager()
- .getSeriesRecording(seriesRecordingId);
- if (series == null) {
- return;
- }
- if (programs != null) {
- startSeriesSettingsActivityInternal(context, seriesRecordingId, programs,
- removeEmptySeriesSchedule, isWindowTranslucent,
- showViewScheduleOptionInDialog, currentProgram);
- } else {
- EpisodicProgramLoadTask episodicProgramLoadTask =
- new EpisodicProgramLoadTask(context, series) {
- @Override
- protected void onPostExecute(List<Program> loadedPrograms) {
- sProgressDialog.dismiss();
- sProgressDialog = null;
- startSeriesSettingsActivityInternal(context, seriesRecordingId,
- loadedPrograms == null ? Collections.EMPTY_LIST : loadedPrograms,
- removeEmptySeriesSchedule, isWindowTranslucent,
- showViewScheduleOptionInDialog, currentProgram);
- }
- }.setLoadCurrentProgram(true)
- .setLoadDisallowedProgram(true)
- .setLoadScheduledEpisode(true)
- .setIgnoreChannelOption(true);
- sProgressDialog = ProgressDialog.show(context, null, context.getString(
- R.string.dvr_series_progress_message_reading_programs), true, true,
- new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialogInterface) {
- episodicProgramLoadTask.cancel(true);
- sProgressDialog = null;
- }
- });
- episodicProgramLoadTask.execute();
- }
- }
-
- private static void startSeriesSettingsActivityInternal(Context context, long seriesRecordingId,
- @NonNull List<Program> programs, boolean removeEmptySeriesSchedule,
- boolean isWindowTranslucent, boolean showViewScheduleOptionInDialog,
- Program currentProgram) {
- SoftPreconditions.checkState(programs != null,
- TAG, "Start series settings activity but programs is null");
+ @Nullable long[] channelIds, boolean removeEmptySeriesSchedule,
+ boolean isWindowTranslucent, boolean showViewScheduleOptionInDialog) {
Intent intent = new Intent(context, DvrSeriesSettingsActivity.class);
intent.putExtra(DvrSeriesSettingsActivity.SERIES_RECORDING_ID, seriesRecordingId);
- BigArguments.reset();
- BigArguments.setArgument(DvrSeriesSettingsActivity.PROGRAM_LIST, programs);
+ intent.putExtra(DvrSeriesSettingsActivity.CHANNEL_ID_LIST, channelIds);
intent.putExtra(DvrSeriesSettingsActivity.REMOVE_EMPTY_SERIES_RECORDING,
removeEmptySeriesSchedule);
intent.putExtra(DvrSeriesSettingsActivity.IS_WINDOW_TRANSLUCENT, isWindowTranslucent);
intent.putExtra(DvrSeriesSettingsActivity.SHOW_VIEW_SCHEDULE_OPTION_IN_DIALOG,
showViewScheduleOptionInDialog);
- intent.putExtra(DvrSeriesSettingsActivity.CURRENT_PROGRAM, currentProgram);
context.startActivity(intent);
}
@@ -482,8 +361,7 @@ public class DvrUiHelper {
* Shows "series recording scheduled" dialog activity.
*/
public static void StartSeriesScheduledDialogActivity(Context context,
- SeriesRecording seriesRecording, boolean showViewScheduleOptionInDialog,
- List<Program> programs) {
+ SeriesRecording seriesRecording, boolean showViewScheduleOptionInDialog) {
if (seriesRecording == null) {
return;
}
@@ -492,9 +370,6 @@ public class DvrUiHelper {
seriesRecording.getId());
intent.putExtra(DvrSeriesScheduledDialogActivity.SHOW_VIEW_SCHEDULE_OPTION,
showViewScheduleOptionInDialog);
- BigArguments.reset();
- BigArguments.setArgument(DvrSeriesScheduledFragment.SERIES_SCHEDULED_KEY_PROGRAMS,
- programs);
context.startActivity(intent);
}
@@ -572,4 +447,4 @@ public class DvrUiHelper {
Utils.toTimeString(endTimeMs, false));
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/dvr/DvrWatchedPositionManager.java b/src/com/android/tv/dvr/DvrWatchedPositionManager.java
index dc05ed06..4eada742 100644
--- a/src/com/android/tv/dvr/DvrWatchedPositionManager.java
+++ b/src/com/android/tv/dvr/DvrWatchedPositionManager.java
@@ -22,7 +22,6 @@ import android.media.tv.TvInputManager;
import android.support.annotation.IntDef;
import com.android.tv.common.SharedPreferencesUtils;
-import com.android.tv.dvr.data.RecordedProgram;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/src/com/android/tv/dvr/provider/EpisodicProgramLoadTask.java b/src/com/android/tv/dvr/EpisodicProgramLoadTask.java
index ba0aca51..15ca2700 100644
--- a/src/com/android/tv/dvr/provider/EpisodicProgramLoadTask.java
+++ b/src/com/android/tv/dvr/EpisodicProgramLoadTask.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.provider;
+package com.android.tv.dvr;
import android.annotation.TargetApi;
import android.content.Context;
@@ -24,15 +24,13 @@ import android.media.tv.TvContract.Programs;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
import android.support.annotation.WorkerThread;
+import android.text.TextUtils;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Program;
-import com.android.tv.dvr.DvrDataManager;
-import com.android.tv.dvr.data.SeasonEpisodeNumber;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
import com.android.tv.util.AsyncDbTask.AsyncProgramQueryTask;
import com.android.tv.util.AsyncDbTask.CursorFilter;
import com.android.tv.util.PermissionUtils;
@@ -42,6 +40,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
@@ -254,13 +253,21 @@ abstract public class EpisodicProgramLoadTask {
return sqlParams;
}
+ @VisibleForTesting
+ static boolean isEpisodeScheduled(Collection<ScheduledEpisode> scheduledEpisodes,
+ ScheduledEpisode episode) {
+ // The episode whose season number or episode number is null will always be scheduled.
+ return scheduledEpisodes.contains(episode) && !TextUtils.isEmpty(episode.seasonNumber)
+ && !TextUtils.isEmpty(episode.episodeNumber);
+ }
+
/**
* Filter the programs which match the series recording. The episodes which the schedules are
* already created for are filtered out too.
*/
private class SeriesRecordingCursorFilter implements CursorFilter {
private final Set<Long> mDisallowedProgramIds = new HashSet<>();
- private final Set<SeasonEpisodeNumber> mSeasonEpisodeNumbers = new HashSet<>();
+ private final Set<ScheduledEpisode> mScheduledEpisodes = new HashSet<>();
SeriesRecordingCursorFilter(List<SeriesRecording> seriesRecordings) {
if (!mLoadDisallowedProgram) {
@@ -275,7 +282,7 @@ abstract public class EpisodicProgramLoadTask {
if (seriesRecordingIds.contains(r.getSeriesRecordingId())
&& r.getState() != ScheduledRecording.STATE_RECORDING_FAILED
&& r.getState() != ScheduledRecording.STATE_RECORDING_CLIPPED) {
- mSeasonEpisodeNumbers.add(new SeasonEpisodeNumber(r));
+ mScheduledEpisodes.add(new ScheduledEpisode(r));
}
}
}
@@ -299,9 +306,9 @@ abstract public class EpisodicProgramLoadTask {
}
if (programMatches) {
return mLoadScheduledEpisode
- || !mSeasonEpisodeNumbers.contains(new SeasonEpisodeNumber(
- seriesRecording.getId(), program.getSeasonNumber(),
- program.getEpisodeNumber()));
+ || !isEpisodeScheduled(mScheduledEpisodes, new ScheduledEpisode(
+ seriesRecording.getId(), program.getSeasonNumber(),
+ program.getEpisodeNumber()));
}
}
return false;
@@ -326,4 +333,50 @@ abstract public class EpisodicProgramLoadTask {
public String[] selectionArgs;
public CursorFilter filter;
}
+
+ /**
+ * A plain java object which includes the season/episode number for the series recording.
+ */
+ public static class ScheduledEpisode {
+ public final long seriesRecordingId;
+ public final String seasonNumber;
+ public final String episodeNumber;
+
+ /**
+ * Create a new Builder with the values set from an existing {@link ScheduledRecording}.
+ */
+ ScheduledEpisode(ScheduledRecording r) {
+ this(r.getSeriesRecordingId(), r.getSeasonNumber(), r.getEpisodeNumber());
+ }
+
+ public ScheduledEpisode(long seriesRecordingId, String seasonNumber, String episodeNumber) {
+ this.seriesRecordingId = seriesRecordingId;
+ this.seasonNumber = seasonNumber;
+ this.episodeNumber = episodeNumber;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof ScheduledEpisode)) return false;
+ ScheduledEpisode that = (ScheduledEpisode) o;
+ return seriesRecordingId == that.seriesRecordingId
+ && Objects.equals(seasonNumber, that.seasonNumber)
+ && Objects.equals(episodeNumber, that.episodeNumber);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(seriesRecordingId, seasonNumber, episodeNumber);
+ }
+
+ @Override
+ public String toString() {
+ return "ScheduledEpisode{" +
+ "seriesRecordingId=" + seriesRecordingId +
+ ", seasonNumber='" + seasonNumber +
+ ", episodeNumber=" + episodeNumber +
+ '}';
+ }
+ }
}
diff --git a/src/com/android/tv/dvr/data/IdGenerator.java b/src/com/android/tv/dvr/IdGenerator.java
index 2ade1dad..0ed6362c 100644
--- a/src/com/android/tv/dvr/data/IdGenerator.java
+++ b/src/com/android/tv/dvr/IdGenerator.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.data;
+package com.android.tv.dvr;
import java.util.concurrent.atomic.AtomicLong;
diff --git a/src/com/android/tv/dvr/recorder/InputTaskScheduler.java b/src/com/android/tv/dvr/InputTaskScheduler.java
index 46546a76..53c89ebc 100644
--- a/src/com/android/tv/dvr/recorder/InputTaskScheduler.java
+++ b/src/com/android/tv/dvr/InputTaskScheduler.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import android.content.Context;
import android.media.tv.TvInputInfo;
@@ -30,10 +30,6 @@ import android.util.LongSparseArray;
import com.android.tv.InputSessionManager;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
-import com.android.tv.dvr.DvrDataManager;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.WritableDvrDataManager;
-import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.util.Clock;
import com.android.tv.util.CompositeComparator;
diff --git a/src/com/android/tv/dvr/data/RecordedProgram.java b/src/com/android/tv/dvr/RecordedProgram.java
index 18e1c769..dd744f80 100644
--- a/src/com/android/tv/dvr/data/RecordedProgram.java
+++ b/src/com/android/tv/dvr/RecordedProgram.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.data;
+package com.android.tv.dvr;
import static android.media.tv.TvContract.RecordedPrograms;
diff --git a/src/com/android/tv/dvr/recorder/RecordingTask.java b/src/com/android/tv/dvr/RecordingTask.java
index c3314dde..c3d236b0 100644
--- a/src/com/android/tv/dvr/recorder/RecordingTask.java
+++ b/src/com/android/tv/dvr/RecordingTask.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import android.annotation.TargetApi;
import android.content.Context;
@@ -37,10 +37,7 @@ import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.WritableDvrDataManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.recorder.InputTaskScheduler.HandlerWrapper;
+import com.android.tv.dvr.InputTaskScheduler.HandlerWrapper;
import com.android.tv.util.Clock;
import com.android.tv.util.Utils;
@@ -259,21 +256,13 @@ public class RecordingTask extends RecordingCallback implements Handler.Callback
public void run() {
if (TvApplication.getSingletons(mContext).getMainActivityWrapper()
.isResumed()) {
- ScheduledRecording scheduledRecording = mDataManager
- .getScheduledRecording(mScheduledRecording.getId());
- if (scheduledRecording != null) {
- Toast.makeText(mContext.getApplicationContext(),
- mContext.getString(R.string
- .dvr_error_insufficient_space_description_one_recording,
- scheduledRecording.getProgramDisplayTitle(mContext)),
- Toast.LENGTH_LONG)
- .show();
- }
+ Toast.makeText(mContext.getApplicationContext(),
+ R.string.dvr_error_insufficient_space_description,
+ Toast.LENGTH_LONG)
+ .show();
} else {
Utils.setRecordingFailedReason(mContext.getApplicationContext(),
TvInputManager.RECORDING_ERROR_INSUFFICIENT_SPACE);
- Utils.addFailedScheduledRecordingInfo(mContext.getApplicationContext(),
- mScheduledRecording.getProgramDisplayTitle(mContext));
}
}
});
diff --git a/src/com/android/tv/dvr/recorder/ScheduledProgramReaper.java b/src/com/android/tv/dvr/ScheduledProgramReaper.java
index d958c4a1..cd79a631 100644
--- a/src/com/android/tv/dvr/recorder/ScheduledProgramReaper.java
+++ b/src/com/android/tv/dvr/ScheduledProgramReaper.java
@@ -14,14 +14,11 @@
* limitations under the License.
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import android.support.annotation.MainThread;
import android.support.annotation.VisibleForTesting;
-import com.android.tv.dvr.WritableDvrDataManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
import com.android.tv.util.Clock;
import java.util.ArrayList;
diff --git a/src/com/android/tv/dvr/data/ScheduledRecording.java b/src/com/android/tv/dvr/ScheduledRecording.java
index 88849a2c..2bda10ea 100644
--- a/src/com/android/tv/dvr/data/ScheduledRecording.java
+++ b/src/com/android/tv/dvr/ScheduledRecording.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.data;
+package com.android.tv.dvr;
import android.content.ContentValues;
import android.content.Context;
@@ -27,11 +27,9 @@ import android.text.TextUtils;
import android.util.Range;
import com.android.tv.R;
-import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
import com.android.tv.data.Program;
-import com.android.tv.dvr.DvrScheduleManager;
import com.android.tv.dvr.provider.DvrContract.Schedules;
import com.android.tv.util.CompositeComparator;
import com.android.tv.util.Utils;
@@ -685,19 +683,6 @@ public final class ScheduledRecording implements Parcelable {
}
}
- /**
- * Returns the program's display title, if the program title is not null, returns program title.
- * Otherwise returns the channel name.
- */
- public String getProgramDisplayTitle(Context context) {
- if (!TextUtils.isEmpty(mProgramTitle)) {
- return mProgramTitle;
- }
- Channel channel = TvApplication.getSingletons(context).getChannelDataManager()
- .getChannel(mChannelId);
- return channel != null ? channel.getDisplayName()
- : context.getString(R.string.no_program_information);
- }
/**
* Converts a string to a @RecordingType int, defaulting to {@link #TYPE_TIMED}.
diff --git a/src/com/android/tv/dvr/recorder/Scheduler.java b/src/com/android/tv/dvr/Scheduler.java
index 19e73342..ce78e1be 100644
--- a/src/com/android/tv/dvr/recorder/Scheduler.java
+++ b/src/com/android/tv/dvr/Scheduler.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import android.app.AlarmManager;
import android.app.PendingIntent;
@@ -32,12 +32,8 @@ import android.util.Range;
import com.android.tv.InputSessionManager;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.ChannelDataManager.Listener;
-import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrDataManager.OnDvrScheduleLoadFinishedListener;
import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.WritableDvrDataManager;
-import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.util.Clock;
import com.android.tv.util.TvInputManagerHelper;
import com.android.tv.util.Utils;
diff --git a/src/com/android/tv/dvr/data/SeriesInfo.java b/src/com/android/tv/dvr/SeriesInfo.java
index a0dec4a4..30256dc5 100644
--- a/src/com/android/tv/dvr/data/SeriesInfo.java
+++ b/src/com/android/tv/dvr/SeriesInfo.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.data;
+package com.android.tv.dvr;
/**
* Series information.
diff --git a/src/com/android/tv/dvr/data/SeriesRecording.java b/src/com/android/tv/dvr/SeriesRecording.java
index b7cf0f66..f0690f5f 100644
--- a/src/com/android/tv/dvr/data/SeriesRecording.java
+++ b/src/com/android/tv/dvr/SeriesRecording.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.data;
+package com.android.tv.dvr;
import android.content.ContentValues;
import android.database.Cursor;
@@ -26,7 +26,6 @@ import android.text.TextUtils;
import com.android.tv.data.BaseProgram;
import com.android.tv.data.Program;
-import com.android.tv.dvr.DvrScheduleManager;
import com.android.tv.dvr.provider.DvrContract.SeriesRecordings;
import com.android.tv.util.Utils;
diff --git a/src/com/android/tv/dvr/recorder/SeriesRecordingScheduler.java b/src/com/android/tv/dvr/SeriesRecordingScheduler.java
index 8a211f66..5ed12ce8 100644
--- a/src/com/android/tv/dvr/recorder/SeriesRecordingScheduler.java
+++ b/src/com/android/tv/dvr/SeriesRecordingScheduler.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
@@ -23,6 +23,7 @@ import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Build;
import android.support.annotation.MainThread;
+import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
@@ -35,16 +36,9 @@ import com.android.tv.common.SharedPreferencesUtils;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Program;
import com.android.tv.data.epg.EpgFetcher;
-import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
import com.android.tv.dvr.DvrDataManager.SeriesRecordingListener;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.WritableDvrDataManager;
-import com.android.tv.dvr.data.SeasonEpisodeNumber;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesInfo;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.provider.EpisodicProgramLoadTask;
+import com.android.tv.dvr.EpisodicProgramLoadTask.ScheduledEpisode;
import com.android.tv.experiments.Experiments;
import java.util.ArrayList;
@@ -58,11 +52,11 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.CopyOnWriteArraySet;
import java.util.Set;
/**
- * Creates the {@link com.android.tv.dvr.data.ScheduledRecording}s for
- * the {@link com.android.tv.dvr.data.SeriesRecording}.
+ * Creates the {@link ScheduledRecording}s for the {@link SeriesRecording}.
* <p>
* The current implementation assumes that the series recordings are scheduled only for one channel.
*/
@@ -91,13 +85,15 @@ public class SeriesRecordingScheduler {
private final DvrManager mDvrManager;
private final WritableDvrDataManager mDataManager;
private final List<SeriesRecordingUpdateTask> mScheduleTasks = new ArrayList<>();
- private final LongSparseArray<FetchSeriesInfoTask> mFetchSeriesInfoTasks =
- new LongSparseArray<>();
+ private final List<FetchSeriesInfoTask> mFetchSeriesInfoTasks = new ArrayList<>();
private final Set<String> mFetchedSeriesIds = new ArraySet<>();
private final SharedPreferences mSharedPreferences;
private boolean mStarted;
private boolean mPaused;
private final Set<Long> mPendingSeriesRecordings = new ArraySet<>();
+ private final Set<OnSeriesRecordingUpdatedListener> mOnSeriesRecordingUpdatedListeners =
+ new CopyOnWriteArraySet<>();
+
private final SeriesRecordingListener mSeriesRecordingListener = new SeriesRecordingListener() {
@Override
@@ -111,7 +107,7 @@ public class SeriesRecordingScheduler {
public void onSeriesRecordingRemoved(SeriesRecording... seriesRecordings) {
// Cancel the update.
for (Iterator<SeriesRecordingUpdateTask> iter = mScheduleTasks.iterator();
- iter.hasNext(); ) {
+ iter.hasNext(); ) {
SeriesRecordingUpdateTask task = iter.next();
if (CollectionUtils.subtract(task.getSeriesRecordings(), seriesRecordings,
SeriesRecording.ID_COMPARATOR).isEmpty()) {
@@ -119,13 +115,6 @@ public class SeriesRecordingScheduler {
iter.remove();
}
}
- for (SeriesRecording seriesRecording : seriesRecordings) {
- FetchSeriesInfoTask task = mFetchSeriesInfoTasks.get(seriesRecording.getId());
- if (task != null) {
- task.cancel(true);
- mFetchSeriesInfoTasks.remove(seriesRecording.getId());
- }
- }
}
@Override
@@ -237,8 +226,7 @@ public class SeriesRecordingScheduler {
}
if (DEBUG) Log.d(TAG, "stop");
mStarted = false;
- for (int i = 0; i < mFetchSeriesInfoTasks.size(); i++) {
- FetchSeriesInfoTask task = mFetchSeriesInfoTasks.get(mFetchSeriesInfoTasks.keyAt(i));
+ for (FetchSeriesInfoTask task : mFetchSeriesInfoTasks) {
task.cancel(true);
}
mFetchSeriesInfoTasks.clear();
@@ -262,7 +250,7 @@ public class SeriesRecordingScheduler {
if (Experiments.CLOUD_EPG.get()) {
FetchSeriesInfoTask task = new FetchSeriesInfoTask(seriesRecording);
task.execute();
- mFetchSeriesInfoTasks.put(seriesRecording.getId(), task);
+ mFetchSeriesInfoTasks.add(task);
}
}
@@ -375,6 +363,20 @@ public class SeriesRecordingScheduler {
}
}
+ /**
+ * Adds {@link OnSeriesRecordingUpdatedListener}.
+ */
+ public void addOnSeriesRecordingUpdatedListener(OnSeriesRecordingUpdatedListener listener) {
+ mOnSeriesRecordingUpdatedListeners.add(listener);
+ }
+
+ /**
+ * Removes {@link OnSeriesRecordingUpdatedListener}.
+ */
+ public void removeOnSeriesRecordingUpdatedListener(OnSeriesRecordingUpdatedListener listener) {
+ mOnSeriesRecordingUpdatedListeners.remove(listener);
+ }
+
private boolean needToReadAllChannels(List<SeriesRecording> seriesRecordingsToUpdate) {
for (SeriesRecording seriesRecording : seriesRecordingsToUpdate) {
if (seriesRecording.getChannelOption() == SeriesRecording.OPTION_CHANNEL_ALL) {
@@ -401,7 +403,8 @@ public class SeriesRecordingScheduler {
/**
* @see #pickOneProgramPerEpisode(List, List)
*/
- public static LongSparseArray<List<Program>> pickOneProgramPerEpisode(
+ @VisibleForTesting
+ static LongSparseArray<List<Program>> pickOneProgramPerEpisode(
DvrDataManager dataManager, List<SeriesRecording> seriesRecordings,
List<Program> programs) {
// Initialize.
@@ -412,7 +415,7 @@ public class SeriesRecordingScheduler {
seriesRecordingIds.put(seriesRecording.getSeriesId(), seriesRecording.getId());
}
// Group programs by the episode.
- Map<SeasonEpisodeNumber, List<Program>> programsForEpisodeMap = new HashMap<>();
+ Map<ScheduledEpisode, List<Program>> programsForEpisodeMap = new HashMap<>();
for (Program program : programs) {
long seriesRecordingId = seriesRecordingIds.get(program.getSeriesId());
if (TextUtils.isEmpty(program.getSeasonNumber())
@@ -421,17 +424,17 @@ public class SeriesRecordingScheduler {
result.get(seriesRecordingId).add(program);
continue;
}
- SeasonEpisodeNumber seasonEpisodeNumber = new SeasonEpisodeNumber(seriesRecordingId,
+ ScheduledEpisode episode = new ScheduledEpisode(seriesRecordingId,
program.getSeasonNumber(), program.getEpisodeNumber());
- List<Program> programsForEpisode = programsForEpisodeMap.get(seasonEpisodeNumber);
+ List<Program> programsForEpisode = programsForEpisodeMap.get(episode);
if (programsForEpisode == null) {
programsForEpisode = new ArrayList<>();
- programsForEpisodeMap.put(seasonEpisodeNumber, programsForEpisode);
+ programsForEpisodeMap.put(episode, programsForEpisode);
}
programsForEpisode.add(program);
}
// Pick one program.
- for (Entry<SeasonEpisodeNumber, List<Program>> entry : programsForEpisodeMap.entrySet()) {
+ for (Entry<ScheduledEpisode, List<Program>> entry : programsForEpisodeMap.entrySet()) {
List<Program> programsForEpisode = entry.getValue();
Collections.sort(programsForEpisode, new Comparator<Program>() {
@Override
@@ -509,6 +512,13 @@ public class SeriesRecordingScheduler {
mDvrManager.addScheduleToSeriesRecording(seriesRecording, programsToSchedule);
}
}
+ if (!mOnSeriesRecordingUpdatedListeners.isEmpty()) {
+ for (OnSeriesRecordingUpdatedListener listener
+ : mOnSeriesRecordingUpdatedListeners) {
+ listener.onSeriesRecordingUpdated(
+ SeriesRecording.toArray(getSeriesRecordings()));
+ }
+ }
}
@Override
@@ -551,12 +561,19 @@ public class SeriesRecordingScheduler {
mFetchedSeriesIds.add(seriesInfo.getId());
updateFetchedSeries();
}
- mFetchSeriesInfoTasks.remove(mSeriesRecording.getId());
+ mFetchSeriesInfoTasks.remove(this);
}
@Override
protected void onCancelled(SeriesInfo seriesInfo) {
- mFetchSeriesInfoTasks.remove(mSeriesRecording.getId());
+ mFetchSeriesInfoTasks.remove(this);
}
}
+
+ /**
+ * A listener to notify when series recording are updated.
+ */
+ public interface OnSeriesRecordingUpdatedListener {
+ void onSeriesRecordingUpdated(SeriesRecording... seriesRecordings);
+ }
}
diff --git a/src/com/android/tv/dvr/WritableDvrDataManager.java b/src/com/android/tv/dvr/WritableDvrDataManager.java
index 129ba153..bf72d912 100644
--- a/src/com/android/tv/dvr/WritableDvrDataManager.java
+++ b/src/com/android/tv/dvr/WritableDvrDataManager.java
@@ -18,9 +18,7 @@ package com.android.tv.dvr;
import android.support.annotation.MainThread;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.ScheduledRecording.RecordingState;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.ScheduledRecording.RecordingState;
/**
* Full data manager.
@@ -29,7 +27,7 @@ import com.android.tv.dvr.data.SeriesRecording;
* for internal use only. Do not call them from UI directly.
*/
@MainThread
-public interface WritableDvrDataManager extends DvrDataManager {
+interface WritableDvrDataManager extends DvrDataManager {
/**
* Adds new recordings.
*/
diff --git a/src/com/android/tv/dvr/data/SeasonEpisodeNumber.java b/src/com/android/tv/dvr/data/SeasonEpisodeNumber.java
deleted file mode 100644
index 89533dbb..00000000
--- a/src/com/android/tv/dvr/data/SeasonEpisodeNumber.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.dvr.data;
-
-import android.text.TextUtils;
-
-import java.util.Objects;
-
-/**
- * A plain java object which includes the season/episode number for the series recording.
- */
-public class SeasonEpisodeNumber {
- public final long seriesRecordingId;
- public final String seasonNumber;
- public final String episodeNumber;
-
- /**
- * Creates a new Builder with the values set from an existing {@link ScheduledRecording}.
- */
- public SeasonEpisodeNumber(ScheduledRecording r) {
- this(r.getSeriesRecordingId(), r.getSeasonNumber(), r.getEpisodeNumber());
- }
-
- public SeasonEpisodeNumber(long seriesRecordingId, String seasonNumber, String episodeNumber) {
- this.seriesRecordingId = seriesRecordingId;
- this.seasonNumber = seasonNumber;
- this.episodeNumber = episodeNumber;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof SeasonEpisodeNumber)
- || TextUtils.isEmpty(seasonNumber) || TextUtils.isEmpty(episodeNumber)) {
- return false;
- }
- SeasonEpisodeNumber that = (SeasonEpisodeNumber) o;
- return seriesRecordingId == that.seriesRecordingId
- && Objects.equals(seasonNumber, that.seasonNumber)
- && Objects.equals(episodeNumber, that.episodeNumber);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(seriesRecordingId, seasonNumber, episodeNumber);
- }
-
- @Override
- public String toString() {
- return "SeasonEpisodeNumber{" +
- "seriesRecordingId=" + seriesRecordingId +
- ", seasonNumber='" + seasonNumber +
- ", episodeNumber=" + episodeNumber +
- '}';
- }
-} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/provider/AsyncDvrDbTask.java b/src/com/android/tv/dvr/provider/AsyncDvrDbTask.java
index c5383d02..1a12fb23 100644
--- a/src/com/android/tv/dvr/provider/AsyncDvrDbTask.java
+++ b/src/com/android/tv/dvr/provider/AsyncDvrDbTask.java
@@ -21,8 +21,8 @@ import android.database.Cursor;
import android.os.AsyncTask;
import android.support.annotation.Nullable;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
import com.android.tv.dvr.provider.DvrContract.Schedules;
import com.android.tv.dvr.provider.DvrContract.SeriesRecordings;
import com.android.tv.util.NamedThreadFactory;
diff --git a/src/com/android/tv/dvr/provider/DvrDatabaseHelper.java b/src/com/android/tv/dvr/provider/DvrDatabaseHelper.java
index 8b9481a9..2f16ba5d 100644
--- a/src/com/android/tv/dvr/provider/DvrDatabaseHelper.java
+++ b/src/com/android/tv/dvr/provider/DvrDatabaseHelper.java
@@ -27,8 +27,8 @@ import android.provider.BaseColumns;
import android.text.TextUtils;
import android.util.Log;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
import com.android.tv.dvr.provider.DvrContract.Schedules;
import com.android.tv.dvr.provider.DvrContract.SeriesRecordings;
diff --git a/src/com/android/tv/dvr/ui/browse/ActionPresenterSelector.java b/src/com/android/tv/dvr/ui/ActionPresenterSelector.java
index 38a78f5d..8b8cd5c5 100644
--- a/src/com/android/tv/dvr/ui/browse/ActionPresenterSelector.java
+++ b/src/com/android/tv/dvr/ui/ActionPresenterSelector.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.graphics.drawable.Drawable;
import android.support.v17.leanback.R;
@@ -110,7 +110,11 @@ class ActionPresenterSelector extends PresenterSelector {
.getDimensionPixelSize(R.dimen.lb_action_padding_horizontal);
vh.view.setPaddingRelative(padding, 0, padding, 0);
}
- vh.mButton.setCompoundDrawablesRelativeWithIntrinsicBounds(icon, null, null, null);
+ if (vh.mLayoutDirection == View.LAYOUT_DIRECTION_RTL) {
+ vh.mButton.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null);
+ } else {
+ vh.mButton.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
+ }
CharSequence line1 = action.getLabel1();
CharSequence line2 = action.getLabel2();
@@ -126,7 +130,7 @@ class ActionPresenterSelector extends PresenterSelector {
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
ActionViewHolder vh = (ActionViewHolder) viewHolder;
- vh.mButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, null, null);
+ vh.mButton.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
vh.view.setPadding(0, 0, 0, 0);
vh.mAction = null;
}
diff --git a/src/com/android/tv/dvr/ui/BigArguments.java b/src/com/android/tv/dvr/ui/BigArguments.java
deleted file mode 100644
index ec3b5065..00000000
--- a/src/com/android/tv/dvr/ui/BigArguments.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.dvr.ui;
-
-import android.support.annotation.NonNull;
-
-import com.android.tv.common.SoftPreconditions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Stores the object to pass through activities/fragments.
- */
-public class BigArguments {
- private final static String TAG = "BigArguments";
- private static Map<String, Object> sBigArgumentMap = new HashMap<>();
-
- /**
- * Sets the argument.
- */
- public static void setArgument(String name, @NonNull Object value) {
- SoftPreconditions.checkState(value != null, TAG, "Set argument, but value is null");
- sBigArgumentMap.put(name, value);
- }
-
- /**
- * Returns the argument which is associated to the name.
- */
- public static Object getArgument(String name) {
- return sBigArgumentMap.get(name);
- }
-
- /**
- * Resets the arguments.
- */
- public static void reset() {
- sBigArgumentMap.clear();
- }
-}
diff --git a/src/com/android/tv/dvr/ui/ChangeImageTransformWithScaledParent.java b/src/com/android/tv/dvr/ui/ChangeImageTransformWithScaledParent.java
deleted file mode 100644
index cddece73..00000000
--- a/src/com/android/tv/dvr/ui/ChangeImageTransformWithScaledParent.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.dvr.ui;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Matrix;
-import android.graphics.drawable.BitmapDrawable;
-import android.transition.ChangeImageTransform;
-import android.transition.TransitionValues;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-
-import com.android.tv.R;
-
-import java.util.Map;
-
-/**
- * TODO: Remove this class once b/32405620 is fixed.
- * This class is for the workaround of b/32405620 and only for the shared element transition between
- * {@link com.android.tv.dvr.ui.browse.RecordingCardView} and
- * {@link com.android.tv.dvr.ui.browse.DvrDetailsActivity}.
- */
-public class ChangeImageTransformWithScaledParent extends ChangeImageTransform {
- private static final String PROPNAME_MATRIX = "android:changeImageTransform:matrix";
-
- public ChangeImageTransformWithScaledParent(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- public void captureStartValues(TransitionValues transitionValues) {
- super.captureStartValues(transitionValues);
- applyParentScale(transitionValues);
- }
-
- @Override
- public void captureEndValues(TransitionValues transitionValues) {
- super.captureEndValues(transitionValues);
- applyParentScale(transitionValues);
- }
-
- private void applyParentScale(TransitionValues transitionValues) {
- View view = transitionValues.view;
- Map<String, Object> values = transitionValues.values;
- Matrix matrix = (Matrix) values.get(PROPNAME_MATRIX);
- if (matrix != null && view.getId() == R.id.details_overview_image
- && view instanceof ImageView) {
- ImageView imageView = (ImageView) view;
- if (imageView.getScaleType() == ScaleType.CENTER_INSIDE
- && imageView.getDrawable() instanceof BitmapDrawable) {
- Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
- if (bitmap.getWidth() < imageView.getWidth()
- && bitmap.getHeight() < imageView.getHeight()) {
- float scale = imageView.getContext().getResources().getFraction(
- R.fraction.lb_focus_zoom_factor_medium, 1, 1);
- matrix.postScale(scale, scale, imageView.getWidth() / 2,
- imageView.getHeight() / 2);
- }
- }
- }
- }
-}
diff --git a/src/com/android/tv/dvr/ui/CurrentRecordingDetailsFragment.java b/src/com/android/tv/dvr/ui/CurrentRecordingDetailsFragment.java
new file mode 100644
index 00000000..5d8e20ff
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/CurrentRecordingDetailsFragment.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tv.dvr.ui;
+
+import android.content.res.Resources;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.OnActionClickedListener;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+
+import com.android.tv.R;
+import com.android.tv.TvApplication;
+import com.android.tv.dvr.DvrManager;
+
+/**
+ * {@link RecordingDetailsFragment} for current recording in DVR.
+ */
+public class CurrentRecordingDetailsFragment extends RecordingDetailsFragment {
+ private static final int ACTION_STOP_RECORDING = 1;
+
+ @Override
+ protected SparseArrayObjectAdapter onCreateActionsAdapter() {
+ SparseArrayObjectAdapter adapter =
+ new SparseArrayObjectAdapter(new ActionPresenterSelector());
+ Resources res = getResources();
+ adapter.set(ACTION_STOP_RECORDING, new Action(ACTION_STOP_RECORDING,
+ res.getString(R.string.epg_dvr_dialog_message_stop_recording), null,
+ res.getDrawable(R.drawable.lb_ic_stop)));
+ return adapter;
+ }
+
+ @Override
+ protected OnActionClickedListener onCreateOnActionClickedListener() {
+ return new OnActionClickedListener() {
+ @Override
+ public void onActionClicked(Action action) {
+ if (action.getId() == ACTION_STOP_RECORDING) {
+ DvrManager dvrManager = TvApplication.getSingletons(getActivity())
+ .getDvrManager();
+ dvrManager.stopRecording(getRecording());
+ }
+ getActivity().finish();
+ }
+ };
+ }
+}
diff --git a/src/com/android/tv/dvr/ui/browse/DetailsContent.java b/src/com/android/tv/dvr/ui/DetailsContent.java
index b43d1f12..19521fca 100644
--- a/src/com/android/tv/dvr/ui/browse/DetailsContent.java
+++ b/src/com/android/tv/dvr/ui/DetailsContent.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.media.tv.TvContract;
import android.support.annotation.Nullable;
@@ -26,7 +26,7 @@ import com.android.tv.data.Channel;
/**
* A class for details content.
*/
-class DetailsContent {
+public class DetailsContent {
/** Constant for invalid time. */
public static final long INVALID_TIME = -1;
diff --git a/src/com/android/tv/dvr/ui/browse/DetailsContentPresenter.java b/src/com/android/tv/dvr/ui/DetailsContentPresenter.java
index a2e3fe16..175f05bc 100644
--- a/src/com/android/tv/dvr/ui/browse/DetailsContentPresenter.java
+++ b/src/com/android/tv/dvr/ui/DetailsContentPresenter.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.app.Activity;
import android.animation.Animator;
@@ -38,14 +38,13 @@ import com.android.tv.util.Utils;
/**
* An {@link Presenter} for rendering a detailed description of an DVR item.
- * Typically this Presenter will be used in a
- * {@link android.support.v17.leanback.widget.DetailsOverviewRowPresenter}.
+ * Typically this Presenter will be used in a {@link DetailsOverviewRowPresenter}.
* Most codes of this class is originated from
* {@link android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter}.
* The latter class are re-used to provide a customized version of
* {@link android.support.v17.leanback.widget.DetailsOverviewRow}.
*/
-class DetailsContentPresenter extends Presenter {
+public class DetailsContentPresenter extends Presenter {
/**
* The ViewHolder for the {@link DetailsContentPresenter}.
*/
@@ -114,20 +113,6 @@ class DetailsContentPresenter extends Presenter {
public ViewHolder(final View view) {
super(view);
- view.addOnAttachStateChangeListener(
- new View.OnAttachStateChangeListener() {
- @Override
- public void onViewAttachedToWindow(View v) {
- // In case predraw listener was removed in detach, make sure
- // we have the proper layout.
- addPreDrawListener();
- }
-
- @Override
- public void onViewDetachedFromWindow(View v) {
- removePreDrawListener();
- }
- });
mTitle = (TextView) view.findViewById(R.id.dvr_details_description_title);
mSubtitle = (TextView) view.findViewById(R.id.dvr_details_description_subtitle);
mBody = (TextView) view.findViewById(R.id.dvr_details_description_body);
@@ -291,6 +276,22 @@ class DetailsContentPresenter extends Presenter {
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { }
+ @Override
+ public void onViewAttachedToWindow(Presenter.ViewHolder holder) {
+ // In case predraw listener was removed in detach, make sure
+ // we have the proper layout.
+ ViewHolder vh = (ViewHolder) holder;
+ vh.addPreDrawListener();
+ super.onViewAttachedToWindow(holder);
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(Presenter.ViewHolder holder) {
+ ViewHolder vh = (ViewHolder) holder;
+ vh.removePreDrawListener();
+ super.onViewDetachedFromWindow(holder);
+ }
+
private void setTopMargin(View view, int topMargin) {
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
lp.topMargin = topMargin;
diff --git a/src/com/android/tv/dvr/ui/browse/DetailsViewBackgroundHelper.java b/src/com/android/tv/dvr/ui/DetailsViewBackgroundHelper.java
index 82fe9ce3..6714ecd3 100644
--- a/src/com/android/tv/dvr/ui/browse/DetailsViewBackgroundHelper.java
+++ b/src/com/android/tv/dvr/ui/DetailsViewBackgroundHelper.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
@@ -26,7 +26,7 @@ import android.support.v17.leanback.app.BackgroundManager;
/**
* The Background Helper.
*/
-class DetailsViewBackgroundHelper {
+public class DetailsViewBackgroundHelper {
// Background delay serves to avoid kicking off expensive bitmap loading
// in case multiple backgrounds are set in quick succession.
private static final int SET_BACKGROUND_DELAY_MS = 100;
diff --git a/src/com/android/tv/dvr/ui/browse/DvrBrowseActivity.java b/src/com/android/tv/dvr/ui/DvrActivity.java
index 2b3dcb25..45fb1cf1 100644
--- a/src/com/android/tv/dvr/ui/browse/DvrBrowseActivity.java
+++ b/src/com/android/tv/dvr/ui/DvrActivity.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.app.Activity;
import android.os.Bundle;
@@ -25,11 +25,11 @@ import com.android.tv.TvApplication;
/**
* {@link android.app.Activity} for DVR UI.
*/
-public class DvrBrowseActivity extends Activity {
+public class DvrActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
TvApplication.setCurrentRunningProcess(this, true);
super.onCreate(savedInstanceState);
setContentView(R.layout.dvr_main);
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java b/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java
index 936e9c31..9df228d1 100644
--- a/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java
@@ -28,9 +28,11 @@ import android.widget.Toast;
import com.android.tv.R;
import com.android.tv.TvApplication;
+import com.android.tv.dvr.RecordedProgram;
import com.android.tv.data.Program;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.RecordedProgram;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.util.Utils;
import java.util.List;
diff --git a/src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java b/src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java
index 3c73cb47..78f21784 100644
--- a/src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java
@@ -25,12 +25,15 @@ import android.support.annotation.NonNull;
import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
import android.support.v17.leanback.widget.GuidedAction;
import android.text.format.DateUtils;
+import android.widget.Toast;
import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.data.Program;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.util.Utils;
import java.util.List;
diff --git a/src/com/android/tv/dvr/ui/browse/DvrBrowseFragment.java b/src/com/android/tv/dvr/ui/DvrBrowseFragment.java
index 803d1017..a6dd31d1 100644
--- a/src/com/android/tv/dvr/ui/browse/DvrBrowseFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrBrowseFragment.java
@@ -14,9 +14,10 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.content.Context;
+import android.media.tv.TvInputManager.TvInputCallback;
import android.os.Bundle;
import android.os.Handler;
import android.support.v17.leanback.app.BrowseFragment;
@@ -24,11 +25,11 @@ import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ClassPresenterSelector;
import android.support.v17.leanback.widget.HeaderItem;
import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.Presenter;
import android.support.v17.leanback.widget.TitleViewAdapter;
+import android.text.TextUtils;
import android.util.Log;
-import android.view.View;
-import android.view.ViewTreeObserver.OnGlobalFocusChangeListener;
import com.android.tv.ApplicationSingletons;
import com.android.tv.R;
@@ -41,10 +42,9 @@ import com.android.tv.dvr.DvrDataManager.RecordedProgramListener;
import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
import com.android.tv.dvr.DvrDataManager.SeriesRecordingListener;
import com.android.tv.dvr.DvrScheduleManager;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.ui.SortedArrayAdapter;
+import com.android.tv.dvr.RecordedProgram;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
import java.util.ArrayList;
import java.util.Arrays;
@@ -79,20 +79,6 @@ public class DvrBrowseFragment extends BrowseFragment implements
private ClassPresenterSelector mPresenterSelector;
private final HashMap<String, RecordedProgram> mSeriesId2LatestProgram = new HashMap<>();
private final Handler mHandler = new Handler();
- private final OnGlobalFocusChangeListener mOnGlobalFocusChangeListener =
- new OnGlobalFocusChangeListener() {
- @Override
- public void onGlobalFocusChanged(View oldFocus, View newFocus) {
- if (oldFocus instanceof RecordingCardView) {
- ((RecordingCardView) oldFocus).expandTitle(false, true);
- }
- if (newFocus instanceof RecordingCardView) {
- // If the header transition is ongoing, expand cards immediately without
- // animation to make a smooth transition.
- ((RecordingCardView) newFocus).expandTitle(true, !isInHeadersTransition());
- }
- }
- };
private final Comparator<Object> RECORDED_PROGRAM_COMPARATOR = new Comparator<Object>() {
@Override
@@ -142,7 +128,7 @@ public class DvrBrowseFragment extends BrowseFragment implements
public void onConflictStateChange(boolean conflict, ScheduledRecording... schedules) {
if (mScheduleAdapter != null) {
for (ScheduledRecording schedule : schedules) {
- onScheduledRecordingConflictStatusChanged(schedule);
+ onScheduledRecordingStatusChanged(schedule);
}
}
}
@@ -168,12 +154,16 @@ public class DvrBrowseFragment extends BrowseFragment implements
new ScheduledRecordingPresenter(context))
.addClassPresenter(RecordedProgram.class, new RecordedProgramPresenter(context))
.addClassPresenter(SeriesRecording.class, new SeriesRecordingPresenter(context))
- .addClassPresenter(FullScheduleCardHolder.class,
- new FullSchedulesCardPresenter(context));
+ .addClassPresenter(FullScheduleCardHolder.class, new FullSchedulesCardPresenter());
mGenreLabels = new ArrayList<>(Arrays.asList(GenreItems.getLabels(context)));
mGenreLabels.add(getString(R.string.dvr_main_others));
- prepareUiElements();
- if (!startBrowseIfDvrInitialized()) {
+ setupUiElements();
+ setupAdapters();
+ mDvrScheudleManager.addOnConflictStateChangeListener(mOnConflictStateChangeListener);
+ prepareEntranceTransition();
+ if (mDvrDataManager.isInitialized()) {
+ startEntranceTransition();
+ } else {
if (!mDvrDataManager.isDvrScheduleLoadFinished()) {
mDvrDataManager.addDvrScheduleLoadFinishedListener(this);
}
@@ -184,19 +174,6 @@ public class DvrBrowseFragment extends BrowseFragment implements
}
@Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- view.getViewTreeObserver().addOnGlobalFocusChangeListener(mOnGlobalFocusChangeListener);
- }
-
- @Override
- public void onDestroyView() {
- getView().getViewTreeObserver()
- .removeOnGlobalFocusChangeListener(mOnGlobalFocusChangeListener);
- super.onDestroyView();
- }
-
- @Override
public void onDestroy() {
if (DEBUG) Log.d(TAG, "onDestroy");
mHandler.removeCallbacks(mUpdateRowsRunnable);
@@ -218,13 +195,25 @@ public class DvrBrowseFragment extends BrowseFragment implements
@Override
public void onDvrScheduleLoadFinished() {
- startBrowseIfDvrInitialized();
+ List<ScheduledRecording> scheduledRecordings = mDvrDataManager.getAllScheduledRecordings();
+ onScheduledRecordingAdded(ScheduledRecording.toArray(scheduledRecordings));
+ List<SeriesRecording> seriesRecordings = mDvrDataManager.getSeriesRecordings();
+ onSeriesRecordingAdded(SeriesRecording.toArray(seriesRecordings));
+ if (mDvrDataManager.isInitialized()) {
+ startEntranceTransition();
+ }
mDvrDataManager.removeDvrScheduleLoadFinishedListener(this);
}
@Override
public void onRecordedProgramLoadFinished() {
- startBrowseIfDvrInitialized();
+ for (RecordedProgram recordedProgram : mDvrDataManager.getRecordedPrograms()) {
+ handleRecordedProgramAdded(recordedProgram, true);
+ }
+ updateRows();
+ if (mDvrDataManager.isInitialized()) {
+ startEntranceTransition();
+ }
mDvrDataManager.removeRecordedProgramLoadFinishedListener(this);
}
@@ -281,18 +270,6 @@ public class DvrBrowseFragment extends BrowseFragment implements
}
}
- private void onScheduledRecordingConflictStatusChanged(ScheduledRecording... schedules) {
- for (ScheduledRecording schedule : schedules) {
- if (needToShowScheduledRecording(schedule)) {
- if (mScheduleAdapter.contains(schedule)) {
- mScheduleAdapter.change(schedule);
- }
- } else {
- mScheduleAdapter.removeWithId(schedule);
- }
- }
- }
-
@Override
public void onSeriesRecordingAdded(SeriesRecording... seriesRecordings) {
handleSeriesRecordingsAdded(Arrays.asList(seriesRecordings));
@@ -318,53 +295,44 @@ public class DvrBrowseFragment extends BrowseFragment implements
super.showTitle(flags);
}
- private void prepareUiElements() {
+ private void setupUiElements() {
setBadgeDrawable(getActivity().getDrawable(R.drawable.ic_dvr_badge));
setHeadersState(HEADERS_ENABLED);
setHeadersTransitionOnBackEnabled(false);
setBrandColor(getResources().getColor(R.color.program_guide_side_panel_background, null));
- mRowsAdapter = new ArrayObjectAdapter(new DvrListRowPresenter(getContext()));
- setAdapter(mRowsAdapter);
- prepareEntranceTransition();
}
- private boolean startBrowseIfDvrInitialized() {
- if (mDvrDataManager.isInitialized()) {
- // Setup rows
- mRecentAdapter = new RecordedProgramAdapter(MAX_RECENT_ITEM_COUNT);
- mScheduleAdapter = new ScheduleAdapter(MAX_SCHEDULED_ITEM_COUNT);
- mSeriesAdapter = new SeriesAdapter();
- for (int i = 0; i < mGenreAdapters.length; i++) {
- mGenreAdapters[i] = new RecordedProgramAdapter();
- }
- // Schedule Recordings.
- List<ScheduledRecording> schedules = mDvrDataManager.getAllScheduledRecordings();
- onScheduledRecordingAdded(ScheduledRecording.toArray(schedules));
- mScheduleAdapter.addExtraItem(FullScheduleCardHolder.FULL_SCHEDULE_CARD_HOLDER);
- // Recorded Programs.
- for (RecordedProgram recordedProgram : mDvrDataManager.getRecordedPrograms()) {
- handleRecordedProgramAdded(recordedProgram, false);
- }
- // Series Recordings. Series recordings should be added after recorded programs, because
- // we build series recordings' latest program information while adding recorded programs.
- List<SeriesRecording> recordings = mDvrDataManager.getSeriesRecordings();
- handleSeriesRecordingsAdded(recordings);
- mRecentRow = new ListRow(new HeaderItem(
- getString(R.string.dvr_main_recent)), mRecentAdapter);
- mRowsAdapter.add(new ListRow(new HeaderItem(
- getString(R.string.dvr_main_scheduled)), mScheduleAdapter));
- mSeriesRow = new ListRow(new HeaderItem(
- getString(R.string.dvr_main_series)), mSeriesAdapter);
- updateRows();
- // Initialize listeners
- mDvrDataManager.addRecordedProgramListener(this);
- mDvrDataManager.addScheduledRecordingListener(this);
- mDvrDataManager.addSeriesRecordingListener(this);
- mDvrScheudleManager.addOnConflictStateChangeListener(mOnConflictStateChangeListener);
- startEntranceTransition();
- return true;
- }
- return false;
+ private void setupAdapters() {
+ mRecentAdapter = new RecordedProgramAdapter(MAX_RECENT_ITEM_COUNT);
+ mScheduleAdapter = new ScheduleAdapter(MAX_SCHEDULED_ITEM_COUNT);
+ mSeriesAdapter = new SeriesAdapter();
+ for (int i = 0; i < mGenreAdapters.length; i++) {
+ mGenreAdapters[i] = new RecordedProgramAdapter();
+ }
+ // Schedule Recordings.
+ List<ScheduledRecording> schedules = mDvrDataManager.getAllScheduledRecordings();
+ onScheduledRecordingAdded(ScheduledRecording.toArray(schedules));
+ mScheduleAdapter.addExtraItem(FullScheduleCardHolder.FULL_SCHEDULE_CARD_HOLDER);
+ // Recorded Programs.
+ for (RecordedProgram recordedProgram : mDvrDataManager.getRecordedPrograms()) {
+ handleRecordedProgramAdded(recordedProgram, false);
+ }
+ // Series Recordings. Series recordings should be added after recorded programs, because
+ // we build series recordings' latest program information while adding recorded programs.
+ List<SeriesRecording> recordings = mDvrDataManager.getSeriesRecordings();
+ handleSeriesRecordingsAdded(recordings);
+ mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+ mRecentRow = new ListRow(new HeaderItem(
+ getString(R.string.dvr_main_recent)), mRecentAdapter);
+ mRowsAdapter.add(new ListRow(new HeaderItem(
+ getString(R.string.dvr_main_scheduled)), mScheduleAdapter));
+ mSeriesRow = new ListRow(new HeaderItem(
+ getString(R.string.dvr_main_series)), mSeriesAdapter);
+ updateRows();
+ mDvrDataManager.addRecordedProgramListener(this);
+ mDvrDataManager.addScheduledRecordingListener(this);
+ mDvrDataManager.addSeriesRecordingListener(this);
+ setAdapter(mRowsAdapter);
}
private void handleRecordedProgramAdded(RecordedProgram recordedProgram,
@@ -621,11 +589,10 @@ public class DvrBrowseFragment extends BrowseFragment implements
@Override
public long getId(Object item) {
- // We takes the inverse number for the ID of recorded programs to make the ID stable.
if (item instanceof SeriesRecording) {
return ((SeriesRecording) item).getId();
} else if (item instanceof RecordedProgram) {
- return -((RecordedProgram) item).getId() - 1;
+ return ((RecordedProgram) item).getId();
} else {
return -1;
}
diff --git a/src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java b/src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java
index 880dc8ac..837d8ab2 100644
--- a/src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java
@@ -27,7 +27,7 @@ import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.ui.DvrConflictFragment.DvrChannelRecordConflictFragment;
import java.util.ArrayList;
diff --git a/src/com/android/tv/dvr/ui/DvrConflictFragment.java b/src/com/android/tv/dvr/ui/DvrConflictFragment.java
index 5985f56f..e7be4d0a 100644
--- a/src/com/android/tv/dvr/ui/DvrConflictFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrConflictFragment.java
@@ -34,9 +34,10 @@ import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
import com.android.tv.data.Program;
-import com.android.tv.dvr.recorder.ConflictChecker;
-import com.android.tv.dvr.recorder.ConflictChecker.OnUpcomingConflictChangeListener;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ConflictChecker;
+import com.android.tv.dvr.ConflictChecker.OnUpcomingConflictChangeListener;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.util.Utils;
import java.util.ArrayList;
diff --git a/src/com/android/tv/dvr/ui/browse/DvrDetailsActivity.java b/src/com/android/tv/dvr/ui/DvrDetailsActivity.java
index 30c81e83..806c775c 100644
--- a/src/com/android/tv/dvr/ui/browse/DvrDetailsActivity.java
+++ b/src/com/android/tv/dvr/ui/DvrDetailsActivity.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.app.Activity;
import android.os.Bundle;
diff --git a/src/com/android/tv/dvr/ui/browse/DvrDetailsFragment.java b/src/com/android/tv/dvr/ui/DvrDetailsFragment.java
index 4d3698ef..21f9c4b4 100644
--- a/src/com/android/tv/dvr/ui/browse/DvrDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrDetailsFragment.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.content.Context;
import android.content.Intent;
@@ -48,8 +48,8 @@ import com.android.tv.data.BaseProgram;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.dialog.PinDialogFragment;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.ui.playback.DvrPlaybackActivity;
+import com.android.tv.dvr.DvrPlaybackActivity;
+import com.android.tv.dvr.RecordedProgram;
import com.android.tv.parental.ParentalControlSettings;
import com.android.tv.util.ImageLoader;
import com.android.tv.util.ToastUtils;
diff --git a/src/com/android/tv/dvr/ui/DvrForgetStorageErrorFragment.java b/src/com/android/tv/dvr/ui/DvrForgetStorageErrorFragment.java
new file mode 100644
index 00000000..73ddcdd0
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/DvrForgetStorageErrorFragment.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tv.dvr.ui;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.text.TextUtils;
+
+import com.android.tv.R;
+import com.android.tv.TvApplication;
+import com.android.tv.common.SoftPreconditions;
+import com.android.tv.dvr.DvrDataManager;
+import com.android.tv.dvr.DvrManager;
+
+import java.util.List;
+
+public class DvrForgetStorageErrorFragment extends DvrGuidedStepFragment {
+ private static final int ACTION_CANCEL = 1;
+ private static final int ACTION_FORGET_STORAGE = 2;
+ private String mInputId;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ Bundle args = getArguments();
+ if (args != null) {
+ mInputId = args.getString(DvrHalfSizedDialogFragment.KEY_INPUT_ID);
+ }
+ SoftPreconditions.checkArgument(!TextUtils.isEmpty(mInputId));
+ super.onCreate(savedInstanceState);
+ }
+
+ @NonNull
+ @Override
+ public Guidance onCreateGuidance(Bundle savedInstanceState) {
+ String title = getResources().getString(R.string.dvr_error_forget_storage_title);
+ String description = getResources().getString(
+ R.string.dvr_error_forget_storage_description);
+ return new Guidance(title, description, null, null);
+ }
+
+ @Override
+ public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
+ Activity activity = getActivity();
+ actions.add(new GuidedAction.Builder(activity)
+ .id(ACTION_CANCEL)
+ .title(getResources().getString(R.string.dvr_action_error_cancel))
+ .build());
+ actions.add(new GuidedAction.Builder(activity)
+ .id(ACTION_FORGET_STORAGE)
+ .title(getResources().getString(R.string.dvr_action_error_forget_storage))
+ .build());
+ }
+
+ @Override
+ public void onGuidedActionClicked(GuidedAction action) {
+ if (action.getId() != ACTION_FORGET_STORAGE) {
+ dismissDialog();
+ return;
+ }
+ DvrManager dvrManager = TvApplication.getSingletons(getContext()).getDvrManager();
+ dvrManager.forgetStorage(mInputId);
+ Activity activity = getActivity();
+ if (activity instanceof DvrDetailsActivity) {
+ // Since we removed everything, just finish the activity.
+ activity.finish();
+ } else {
+ dismissDialog();
+ }
+ }
+}
diff --git a/src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java b/src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java
index 433588da..d26e6836 100644
--- a/src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java
@@ -16,12 +16,10 @@
package com.android.tv.dvr.ui;
-import android.app.Activity;
import android.app.DialogFragment;
import android.content.Context;
import android.os.Bundle;
import android.support.v17.leanback.app.GuidedStepFragment;
-import android.support.v17.leanback.widget.GuidanceStylist;
import android.support.v17.leanback.widget.GuidedAction;
import android.support.v17.leanback.widget.VerticalGridView;
import android.view.LayoutInflater;
@@ -31,26 +29,11 @@ import android.view.ViewGroup;
import com.android.tv.MainActivity;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.dialog.HalfSizedDialogFragment.OnActionClickListener;
import com.android.tv.dialog.SafeDismissDialogFragment;
import com.android.tv.dvr.DvrManager;
-
-import java.util.List;
+import com.android.tv.dvr.ui.HalfSizedDialogFragment.OnActionClickListener;
public class DvrGuidedStepFragment extends GuidedStepFragment {
- /**
- * Action ID for "recording/scheduling the program anyway".
- */
- public static final int ACTION_RECORD_ANYWAY = 1;
- /**
- * Action ID for "deleting existed recordings".
- */
- public static final int ACTION_DELETE_RECORDINGS = 2;
- /**
- * Action ID for "cancelling current recording request".
- */
- public static final int ACTION_CANCEL_RECORDING = 3;
-
private DvrManager mDvrManager;
private OnActionClickListener mOnActionClickListener;
@@ -103,35 +86,4 @@ public class DvrGuidedStepFragment extends GuidedStepFragment {
protected void setOnActionClickListener(OnActionClickListener listener) {
mOnActionClickListener = listener;
}
-
- /**
- * The inner guided step fragment for
- * {@link com.android.tv.dvr.ui.DvrHalfSizedDialogFragment
- * .DvrNoFreeSpaceErrorDialogFragment}.
- */
- public static class DvrNoFreeSpaceErrorFragment
- extends DvrGuidedStepFragment {
- @Override
- public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
- return new GuidanceStylist.Guidance(getString(R.string.dvr_error_no_free_space_title),
- getString(R.string.dvr_error_no_free_space_description), null, null);
- }
-
- @Override
- public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
- Activity activity = getActivity();
- actions.add(new GuidedAction.Builder(activity)
- .id(ACTION_RECORD_ANYWAY)
- .title(R.string.dvr_action_record_anyway)
- .build());
- actions.add(new GuidedAction.Builder(activity)
- .id(ACTION_DELETE_RECORDINGS)
- .title(R.string.dvr_action_delete_recordings)
- .build());
- actions.add(new GuidedAction.Builder(activity)
- .id(ACTION_CANCEL_RECORDING)
- .title(R.string.dvr_action_record_cancel)
- .build());
- }
- }
} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/DvrHalfSizedDialogFragment.java b/src/com/android/tv/dvr/ui/DvrHalfSizedDialogFragment.java
index 9054dd03..2b132db8 100644
--- a/src/com/android/tv/dvr/ui/DvrHalfSizedDialogFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrHalfSizedDialogFragment.java
@@ -29,7 +29,6 @@ import android.view.ViewGroup;
import com.android.tv.MainActivity;
import com.android.tv.R;
import com.android.tv.dvr.DvrStorageStatusManager;
-import com.android.tv.dialog.HalfSizedDialogFragment;
import com.android.tv.dvr.ui.DvrConflictFragment.DvrChannelWatchConflictFragment;
import com.android.tv.dvr.ui.DvrConflictFragment.DvrProgramConflictFragment;
import com.android.tv.guide.ProgramGuide;
@@ -167,17 +166,6 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
}
/**
- * A dialog fragment to show error message when there is no enough free space to record.
- */
- public static class DvrNoFreeSpaceErrorDialogFragment
- extends DvrGuidedStepDialogFragment {
- @Override
- protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
- return new DvrGuidedStepFragment.DvrNoFreeSpaceErrorFragment();
- }
- }
-
- /**
* A dialog fragment to show error message when the current storage is too small to
* support DVR
*/
diff --git a/src/com/android/tv/dvr/ui/DvrInsufficientSpaceErrorFragment.java b/src/com/android/tv/dvr/ui/DvrInsufficientSpaceErrorFragment.java
index 3c5df1a6..3b1dbfa0 100644
--- a/src/com/android/tv/dvr/ui/DvrInsufficientSpaceErrorFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrInsufficientSpaceErrorFragment.java
@@ -17,7 +17,6 @@
package com.android.tv.dvr.ui;
import android.app.Activity;
-import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
@@ -25,67 +24,19 @@ import android.support.v17.leanback.widget.GuidedAction;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.common.SoftPreconditions;
-import com.android.tv.dvr.ui.browse.DvrBrowseActivity;
+import com.android.tv.dvr.DvrDataManager;
-import java.util.ArrayList;
import java.util.List;
public class DvrInsufficientSpaceErrorFragment extends DvrGuidedStepFragment {
- /**
- * Key for the failed scheduled recordings information.
- */
- public static final String FAILED_SCHEDULED_RECORDING_INFOS =
- "failed_scheduled_recording_infos";
-
- private static final String TAG = "DvrInsufficientSpaceErrorFragment";
-
- private static final int ACTION_VIEW_RECENT_RECORDINGS = 1;
-
- private ArrayList<String> mFailedScheduledRecordingInfos;
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- Bundle args = getArguments();
- if (args != null) {
- mFailedScheduledRecordingInfos =
- args.getStringArrayList(FAILED_SCHEDULED_RECORDING_INFOS);
- }
- SoftPreconditions.checkState(
- mFailedScheduledRecordingInfos != null && !mFailedScheduledRecordingInfos.isEmpty(),
- TAG, "failed scheduled recording is null");
- }
+ private static final int ACTION_DONE = 1;
+ private static final int ACTION_OPEN_DVR = 2;
@Override
public Guidance onCreateGuidance(Bundle savedInstanceState) {
- String title;
- String description;
- int failedScheduledRecordingSize = mFailedScheduledRecordingInfos.size();
- if (failedScheduledRecordingSize == 1) {
- title = getString(
- R.string.dvr_error_insufficient_space_title_one_recording,
- mFailedScheduledRecordingInfos.get(0));
- description = getString(
- R.string.dvr_error_insufficient_space_description_one_recording,
- mFailedScheduledRecordingInfos.get(0));
- } else if (failedScheduledRecordingSize == 2) {
- title = getString(
- R.string.dvr_error_insufficient_space_title_two_recordings,
- mFailedScheduledRecordingInfos.get(0), mFailedScheduledRecordingInfos.get(1));
- description = getString(
- R.string.dvr_error_insufficient_space_description_two_recordings,
- mFailedScheduledRecordingInfos.get(0), mFailedScheduledRecordingInfos.get(1));
- } else {
- title = getString(
- R.string.dvr_error_insufficient_space_title_three_or_more_recordings,
- mFailedScheduledRecordingInfos.get(0), mFailedScheduledRecordingInfos.get(1),
- mFailedScheduledRecordingInfos.get(2));
- description = getString(
- R.string.dvr_error_insufficient_space_description_three_or_more_recordings,
- mFailedScheduledRecordingInfos.get(0), mFailedScheduledRecordingInfos.get(1),
- mFailedScheduledRecordingInfos.get(2));
- }
+ String title = getResources().getString(R.string.dvr_error_insufficient_space_title);
+ String description = getResources()
+ .getString(R.string.dvr_error_insufficient_space_description);
return new Guidance(title, description, null, null);
}
@@ -93,21 +44,26 @@ public class DvrInsufficientSpaceErrorFragment extends DvrGuidedStepFragment {
public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
Activity activity = getActivity();
actions.add(new GuidedAction.Builder(activity)
- .clickAction(GuidedAction.ACTION_ID_OK)
+ .id(ACTION_DONE)
+ .title(getResources().getString(R.string.dvr_action_error_done))
.build());
- if (TvApplication.getSingletons(getContext()).getDvrManager().hasValidItems()) {
- actions.add(new GuidedAction.Builder(activity)
- .id(ACTION_VIEW_RECENT_RECORDINGS)
- .title(getResources().getString(
- R.string.dvr_error_insufficient_space_action_view_recent_recordings))
- .build());
+ DvrDataManager dvrDataManager = TvApplication.getSingletons(getContext())
+ .getDvrDataManager();
+ if (!(dvrDataManager.getRecordedPrograms().isEmpty()
+ && dvrDataManager.getStartedRecordings().isEmpty()
+ && dvrDataManager.getNonStartedScheduledRecordings().isEmpty()
+ && dvrDataManager.getSeriesRecordings().isEmpty())) {
+ actions.add(new GuidedAction.Builder(activity)
+ .id(ACTION_OPEN_DVR)
+ .title(getResources().getString(R.string.dvr_action_error_open_dvr))
+ .build());
}
}
@Override
public void onGuidedActionClicked(GuidedAction action) {
- if (action.getId() == ACTION_VIEW_RECENT_RECORDINGS) {
- Intent intent = new Intent(getActivity(), DvrBrowseActivity.class);
+ if (action.getId() == ACTION_OPEN_DVR) {
+ Intent intent = new Intent(getActivity(), DvrActivity.class);
getActivity().startActivity(intent);
}
dismissDialog();
diff --git a/src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java b/src/com/android/tv/dvr/ui/DvrItemPresenter.java
index 317b6af3..339e5d2f 100644
--- a/src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java
+++ b/src/com/android/tv/dvr/ui/DvrItemPresenter.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.app.Activity;
import android.support.annotation.CallSuper;
@@ -22,17 +22,16 @@ import android.support.v17.leanback.widget.Presenter;
import android.view.View;
import android.view.View.OnClickListener;
-import com.android.tv.dvr.ui.DvrUiHelper;
+import com.android.tv.dvr.DvrUiHelper;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Set;
/**
* An abstract class to present DVR items in {@link RecordingCardView}, which is mainly used in
- * {@link DvrBrowseFragment}. DVR items might include:
- * {@link com.android.tv.dvr.data.ScheduledRecording},
- * {@link com.android.tv.dvr.data.RecordedProgram}, and
- * {@link com.android.tv.dvr.data.SeriesRecording}.
+ * {@link DvrBrowseFragment}. DVR items might include: {@link ScheduledRecording},
+ * {@link RecordedProgram}, and {@link SeriesRecording}.
*/
public abstract class DvrItemPresenter extends Presenter {
private final Set<ViewHolder> mBoundViewHolders = new HashSet<>();
@@ -50,8 +49,6 @@ public abstract class DvrItemPresenter extends Presenter {
@CallSuper
public void onUnbindViewHolder(ViewHolder viewHolder) {
mBoundViewHolders.remove(viewHolder);
- viewHolder.view.setTag(null);
- viewHolder.view.setOnClickListener(null);
}
/**
diff --git a/src/com/android/tv/dvr/ui/DvrMissingStorageErrorFragment.java b/src/com/android/tv/dvr/ui/DvrMissingStorageErrorFragment.java
index 8dc9eb4e..2e2c2849 100644
--- a/src/com/android/tv/dvr/ui/DvrMissingStorageErrorFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrMissingStorageErrorFragment.java
@@ -17,27 +17,29 @@
package com.android.tv.dvr.ui;
import android.app.Activity;
-import android.content.ActivityNotFoundException;
-import android.content.Intent;
import android.os.Bundle;
-import android.provider.Settings;
+import android.support.v17.leanback.app.GuidedStepFragment;
import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
import android.support.v17.leanback.widget.GuidedAction;
-import android.util.Log;
+import android.text.TextUtils;
import com.android.tv.R;
-import com.android.tv.dvr.ui.browse.DvrDetailsActivity;
+import com.android.tv.common.SoftPreconditions;
import java.util.List;
public class DvrMissingStorageErrorFragment extends DvrGuidedStepFragment {
- private static String TAG = "DvrMissingStorageErrorFragment";
-
- private static final int ACTION_OK = 1;
- private static final int ACTION_OPEN_STORAGE_SETTINGS = 2;
+ private static final int ACTION_CANCEL = 1;
+ private static final int ACTION_FORGET_STORAGE = 2;
+ private String mInputId;
@Override
public void onCreate(Bundle savedInstanceState) {
+ Bundle args = getArguments();
+ if (args != null) {
+ mInputId = args.getString(DvrHalfSizedDialogFragment.KEY_INPUT_ID);
+ }
+ SoftPreconditions.checkArgument(!TextUtils.isEmpty(mInputId));
super.onCreate(savedInstanceState);
}
@@ -53,31 +55,25 @@ public class DvrMissingStorageErrorFragment extends DvrGuidedStepFragment {
public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
Activity activity = getActivity();
actions.add(new GuidedAction.Builder(activity)
- .id(ACTION_OK)
- .title(android.R.string.ok)
+ .id(ACTION_CANCEL)
+ .title(getResources().getString(R.string.dvr_action_error_cancel))
.build());
actions.add(new GuidedAction.Builder(activity)
- .id(ACTION_OPEN_STORAGE_SETTINGS)
- .title(getResources().getString(R.string.dvr_action_error_storage_settings))
+ .id(ACTION_FORGET_STORAGE)
+ .title(getResources().getString(R.string.dvr_action_error_forget_storage))
.build());
}
@Override
public void onGuidedActionClicked(GuidedAction action) {
- Activity activity = getActivity();
- if (activity instanceof DvrDetailsActivity) {
- activity.finish();
- } else {
- dismissDialog();
- }
- if (action.getId() != ACTION_OPEN_STORAGE_SETTINGS) {
+ if (action.getId() == ACTION_FORGET_STORAGE) {
+ DvrForgetStorageErrorFragment fragment = new DvrForgetStorageErrorFragment();
+ Bundle args = new Bundle();
+ args.putString(DvrHalfSizedDialogFragment.KEY_INPUT_ID, mInputId);
+ fragment.setArguments(args);
+ GuidedStepFragment.add(getFragmentManager(), fragment, R.id.halfsized_dialog_host);
return;
}
- final Intent intent = new Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS);
- try {
- getContext().startActivity(intent);
- } catch (ActivityNotFoundException e) {
- Log.e(TAG, "Can't start internal storage settings activity", e);
- }
+ dismissDialog();
}
-}
+} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/playback/DvrPlaybackCardPresenter.java b/src/com/android/tv/dvr/ui/DvrPlaybackCardPresenter.java
index 4bd121b1..8c4c856c 100644
--- a/src/com/android/tv/dvr/ui/playback/DvrPlaybackCardPresenter.java
+++ b/src/com/android/tv/dvr/ui/DvrPlaybackCardPresenter.java
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.tv.dvr.ui.playback;
+package com.android.tv.dvr.ui;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Resources;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -25,25 +26,22 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.android.tv.R;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.ui.browse.RecordedProgramPresenter;
-import com.android.tv.dvr.ui.browse.RecordingCardView;
+import com.android.tv.dvr.RecordedProgram;
+import com.android.tv.dvr.DvrPlaybackActivity;
import com.android.tv.util.Utils;
/**
* This class is used to generate Views and bind Objects for related recordings in DVR playback.
*/
-class DvrPlaybackCardPresenter extends RecordedProgramPresenter {
+public class DvrPlaybackCardPresenter extends RecordedProgramPresenter {
private static final String TAG = "DvrPlaybackCardPresenter";
private static final boolean DEBUG = false;
private final int mRelatedRecordingCardWidth;
private final int mRelatedRecordingCardHeight;
- private final DvrPlaybackOverlayFragment mFragment;
- DvrPlaybackCardPresenter(Context context, DvrPlaybackOverlayFragment fragment) {
+ DvrPlaybackCardPresenter(Context context) {
super(context);
- mFragment = fragment;
mRelatedRecordingCardWidth =
context.getResources().getDimensionPixelSize(R.dimen.dvr_related_recordings_width);
mRelatedRecordingCardHeight =
@@ -52,8 +50,9 @@ class DvrPlaybackCardPresenter extends RecordedProgramPresenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
+ Resources res = parent.getResources();
RecordingCardView view = new RecordingCardView(
- getContext(), mRelatedRecordingCardWidth, mRelatedRecordingCardHeight, true);
+ getContext(), mRelatedRecordingCardWidth, mRelatedRecordingCardHeight);
return new ViewHolder(view);
}
@@ -62,10 +61,6 @@ class DvrPlaybackCardPresenter extends RecordedProgramPresenter {
return new OnClickListener() {
@Override
public void onClick(View v) {
- // Disable fading of overlay fragment to prevent the layout blinking while updating
- // new playback states and info. The fading enabled status will be reset during
- // playback state changing, in DvrPlaybackControlHelper.onStateChanged().
- mFragment.setFadingEnabled(false);
long programId = ((RecordedProgram) v.getTag()).getId();
if (DEBUG) Log.d(TAG, "Play Related Recording:" + programId);
Intent intent = new Intent(getContext(), DvrPlaybackActivity.class);
@@ -74,4 +69,14 @@ class DvrPlaybackCardPresenter extends RecordedProgramPresenter {
}
};
}
+
+ @Override
+ protected String getDescription(RecordedProgram program) {
+ String description = program.getDescription();
+ if (TextUtils.isEmpty(description)) {
+ description =
+ getContext().getResources().getString(R.string.dvr_msg_no_program_description);
+ }
+ return description;
+ }
} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/playback/DvrPlaybackControlHelper.java b/src/com/android/tv/dvr/ui/DvrPlaybackControlHelper.java
index 4658a328..0bc4ecb1 100644
--- a/src/com/android/tv/dvr/ui/playback/DvrPlaybackControlHelper.java
+++ b/src/com/android/tv/dvr/ui/DvrPlaybackControlHelper.java
@@ -14,26 +14,19 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.playback;
+package com.android.tv.dvr.ui;
import android.app.Activity;
-import android.content.Context;
import android.graphics.drawable.Drawable;
import android.media.MediaMetadata;
import android.media.session.MediaController;
import android.media.session.MediaController.TransportControls;
import android.media.session.PlaybackState;
-import android.media.tv.TvTrackInfo;
-import android.os.Bundle;
import android.support.v17.leanback.app.PlaybackControlGlue;
import android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter;
import android.support.v17.leanback.widget.Action;
-import android.support.v17.leanback.widget.ArrayObjectAdapter;
-import android.support.v17.leanback.widget.ControlButtonPresenterSelector;
import android.support.v17.leanback.widget.OnActionClickedListener;
import android.support.v17.leanback.widget.PlaybackControlsRow;
-import android.support.v17.leanback.widget.PlaybackControlsRow.ClosedCaptioningAction;
-import android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction;
import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
import android.support.v17.leanback.widget.RowPresenter;
import android.text.TextUtils;
@@ -44,18 +37,19 @@ import android.view.View;
import com.android.tv.R;
import com.android.tv.util.TimeShiftUtils;
-import java.util.ArrayList;
-
/**
* A helper class to assist {@link DvrPlaybackOverlayFragment} to manage its controls row and
* send command to the media controller. It also helps to update playback states displayed in the
* fragment according to information the media session provides.
*/
-class DvrPlaybackControlHelper extends PlaybackControlGlue {
+public class DvrPlaybackControlHelper extends PlaybackControlGlue {
private static final String TAG = "DvrPlaybackControlHelper";
private static final boolean DEBUG = false;
- private static final int AUDIO_ACTION_ID = 1001;
+ /**
+ * Indicates the ID of the media under playback is unknown.
+ */
+ public static int UNKNOWN_MEDIA_ID = -1;
private int mPlaybackState = PlaybackState.STATE_NONE;
private int mPlaybackSpeedLevel;
@@ -66,9 +60,6 @@ class DvrPlaybackControlHelper extends PlaybackControlGlue {
private final MediaController.Callback mMediaControllerCallback = new MediaControllerCallback();
private final TransportControls mTransportControls;
private final int mExtraPaddingTopForNoDescription;
- private final ArrayObjectAdapter mSecondaryActionsAdapter;
- private final MultiAction mClosedCaptioningAction;
- private final MultiAction mMultiAudioAction;
public DvrPlaybackControlHelper(Activity activity, DvrPlaybackOverlayFragment overlayFragment) {
super(activity, overlayFragment, new int[TimeShiftUtils.MAX_SPEED_LEVEL + 1]);
@@ -77,15 +68,11 @@ class DvrPlaybackControlHelper extends PlaybackControlGlue {
mTransportControls = mMediaController.getTransportControls();
mExtraPaddingTopForNoDescription = activity.getResources()
.getDimensionPixelOffset(R.dimen.dvr_playback_controls_extra_padding_top);
- mSecondaryActionsAdapter = new ArrayObjectAdapter(new ControlButtonPresenterSelector());
- mClosedCaptioningAction = new ClosedCaptioningAction(activity);
- mMultiAudioAction = new MultiAudioAction(activity);
}
@Override
public PlaybackControlsRowPresenter createControlsRowAndPresenter() {
PlaybackControlsRow controlsRow = new PlaybackControlsRow(this);
- controlsRow.setSecondaryActionsAdapter(mSecondaryActionsAdapter);
setControlsRow(controlsRow);
AbstractDetailsDescriptionPresenter detailsPresenter =
new AbstractDetailsDescriptionPresenter() {
@@ -129,21 +116,7 @@ class DvrPlaybackControlHelper extends PlaybackControlGlue {
@Override
public void onActionClicked(Action action) {
if (mReadyToControl) {
- int trackType;
- if (action.getId() == mClosedCaptioningAction.getId()) {
- trackType = TvTrackInfo.TYPE_SUBTITLE;
- } else if (action.getId() == AUDIO_ACTION_ID) {
- trackType = TvTrackInfo.TYPE_AUDIO;
- } else {
- DvrPlaybackControlHelper.super.onActionClicked(action);
- return;
- }
- ArrayList<TvTrackInfo> trackInfos =
- ((DvrPlaybackOverlayFragment) getFragment()).getTracks(trackType);
- if (!trackInfos.isEmpty()) {
- showSideFragment(trackInfos, ((DvrPlaybackOverlayFragment)
- getFragment()).getSelectedTrackId(trackType));
- }
+ DvrPlaybackControlHelper.super.onActionClicked(action);
}
}
});
@@ -185,10 +158,10 @@ class DvrPlaybackControlHelper extends PlaybackControlGlue {
/**
* Returns the ID of the media under playback.
*/
- public String getMediaId() {
+ public long getMediaId() {
MediaMetadata mediaMetadata = mMediaController.getMetadata();
- return mediaMetadata == null ? null
- : mediaMetadata.getString(MediaMetadata.METADATA_KEY_MEDIA_ID);
+ return mediaMetadata == null ? UNKNOWN_MEDIA_ID
+ : mediaMetadata.getLong(MediaMetadata.METADATA_KEY_MEDIA_ID);
}
@Override
@@ -244,37 +217,6 @@ class DvrPlaybackControlHelper extends PlaybackControlGlue {
mMediaController.unregisterCallback(mMediaControllerCallback);
}
- /**
- * Update the secondary controls row.
- * @param hasClosedCaption {@code true} to show the closed caption selection button,
- * {@code false} to hide it.
- * @param hasMultiAudio {@code true} to show the audio track selection button,
- * {@code false} to hide it.
- */
- public void updateSecondaryRow(boolean hasClosedCaption, boolean hasMultiAudio) {
- if (hasClosedCaption) {
- if (mSecondaryActionsAdapter.indexOf(mClosedCaptioningAction) < 0) {
- mSecondaryActionsAdapter.add(0, mClosedCaptioningAction);
- }
- } else {
- mSecondaryActionsAdapter.remove(mClosedCaptioningAction);
- }
- if (hasMultiAudio) {
- if (mSecondaryActionsAdapter.indexOf(mMultiAudioAction) < 0) {
- mSecondaryActionsAdapter.add(mMultiAudioAction);
- }
- } else {
- mSecondaryActionsAdapter.remove(mMultiAudioAction);
- }
- }
-
- /**
- * Returns if the secondary controls row has any buttons and thus should be shown.
- */
- public boolean hasSecondaryRow() {
- return mSecondaryActionsAdapter.size() != 0;
- }
-
@Override
protected void startPlayback(int speedId) {
if (getCurrentSpeedId() == speedId) {
@@ -309,14 +251,6 @@ class DvrPlaybackControlHelper extends PlaybackControlGlue {
// Do nothing.
}
- /**
- * Notifies closed caption being enabled/disabled to update related UI.
- */
- void onSubtitleTrackStateChanged(boolean enabled) {
- mClosedCaptioningAction.setIndex(enabled ?
- ClosedCaptioningAction.ON : ClosedCaptioningAction.OFF);
- }
-
private void onStateChanged(int state, long positionMs, int speedLevel) {
if (DEBUG) Log.d(TAG, "onStateChanged");
getControlsRow().setCurrentTime((int) positionMs);
@@ -363,19 +297,6 @@ class DvrPlaybackControlHelper extends PlaybackControlGlue {
onStateChanged();
}
- private void showSideFragment(ArrayList<TvTrackInfo> trackInfos, String selectedTrackId) {
- Bundle args = new Bundle();
- args.putParcelableArrayList(DvrPlaybackSideFragment.TRACK_INFOS, trackInfos);
- args.putString(DvrPlaybackSideFragment.SELECTED_TRACK_ID, selectedTrackId);
- DvrPlaybackSideFragment sideFragment = new DvrPlaybackSideFragment();
- sideFragment.setArguments(args);
- getFragment().getFragmentManager().beginTransaction()
- .hide(getFragment())
- .replace(R.id.dvr_playback_side_fragment, sideFragment)
- .addToBackStack(null)
- .commit();
- }
-
private class MediaControllerCallback extends MediaController.Callback {
@Override
public void onPlaybackStateChanged(PlaybackState state) {
@@ -389,11 +310,4 @@ class DvrPlaybackControlHelper extends PlaybackControlGlue {
((DvrPlaybackOverlayFragment) getFragment()).onMediaControllerUpdated();
}
}
-
- private static class MultiAudioAction extends MultiAction {
- MultiAudioAction(Context context) {
- super(AUDIO_ACTION_ID);
- setDrawables(new Drawable[]{context.getDrawable(R.drawable.ic_tvoption_multi_track)});
- }
- }
} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/playback/DvrPlaybackOverlayFragment.java b/src/com/android/tv/dvr/ui/DvrPlaybackOverlayFragment.java
index ff907182..51ec93b8 100644
--- a/src/com/android/tv/dvr/ui/playback/DvrPlaybackOverlayFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrPlaybackOverlayFragment.java
@@ -14,14 +14,13 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.playback;
+package com.android.tv.dvr.ui;
import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.hardware.display.DisplayManager;
import android.media.tv.TvContentRating;
-import android.media.tv.TvTrackInfo;
import android.os.Bundle;
import android.media.session.PlaybackState;
import android.media.tv.TvInputManager;
@@ -31,6 +30,7 @@ import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ClassPresenterSelector;
import android.support.v17.leanback.widget.HeaderItem;
import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.PlaybackControlsRow;
import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
import android.support.v17.leanback.widget.SinglePresenterSelector;
@@ -38,25 +38,20 @@ import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
+import android.text.TextUtils;
import android.util.Log;
import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.data.BaseProgram;
+import com.android.tv.dvr.RecordedProgram;
import com.android.tv.dialog.PinDialogFragment;
import com.android.tv.dvr.DvrDataManager;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.ui.SortedArrayAdapter;
-import com.android.tv.dvr.ui.browse.DvrListRowPresenter;
+import com.android.tv.dvr.DvrPlayer;
+import com.android.tv.dvr.DvrPlaybackMediaSessionHelper;
import com.android.tv.parental.ContentRatingsManager;
-import com.android.tv.util.TvSettings;
-import com.android.tv.util.TvTrackInfoUtils;
import com.android.tv.util.Utils;
-import java.util.List;
-import java.util.ArrayList;
-
public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
// TODO: Handles audio focus. Deals with block and ratings.
private static final String TAG = "DvrPlaybackOverlayFragment";
@@ -67,7 +62,6 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
// mProgram is only used to store program from intent. Don't use it elsewhere.
private RecordedProgram mProgram;
- private DvrPlayer mDvrPlayer;
private DvrPlaybackMediaSessionHelper mMediaSessionHelper;
private DvrPlaybackControlHelper mPlaybackControlHelper;
private ArrayObjectAdapter mRowsAdapter;
@@ -78,30 +72,19 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
private TvView mTvView;
private View mBlockScreenView;
private ListRow mRelatedRecordingsRow;
- private int mPaddingWithoutRelatedRow;
- private int mPaddingWithoutSecondaryRow;
+ private int mExtraPaddingNoRelatedRow;
private int mWindowWidth;
private int mWindowHeight;
private float mAppliedAspectRatio;
private float mWindowAspectRatio;
private boolean mPinChecked;
- private DvrPlayer.OnTrackSelectedListener mOnSubtitleTrackSelectedListener =
- new DvrPlayer.OnTrackSelectedListener() {
- @Override
- public void onTrackSelected(String selectedTrackId) {
- mPlaybackControlHelper.onSubtitleTrackStateChanged(selectedTrackId != null);
- mRowsAdapter.notifyArrayItemRangeChanged(0, 1);
- }
- };
@Override
public void onCreate(Bundle savedInstanceState) {
if (DEBUG) Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
- mPaddingWithoutRelatedRow = getActivity().getResources()
- .getDimensionPixelOffset(R.dimen.dvr_playback_overlay_padding_top_no_related_row);
- mPaddingWithoutSecondaryRow = getActivity().getResources()
- .getDimensionPixelOffset(R.dimen.dvr_playback_overlay_padding_top_no_secondary_row);
+ mExtraPaddingNoRelatedRow = getActivity().getResources()
+ .getDimensionPixelOffset(R.dimen.dvr_playback_fragment_extra_padding_top);
mDvrDataManager = TvApplication.getSingletons(getActivity()).getDvrDataManager();
mContentRatingsManager = TvApplication.getSingletons(getContext())
.getTvInputManagerHelper().getContentRatingsManager();
@@ -127,31 +110,13 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
super.onActivityCreated(savedInstanceState);
mTvView = (TvView) getActivity().findViewById(R.id.dvr_tv_view);
mBlockScreenView = getActivity().findViewById(R.id.block_screen);
- mDvrPlayer = new DvrPlayer(mTvView);
mMediaSessionHelper = new DvrPlaybackMediaSessionHelper(
- getActivity(), MEDIA_SESSION_TAG, mDvrPlayer, this);
+ getActivity(), MEDIA_SESSION_TAG, new DvrPlayer(mTvView), this);
mPlaybackControlHelper = new DvrPlaybackControlHelper(getActivity(), this);
setUpRows();
- mDvrPlayer.setOnTracksAvailabilityChangedListener(
- new DvrPlayer.OnTracksAvailabilityChangedListener() {
- @Override
- public void onTracksAvailabilityChanged(boolean hasClosedCaption,
- boolean hasMultiAudio) {
- mPlaybackControlHelper.updateSecondaryRow(hasClosedCaption, hasMultiAudio);
- if (hasClosedCaption) {
- mDvrPlayer.setOnTrackSelectedListener(TvTrackInfo.TYPE_SUBTITLE,
- mOnSubtitleTrackSelectedListener);
- selectBestMatchedTrack(TvTrackInfo.TYPE_SUBTITLE);
- } else {
- mDvrPlayer.setOnTrackSelectedListener(TvTrackInfo.TYPE_SUBTITLE, null);
- }
- if (hasMultiAudio) {
- selectBestMatchedTrack(TvTrackInfo.TYPE_AUDIO);
- }
- onMediaControllerUpdated();
- }
- });
- mDvrPlayer.setOnAspectRatioChangedListener(new DvrPlayer.OnAspectRatioChangedListener() {
+ preparePlayback(getActivity().getIntent());
+ DvrPlayer dvrPlayer = mMediaSessionHelper.getDvrPlayer();
+ dvrPlayer.setAspectRatioChangedListener(new DvrPlayer.AspectRatioChangedListener() {
@Override
public void onAspectRatioChanged(float videoAspectRatio) {
updateAspectRatio(videoAspectRatio);
@@ -159,7 +124,7 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
});
mPinChecked = getActivity().getIntent()
.getBooleanExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_PIN_CHECKED, false);
- mDvrPlayer.setOnContentBlockedListener(new DvrPlayer.OnContentBlockedListener() {
+ dvrPlayer.setContentBlockedListener(new DvrPlayer.ContentBlockedListener() {
@Override
public void onContentBlocked(TvContentRating rating) {
if (mPinChecked) {
@@ -184,7 +149,6 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
.show(getActivity().getFragmentManager(), PinDialogFragment.DIALOG_TAG);
}
});
- preparePlayback(getActivity().getIntent());
}
@Override
@@ -236,9 +200,6 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
updateAspectRatio(mAppliedAspectRatio);
}
- /**
- * Returns next recorded episode in the same series as now playing program.
- */
public RecordedProgram getNextEpisode(RecordedProgram program) {
int position = mRelatedRecordingsRowAdapter.findInsertPosition(program);
if (position == mRelatedRecordingsRowAdapter.size()) {
@@ -248,92 +209,16 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
}
}
- /**
- * Returns the tracks of the give type of the current playback.
-
- * @param trackType Should be {@link TvTrackInfo#TYPE_SUBTITLE}
- * or {@link TvTrackInfo#TYPE_AUDIO}. Or returns {@code null}.
- */
- public ArrayList<TvTrackInfo> getTracks(int trackType) {
- if (trackType == TvTrackInfo.TYPE_AUDIO) {
- return mDvrPlayer.getAudioTracks();
- } else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
- return mDvrPlayer.getSubtitleTracks();
- }
- return null;
- }
-
- /**
- * Returns the ID of the selected track of the given type.
- */
- public String getSelectedTrackId(int trackType) {
- return mDvrPlayer.getSelectedTrackId(trackType);
- }
-
- /**
- * Returns the language setting of the given track type.
-
- * @param trackType Should be {@link TvTrackInfo#TYPE_SUBTITLE}
- * or {@link TvTrackInfo#TYPE_AUDIO}.
- * @return {@code null} if no language has been set for the given track type.
- */
- TvTrackInfo getTrackSetting(int trackType) {
- return TvSettings.getDvrPlaybackTrackSettings(getContext(), trackType);
- }
-
- /**
- * Selects the given audio or subtitle track for DVR playback.
- * @param trackType Should be {@link TvTrackInfo#TYPE_SUBTITLE}
- * or {@link TvTrackInfo#TYPE_AUDIO}.
- * @param selectedTrack {@code null} to disable the audio or subtitle track according to
- * trackType.
- */
- void selectTrack(int trackType, TvTrackInfo selectedTrack) {
- if (mDvrPlayer.isPlaybackPrepared()) {
- mDvrPlayer.selectTrack(trackType, selectedTrack);
- }
- }
-
- /**
- * Notifies the content of controls row or related recordings row is changed and the UI should
- * be updated according to the change.
- */
void onMediaControllerUpdated() {
- updateVerticalPosition();
- mRowsAdapter.notifyArrayItemRangeChanged(0, 2);
- }
-
- private void selectBestMatchedTrack(int trackType) {
- TvTrackInfo selectedTrack = getTrackSetting(trackType);
- if (selectedTrack != null) {
- TvTrackInfo bestMatchedTrack = TvTrackInfoUtils.getBestTrackInfo(getTracks(trackType),
- selectedTrack.getId(), selectedTrack.getLanguage(),
- trackType == TvTrackInfo.TYPE_AUDIO ? selectedTrack.getAudioChannelCount() : 0);
- if (bestMatchedTrack != null && (trackType == TvTrackInfo.TYPE_AUDIO || Utils
- .isEqualLanguage(bestMatchedTrack.getLanguage(),
- selectedTrack.getLanguage()))) {
- selectTrack(trackType, bestMatchedTrack);
- return;
- }
- }
- if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
- // Disables closed captioning if there's no matched language.
- selectTrack(TvTrackInfo.TYPE_SUBTITLE, null);
- }
+ mRowsAdapter.notifyArrayItemRangeChanged(0, 1);
}
private void updateAspectRatio(float videoAspectRatio) {
- if (videoAspectRatio <= 0) {
- // We don't have video's width or height information, use window's aspect ratio.
- videoAspectRatio = mWindowAspectRatio;
- }
if (Math.abs(mAppliedAspectRatio - videoAspectRatio) < DISPLAY_ASPECT_RATIO_EPSILON) {
// No need to change
return;
}
- if (Math.abs(mWindowAspectRatio - videoAspectRatio) < DISPLAY_ASPECT_RATIO_EPSILON) {
- ((ViewGroup) mTvView.getParent()).setPadding(0, 0, 0, 0);
- } else if (videoAspectRatio < mWindowAspectRatio) {
+ if (videoAspectRatio < mWindowAspectRatio) {
int newPadding = (mWindowWidth - Math.round(mWindowHeight * videoAspectRatio)) / 2;
((ViewGroup) mTvView.getParent()).setPadding(newPadding, 0, newPadding, 0);
} else {
@@ -345,7 +230,6 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
private void preparePlayback(Intent intent) {
mMediaSessionHelper.setupPlayback(mProgram, getSeekTimeFromIntent(intent));
- mPlaybackControlHelper.updateSecondaryRow(false, false);
getActivity().getMediaController().getTransportControls().prepare();
updateRelatedRecordingsRow();
}
@@ -355,35 +239,24 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
mRelatedRecordingsRowAdapter.clear();
long programId = mProgram.getId();
String seriesId = mProgram.getSeriesId();
- SeriesRecording seriesRecording = mDvrDataManager.getSeriesRecording(seriesId);
- if (seriesRecording != null) {
+ if (!TextUtils.isEmpty(seriesId)) {
if (DEBUG) Log.d(TAG, "Update related recordings with:" + seriesId);
- List<RecordedProgram> relatedPrograms =
- mDvrDataManager.getRecordedPrograms(seriesRecording.getId());
- for (RecordedProgram program : relatedPrograms) {
- if (programId != program.getId()) {
+ for (RecordedProgram program : mDvrDataManager.getRecordedPrograms()) {
+ if (seriesId.equals(program.getSeriesId()) && programId != program.getId()) {
mRelatedRecordingsRowAdapter.add(program);
}
}
}
+ View view = getView();
if (mRelatedRecordingsRowAdapter.size() == 0) {
mRowsAdapter.remove(mRelatedRecordingsRow);
+ view.setPadding(view.getPaddingLeft(), mExtraPaddingNoRelatedRow,
+ view.getPaddingRight(), view.getPaddingBottom());
} else if (wasEmpty){
mRowsAdapter.add(mRelatedRecordingsRow);
+ view.setPadding(view.getPaddingLeft(), 0,
+ view.getPaddingRight(), view.getPaddingBottom());
}
- onMediaControllerUpdated();
- }
-
- private void updateVerticalPosition() {
- int verticalPadding = 0;
- verticalPadding +=
- mRelatedRecordingsRowAdapter.size() == 0 ? mPaddingWithoutRelatedRow : 0;
- verticalPadding +=
- mPlaybackControlHelper.hasSecondaryRow() ? 0 : mPaddingWithoutSecondaryRow;
- if (DEBUG) Log.d(TAG, "New controls padding: " + verticalPadding);
- View view = getView();
- view.setPadding(view.getPaddingLeft(), verticalPadding,
- view.getPaddingRight(), view.getPaddingBottom());
}
private void setUpRows() {
@@ -392,7 +265,7 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
ClassPresenterSelector selector = new ClassPresenterSelector();
selector.addClassPresenter(PlaybackControlsRow.class, controlsRowPresenter);
- selector.addClassPresenter(ListRow.class, new DvrListRowPresenter(getContext()));
+ selector.addClassPresenter(ListRow.class, new ListRowPresenter());
mRowsAdapter = new ArrayObjectAdapter(selector);
mRowsAdapter.add(mPlaybackControlHelper.getControlsRow());
@@ -401,7 +274,7 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
}
private ListRow getRelatedRecordingsRow() {
- mRelatedRecordingCardPresenter = new DvrPlaybackCardPresenter(getActivity(), this);
+ mRelatedRecordingCardPresenter = new DvrPlaybackCardPresenter(getActivity());
mRelatedRecordingsRowAdapter = new RelatedRecordingsAdapter(mRelatedRecordingCardPresenter);
HeaderItem header = new HeaderItem(0,
getActivity().getString(R.string.dvr_playback_related_recordings));
@@ -424,7 +297,7 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
}
@Override
- public long getId(BaseProgram item) {
+ long getId(BaseProgram item) {
return item.getId();
}
}
diff --git a/src/com/android/tv/dvr/ui/DvrScheduleFragment.java b/src/com/android/tv/dvr/ui/DvrScheduleFragment.java
index d6008315..da6d1637 100644
--- a/src/com/android/tv/dvr/ui/DvrScheduleFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrScheduleFragment.java
@@ -32,8 +32,9 @@ import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Program;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
import com.android.tv.dvr.ui.DvrConflictFragment.DvrProgramConflictFragment;
import com.android.tv.util.Utils;
@@ -47,26 +48,18 @@ import java.util.List;
*/
@TargetApi(Build.VERSION_CODES.N)
public class DvrScheduleFragment extends DvrGuidedStepFragment {
- /**
- * Key for the whether to add the current program to series.
- * Type: boolean
- */
- public static final String KEY_ADD_CURRENT_PROGRAM_TO_SERIES = "add_current_program_to_series";
-
private static final String TAG = "DvrScheduleFragment";
private static final int ACTION_RECORD_EPISODE = 1;
private static final int ACTION_RECORD_SERIES = 2;
private Program mProgram;
- private boolean mAddCurrentProgramToSeries;
@Override
public void onCreate(Bundle savedInstanceState) {
Bundle args = getArguments();
if (args != null) {
mProgram = args.getParcelable(DvrHalfSizedDialogFragment.KEY_PROGRAM);
- mAddCurrentProgramToSeries = args.getBoolean(KEY_ADD_CURRENT_PROGRAM_TO_SERIES, false);
}
DvrManager dvrManager = TvApplication.getSingletons(getContext()).getDvrManager();
SoftPreconditions.checkArgument(mProgram != null && mProgram.isEpisodic(), TAG,
@@ -146,10 +139,8 @@ public class DvrScheduleFragment extends DvrGuidedStepFragment {
.build();
getDvrManager().updateSeriesRecording(seriesRecording);
}
-
DvrUiHelper.startSeriesSettingsActivity(getContext(),
- seriesRecording.getId(), null, true, true, true,
- mAddCurrentProgramToSeries ? mProgram : null);
+ seriesRecording.getId(), null, true, true, true);
dismissDialog();
}
}
diff --git a/src/com/android/tv/dvr/ui/list/DvrSchedulesActivity.java b/src/com/android/tv/dvr/ui/DvrSchedulesActivity.java
index a0410bb3..f6e6ac26 100644
--- a/src/com/android/tv/dvr/ui/list/DvrSchedulesActivity.java
+++ b/src/com/android/tv/dvr/ui/DvrSchedulesActivity.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.list;
+package com.android.tv.dvr.ui;
import android.app.Activity;
import android.app.ProgressDialog;
@@ -24,13 +24,15 @@ import android.support.annotation.IntDef;
import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.data.Program;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.provider.EpisodicProgramLoadTask;
-import com.android.tv.dvr.recorder.SeriesRecordingScheduler;
-import com.android.tv.dvr.ui.BigArguments;
+import com.android.tv.dvr.EpisodicProgramLoadTask;
+import com.android.tv.dvr.SeriesRecording;
+import com.android.tv.dvr.SeriesRecordingScheduler;
+import com.android.tv.dvr.ui.list.DvrSchedulesFragment;
+import com.android.tv.dvr.ui.list.DvrSeriesSchedulesFragment;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -70,47 +72,33 @@ public class DvrSchedulesActivity extends Activity {
getFragmentManager().beginTransaction().add(
R.id.fragment_container, schedulesFragment).commit();
} else if (scheduleType == TYPE_SERIES_SCHEDULE) {
- if (BigArguments.getArgument(DvrSeriesSchedulesFragment
- .SERIES_SCHEDULES_KEY_SERIES_PROGRAMS) != null) {
- // The programs will be passed to the DvrSeriesSchedulesFragment, so don't need
- // to reset the BigArguments.
- showDvrSeriesSchedulesFragment(getIntent().getExtras());
- } else {
- final ProgressDialog dialog = ProgressDialog.show(this, null, getString(
- R.string.dvr_series_progress_message_reading_programs));
- SeriesRecording seriesRecording = getIntent().getExtras()
- .getParcelable(DvrSeriesSchedulesFragment
- .SERIES_SCHEDULES_KEY_SERIES_RECORDING);
- // To get programs faster, hold the update of the series schedules.
- SeriesRecordingScheduler.getInstance(this).pauseUpdate();
- new EpisodicProgramLoadTask(this, Collections.singletonList(seriesRecording)) {
- @Override
- protected void onPostExecute(List<Program> programs) {
- SeriesRecordingScheduler.getInstance(DvrSchedulesActivity.this)
- .resumeUpdate();
- dialog.dismiss();
- Bundle args = getIntent().getExtras();
- BigArguments.reset();
- BigArguments.setArgument(
- DvrSeriesSchedulesFragment.SERIES_SCHEDULES_KEY_SERIES_PROGRAMS,
- programs == null ? Collections.EMPTY_LIST : programs);
- showDvrSeriesSchedulesFragment(args);
- }
- }.setLoadCurrentProgram(true)
- .setLoadDisallowedProgram(true)
- .setLoadScheduledEpisode(true)
- .setIgnoreChannelOption(true)
- .execute();
- }
+ final ProgressDialog dialog = ProgressDialog.show(this, null, getString(
+ R.string.dvr_series_schedules_progress_message_reading_programs));
+ SeriesRecording seriesRecording = getIntent().getExtras()
+ .getParcelable(DvrSeriesSchedulesFragment
+ .SERIES_SCHEDULES_KEY_SERIES_RECORDING);
+ // To get programs faster, hold the update of the series schedules.
+ SeriesRecordingScheduler.getInstance(this).pauseUpdate();
+ new EpisodicProgramLoadTask(this, Collections.singletonList(seriesRecording)) {
+ @Override
+ protected void onPostExecute(List<Program> programs) {
+ SeriesRecordingScheduler.getInstance(DvrSchedulesActivity.this).resumeUpdate();
+ dialog.dismiss();
+ Bundle args = getIntent().getExtras();
+ args.putParcelableArrayList(DvrSeriesSchedulesFragment
+ .SERIES_SCHEDULES_KEY_SERIES_PROGRAMS, new ArrayList<>(programs));
+ DvrSeriesSchedulesFragment schedulesFragment = new DvrSeriesSchedulesFragment();
+ schedulesFragment.setArguments(args);
+ getFragmentManager().beginTransaction().add(
+ R.id.fragment_container, schedulesFragment).commit();
+ }
+ }.setLoadCurrentProgram(true)
+ .setLoadDisallowedProgram(true)
+ .setLoadScheduledEpisode(true)
+ .setIgnoreChannelOption(true)
+ .execute();
} else {
finish();
}
}
-
- private void showDvrSeriesSchedulesFragment(Bundle args) {
- DvrSeriesSchedulesFragment schedulesFragment = new DvrSeriesSchedulesFragment();
- schedulesFragment.setArguments(args);
- getFragmentManager().beginTransaction().add(
- R.id.fragment_container, schedulesFragment).commit();
- }
}
diff --git a/src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java b/src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java
index 667af34a..f57e4b05 100644
--- a/src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java
+++ b/src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java
@@ -22,6 +22,9 @@ import android.support.v17.leanback.app.GuidedStepFragment;
import com.android.tv.R;
import com.android.tv.TvApplication;
+import com.android.tv.common.SoftPreconditions;
+import com.android.tv.dvr.ui.SeriesDeletionFragment;
+import com.android.tv.ui.sidepanel.SettingsFragment;
/**
* Activity to show details view in DVR.
@@ -39,7 +42,7 @@ public class DvrSeriesDeletionActivity extends Activity {
setContentView(R.layout.activity_dvr_series_settings);
// Check savedInstanceState to prevent that activity is being showed with animation.
if (savedInstanceState == null) {
- DvrSeriesDeletionFragment deletionFragment = new DvrSeriesDeletionFragment();
+ SeriesDeletionFragment deletionFragment = new SeriesDeletionFragment();
deletionFragment.setArguments(getIntent().getExtras());
GuidedStepFragment.addAsRoot(this, deletionFragment, R.id.dvr_settings_view_frame);
}
diff --git a/src/com/android/tv/dvr/ui/DvrSeriesScheduledFragment.java b/src/com/android/tv/dvr/ui/DvrSeriesScheduledFragment.java
index 8f880f16..1173df46 100644
--- a/src/com/android/tv/dvr/ui/DvrSeriesScheduledFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrSeriesScheduledFragment.java
@@ -25,29 +25,22 @@ import android.support.v17.leanback.widget.GuidedAction;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.data.Program;
+import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrScheduleManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.ui.list.DvrSchedulesActivity;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
import com.android.tv.dvr.ui.list.DvrSeriesSchedulesFragment;
import java.util.List;
public class DvrSeriesScheduledFragment extends DvrGuidedStepFragment {
- /**
- * The key for program list which will be passed to {@link DvrSeriesSchedulesFragment}.
- * Type: List<{@link Program}>
- */
- public static final String SERIES_SCHEDULED_KEY_PROGRAMS = "series_scheduled_key_programs";
-
private final static long SERIES_RECORDING_ID_NOT_SET = -1;
private final static int ACTION_VIEW_SCHEDULES = 1;
+ private DvrScheduleManager mDvrScheduleManager;
private SeriesRecording mSeriesRecording;
private boolean mShowViewScheduleOption;
- private List<Program> mPrograms;
private int mSchedulesAddedCount = 0;
private boolean mHasConflict = false;
@@ -65,25 +58,22 @@ public class DvrSeriesScheduledFragment extends DvrGuidedStepFragment {
}
mShowViewScheduleOption = getArguments().getBoolean(
DvrSeriesScheduledDialogActivity.SHOW_VIEW_SCHEDULE_OPTION);
+ mDvrScheduleManager = TvApplication.getSingletons(context).getDvrScheduleManager();
mSeriesRecording = TvApplication.getSingletons(context).getDvrDataManager()
.getSeriesRecording(seriesRecordingId);
if (mSeriesRecording == null) {
getActivity().finish();
return;
}
- mPrograms = (List<Program>) BigArguments.getArgument(SERIES_SCHEDULED_KEY_PROGRAMS);
- BigArguments.reset();
mSchedulesAddedCount = TvApplication.getSingletons(getContext()).getDvrManager()
.getAvailableScheduledRecording(mSeriesRecording.getId()).size();
- DvrScheduleManager dvrScheduleManager =
- TvApplication.getSingletons(context).getDvrScheduleManager();
List<ScheduledRecording> conflictingRecordings =
- dvrScheduleManager.getConflictingSchedules(mSeriesRecording);
+ mDvrScheduleManager.getConflictingSchedules(mSeriesRecording);
mHasConflict = !conflictingRecordings.isEmpty();
for (ScheduledRecording recording : conflictingRecordings) {
if (recording.getSeriesRecordingId() == mSeriesRecording.getId()) {
++mInThisSeriesConflictCount;
- } else if (recording.getPriority() < mSeriesRecording.getPriority()) {
+ } else {
++mOutThisSeriesConflictCount;
}
}
@@ -123,9 +113,6 @@ public class DvrSeriesScheduledFragment extends DvrGuidedStepFragment {
.TYPE_SERIES_SCHEDULE);
intent.putExtra(DvrSeriesSchedulesFragment.SERIES_SCHEDULES_KEY_SERIES_RECORDING,
mSeriesRecording);
- BigArguments.reset();
- BigArguments.setArgument(DvrSeriesSchedulesFragment
- .SERIES_SCHEDULES_KEY_SERIES_PROGRAMS, mPrograms);
startActivity(intent);
}
getActivity().finish();
@@ -134,30 +121,30 @@ public class DvrSeriesScheduledFragment extends DvrGuidedStepFragment {
private String getDescription() {
if (!mHasConflict) {
return getResources().getQuantityString(
- R.plurals.dvr_series_scheduled_no_conflict, mSchedulesAddedCount,
+ R.plurals.dvr_series_recording_scheduled_no_conflict, mSchedulesAddedCount,
mSchedulesAddedCount, mSeriesRecording.getTitle());
} else {
// mInThisSeriesConflictCount equals 0 and mOutThisSeriesConflictCount equals 0 means
// mHasConflict is false. So we don't need to check that case.
if (mInThisSeriesConflictCount != 0 && mOutThisSeriesConflictCount != 0) {
- return getResources().getQuantityString(
- R.plurals.dvr_series_scheduled_this_and_other_series_conflict,
+ return getResources().getQuantityString(R.plurals
+ .dvr_series_recording_scheduled_this_and_other_series_conflict,
mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecording.getTitle(),
mInThisSeriesConflictCount + mOutThisSeriesConflictCount);
} else if (mInThisSeriesConflictCount != 0) {
- return getResources().getQuantityString(
- R.plurals.dvr_series_recording_scheduled_only_this_series_conflict,
+ return getResources().getQuantityString(R.plurals
+ .dvr_series_recording_scheduled_only_this_series_conflict,
mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecording.getTitle(),
mInThisSeriesConflictCount);
} else {
if (mOutThisSeriesConflictCount == 1) {
- return getResources().getQuantityString(
- R.plurals.dvr_series_scheduled_only_other_series_one_conflict,
+ return getResources().getQuantityString(R.plurals
+ .dvr_series_recording_scheduled_only_other_series_one_conflict,
mSchedulesAddedCount, mSchedulesAddedCount,
mSeriesRecording.getTitle());
} else {
- return getResources().getQuantityString(
- R.plurals.dvr_series_scheduled_only_other_series_many_conflicts,
+ return getResources().getQuantityString(R.plurals
+ .dvr_series_recording_scheduled_only_other_series_conflict,
mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecording.getTitle(),
mOutThisSeriesConflictCount);
}
diff --git a/src/com/android/tv/dvr/ui/DvrSeriesSettingsActivity.java b/src/com/android/tv/dvr/ui/DvrSeriesSettingsActivity.java
index 6dd20b3a..3f7671b3 100644
--- a/src/com/android/tv/dvr/ui/DvrSeriesSettingsActivity.java
+++ b/src/com/android/tv/dvr/ui/DvrSeriesSettingsActivity.java
@@ -17,6 +17,7 @@
package com.android.tv.dvr.ui;
import android.app.Activity;
+import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v17.leanback.app.GuidedStepFragment;
@@ -37,34 +38,25 @@ public class DvrSeriesSettingsActivity extends Activity {
/**
* Name of the boolean flag to decide if the series recording with empty schedule and recording
* will be removed.
- * Type: boolean
*/
public static final String REMOVE_EMPTY_SERIES_RECORDING = "remove_empty_series_recording";
/**
* Name of the boolean flag to decide if the setting fragment should be translucent.
- * Type: boolean
*/
public static final String IS_WINDOW_TRANSLUCENT = "windows_translucent";
/**
- * Name of the program list. The list contains the programs which belong to the series.
- * Type: List<{@link com.android.tv.data.Program}>
+ * Name of the channel id list. If the channel list is given, we show the channels
+ * from the values in channel option.
+ * Type: Long array
*/
- public static final String PROGRAM_LIST = "program_list";
+ public static final String CHANNEL_ID_LIST = "channel_id_list";
/**
* Name of the boolean flag to check if the confirm dialog should show view schedule option.
- * Type: boolean
*/
public static final String SHOW_VIEW_SCHEDULE_OPTION_IN_DIALOG =
"show_view_schedule_option_in_dialog";
- /**
- * Name of the current program added to series. The current program will be recorded only when
- * the series recording is initialized from media controller. But for other case, the current
- * program won't be recorded.
- */
- public static final String CURRENT_PROGRAM = "current_program";
-
@Override
public void onCreate(Bundle savedInstanceState) {
TvApplication.setCurrentRunningProcess(this, true);
@@ -74,7 +66,7 @@ public class DvrSeriesSettingsActivity extends Activity {
SoftPreconditions.checkArgument(seriesRecordingId != -1);
if (savedInstanceState == null) {
- DvrSeriesSettingsFragment settingFragment = new DvrSeriesSettingsFragment();
+ SeriesSettingsFragment settingFragment = new SeriesSettingsFragment();
settingFragment.setArguments(getIntent().getExtras());
GuidedStepFragment.addAsRoot(this, settingFragment, R.id.dvr_settings_view_frame);
}
diff --git a/src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java b/src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java
index b476fff7..c3867886 100644
--- a/src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java
@@ -33,7 +33,7 @@ import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -131,8 +131,15 @@ public class DvrStopRecordingFragment extends DvrGuidedStepFragment {
String title = getString(R.string.dvr_stop_recording_dialog_title);
String description;
if (mStopReason == REASON_ON_CONFLICT) {
+ String programTitle = mSchedule.getProgramTitle();
+ if (TextUtils.isEmpty(programTitle)) {
+ ChannelDataManager channelDataManager =
+ TvApplication.getSingletons(getActivity()).getChannelDataManager();
+ Channel channel = channelDataManager.getChannel(mSchedule.getChannelId());
+ programTitle = channel.getDisplayName();
+ }
description = getString(R.string.dvr_stop_recording_dialog_description_on_conflict,
- mSchedule.getProgramDisplayTitle(getContext()));
+ mSchedule.getProgramTitle());
} else {
description = getString(R.string.dvr_stop_recording_dialog_description);
}
diff --git a/src/com/android/tv/dvr/ui/DvrStopSeriesRecordingFragment.java b/src/com/android/tv/dvr/ui/DvrStopSeriesRecordingFragment.java
index fe3a4a60..feaa2357 100644
--- a/src/com/android/tv/dvr/ui/DvrStopSeriesRecordingFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrStopSeriesRecordingFragment.java
@@ -31,8 +31,8 @@ import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/tv/dvr/ui/FadeBackground.java b/src/com/android/tv/dvr/ui/FadeBackground.java
deleted file mode 100644
index 4f06ebcf..00000000
--- a/src/com/android/tv/dvr/ui/FadeBackground.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.dvr.ui;
-
-import android.animation.Animator;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.transition.Transition;
-import android.transition.TransitionValues;
-import android.transition.Visibility;
-import android.util.AttributeSet;
-import android.view.ViewGroup;
-
-import com.android.tv.R;
-
-/**
- * This transition fades in/out of the background of the view by changing the background color.
- */
-public class FadeBackground extends Transition {
- private final int mMode;
-
- public FadeBackground(Context context, AttributeSet attrs) {
- super(context, attrs);
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FadeBackground);
- mMode = a.getInt(R.styleable.FadeBackground_fadingMode, Visibility.MODE_IN);
- a.recycle();
- }
-
- @Override
- public void captureStartValues(TransitionValues transitionValues) { }
-
- @Override
- public void captureEndValues(TransitionValues transitionValues) { }
-
- @Override
- public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
- TransitionValues endValues) {
- if (startValues == null || endValues == null) {
- return null;
- }
- Drawable background = endValues.view.getBackground();
- if (background instanceof ColorDrawable) {
- int color = ((ColorDrawable) background).getColor();
- int transparentColor = Color.argb(0, Color.red(color), Color.green(color),
- Color.blue(color));
- return mMode == Visibility.MODE_OUT
- ? ObjectAnimator.ofArgb(background, "color", transparentColor)
- : ObjectAnimator.ofArgb(background, "color", transparentColor, color);
- }
- return null;
- }
-}
diff --git a/src/com/android/tv/dvr/ui/browse/FullScheduleCardHolder.java b/src/com/android/tv/dvr/ui/FullScheduleCardHolder.java
index 311137a9..d4d4d8ab 100644
--- a/src/com/android/tv/dvr/ui/browse/FullScheduleCardHolder.java
+++ b/src/com/android/tv/dvr/ui/FullScheduleCardHolder.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
/**
* Special object for schedule preview;
diff --git a/src/com/android/tv/dvr/ui/browse/FullSchedulesCardPresenter.java b/src/com/android/tv/dvr/ui/FullSchedulesCardPresenter.java
index 6d4763d4..7dd85f45 100644
--- a/src/com/android/tv/dvr/ui/browse/FullSchedulesCardPresenter.java
+++ b/src/com/android/tv/dvr/ui/FullSchedulesCardPresenter.java
@@ -14,17 +14,17 @@
* limitations under the License.
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.content.Context;
-import android.graphics.drawable.Drawable;
+import android.support.v17.leanback.widget.Presenter;
import android.view.View;
import android.view.ViewGroup;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.ui.DvrUiHelper;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.util.Utils;
import java.util.Collections;
@@ -33,31 +33,23 @@ import java.util.List;
/**
* Presents a {@link ScheduledRecording} in the {@link DvrBrowseFragment}.
*/
-class FullSchedulesCardPresenter extends DvrItemPresenter {
- private Context mContext;
- private final Drawable mIconDrawable;
- private final String mCardTitleText;
-
- public FullSchedulesCardPresenter(Context context) {
- mContext = context;
- mIconDrawable = mContext.getDrawable(R.drawable.dvr_full_schedule);
- mCardTitleText = mContext.getString(R.string.dvr_full_schedule_card_view_title);
- }
-
+public class FullSchedulesCardPresenter extends Presenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
Context context = parent.getContext();
RecordingCardView view = new RecordingCardView(context);
- return new ViewHolder(view);
+ return new ScheduledRecordingViewHolder(view);
}
@Override
- public void onBindViewHolder(ViewHolder vh, Object o) {
- final RecordingCardView cardView = (RecordingCardView) vh.view;
+ public void onBindViewHolder(ViewHolder baseHolder, Object o) {
+ final ScheduledRecordingViewHolder viewHolder = (ScheduledRecordingViewHolder) baseHolder;
+ final RecordingCardView cardView = (RecordingCardView) viewHolder.view;
+ final Context context = viewHolder.view.getContext();
- cardView.setImage(mIconDrawable);
- cardView.setTitle(mCardTitleText);
- List<ScheduledRecording> scheduledRecordings = TvApplication.getSingletons(mContext)
+ cardView.setImage(context.getDrawable(R.drawable.dvr_full_schedule));
+ cardView.setTitle(context.getString(R.string.dvr_full_schedule_card_view_title));
+ List<ScheduledRecording> scheduledRecordings = TvApplication.getSingletons(context)
.getDvrDataManager().getAvailableScheduledRecordings();
int fullDays = 0;
if (!scheduledRecordings.isEmpty()) {
@@ -65,24 +57,28 @@ class FullSchedulesCardPresenter extends DvrItemPresenter {
Collections.max(scheduledRecordings, ScheduledRecording.START_TIME_COMPARATOR)
.getStartTimeMs()) + 1;
}
- cardView.setContent(mContext.getResources().getQuantityString(
+ cardView.setContent(context.getResources().getQuantityString(
R.plurals.dvr_full_schedule_card_view_content, fullDays, fullDays), null);
- super.onBindViewHolder(vh, o);
+
+ View.OnClickListener clickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ DvrUiHelper.startSchedulesActivity(context, null);
+ }
+ };
+ baseHolder.view.setOnClickListener(clickListener);
}
@Override
- public void onUnbindViewHolder(ViewHolder vh) {
- ((RecordingCardView) vh.view).reset();
- super.onUnbindViewHolder(vh);
+ public void onUnbindViewHolder(ViewHolder baseHolder) {
+ ScheduledRecordingViewHolder viewHolder = (ScheduledRecordingViewHolder) baseHolder;
+ final RecordingCardView cardView = (RecordingCardView) viewHolder.view;
+ cardView.reset();
}
- @Override
- protected View.OnClickListener onCreateOnClickListener() {
- return new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- DvrUiHelper.startSchedulesActivity(mContext, null);
- }
- };
+ private static final class ScheduledRecordingViewHolder extends ViewHolder {
+ ScheduledRecordingViewHolder(RecordingCardView view) {
+ super(view);
+ }
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/dialog/HalfSizedDialogFragment.java b/src/com/android/tv/dvr/ui/HalfSizedDialogFragment.java
index 315c6a93..d320816e 100644
--- a/src/com/android/tv/dialog/HalfSizedDialogFragment.java
+++ b/src/com/android/tv/dvr/ui/HalfSizedDialogFragment.java
@@ -14,9 +14,8 @@
* limitations under the License.
*/
-package com.android.tv.dialog;
+package com.android.tv.dvr.ui;
-import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
@@ -26,6 +25,7 @@ import android.view.View;
import android.view.ViewGroup;
import com.android.tv.R;
+import com.android.tv.dialog.SafeDismissDialogFragment;
import java.util.concurrent.TimeUnit;
@@ -54,6 +54,13 @@ public class HalfSizedDialogFragment extends SafeDismissDialogFragment {
@Override
public void onStart() {
super.onStart();
+ getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
+ public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent keyEvent) {
+ mHandler.removeCallbacks(mAutoDismisser);
+ mHandler.postDelayed(mAutoDismisser, AUTO_DISMISS_TIME_THRESHOLD_MS);
+ return false;
+ }
+ });
mHandler.postDelayed(mAutoDismisser, AUTO_DISMISS_TIME_THRESHOLD_MS);
}
@@ -74,19 +81,6 @@ public class HalfSizedDialogFragment extends SafeDismissDialogFragment {
}
@Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- Dialog dialog = super.onCreateDialog(savedInstanceState);
- dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
- public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent keyEvent) {
- mHandler.removeCallbacks(mAutoDismisser);
- mHandler.postDelayed(mAutoDismisser, AUTO_DISMISS_TIME_THRESHOLD_MS);
- return false;
- }
- });
- return dialog;
- }
-
- @Override
public int getTheme() {
return R.style.Theme_TV_dialog_HalfSizedDialog;
}
diff --git a/src/com/android/tv/dvr/ui/DvrPrioritySettingsFragment.java b/src/com/android/tv/dvr/ui/PrioritySettingsFragment.java
index 562898a3..158bd824 100644
--- a/src/com/android/tv/dvr/ui/DvrPrioritySettingsFragment.java
+++ b/src/com/android/tv/dvr/ui/PrioritySettingsFragment.java
@@ -33,7 +33,7 @@ import com.android.tv.TvApplication;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.DvrScheduleManager;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.SeriesRecording;
import java.util.ArrayList;
import java.util.List;
@@ -41,7 +41,7 @@ import java.util.List;
/**
* Fragment for DVR series recording settings.
*/
-public class DvrPrioritySettingsFragment extends GuidedStepFragment {
+public class PrioritySettingsFragment extends GuidedStepFragment {
/**
* Name of series recording id starting the fragment.
* Type: Long
@@ -162,6 +162,7 @@ public class DvrPrioritySettingsFragment extends GuidedStepFragment {
return;
}
if (action.getId() < 0) {
+ int selectedPosition = mSeriesRecordings.indexOf(mSelectedRecording);
mSelectedRecording = null;
for (int i = 0; i < mSeriesRecordings.size(); ++i) {
updateItem(i);
@@ -247,4 +248,4 @@ public class DvrPrioritySettingsFragment extends GuidedStepFragment {
titleView.setTypeface(titleView.getTypeface(), Typeface.NORMAL);
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/dvr/ui/browse/RecordedProgramDetailsFragment.java b/src/com/android/tv/dvr/ui/RecordedProgramDetailsFragment.java
index fe9b9de5..e698b8a2 100644
--- a/src/com/android/tv/dvr/ui/browse/RecordedProgramDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/RecordedProgramDetailsFragment.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.content.res.Resources;
import android.media.tv.TvInputManager;
@@ -30,10 +30,10 @@ import com.android.tv.data.Channel;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.DvrWatchedPositionManager;
-import com.android.tv.dvr.data.RecordedProgram;
+import com.android.tv.dvr.RecordedProgram;
/**
- * {@link android.support.v17.leanback.app.DetailsFragment} for recorded program in DVR.
+ * {@link DetailsFragment} for recorded program in DVR.
*/
public class RecordedProgramDetailsFragment extends DvrDetailsFragment
implements DvrDataManager.RecordedProgramListener {
diff --git a/src/com/android/tv/dvr/ui/browse/RecordedProgramPresenter.java b/src/com/android/tv/dvr/ui/RecordedProgramPresenter.java
index ee978797..1bf34310 100644
--- a/src/com/android/tv/dvr/ui/browse/RecordedProgramPresenter.java
+++ b/src/com/android/tv/dvr/ui/RecordedProgramPresenter.java
@@ -14,26 +14,31 @@
* limitations under the License.
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
+import android.app.Activity;
import android.content.Context;
import android.media.tv.TvContract;
import android.media.tv.TvInputManager;
+import android.net.Uri;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.TextAppearanceSpan;
+import android.view.View;
import android.view.ViewGroup;
import com.android.tv.R;
import com.android.tv.TvApplication;
+import com.android.tv.dvr.RecordedProgram;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.dvr.DvrWatchedPositionManager;
import com.android.tv.dvr.DvrWatchedPositionManager.WatchedPositionChangedListener;
-import com.android.tv.dvr.data.RecordedProgram;
import com.android.tv.util.Utils;
+import java.util.concurrent.TimeUnit;
+
/**
* Presents a {@link RecordedProgram} in the {@link DvrBrowseFragment}.
*/
@@ -45,7 +50,6 @@ public class RecordedProgramPresenter extends DvrItemPresenter {
private String mYesterdayString;
private final int mProgressBarColor;
private final boolean mShowEpisodeTitle;
- private final boolean mExpandTitleWhenFocused;
private static final class RecordedProgramViewHolder extends ViewHolder
implements WatchedPositionChangedListener {
@@ -75,27 +79,25 @@ public class RecordedProgramPresenter extends DvrItemPresenter {
}
}
- public RecordedProgramPresenter(Context context, boolean showEpisodeTitle,
- boolean expandTitleWhenFocused) {
+ public RecordedProgramPresenter(Context context, boolean showEpisodeTitle) {
mContext = context;
- mChannelDataManager = TvApplication.getSingletons(mContext).getChannelDataManager();
- mTodayString = mContext.getString(R.string.dvr_date_today);
- mYesterdayString = mContext.getString(R.string.dvr_date_yesterday);
+ mChannelDataManager = TvApplication.getSingletons(context).getChannelDataManager();
+ mTodayString = context.getString(R.string.dvr_date_today);
+ mYesterdayString = context.getString(R.string.dvr_date_yesterday);
mDvrWatchedPositionManager =
- TvApplication.getSingletons(mContext).getDvrWatchedPositionManager();
- mProgressBarColor = mContext.getResources()
+ TvApplication.getSingletons(context).getDvrWatchedPositionManager();
+ mProgressBarColor = context.getResources()
.getColor(R.color.play_controls_progress_bar_watched);
mShowEpisodeTitle = showEpisodeTitle;
- mExpandTitleWhenFocused = expandTitleWhenFocused;
}
public RecordedProgramPresenter(Context context) {
- this(context, false, false);
+ this(context, false);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
- RecordingCardView view = new RecordingCardView(mContext, mExpandTitleWhenFocused);
+ RecordingCardView view = new RecordingCardView(mContext);
return new RecordedProgramViewHolder(view, mProgressBarColor);
}
@@ -130,7 +132,8 @@ public class RecordedProgramPresenter extends DvrItemPresenter {
isChannelLogo = true;
}
cardView.setImageUri(imageUri, isChannelLogo);
- int durationMinutes = Math.max(1, Utils.getRoundOffMinsFromMs(program.getDurationMillis()));
+ int durationMinutes =
+ Math.max(1, (int) TimeUnit.MILLISECONDS.toMinutes(program.getDurationMillis()));
String durationString = getContext().getResources().getQuantityString(
R.plurals.dvr_program_duration, durationMinutes, durationMinutes);
cardView.setContent(getDescription(program), durationString);
diff --git a/src/com/android/tv/dvr/ui/browse/RecordingCardView.java b/src/com/android/tv/dvr/ui/RecordingCardView.java
index 7b0a8cb9..51c3b03b 100644
--- a/src/com/android/tv/dvr/ui/browse/RecordingCardView.java
+++ b/src/com/android/tv/dvr/ui/RecordingCardView.java
@@ -14,69 +14,51 @@
* limitations under the License.
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
-import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
-import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.support.annotation.Nullable;
import android.support.v17.leanback.widget.BaseCardView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
-import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.android.tv.R;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.ui.ViewUtils;
+import com.android.tv.dvr.RecordedProgram;
import com.android.tv.util.ImageLoader;
/**
- * A CardView for displaying info about a {@link com.android.tv.dvr.data.ScheduledRecording}
- * or {@link RecordedProgram} or {@link com.android.tv.dvr.data.SeriesRecording}.
+ * A CardView for displaying info about a {@link com.android.tv.dvr.ScheduledRecording} or
+ * {@link RecordedProgram} or
+ * {@link com.android.tv.dvr.SeriesRecording}.
*/
-public class RecordingCardView extends BaseCardView {
- // This value should be the same with
- // android.support.v17.leanback.widget.FocusHighlightHelper.BrowseItemFocusHighlight.DURATION_MS
- private final static int ANIMATION_DURATION = 150;
+class RecordingCardView extends BaseCardView {
private final ImageView mImageView;
private final int mImageWidth;
private final int mImageHeight;
private String mImageUri;
+ private final TextView mTitleView;
private final TextView mMajorContentView;
private final TextView mMinorContentView;
private final ProgressBar mProgressBar;
private final View mAffiliatedIconContainer;
private final ImageView mAffiliatedIcon;
private final Drawable mDefaultImage;
- private final FrameLayout mTitleArea;
- private final TextView mFoldedTitleView;
- private final TextView mExpandedTitleView;
- private final ValueAnimator mExpandTitleAnimator;
- private final int mFoldedTitleHeight;
- private final int mExpandedTitleHeight;
- private final boolean mExpandTitleWhenFocused;
- private boolean mExpanded;
- public RecordingCardView(Context context) {
- this(context, false);
+ RecordingCardView(Context context) {
+ this(context,
+ context.getResources().getDimensionPixelSize(R.dimen.dvr_card_image_layout_width),
+ context.getResources().getDimensionPixelSize(R.dimen.dvr_card_image_layout_height));
}
- public RecordingCardView(Context context, boolean expandTitleWhenFocused) {
- this(context, context.getResources().getDimensionPixelSize(
- R.dimen.dvr_library_card_image_layout_width), context.getResources()
- .getDimensionPixelSize(R.dimen.dvr_library_card_image_layout_height),
- expandTitleWhenFocused);
- }
-
- public RecordingCardView(Context context, int imageWidth, int imageHeight,
- boolean expandTitleWhenFocused) {
+ RecordingCardView(Context context, int imageWidth, int imageHeight) {
super(context);
//TODO(dvr): move these to the layout XML.
setCardType(BaseCardView.CARD_TYPE_INFO_UNDER_WITH_EXTRA);
@@ -93,73 +75,13 @@ public class RecordingCardView extends BaseCardView {
mProgressBar = (ProgressBar) findViewById(R.id.recording_progress);
mAffiliatedIconContainer = findViewById(R.id.affiliated_icon_container);
mAffiliatedIcon = (ImageView) findViewById(R.id.affiliated_icon);
+ mTitleView = (TextView) findViewById(R.id.title);
mMajorContentView = (TextView) findViewById(R.id.content_major);
mMinorContentView = (TextView) findViewById(R.id.content_minor);
- mTitleArea = (FrameLayout) findViewById(R.id.title_area);
- mFoldedTitleView = (TextView) findViewById(R.id.title_one_line);
- mExpandedTitleView = (TextView) findViewById(R.id.title_two_lines);
- mFoldedTitleHeight = getResources()
- .getDimensionPixelSize(R.dimen.dvr_library_card_folded_title_height);
- mExpandedTitleHeight = getResources()
- .getDimensionPixelSize(R.dimen.dvr_library_card_expanded_title_height);
- mExpandTitleAnimator = ValueAnimator.ofFloat(0.0f, 1.0f).setDuration(ANIMATION_DURATION);
- mExpandTitleAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator valueAnimator) {
- float value = (Float) valueAnimator.getAnimatedValue();
- mExpandedTitleView.setAlpha(value);
- mFoldedTitleView.setAlpha(1.0f - value);
- ViewUtils.setLayoutHeight(mTitleArea, (int) (mFoldedTitleHeight
- + (mExpandedTitleHeight - mFoldedTitleHeight) * value));
- }
- });
- mExpandTitleWhenFocused = expandTitleWhenFocused;
- }
-
- @Override
- protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
- super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
- if (mExpandTitleWhenFocused) {
- if (gainFocus) {
- expandTitle(true, true);
- } else {
- expandTitle(false, true);
- }
- }
- }
-
- /**
- * Expands/folds the title area to show program title with two/one lines.
- *
- * @param expand {@code true} to expand the title area, or {@code false} to fold it.
- * @param withAnimation {@code true} to expand/fold with animation.
- */
- public void expandTitle(boolean expand, boolean withAnimation) {
- if (expand != mExpanded && mFoldedTitleView.getLayout().getEllipsisCount(0) > 0) {
- if (withAnimation) {
- if (expand) {
- mExpandTitleAnimator.start();
- } else {
- mExpandTitleAnimator.reverse();
- }
- } else {
- if (expand) {
- mFoldedTitleView.setAlpha(0.0f);
- mExpandedTitleView.setAlpha(1.0f);
- ViewUtils.setLayoutHeight(mTitleArea, mExpandedTitleHeight);
- } else {
- mFoldedTitleView.setAlpha(1.0f);
- mExpandedTitleView.setAlpha(0.0f);
- ViewUtils.setLayoutHeight(mTitleArea, mFoldedTitleHeight);
- }
- }
- mExpanded = expand;
- }
}
void setTitle(CharSequence title) {
- mFoldedTitleView.setText(title);
- mExpandedTitleView.setText(title);
+ mTitleView.setText(title);
}
void setContent(CharSequence majorContent, CharSequence minorContent) {
@@ -256,9 +178,8 @@ public class RecordingCardView extends BaseCardView {
}
public void reset() {
- mFoldedTitleView.setText(null);
- mExpandedTitleView.setText(null);
+ mTitleView.setText(null);
setContent(null, null);
mImageView.setImageDrawable(mDefaultImage);
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/dvr/ui/browse/RecordingDetailsFragment.java b/src/com/android/tv/dvr/ui/RecordingDetailsFragment.java
index a877e05f..4e19ec3f 100644
--- a/src/com/android/tv/dvr/ui/browse/RecordingDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/RecordingDetailsFragment.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.os.Bundle;
import android.support.v17.leanback.app.DetailsFragment;
@@ -26,7 +26,7 @@ import android.text.style.TextAppearanceSpan;
import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.data.Channel;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
/**
* {@link DetailsFragment} for recordings in DVR.
diff --git a/src/com/android/tv/dvr/ui/browse/ScheduledRecordingDetailsFragment.java b/src/com/android/tv/dvr/ui/ScheduledRecordingDetailsFragment.java
index eb0f4f0d..60816bb5 100644
--- a/src/com/android/tv/dvr/ui/browse/ScheduledRecordingDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/ScheduledRecordingDetailsFragment.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.content.res.Resources;
import android.os.Bundle;
@@ -26,7 +26,7 @@ import android.text.TextUtils;
import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.ui.DvrUiHelper;
+import com.android.tv.dvr.DvrUiHelper;
/**
* {@link RecordingDetailsFragment} for scheduled recording in DVR.
diff --git a/src/com/android/tv/dvr/ui/browse/ScheduledRecordingPresenter.java b/src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java
index efc8785a..5f447f13 100644
--- a/src/com/android/tv/dvr/ui/browse/ScheduledRecordingPresenter.java
+++ b/src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java
@@ -14,8 +14,9 @@
* limitations under the License.
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
+import android.app.Activity;
import android.content.Context;
import android.media.tv.TvContract;
import android.os.Handler;
@@ -31,7 +32,7 @@ import com.android.tv.TvApplication;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.util.Utils;
import java.util.concurrent.TimeUnit;
@@ -39,7 +40,7 @@ import java.util.concurrent.TimeUnit;
/**
* Presents a {@link ScheduledRecording} in the {@link DvrBrowseFragment}.
*/
-class ScheduledRecordingPresenter extends DvrItemPresenter {
+public class ScheduledRecordingPresenter extends DvrItemPresenter {
private static final long PROGRESS_UPDATE_INTERVAL_MS = TimeUnit.SECONDS.toMillis(5);
private final ChannelDataManager mChannelDataManager;
@@ -91,17 +92,18 @@ class ScheduledRecordingPresenter extends DvrItemPresenter {
}
public ScheduledRecordingPresenter(Context context) {
- mContext = context;
- ApplicationSingletons singletons = TvApplication.getSingletons(mContext);
+ ApplicationSingletons singletons = TvApplication.getSingletons(context);
mChannelDataManager = singletons.getChannelDataManager();
mDvrManager = singletons.getDvrManager();
- mProgressBarColor = mContext.getResources()
+ mContext = context;
+ mProgressBarColor = context.getResources()
.getColor(R.color.play_controls_recording_icon_color_on_focus);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
- RecordingCardView view = new RecordingCardView(mContext);
+ Context context = parent.getContext();
+ RecordingCardView view = new RecordingCardView(context);
return new ScheduledRecordingViewHolder(view, mProgressBarColor);
}
@@ -142,8 +144,9 @@ class ScheduledRecordingPresenter extends DvrItemPresenter {
public void onUnbindViewHolder(ViewHolder baseHolder) {
ScheduledRecordingViewHolder viewHolder = (ScheduledRecordingViewHolder) baseHolder;
viewHolder.stopUpdateProgressBar();
+ final RecordingCardView cardView = (RecordingCardView) viewHolder.view;
viewHolder.mScheduledRecording = null;
- ((RecordingCardView) viewHolder.view).reset();
+ cardView.reset();
super.onUnbindViewHolder(viewHolder);
}
@@ -171,4 +174,4 @@ class ScheduledRecordingPresenter extends DvrItemPresenter {
cardView.setTitle(title);
cardView.setImageUri(imageUri, isChannelLogo);
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/dvr/ui/DvrSeriesDeletionFragment.java b/src/com/android/tv/dvr/ui/SeriesDeletionFragment.java
index 8bf8560f..36e3cfc1 100644
--- a/src/com/android/tv/dvr/ui/DvrSeriesDeletionFragment.java
+++ b/src/com/android/tv/dvr/ui/SeriesDeletionFragment.java
@@ -33,10 +33,9 @@ import com.android.tv.common.SoftPreconditions;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.DvrWatchedPositionManager;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.RecordedProgram;
+import com.android.tv.dvr.SeriesRecording;
import com.android.tv.ui.GuidedActionsStylistWithDivider;
-import com.android.tv.util.Utils;
import java.util.ArrayList;
import java.util.Collections;
@@ -48,7 +47,7 @@ import java.util.concurrent.TimeUnit;
/**
* Fragment for DVR series recording settings.
*/
-public class DvrSeriesDeletionFragment extends GuidedStepFragment {
+public class SeriesDeletionFragment extends GuidedStepFragment {
private static final long WATCHED_TIME_UNIT_THRESHOLD = TimeUnit.MINUTES.toMillis(2);
// Since recordings' IDs are used as its check actions' IDs, which are random positive numbers,
@@ -219,8 +218,8 @@ public class DvrSeriesDeletionFragment extends GuidedStepFragment {
private String getWatchedString(long watchedPositionMs, long durationMs) {
if (durationMs > WATCHED_TIME_UNIT_THRESHOLD) {
return getResources().getString(R.string.dvr_series_watched_info_minutes,
- Math.max(1, Utils.getRoundOffMinsFromMs(watchedPositionMs)),
- Utils.getRoundOffMinsFromMs(durationMs));
+ Math.max(1, TimeUnit.MILLISECONDS.toMinutes(watchedPositionMs)),
+ TimeUnit.MILLISECONDS.toMinutes(durationMs));
} else {
return getResources().getString(R.string.dvr_series_watched_info_seconds,
Math.max(1, TimeUnit.MILLISECONDS.toSeconds(watchedPositionMs)),
diff --git a/src/com/android/tv/dvr/ui/browse/SeriesRecordingDetailsFragment.java b/src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java
index f7b60b50..e9e391d4 100644
--- a/src/com/android/tv/dvr/ui/browse/SeriesRecordingDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
@@ -28,6 +28,7 @@ import android.support.v17.leanback.widget.DetailsOverviewRow;
import android.support.v17.leanback.widget.DetailsOverviewRowPresenter;
import android.support.v17.leanback.widget.HeaderItem;
import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.OnActionClickedListener;
import android.support.v17.leanback.widget.PresenterSelector;
import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
@@ -38,11 +39,12 @@ import com.android.tv.TvApplication;
import com.android.tv.data.BaseProgram;
import com.android.tv.data.Channel;
import com.android.tv.dvr.DvrDataManager;
+import com.android.tv.dvr.DvrManager;
+import com.android.tv.dvr.DvrUiHelper;
import com.android.tv.dvr.DvrWatchedPositionManager;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.ui.DvrUiHelper;
-import com.android.tv.dvr.ui.SortedArrayAdapter;
+import com.android.tv.dvr.RecordedProgram;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
import java.util.Collections;
import java.util.Comparator;
@@ -83,7 +85,7 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
mWatchLabel = getString(R.string.dvr_detail_watch);
mResumeLabel = getString(R.string.dvr_detail_series_resume);
mWatchDrawable = getResources().getDrawable(R.drawable.lb_ic_play, null);
- mRecordedProgramPresenter = new RecordedProgramPresenter(getContext(), true, true);
+ mRecordedProgramPresenter = new RecordedProgramPresenter(getContext(), true);
super.onCreate(savedInstanceState);
}
@@ -156,7 +158,7 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
DetailsOverviewRowPresenter rowPresenter) {
ClassPresenterSelector presenterSelector = new ClassPresenterSelector();
presenterSelector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
- presenterSelector.addClassPresenter(ListRow.class, new DvrListRowPresenter(getContext()));
+ presenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
return presenterSelector;
}
@@ -201,7 +203,10 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
mDvrDataManager.removeSeriesRecordingListener(this);
mDvrDataManager.removeRecordedProgramListener(this);
if (mSeries != null) {
- mDvrDataManager.checkAndRemoveEmptySeriesRecording(mSeries.getId());
+ DvrManager dvrManager = TvApplication.getSingletons(getActivity()).getDvrManager();
+ if (dvrManager.canRemoveSeriesRecording(mSeries.getId())) {
+ dvrManager.removeSeriesRecording(mSeries.getId());
+ }
}
mRecordedProgramPresenter.unbindAllViewHolders();
}
@@ -260,6 +265,7 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
public void onSeriesRecordingRemoved(SeriesRecording... seriesRecordings) {
for (SeriesRecording series : seriesRecordings) {
if (series.getId() == mSeries.getId()) {
+ mSeries = null;
getActivity().finish();
return;
}
@@ -366,4 +372,4 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
return program.getId();
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/dvr/ui/browse/SeriesRecordingPresenter.java b/src/com/android/tv/dvr/ui/SeriesRecordingPresenter.java
index af6ecc19..c2c0f596 100644
--- a/src/com/android/tv/dvr/ui/browse/SeriesRecordingPresenter.java
+++ b/src/com/android/tv/dvr/ui/SeriesRecordingPresenter.java
@@ -14,8 +14,9 @@
* limitations under the License.
*/
-package com.android.tv.dvr.ui.browse;
+package com.android.tv.dvr.ui;
+import android.app.Activity;
import android.content.Context;
import android.media.tv.TvContract;
import android.media.tv.TvInputManager;
@@ -33,16 +34,16 @@ import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.DvrWatchedPositionManager;
import com.android.tv.dvr.DvrWatchedPositionManager.WatchedPositionChangedListener;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.RecordedProgram;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
import java.util.List;
/**
* Presents a {@link SeriesRecording} in {@link DvrBrowseFragment}.
*/
-class SeriesRecordingPresenter extends DvrItemPresenter {
+public class SeriesRecordingPresenter extends DvrItemPresenter {
private final ChannelDataManager mChannelDataManager;
private final DvrDataManager mDvrDataManager;
private final DvrManager mDvrManager;
diff --git a/src/com/android/tv/dvr/ui/DvrSeriesSettingsFragment.java b/src/com/android/tv/dvr/ui/SeriesSettingsFragment.java
index f28382da..6c05c9c6 100644
--- a/src/com/android/tv/dvr/ui/DvrSeriesSettingsFragment.java
+++ b/src/com/android/tv/dvr/ui/SeriesSettingsFragment.java
@@ -17,13 +17,19 @@
package com.android.tv.dvr.ui;
import android.app.FragmentManager;
+import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.v17.leanback.app.GuidedStepFragment;
import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
import android.support.v17.leanback.widget.GuidedAction;
import android.support.v17.leanback.widget.GuidedActionsStylist;
+import android.util.Log;
import android.util.LongSparseArray;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ProgressBar;
import com.android.tv.R;
import com.android.tv.TvApplication;
@@ -32,14 +38,14 @@ import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.Program;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeasonEpisodeNumber;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.data.SeriesRecording.ChannelOption;
-import com.android.tv.dvr.recorder.SeriesRecordingScheduler;
-
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.EpisodicProgramLoadTask;
+import com.android.tv.dvr.SeriesRecording;
+import com.android.tv.dvr.SeriesRecording.ChannelOption;
+import com.android.tv.dvr.SeriesRecordingScheduler;
+import com.android.tv.dvr.SeriesRecordingScheduler.OnSeriesRecordingUpdatedListener;
import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -47,7 +53,7 @@ import java.util.Set;
/**
* Fragment for DVR series recording settings.
*/
-public class DvrSeriesSettingsFragment extends GuidedStepFragment
+public class SeriesSettingsFragment extends GuidedStepFragment
implements DvrDataManager.SeriesRecordingListener {
private static final String TAG = "SeriesSettingsFragment";
private static final boolean DEBUG = false;
@@ -60,13 +66,15 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
private static final long SUB_ACTION_ID_CHANNEL_ONE_BASE = 500;
private DvrDataManager mDvrDataManager;
+ private ChannelDataManager mChannelDataManager;
+ private DvrManager mDvrManager;
private SeriesRecording mSeriesRecording;
private long mSeriesRecordingId;
@ChannelOption int mChannelOption;
+ private Comparator<Channel> mChannelComparator;
private long mSelectedChannelId;
private int mBackStackCount;
private boolean mShowViewScheduleOptionInDialog;
- private Program mCurrentProgram;
private String mFragmentTitle;
private String mProrityActionTitle;
@@ -76,7 +84,7 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
private String mChannelsActionAllText;
private LongSparseArray<Channel> mId2Channel = new LongSparseArray<>();
private List<Channel> mChannels = new ArrayList<>();
- private List<Program> mPrograms;
+ private EpisodicProgramLoadTask mEpisodicProgramLoadTask;
private GuidedAction mPriorityGuidedAction;
private GuidedAction mChannelsGuidedAction;
@@ -92,24 +100,22 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
getActivity().finish();
return;
}
+ mDvrManager = TvApplication.getSingletons(context).getDvrManager();
mShowViewScheduleOptionInDialog = getArguments().getBoolean(
DvrSeriesSettingsActivity.SHOW_VIEW_SCHEDULE_OPTION_IN_DIALOG);
- mCurrentProgram = getArguments().getParcelable(DvrSeriesSettingsActivity.CURRENT_PROGRAM);
mDvrDataManager.addSeriesRecordingListener(this);
- mPrograms = (List<Program>) BigArguments.getArgument(
- DvrSeriesSettingsActivity.PROGRAM_LIST);
- BigArguments.reset();
- if (mPrograms == null) {
- getActivity().finish();
- return;
- }
- Set<Long> channelIds = new HashSet<>();
- ChannelDataManager channelDataManager =
- TvApplication.getSingletons(context).getChannelDataManager();
- for (Program program : mPrograms) {
- long channelId = program.getChannelId();
- if (channelIds.add(channelId)) {
- Channel channel = channelDataManager.getChannel(channelId);
+ long[] channelIds = getArguments().getLongArray(DvrSeriesSettingsActivity.CHANNEL_ID_LIST);
+ mChannelDataManager = TvApplication.getSingletons(context).getChannelDataManager();
+ if (channelIds == null) {
+ Channel channel = mChannelDataManager.getChannel(mSeriesRecording.getChannelId());
+ if (channel != null) {
+ mId2Channel.put(channel.getId(), channel);
+ mChannels.add(channel);
+ }
+ collectChannelsInBackground();
+ } else {
+ for (long channelId : channelIds) {
+ Channel channel = mChannelDataManager.getChannel(channelId);
if (channel != null) {
mId2Channel.put(channel.getId(), channel);
mChannels.add(channel);
@@ -119,14 +125,16 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
mChannelOption = mSeriesRecording.getChannelOption();
mSelectedChannelId = Channel.INVALID_ID;
if (mChannelOption == SeriesRecording.OPTION_CHANNEL_ONE) {
- Channel channel = channelDataManager.getChannel(mSeriesRecording.getChannelId());
+ Channel channel = mChannelDataManager.getChannel(mSeriesRecording.getChannelId());
if (channel != null) {
mSelectedChannelId = channel.getId();
} else {
mChannelOption = SeriesRecording.OPTION_CHANNEL_ALL;
}
}
- mChannels.sort(Channel.CHANNEL_NUMBER_COMPARATOR);
+ mChannelComparator = new Channel.DefaultComparator(context,
+ TvApplication.getSingletons(context).getTvInputManagerHelper());
+ mChannels.sort(mChannelComparator);
mFragmentTitle = getString(R.string.dvr_series_settings_title);
mProrityActionTitle = getString(R.string.dvr_series_settings_priority);
mProrityActionHighestText = getString(R.string.dvr_series_settings_priority_highest);
@@ -136,23 +144,23 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
}
@Override
- public void onResume() {
- super.onResume();
- // To avoid the order of series's priority has changed, but series doesn't get update.
- updatePriorityGuidedAction();
- }
-
- @Override
public void onDetach() {
super.onDetach();
mDvrDataManager.removeSeriesRecordingListener(this);
+ if (mEpisodicProgramLoadTask != null) {
+ mEpisodicProgramLoadTask.cancel(true);
+ mEpisodicProgramLoadTask = null;
+ }
}
@Override
public void onDestroy() {
- if (getFragmentManager().getBackStackEntryCount() == mBackStackCount && getArguments()
- .getBoolean(DvrSeriesSettingsActivity.REMOVE_EMPTY_SERIES_RECORDING)) {
- mDvrDataManager.checkAndRemoveEmptySeriesRecording(mSeriesRecordingId);
+ DvrManager dvrManager = TvApplication.getSingletons(getActivity()).getDvrManager();
+ if (getFragmentManager().getBackStackEntryCount() == mBackStackCount
+ && getArguments()
+ .getBoolean(DvrSeriesSettingsActivity.REMOVE_EMPTY_SERIES_RECORDING)
+ && dvrManager.canRemoveSeriesRecording(mSeriesRecordingId)) {
+ dvrManager.removeSeriesRecording(mSeriesRecordingId);
}
super.onDestroy();
}
@@ -170,6 +178,7 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
.id(ACTION_ID_PRIORITY)
.title(mProrityActionTitle)
.build();
+ updatePriorityGuidedAction(false);
actions.add(mPriorityGuidedAction);
mChannelsGuidedAction = new GuidedAction.Builder(getActivity())
@@ -195,6 +204,10 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
public void onGuidedActionClicked(GuidedAction action) {
long actionId = action.getId();
if (actionId == GuidedAction.ACTION_ID_OK) {
+ if (mEpisodicProgramLoadTask != null) {
+ mEpisodicProgramLoadTask.cancel(true);
+ mEpisodicProgramLoadTask = null;
+ }
if (mChannelOption != mSeriesRecording.getChannelOption()
|| mSeriesRecording.isStopped()
|| (mChannelOption == SeriesRecording.OPTION_CHANNEL_ONE
@@ -205,14 +218,28 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
if (mSelectedChannelId != Channel.INVALID_ID) {
builder.setChannelId(mSelectedChannelId);
}
- DvrManager dvrManager = TvApplication.getSingletons(getContext()).getDvrManager();
- dvrManager.updateSeriesRecording(builder.build());
- if (mCurrentProgram != null && (mChannelOption == SeriesRecording.OPTION_CHANNEL_ALL
- || mSelectedChannelId == mCurrentProgram.getChannelId())) {
- dvrManager.addSchedule(mCurrentProgram);
- }
- updateSchedulesToSeries();
- showConfirmDialog();
+ TvApplication.getSingletons(getContext()).getDvrManager()
+ .updateSeriesRecording(builder.build());
+ SeriesRecordingScheduler scheduler =
+ SeriesRecordingScheduler.getInstance(getContext());
+ // Since dialog is used even after the fragment is closed, we should
+ // use application context.
+ ProgressDialog dialog = ProgressDialog.show(getContext(), null, getString(
+ R.string.dvr_series_schedules_progress_message_updating_programs));
+ scheduler.addOnSeriesRecordingUpdatedListener(
+ new OnSeriesRecordingUpdatedListener() {
+ @Override
+ public void onSeriesRecordingUpdated(SeriesRecording... seriesRecordings) {
+ for (SeriesRecording seriesRecording : seriesRecordings) {
+ if (seriesRecording.getId() == mSeriesRecordingId) {
+ dialog.dismiss();
+ scheduler.removeOnSeriesRecordingUpdatedListener(this);
+ showConfirmDialog();
+ return;
+ }
+ }
+ }
+ });
} else {
showConfirmDialog();
}
@@ -220,9 +247,9 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
finishGuidedStepFragments();
} else if (actionId == ACTION_ID_PRIORITY) {
FragmentManager fragmentManager = getFragmentManager();
- DvrPrioritySettingsFragment fragment = new DvrPrioritySettingsFragment();
+ PrioritySettingsFragment fragment = new PrioritySettingsFragment();
Bundle args = new Bundle();
- args.putLong(DvrPrioritySettingsFragment.COME_FROM_SERIES_RECORDING_ID,
+ args.putLong(PrioritySettingsFragment.COME_FROM_SERIES_RECORDING_ID,
mSeriesRecording.getId());
fragment.setArguments(args);
GuidedStepFragment.add(fragmentManager, fragment, R.id.dvr_settings_view_frame);
@@ -254,7 +281,7 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
private void updateChannelsGuidedAction(boolean notifyActionChanged) {
if (mChannelOption == SeriesRecording.OPTION_CHANNEL_ALL) {
mChannelsGuidedAction.setDescription(mChannelsActionAllText);
- } else if (mId2Channel.get(mSelectedChannelId) != null){
+ } else {
mChannelsGuidedAction.setDescription(mId2Channel.get(mSelectedChannelId)
.getDisplayText());
}
@@ -263,7 +290,7 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
}
}
- private void updatePriorityGuidedAction() {
+ private void updatePriorityGuidedAction(boolean notifyActionChanged) {
int totalSeriesCount = 0;
int priorityOrder = 0;
for (SeriesRecording seriesRecording : mDvrDataManager.getSeriesRecordings()) {
@@ -285,38 +312,49 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
mPriorityGuidedAction.setDescription(getString(
R.string.dvr_series_settings_priority_rank, priorityOrder + 1));
}
- notifyActionChanged(findActionPositionById(ACTION_ID_PRIORITY));
+ if (notifyActionChanged) {
+ notifyActionChanged(findActionPositionById(ACTION_ID_PRIORITY));
+ }
}
- private void updateSchedulesToSeries() {
- List<Program> recordingCandidates = new ArrayList<>();
- Set<SeasonEpisodeNumber> scheduledEpisodes = new HashSet<>();
- for (ScheduledRecording r : mDvrDataManager.getScheduledRecordings(mSeriesRecordingId)) {
- if (r.getState() != ScheduledRecording.STATE_RECORDING_FAILED
- && r.getState() != ScheduledRecording.STATE_RECORDING_CLIPPED) {
- scheduledEpisodes.add(new SeasonEpisodeNumber(
- r.getSeriesRecordingId(), r.getSeasonNumber(), r.getEpisodeNumber()));
- }
+ private void collectChannelsInBackground() {
+ if (mEpisodicProgramLoadTask != null) {
+ mEpisodicProgramLoadTask.cancel(true);
}
- for (Program program : mPrograms) {
- // Removes current programs and scheduled episodes out, matches the channel option.
- if (program.getStartTimeUtcMillis() >= System.currentTimeMillis()
- && mSeriesRecording.matchProgram(program)
- && !scheduledEpisodes.contains(new SeasonEpisodeNumber(
- mSeriesRecordingId, program.getSeasonNumber(), program.getEpisodeNumber()))) {
- recordingCandidates.add(program);
+ mEpisodicProgramLoadTask = new EpisodicProgramLoadTask(getContext(), mSeriesRecording) {
+ @Override
+ protected void onPostExecute(List<Program> programs) {
+ mEpisodicProgramLoadTask = null;
+ Set<Long> channelIds = new HashSet<>();
+ for (Program program : programs) {
+ channelIds.add(program.getChannelId());
+ }
+ boolean channelAdded = false;
+ for (Long channelId : channelIds) {
+ if (mId2Channel.get(channelId) != null) {
+ continue;
+ }
+ Channel channel = mChannelDataManager.getChannel(channelId);
+ if (channel != null) {
+ channelAdded = true;
+ mId2Channel.put(channelId, channel);
+ mChannels.add(channel);
+ if (DEBUG) Log.d(TAG, "Added channel: " + channel);
+ }
+ }
+ if (!channelAdded) {
+ return;
+ }
+ mChannels.sort(mChannelComparator);
+ mChannelsGuidedAction.setSubActions(buildChannelSubAction());
+ notifyActionChanged(findActionPositionById(ACTION_ID_CHANNEL));
+ if (DEBUG) Log.d(TAG, "Complete EpisodicProgramLoadTask");
}
- }
- if (recordingCandidates.isEmpty()) {
- return;
- }
- List<Program> programsToSchedule = SeriesRecordingScheduler.pickOneProgramPerEpisode(
- mDvrDataManager, Collections.singletonList(mSeriesRecording), recordingCandidates)
- .get(mSeriesRecordingId);
- if (!programsToSchedule.isEmpty()) {
- TvApplication.getSingletons(getContext()).getDvrManager()
- .addScheduleToSeriesRecording(mSeriesRecording, programsToSchedule);
- }
+ }.setLoadCurrentProgram(true)
+ .setLoadDisallowedProgram(true)
+ .setLoadScheduledEpisode(true)
+ .setIgnoreChannelOption(true);
+ mEpisodicProgramLoadTask.execute();
}
private List<GuidedAction> buildChannelSubAction() {
@@ -335,8 +373,8 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
}
private void showConfirmDialog() {
- DvrUiHelper.StartSeriesScheduledDialogActivity(getContext(), mSeriesRecording,
- mShowViewScheduleOptionInDialog, mPrograms);
+ DvrUiHelper.StartSeriesScheduledDialogActivity(
+ getContext(), mSeriesRecording, mShowViewScheduleOptionInDialog);
finishGuidedStepFragments();
}
@@ -344,23 +382,16 @@ public class DvrSeriesSettingsFragment extends GuidedStepFragment
public void onSeriesRecordingAdded(SeriesRecording... seriesRecordings) { }
@Override
- public void onSeriesRecordingRemoved(SeriesRecording... seriesRecordings) {
- for (SeriesRecording series : seriesRecordings) {
- if (series.getId() == mSeriesRecording.getId()) {
- finishGuidedStepFragments();
- return;
- }
- }
- }
+ public void onSeriesRecordingRemoved(SeriesRecording... seriesRecordings) { }
@Override
public void onSeriesRecordingChanged(SeriesRecording... seriesRecordings) {
for (SeriesRecording seriesRecording : seriesRecordings) {
if (seriesRecording.getId() == mSeriesRecordingId) {
mSeriesRecording = seriesRecording;
- updatePriorityGuidedAction();
+ updatePriorityGuidedAction(true);
return;
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/dvr/ui/SortedArrayAdapter.java b/src/com/android/tv/dvr/ui/SortedArrayAdapter.java
index 8c0af9ed..393a5ff3 100644
--- a/src/com/android/tv/dvr/ui/SortedArrayAdapter.java
+++ b/src/com/android/tv/dvr/ui/SortedArrayAdapter.java
@@ -20,15 +20,11 @@ import android.support.annotation.VisibleForTesting;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.PresenterSelector;
-import com.android.tv.common.SoftPreconditions;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
/**
* Keeps a set of items sorted
@@ -39,18 +35,16 @@ public abstract class SortedArrayAdapter<T> extends ArrayObjectAdapter {
private final Comparator<T> mComparator;
private final int mMaxItemCount;
private int mExtraItemCount;
- private final Set<Long> mIds = new HashSet<>();
- public SortedArrayAdapter(PresenterSelector presenterSelector, Comparator<T> comparator) {
+ SortedArrayAdapter(PresenterSelector presenterSelector, Comparator<T> comparator) {
this(presenterSelector, comparator, Integer.MAX_VALUE);
}
- public SortedArrayAdapter(PresenterSelector presenterSelector, Comparator<T> comparator,
+ SortedArrayAdapter(PresenterSelector presenterSelector, Comparator<T> comparator,
int maxItemCount) {
super(presenterSelector);
mComparator = comparator;
mMaxItemCount = maxItemCount;
- setHasStableIds(true);
}
/**
@@ -62,12 +56,7 @@ public abstract class SortedArrayAdapter<T> extends ArrayObjectAdapter {
final void setInitialItems(List<T> items) {
List<T> itemsCopy = new ArrayList<>(items);
Collections.sort(itemsCopy, mComparator);
- for (T item : itemsCopy) {
- add(item, true);
- if (size() == mMaxItemCount) {
- break;
- }
- }
+ addAll(0, itemsCopy.subList(0, Math.min(mMaxItemCount, itemsCopy.size())));
}
/**
@@ -93,9 +82,6 @@ public abstract class SortedArrayAdapter<T> extends ArrayObjectAdapter {
* the end to save search time.
*/
public final void add(T item, boolean insertToEnd) {
- long newItemId = getId(item);
- SoftPreconditions.checkState(!mIds.contains(newItemId));
- mIds.add(newItemId);
int i;
if (insertToEnd) {
i = findInsertPosition(item);
@@ -103,9 +89,8 @@ public abstract class SortedArrayAdapter<T> extends ArrayObjectAdapter {
i = findInsertPositionBinary(item);
}
super.add(i, item);
- if (mMaxItemCount < Integer.MAX_VALUE && size() > mMaxItemCount + mExtraItemCount) {
- Object removedItem = get(mMaxItemCount);
- remove(removedItem);
+ if (size() > mMaxItemCount + mExtraItemCount) {
+ removeItems(mMaxItemCount, size() - mMaxItemCount - mExtraItemCount);
}
}
@@ -115,97 +100,48 @@ public abstract class SortedArrayAdapter<T> extends ArrayObjectAdapter {
* They will be presented in their insertion order.
*/
public int addExtraItem(T item) {
- long newItemId = getId(item);
- SoftPreconditions.checkState(!mIds.contains(newItemId));
- mIds.add(newItemId);
super.add(item);
return ++mExtraItemCount;
}
- @Override
- public boolean remove(Object item) {
- return removeWithId((T) item);
- }
-
/**
* Removes an item which has the same ID as {@code item}.
*/
public boolean removeWithId(T item) {
- int index = indexWithId(item);
- return index >= 0 && index < size() && removeItems(index, 1) == 1;
- }
-
- @Override
- public int removeItems(int position, int count) {
- int upperBound = Math.min(position + count, size());
- for (int i = position; i < upperBound; i++) {
- mIds.remove(getId((T) get(i)));
- }
- if (upperBound > size() - mExtraItemCount) {
- mExtraItemCount -= upperBound - Math.max(size() - mExtraItemCount, position);
- }
- return super.removeItems(position, count);
- }
-
- @Override
- public void replace(int position, Object item) {
- boolean wasExtra = position >= size() - mExtraItemCount;
- removeItems(position, 1);
- if (!wasExtra) {
- add(item);
- } else {
- addExtraItem((T) item);
- }
- }
-
- @Override
- public void clear() {
- mIds.clear();
- super.clear();
+ int index = indexWithTypeAndId(item);
+ return index >= 0 && index < size() && remove(get(index));
}
/**
- * Changes an item in the list.
+ * Change an item in the list.
* @param item The item to change.
*/
public final void change(T item) {
- int oldIndex = indexWithId(item);
+ int oldIndex = indexWithTypeAndId(item);
if (oldIndex != -1) {
T old = (T) get(oldIndex);
if (mComparator.compare(old, item) == 0) {
replace(oldIndex, item);
return;
}
- remove(old);
+ removeItems(oldIndex, 1);
}
add(item);
}
/**
- * Checks whether the item is in the list.
- */
- public final boolean contains(T item) {
- return indexWithId(item) != -1;
- }
-
- @Override
- public long getId(int position) {
- return getId((T) get(position));
- }
-
- /**
* Returns the id of the the given {@code item}, which will be used in {@link #change} to
* decide if the given item is already existed in the adapter.
*
* The id must be stable.
*/
- protected abstract long getId(T item);
+ abstract long getId(T item);
- private int indexWithId(T item) {
+ private int indexWithTypeAndId(T item) {
long id = getId(item);
for (int i = 0; i < size() - mExtraItemCount; i++) {
T r = (T) get(i);
- if (getId(r) == id) {
+ if (r.getClass() == item.getClass() && getId(r) == id) {
return i;
}
}
diff --git a/src/com/android/tv/dvr/ui/browse/CurrentRecordingDetailsFragment.java b/src/com/android/tv/dvr/ui/browse/CurrentRecordingDetailsFragment.java
deleted file mode 100644
index c8f6a03f..00000000
--- a/src/com/android/tv/dvr/ui/browse/CurrentRecordingDetailsFragment.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.dvr.ui.browse;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.support.v17.leanback.widget.Action;
-import android.support.v17.leanback.widget.OnActionClickedListener;
-import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
-
-import com.android.tv.R;
-import com.android.tv.TvApplication;
-import com.android.tv.dialog.HalfSizedDialogFragment;
-import com.android.tv.dvr.DvrDataManager;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.ui.DvrStopRecordingFragment;
-import com.android.tv.dvr.ui.DvrUiHelper;
-
-/**
- * {@link RecordingDetailsFragment} for current recording in DVR.
- */
-public class CurrentRecordingDetailsFragment extends RecordingDetailsFragment {
- private static final int ACTION_STOP_RECORDING = 1;
-
- private DvrDataManager mDvrDataManger;
- private final DvrDataManager.ScheduledRecordingListener mScheduledRecordingListener =
- new DvrDataManager.ScheduledRecordingListener() {
- @Override
- public void onScheduledRecordingAdded(ScheduledRecording... schedules) { }
-
- @Override
- public void onScheduledRecordingRemoved(ScheduledRecording... schedules) {
- for (ScheduledRecording schedule : schedules) {
- if (schedule.getId() == getRecording().getId()) {
- getActivity().finish();
- return;
- }
- }
- }
-
- @Override
- public void onScheduledRecordingStatusChanged(ScheduledRecording... schedules) {
- for (ScheduledRecording schedule : schedules) {
- if (schedule.getId() == getRecording().getId()
- && schedule.getState()
- != ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- getActivity().finish();
- return;
- }
- }
- }
- };
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- mDvrDataManger = TvApplication.getSingletons(context).getDvrDataManager();
- mDvrDataManger.addScheduledRecordingListener(mScheduledRecordingListener);
- }
-
- @Override
- protected SparseArrayObjectAdapter onCreateActionsAdapter() {
- SparseArrayObjectAdapter adapter =
- new SparseArrayObjectAdapter(new ActionPresenterSelector());
- Resources res = getResources();
- adapter.set(ACTION_STOP_RECORDING, new Action(ACTION_STOP_RECORDING,
- res.getString(R.string.epg_dvr_dialog_message_stop_recording), null,
- res.getDrawable(R.drawable.lb_ic_stop)));
- return adapter;
- }
-
- @Override
- protected OnActionClickedListener onCreateOnActionClickedListener() {
- return new OnActionClickedListener() {
- @Override
- public void onActionClicked(Action action) {
- if (action.getId() == ACTION_STOP_RECORDING) {
- DvrUiHelper.showStopRecordingDialog(getActivity(),
- getRecording().getChannelId(),
- DvrStopRecordingFragment.REASON_USER_STOP,
- new HalfSizedDialogFragment.OnActionClickListener() {
- @Override
- public void onActionClick(long actionId) {
- if (actionId == DvrStopRecordingFragment.ACTION_STOP) {
- DvrManager dvrManager =
- TvApplication.getSingletons(getContext())
- .getDvrManager();
- dvrManager.stopRecording(getRecording());
- getActivity().finish();
- }
- }
- });
- }
- }
- };
- }
-
- @Override
- public void onDetach() {
- if (mDvrDataManger != null) {
- mDvrDataManger.removeScheduledRecordingListener(mScheduledRecordingListener);
- }
- super.onDetach();
- }
-}
diff --git a/src/com/android/tv/dvr/ui/browse/DvrListRowPresenter.java b/src/com/android/tv/dvr/ui/browse/DvrListRowPresenter.java
deleted file mode 100644
index 37a72eaf..00000000
--- a/src/com/android/tv/dvr/ui/browse/DvrListRowPresenter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.dvr.ui.browse;
-
-import android.content.Context;
-import android.support.v17.leanback.widget.ListRowPresenter;
-import android.view.ViewGroup;
-
-import com.android.tv.R;
-
-/** A list row presenter to display expand/fold card views list. */
-public class DvrListRowPresenter extends ListRowPresenter {
- public DvrListRowPresenter(Context context) {
- super();
- setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
- setExpandedRowHeight(
- context.getResources()
- .getDimensionPixelSize(R.dimen.dvr_library_expanded_row_height));
- }
-}
diff --git a/src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java b/src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java
index 5abd52a1..d28f026c 100644
--- a/src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java
+++ b/src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java
@@ -29,7 +29,7 @@ import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrScheduleManager;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
/**
* A base fragment to show the list of schedule recordings.
diff --git a/src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java b/src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java
index 3cbb500a..722c9b6e 100644
--- a/src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java
+++ b/src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java
@@ -18,9 +18,12 @@ package com.android.tv.dvr.ui.list;
import android.os.Bundle;
import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
import com.android.tv.R;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.ui.list.SchedulesHeaderRowPresenter.DateHeaderRowPresenter;
/**
diff --git a/src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java b/src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java
index 57e7a88f..42a1e72b 100644
--- a/src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java
+++ b/src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java
@@ -17,7 +17,6 @@
package com.android.tv.dvr.ui.list;
import android.annotation.TargetApi;
-import android.content.Context;
import android.database.ContentObserver;
import android.media.tv.TvContract.Programs;
import android.net.Uri;
@@ -36,13 +35,11 @@ import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.Program;
-import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrDataManager.SeriesRecordingListener;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.provider.EpisodicProgramLoadTask;
-import com.android.tv.dvr.ui.BigArguments;
+import com.android.tv.dvr.EpisodicProgramLoadTask;
+import com.android.tv.dvr.SeriesRecording;
+import com.android.tv.dvr.ui.list.SchedulesHeaderRowPresenter.SeriesRecordingHeaderRowPresenter;
-import java.util.Collections;
import java.util.List;
/**
@@ -50,22 +47,20 @@ import java.util.List;
*/
@TargetApi(Build.VERSION_CODES.N)
public class DvrSeriesSchedulesFragment extends BaseDvrSchedulesFragment {
+ private static final String TAG = "DvrSeriesSchedulesFragment";
/**
* The key for series recording whose scheduled recording list will be displayed.
- * Type: {@link SeriesRecording}
*/
public static final String SERIES_SCHEDULES_KEY_SERIES_RECORDING =
"series_schedules_key_series_recording";
/**
- * The key for programs which belong to the series recording whose scheduled recording list
- * will be displayed.
- * Type: List<{@link Program}>
+ * The key for programs belong to the series recording whose scheduled recording
+ * list will be displayed.
*/
public static final String SERIES_SCHEDULES_KEY_SERIES_PROGRAMS =
"series_schedules_key_series_programs";
private ChannelDataManager mChannelDataManager;
- private DvrDataManager mDvrDataManager;
private SeriesRecording mSeriesRecording;
private List<Program> mPrograms;
private EpisodicProgramLoadTask mProgramLoadTask;
@@ -92,22 +87,20 @@ public class DvrSeriesSchedulesFragment extends BaseDvrSchedulesFragment {
&& getRowsAdapter() instanceof SeriesScheduleRowAdapter) {
((SeriesScheduleRowAdapter) getRowsAdapter())
.onSeriesRecordingUpdated(r);
- mSeriesRecording = r;
- updateEmptyMessage();
return;
}
}
}
};
- private final Handler mHandler = new Handler(Looper.getMainLooper());
- private final ContentObserver mContentObserver = new ContentObserver(mHandler) {
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- super.onChange(selfChange, uri);
- executeProgramLoadingTask();
- }
- };
+ private final ContentObserver mContentObserver =
+ new ContentObserver(new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ super.onChange(selfChange, uri);
+ executeProgramLoadingTask();
+ }
+ };
private final ChannelDataManager.Listener mChannelListener = new ChannelDataManager.Listener() {
@Override
@@ -127,28 +120,17 @@ public class DvrSeriesSchedulesFragment extends BaseDvrSchedulesFragment {
}
@Override
- public void onAttach(Context context) {
- super.onAttach(context);
+ public void onCreate(Bundle savedInstanceState) {
Bundle args = getArguments();
if (args != null) {
mSeriesRecording = args.getParcelable(SERIES_SCHEDULES_KEY_SERIES_RECORDING);
- mPrograms = (List<Program>) BigArguments.getArgument(
- SERIES_SCHEDULES_KEY_SERIES_PROGRAMS);
- BigArguments.reset();
+ mPrograms = args.getParcelableArrayList(SERIES_SCHEDULES_KEY_SERIES_PROGRAMS);
}
- if (args == null || mPrograms == null) {
- getActivity().finish();
- }
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ApplicationSingletons singletons = TvApplication.getSingletons(getContext());
+ singletons.getDvrDataManager().addSeriesRecordingListener(mSeriesRecordingListener);
mChannelDataManager = singletons.getChannelDataManager();
mChannelDataManager.addListener(mChannelListener);
- mDvrDataManager = singletons.getDvrDataManager();
- mDvrDataManager.addSeriesRecordingListener(mSeriesRecordingListener);
getContext().getContentResolver().registerContentObserver(Programs.CONTENT_URI, true,
mContentObserver);
}
@@ -162,16 +144,8 @@ public class DvrSeriesSchedulesFragment extends BaseDvrSchedulesFragment {
private void onProgramsUpdated() {
((SeriesScheduleRowAdapter) getRowsAdapter()).setPrograms(mPrograms);
- updateEmptyMessage();
- }
-
- private void updateEmptyMessage() {
if (mPrograms == null || mPrograms.isEmpty()) {
- if (mSeriesRecording.getState() == SeriesRecording.STATE_SERIES_STOPPED) {
- showEmptyMessage(R.string.dvr_series_schedules_stopped_empty_state);
- } else {
- showEmptyMessage(R.string.dvr_series_schedules_empty_state);
- }
+ showEmptyMessage(R.string.dvr_series_schedules_empty_state);
} else {
hideEmptyMessage();
}
@@ -184,15 +158,15 @@ public class DvrSeriesSchedulesFragment extends BaseDvrSchedulesFragment {
mProgramLoadTask = null;
}
getContext().getContentResolver().unregisterContentObserver(mContentObserver);
- mHandler.removeCallbacksAndMessages(null);
mChannelDataManager.removeListener(mChannelListener);
- mDvrDataManager.removeSeriesRecordingListener(mSeriesRecordingListener);
+ TvApplication.getSingletons(getContext()).getDvrDataManager()
+ .removeSeriesRecordingListener(mSeriesRecordingListener);
super.onDestroy();
}
@Override
public SchedulesHeaderRowPresenter onCreateHeaderRowPresenter() {
- return new SchedulesHeaderRowPresenter.SeriesRecordingHeaderRowPresenter(getContext());
+ return new SeriesRecordingHeaderRowPresenter(getContext());
}
@Override
@@ -221,7 +195,7 @@ public class DvrSeriesSchedulesFragment extends BaseDvrSchedulesFragment {
mProgramLoadTask = new EpisodicProgramLoadTask(getContext(), mSeriesRecording) {
@Override
protected void onPostExecute(List<Program> programs) {
- mPrograms = programs == null ? Collections.EMPTY_LIST : programs;
+ mPrograms = programs;
onProgramsUpdated();
}
};
@@ -231,4 +205,4 @@ public class DvrSeriesSchedulesFragment extends BaseDvrSchedulesFragment {
.setIgnoreChannelOption(true)
.execute();
}
-}
+} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/list/EpisodicProgramRow.java b/src/com/android/tv/dvr/ui/list/EpisodicProgramRow.java
index 9b0ad105..23aebf59 100644
--- a/src/com/android/tv/dvr/ui/list/EpisodicProgramRow.java
+++ b/src/com/android/tv/dvr/ui/list/EpisodicProgramRow.java
@@ -19,13 +19,13 @@ package com.android.tv.dvr.ui.list;
import android.content.Context;
import com.android.tv.data.Program;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.ScheduledRecording.Builder;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording.Builder;
/**
* A class for the episodic program.
*/
-class EpisodicProgramRow extends ScheduleRow {
+public class EpisodicProgramRow extends ScheduleRow {
private final String mInputId;
private final Program mProgram;
diff --git a/src/com/android/tv/dvr/ui/list/ScheduleRow.java b/src/com/android/tv/dvr/ui/list/ScheduleRow.java
index 66e96f94..3fc92e8a 100644
--- a/src/com/android/tv/dvr/ui/list/ScheduleRow.java
+++ b/src/com/android/tv/dvr/ui/list/ScheduleRow.java
@@ -20,12 +20,12 @@ import android.content.Context;
import android.support.annotation.Nullable;
import com.android.tv.common.SoftPreconditions;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
/**
* A class for schedule recording row.
*/
-class ScheduleRow {
+public class ScheduleRow {
private final SchedulesHeaderRow mHeaderRow;
@Nullable private ScheduledRecording mSchedule;
private boolean mStopRecordingRequested;
diff --git a/src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java b/src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java
index 97d60473..9cc82653 100644
--- a/src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java
+++ b/src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java
@@ -30,8 +30,8 @@ import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.dvr.DvrManager;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.ui.list.SchedulesHeaderRow.DateHeaderRow;
-import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.util.Utils;
import java.util.ArrayList;
@@ -43,7 +43,7 @@ import java.util.concurrent.TimeUnit;
/**
* An adapter for {@link ScheduleRow}.
*/
-class ScheduleRowAdapter extends ArrayObjectAdapter {
+public class ScheduleRowAdapter extends ArrayObjectAdapter {
private static final String TAG = "ScheduleRowAdapter";
private static final boolean DEBUG = false;
diff --git a/src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java b/src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java
index dc4e3c41..1257e725 100644
--- a/src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java
+++ b/src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java
@@ -42,24 +42,25 @@ import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
-import com.android.tv.dialog.HalfSizedDialogFragment;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.DvrScheduleManager;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.ui.DvrStopRecordingFragment;
-import com.android.tv.dvr.ui.DvrUiHelper;
+import com.android.tv.dvr.ui.HalfSizedDialogFragment;
import com.android.tv.util.ToastUtils;
import com.android.tv.util.Utils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
+import java.util.concurrent.TimeUnit;
/**
* A RowPresenter for {@link ScheduleRow}.
*/
@TargetApi(Build.VERSION_CODES.N)
-class ScheduleRowPresenter extends RowPresenter {
+public class ScheduleRowPresenter extends RowPresenter {
private static final String TAG = "ScheduleRowPresenter";
@Retention(RetentionPolicy.SOURCE)
@@ -344,9 +345,7 @@ class ScheduleRowPresenter extends RowPresenter {
viewHolder.mInfoContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- if (isInfoClickable(row)) {
- onInfoClicked(row);
- }
+ onInfoClicked(row);
}
});
@@ -367,7 +366,8 @@ class ScheduleRowPresenter extends RowPresenter {
viewHolder.mTimeView.setText(onGetRecordingTimeText(row));
String programInfoText = onGetProgramInfoText(row);
if (TextUtils.isEmpty(programInfoText)) {
- int durationMins = Math.max(1, Utils.getRoundOffMinsFromMs(row.getDuration()));
+ int durationMins =
+ Math.max((int) TimeUnit.MILLISECONDS.toMinutes(row.getDuration()), 1);
programInfoText = mContext.getResources().getQuantityString(
R.plurals.dvr_schedules_recording_duration, durationMins, durationMins);
}
@@ -403,7 +403,6 @@ class ScheduleRowPresenter extends RowPresenter {
} else {
viewHolder.whiteBackInfo();
}
- viewHolder.mInfoContainer.setFocusable(isInfoClickable(row));
updateActionContainer(viewHolder, viewHolder.isSelected());
}
@@ -455,13 +454,11 @@ class ScheduleRowPresenter extends RowPresenter {
/**
* Called when user click Info in {@link ScheduleRow}.
*/
- protected void onInfoClicked(ScheduleRow row) {
- DvrUiHelper.startDetailsActivity((Activity) mContext, row.getSchedule(), null, true);
- }
-
- private boolean isInfoClickable(ScheduleRow row) {
- return row.getSchedule() != null
- && (row.getSchedule().isNotStarted() || row.getSchedule().isInProgress());
+ protected void onInfoClicked(ScheduleRow scheduleRow) {
+ ScheduledRecording schedule = scheduleRow.getSchedule();
+ if (schedule != null) {
+ DvrUiHelper.startDetailsActivity((Activity) mContext, schedule, null, true);
+ }
}
/**
@@ -548,7 +545,7 @@ class ScheduleRowPresenter extends RowPresenter {
// This row has been deleted.
return;
}
- if (row.isRecordingInProgress() && !row.isStopRecordingRequested()) {
+ if (row.isOnAir() && row.isRecordingInProgress() && !row.isStopRecordingRequested()) {
row.setStopRecordingRequested(true);
mDvrManager.stopRecording(row.getSchedule());
CharSequence deletedInfo = onGetProgramInfoText(row);
@@ -673,9 +670,10 @@ class ScheduleRowPresenter extends RowPresenter {
hideActionView(viewHolder.mFirstActionContainer, View.GONE);
}
};
- mLastFocusedViewId = R.id.info_container;
- SoftPreconditions.checkState(viewHolder.mInfoContainer.isFocusable(), TAG,
- "No focusable view in this row: " + viewHolder);
+ if (mLastFocusedViewId == R.id.action_first_container
+ || mLastFocusedViewId == R.id.action_second_container) {
+ mLastFocusedViewId = R.id.info_container;
+ }
break;
}
View view = viewHolder.view.findViewById(mLastFocusedViewId);
@@ -685,10 +683,8 @@ class ScheduleRowPresenter extends RowPresenter {
// requestFocus() explicitly.
if (view.hasFocus()) {
viewHolder.mPendingAnimationRunnable.run();
- } else if (view.isFocusable()){
- view.requestFocus();
} else {
- viewHolder.view.requestFocus();
+ view.requestFocus();
}
}
} else {
@@ -741,10 +737,10 @@ class ScheduleRowPresenter extends RowPresenter {
@ScheduleRowAction
protected int[] getAvailableActions(ScheduleRow row) {
if (row.getSchedule() != null) {
- if (row.isRecordingInProgress()) {
- return new int[]{ACTION_STOP_RECORDING};
- } else if (row.isOnAir()) {
- if (row.isRecordingNotStarted()) {
+ if (row.isOnAir()) {
+ if (row.isRecordingInProgress()) {
+ return new int[] {ACTION_STOP_RECORDING};
+ } else if (row.isRecordingNotStarted()) {
if (canResolveConflict()) {
// The "START" action can change the conflict states.
return new int[] {ACTION_REMOVE_SCHEDULE, ACTION_START_RECORDING};
diff --git a/src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java b/src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java
index 715ecb8c..0fb0924d 100644
--- a/src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java
+++ b/src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java
@@ -16,15 +16,12 @@
package com.android.tv.dvr.ui.list;
-import com.android.tv.data.Program;
-import com.android.tv.dvr.data.SeriesRecording;
-
-import java.util.List;
+import com.android.tv.dvr.SeriesRecording;
/**
* A base class for the rows for schedules' header.
*/
-abstract class SchedulesHeaderRow {
+public abstract class SchedulesHeaderRow {
private String mTitle;
private String mDescription;
private int mItemCount;
@@ -101,20 +98,11 @@ abstract class SchedulesHeaderRow {
*/
public static class SeriesRecordingHeaderRow extends SchedulesHeaderRow {
private SeriesRecording mSeriesRecording;
- private List<Program> mPrograms;
public SeriesRecordingHeaderRow(String title, String description, int itemCount,
- SeriesRecording series, List<Program> programs) {
+ SeriesRecording series) {
super(title, description, itemCount);
mSeriesRecording = series;
- mPrograms = programs;
- }
-
- /**
- * Returns the list of programs which belong to the series.
- */
- public List<Program> getPrograms() {
- return mPrograms;
}
/**
@@ -131,4 +119,4 @@ abstract class SchedulesHeaderRow {
mSeriesRecording = seriesRecording;
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java b/src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java
index fe2033ba..69c33a96 100644
--- a/src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java
+++ b/src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java
@@ -30,14 +30,15 @@ import android.widget.TextView;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.ui.DvrUiHelper;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.SeriesRecording;
+import com.android.tv.dvr.ui.DvrSchedulesActivity;
import com.android.tv.dvr.ui.list.SchedulesHeaderRow.SeriesRecordingHeaderRow;
/**
* A base class for RowPresenter for {@link SchedulesHeaderRow}
*/
-abstract class SchedulesHeaderRowPresenter extends RowPresenter {
+public abstract class SchedulesHeaderRowPresenter extends RowPresenter {
private Context mContext;
public SchedulesHeaderRowPresenter(Context context) {
@@ -78,7 +79,7 @@ abstract class SchedulesHeaderRowPresenter extends RowPresenter {
}
/**
- * A presenter for {@link SchedulesHeaderRow.DateHeaderRow}.
+ * A presenter for {@link com.android.tv.dvr.ui.list.SchedulesHeaderRow.DateHeaderRow}.
*/
public static class DateHeaderRowPresenter extends SchedulesHeaderRowPresenter {
public DateHeaderRowPresenter(Context context) {
@@ -92,7 +93,7 @@ abstract class SchedulesHeaderRowPresenter extends RowPresenter {
/**
* A ViewHolder for
- * {@link SchedulesHeaderRow.DateHeaderRow}.
+ * {@link com.android.tv.dvr.ui.list.SchedulesHeaderRow.DateHeaderRow}.
*/
public static class DateHeaderRowViewHolder extends SchedulesHeaderRowViewHolder {
public DateHeaderRowViewHolder(Context context, ViewGroup parent) {
@@ -151,9 +152,9 @@ abstract class SchedulesHeaderRowPresenter extends RowPresenter {
headerViewHolder.mSeriesSettingsButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
+ // TODO: pass channel list for settings.
DvrUiHelper.startSeriesSettingsActivity(getContext(),
- header.getSeriesRecording().getId(),
- header.getPrograms(), false, false, false, null);
+ header.getSeriesRecording().getId(), null, false, false, false);
}
});
headerViewHolder.mToggleStartStopButton.setOnClickListener(new OnClickListener() {
@@ -168,9 +169,9 @@ abstract class SchedulesHeaderRowPresenter extends RowPresenter {
.build();
TvApplication.getSingletons(getContext()).getDvrManager()
.updateSeriesRecording(seriesRecording);
+ // TODO: pass channel list for settings.
DvrUiHelper.startSeriesSettingsActivity(getContext(),
- header.getSeriesRecording().getId(),
- header.getPrograms(), false, false, false, null);
+ header.getSeriesRecording().getId(), null, false, false, false);
} else {
DvrUiHelper.showCancelAllSeriesRecordingDialog(
(DvrSchedulesActivity) view.getContext(),
@@ -181,8 +182,11 @@ abstract class SchedulesHeaderRowPresenter extends RowPresenter {
}
private void setTextDrawable(TextView textView, Drawable drawableStart) {
- textView.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, null, null,
- null);
+ if (mLtr) {
+ textView.setCompoundDrawablesWithIntrinsicBounds(drawableStart, null, null, null);
+ } else {
+ textView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawableStart, null);
+ }
}
/**
diff --git a/src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java b/src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java
index 6b6de8b8..3b493774 100644
--- a/src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java
+++ b/src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java
@@ -31,8 +31,8 @@ import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Program;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
import com.android.tv.dvr.ui.list.SchedulesHeaderRow.SeriesRecordingHeaderRow;
import com.android.tv.util.Utils;
@@ -46,7 +46,7 @@ import java.util.Map;
* An adapter for series schedule row.
*/
@TargetApi(Build.VERSION_CODES.N)
-class SeriesScheduleRowAdapter extends ScheduleRowAdapter {
+public class SeriesScheduleRowAdapter extends ScheduleRowAdapter {
private static final String TAG = "SeriesRowAdapter";
private static final boolean DEBUG = false;
@@ -96,7 +96,7 @@ class SeriesScheduleRowAdapter extends ScheduleRowAdapter {
Collections.sort(sortedPrograms);
List<EpisodicProgramRow> rows = new ArrayList<>();
mHeaderRow = new SeriesRecordingHeaderRow(mSeriesRecording.getTitle(),
- null, sortedPrograms.size(), mSeriesRecording, programs);
+ null, sortedPrograms.size(), mSeriesRecording);
for (Program program : sortedPrograms) {
ScheduledRecording schedule =
mDataManager.getScheduledRecordingForProgramId(program.getId());
@@ -145,7 +145,7 @@ class SeriesScheduleRowAdapter extends ScheduleRowAdapter {
if (index != -1) {
EpisodicProgramRow row = (EpisodicProgramRow) get(index);
if (!row.isStartRecordingRequested()) {
- setScheduleToRow(row, schedule);
+ row.setSchedule(schedule);
notifyArrayItemRangeChanged(index, 1);
}
}
@@ -195,10 +195,12 @@ class SeriesScheduleRowAdapter extends ScheduleRowAdapter {
if (!isStartOrStopRequested()) {
executePendingUpdate();
}
- setScheduleToRow(row, schedule);
+ row.setSchedule(schedule);
}
+ } else if (willBeKept(schedule)) {
+ row.setSchedule(schedule);
} else {
- setScheduleToRow(row, schedule);
+ row.setSchedule(null);
}
notifyArrayItemRangeChanged(index, 1);
}
@@ -211,14 +213,6 @@ class SeriesScheduleRowAdapter extends ScheduleRowAdapter {
}
}
- private void setScheduleToRow(ScheduleRow row, ScheduledRecording schedule) {
- if (schedule != null && willBeKept(schedule)) {
- row.setSchedule(schedule);
- } else {
- row.setSchedule(null);
- }
- }
-
private int findRowIndexByProgramId(long programId) {
for (int i = 0; i < size(); i++) {
Object item = get(i);
diff --git a/src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java b/src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java
index c8503e0d..5d88579a 100644
--- a/src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java
+++ b/src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java
@@ -22,13 +22,13 @@ import android.view.ViewGroup;
import com.android.tv.R;
import com.android.tv.common.SoftPreconditions;
-import com.android.tv.dvr.ui.DvrUiHelper;
+import com.android.tv.dvr.DvrUiHelper;
import com.android.tv.util.Utils;
/**
* A RowPresenter for series schedule row.
*/
-class SeriesScheduleRowPresenter extends ScheduleRowPresenter {
+public class SeriesScheduleRowPresenter extends ScheduleRowPresenter {
private static final String TAG = "SeriesRowPresenter";
private boolean mLtr;
@@ -74,8 +74,13 @@ class SeriesScheduleRowPresenter extends ScheduleRowPresenter {
viewHolder.getProgramTitleView().setCompoundDrawablePadding(getContext()
.getResources().getDimensionPixelOffset(
R.dimen.dvr_schedules_warning_icon_padding));
- viewHolder.getProgramTitleView().setCompoundDrawablesRelativeWithIntrinsicBounds(
- R.drawable.ic_warning_gray600_36dp, 0, 0, 0);
+ if (mLtr) {
+ viewHolder.getProgramTitleView().setCompoundDrawablesWithIntrinsicBounds(
+ R.drawable.ic_warning_gray600_36dp, 0, 0, 0);
+ } else {
+ viewHolder.getProgramTitleView().setCompoundDrawablesWithIntrinsicBounds(
+ 0, 0, R.drawable.ic_warning_gray600_36dp, 0);
+ }
} else {
viewHolder.getProgramTitleView().setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}
@@ -83,7 +88,9 @@ class SeriesScheduleRowPresenter extends ScheduleRowPresenter {
@Override
protected void onInfoClicked(ScheduleRow row) {
- DvrUiHelper.startSchedulesActivity(getContext(), row.getSchedule());
+ if (row.getSchedule() != null) {
+ DvrUiHelper.startSchedulesActivity(getContext(), row.getSchedule());
+ }
}
@Override
diff --git a/src/com/android/tv/dvr/ui/playback/DvrPlaybackSideFragment.java b/src/com/android/tv/dvr/ui/playback/DvrPlaybackSideFragment.java
deleted file mode 100644
index e49870f1..00000000
--- a/src/com/android/tv/dvr/ui/playback/DvrPlaybackSideFragment.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.dvr.ui.playback;
-
-import android.media.tv.TvTrackInfo;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v17.leanback.app.GuidedStepFragment;
-import android.support.v17.leanback.widget.GuidedAction;
-import android.text.TextUtils;
-import android.transition.Transition;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.tv.R;
-import com.android.tv.util.TvSettings;
-
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Fragment for DVR playback closed-caption/multi-audio settings.
- */
-public class DvrPlaybackSideFragment extends GuidedStepFragment {
- /**
- * The tag for passing track infos to side fragments.
- */
- public static final String TRACK_INFOS = "dvr_key_track_infos";
- /**
- * The tag for passing selected track's ID to side fragments.
- */
- public static final String SELECTED_TRACK_ID = "dvr_key_selected_track_id";
-
- private static final int ACTION_ID_NO_SUBTITLE = -1;
- private static final int CHECK_SET_ID = 1;
-
- private List<TvTrackInfo> mTrackInfos;
- private String mSelectedTrackId;
- private TvTrackInfo mSelectedTrack;
- private int mTrackType;
- private DvrPlaybackOverlayFragment mOverlayFragment;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- mTrackInfos = getArguments().getParcelableArrayList(TRACK_INFOS);
- mTrackType = mTrackInfos.get(0).getType();
- mSelectedTrackId = getArguments().getString(SELECTED_TRACK_ID);
- mOverlayFragment = ((DvrPlaybackOverlayFragment) getFragmentManager()
- .findFragmentById(R.id.dvr_playback_controls_fragment));
- super.onCreate(savedInstanceState);
- }
-
- @Override
- public View onCreateBackgroundView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View backgroundView = super.onCreateBackgroundView(inflater, container, savedInstanceState);
- backgroundView.setBackgroundColor(getResources()
- .getColor(R.color.lb_playback_controls_background_light));
- return backgroundView;
- }
-
- @Override
- public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
- if (mTrackType == TvTrackInfo.TYPE_SUBTITLE) {
- actions.add(new GuidedAction.Builder(getActivity())
- .id(ACTION_ID_NO_SUBTITLE)
- .title(getString(R.string.closed_caption_option_item_off))
- .checkSetId(CHECK_SET_ID)
- .checked(mSelectedTrackId == null)
- .build());
- }
- for (int i = 0; i < mTrackInfos.size(); i++) {
- TvTrackInfo info = mTrackInfos.get(i);
- boolean checked = TextUtils.equals(info.getId(), mSelectedTrackId);
- GuidedAction action = new GuidedAction.Builder(getActivity())
- .id(i)
- .title(getTrackLabel(info, i))
- .checkSetId(CHECK_SET_ID)
- .checked(checked)
- .build();
- actions.add(action);
- if (checked) {
- mSelectedTrack = info;
- }
- }
- }
-
- @Override
- public void onGuidedActionFocused(GuidedAction action) {
- int actionId = (int) action.getId();
- mOverlayFragment.selectTrack(mTrackType, actionId < 0 ? null : mTrackInfos.get(actionId));
- }
-
- @Override
- public void onGuidedActionClicked(GuidedAction action) {
- int actionId = (int) action.getId();
- mSelectedTrack = actionId < 0 ? null : mTrackInfos.get(actionId);
- TvSettings.setDvrPlaybackTrackSettings(getContext(), mTrackType, mSelectedTrack);
- getFragmentManager().popBackStack();
- }
-
- @Override
- public void onStart() {
- super.onStart();
- // Workaround: when overlay fragment is faded out, any focus will lost due to overlay
- // fragment's implementation. So we disable overlay fragment's fading here to prevent
- // losing focus while users are interacting with the side fragment.
- mOverlayFragment.setFadingEnabled(false);
- }
-
- @Override
- public void onStop() {
- super.onStop();
- // We disable fading of overlay fragment to prevent side fragment from losing focus,
- // therefore we should resume it here.
- mOverlayFragment.setFadingEnabled(true);
- mOverlayFragment.selectTrack(mTrackType, mSelectedTrack);
- }
-
- private String getTrackLabel(TvTrackInfo track, int trackIndex) {
- if (track.getLanguage() != null) {
- return new Locale(track.getLanguage()).getDisplayName();
- }
- return track.getType() == TvTrackInfo.TYPE_SUBTITLE ?
- getString(R.string.closed_caption_unknown_language, trackIndex + 1)
- : getString(R.string.multi_audio_unknown_language);
- }
-
- @Override
- protected void onProvideFragmentTransitions() {
- super.onProvideFragmentTransitions();
- // Excludes the background scrim from transition to prevent the blinking caused by
- // hiding the overlay fragment and sliding in the side fragment at the same time.
- Transition t = getEnterTransition();
- if (t != null) {
- t.excludeTarget(R.id.guidedstep_background, true);
- }
- }
-} \ No newline at end of file
diff --git a/src/com/android/tv/experiments/ExperimentFlag.java b/src/com/android/tv/experiments/ExperimentFlag.java
index c0cbd643..8f60c2b5 100644
--- a/src/com/android/tv/experiments/ExperimentFlag.java
+++ b/src/com/android/tv/experiments/ExperimentFlag.java
@@ -16,19 +16,12 @@
package com.android.tv.experiments;
-import android.support.annotation.VisibleForTesting;
/**
* Experiments return values based on user, device and other criteria.
*/
public final class ExperimentFlag<T> {
-
- private static boolean sAllowOverrides = false;
-
- @VisibleForTesting
- public static void initForTest() {
- sAllowOverrides = true;
- }
+ private final T mDefaultValue;
/** Returns a boolean experiment */
public static ExperimentFlag<Boolean> createFlag(
@@ -37,11 +30,6 @@ public final class ExperimentFlag<T> {
defaultValue);
}
- private final T mDefaultValue;
-
- private T mOverrideValue = null;
- private boolean mOverridden = false;
-
private ExperimentFlag(
T defaultValue) {
mDefaultValue = defaultValue;
@@ -49,22 +37,6 @@ public final class ExperimentFlag<T> {
/** Returns value for this experiment */
public T get() {
- return sAllowOverrides && mOverridden ? mOverrideValue : mDefaultValue;
+ return mDefaultValue;
}
-
- @VisibleForTesting
- public void override(T t) {
- if (sAllowOverrides) {
- mOverridden = true;
- mOverrideValue = t;
- }
- }
-
- @VisibleForTesting
- public void resetOverride() {
- mOverridden = false;
- }
-
-
-
}
diff --git a/src/com/android/tv/experiments/Experiments.java b/src/com/android/tv/experiments/Experiments.java
index e17fc300..f16c8d1e 100644
--- a/src/com/android/tv/experiments/Experiments.java
+++ b/src/com/android/tv/experiments/Experiments.java
@@ -23,16 +23,11 @@ import com.android.tv.common.BuildConfig;
/**
* Set of experiments visible in AOSP.
*
- * <p>This file is maintained by hand.
+ * <p>
+ * This file is maintained by hand.
*/
public final class Experiments {
public static final ExperimentFlag<Boolean> CLOUD_EPG = createFlag(
- true);
-
- /**
- * Use network tuner if it is available and there is no other tuner types.
- */
- public static final ExperimentFlag<Boolean> NETWORK_TUNER = createFlag(
false);
/**
diff --git a/src/com/android/tv/guide/ProgramGuide.java b/src/com/android/tv/guide/ProgramGuide.java
index bec4e462..120b3dba 100644
--- a/src/com/android/tv/guide/ProgramGuide.java
+++ b/src/com/android/tv/guide/ProgramGuide.java
@@ -48,7 +48,7 @@ import com.android.tv.ChannelTuner;
import com.android.tv.Features;
import com.android.tv.MainActivity;
import com.android.tv.R;
-import com.android.tv.util.DurationTimer;
+import com.android.tv.analytics.DurationTimer;
import com.android.tv.analytics.Tracker;
import com.android.tv.common.WeakHandler;
import com.android.tv.data.ChannelDataManager;
diff --git a/src/com/android/tv/guide/ProgramItemView.java b/src/com/android/tv/guide/ProgramItemView.java
index d5fb418f..4c7a4404 100644
--- a/src/com/android/tv/guide/ProgramItemView.java
+++ b/src/com/android/tv/guide/ProgramItemView.java
@@ -44,8 +44,8 @@ import com.android.tv.analytics.Tracker;
import com.android.tv.common.feature.CommonFeatures;
import com.android.tv.data.Channel;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.ui.DvrUiHelper;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.guide.ProgramManager.TableEntry;
import com.android.tv.util.ToastUtils;
import com.android.tv.util.Utils;
@@ -106,19 +106,18 @@ public class ProgramItemView extends TextView {
}, entry.getWidth() > ((ProgramItemView) view).mMaxWidthForRipple ? 0
: view.getResources()
.getInteger(R.integer.program_guide_ripple_anim_duration));
- } else if (entry.program != null && CommonFeatures.DVR.isEnabled(view.getContext())) {
+ } else if (CommonFeatures.DVR.isEnabled(view.getContext())) {
DvrManager dvrManager = singletons.getDvrManager();
if (entry.entryStartUtcMillis > System.currentTimeMillis()
&& dvrManager.isProgramRecordable(entry.program)) {
if (entry.scheduledRecording == null) {
- DvrUiHelper.checkStorageStatusAndShowErrorMessage(tvActivity,
- channel.getInputId(), new Runnable() {
- @Override
- public void run() {
- DvrUiHelper.requestRecordingFutureProgram(tvActivity,
- entry.program, false);
- }
- });
+ if (DvrUiHelper.checkStorageStatusAndShowErrorMessage(tvActivity,
+ channel.getInputId())
+ && DvrUiHelper.handleCreateSchedule(tvActivity, entry.program)) {
+ String msg = view.getContext().getString(
+ R.string.dvr_msg_program_scheduled, entry.program.getTitle());
+ ToastUtils.show(view.getContext(), msg, Toast.LENGTH_SHORT);
+ }
} else {
dvrManager.removeScheduledRecording(entry.scheduledRecording);
String msg = view.getResources().getString(
diff --git a/src/com/android/tv/guide/ProgramManager.java b/src/com/android/tv/guide/ProgramManager.java
index e543fd05..e3d919df 100644
--- a/src/com/android/tv/guide/ProgramManager.java
+++ b/src/com/android/tv/guide/ProgramManager.java
@@ -29,7 +29,7 @@ import com.android.tv.data.ProgramDataManager;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrScheduleManager;
import com.android.tv.dvr.DvrScheduleManager.OnConflictStateChangeListener;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.util.TvInputManagerHelper;
import com.android.tv.util.Utils;
@@ -439,24 +439,11 @@ public class ProgramManager {
mChannels = mChannelDataManager.getBrowsableChannelList();
mSelectedGenreId = GenreItems.ID_ALL_CHANNELS;
mFilteredChannels = mChannels;
- updateTableEntriesWithoutNotification(clearPreviousTableEntries);
- // Channel update notification should be called after updating table entries, so that
- // the listener can get the entries.
notifyChannelsUpdated();
- notifyTableEntriesUpdated();
- buildGenreFilters();
+ updateTableEntries(clearPreviousTableEntries);
}
private void updateTableEntries(boolean clear) {
- updateTableEntriesWithoutNotification(clear);
- notifyTableEntriesUpdated();
- buildGenreFilters();
- }
-
- /**
- * Updates the table entries without notifying the change.
- */
- private void updateTableEntriesWithoutNotification(boolean clear) {
if (clear) {
mChannelIdEntriesMap.clear();
}
@@ -504,6 +491,9 @@ public class ProgramManager {
}
}
}
+
+ notifyTableEntriesUpdated();
+ buildGenreFilters();
}
private void notifyGenresUpdated() {
diff --git a/src/com/android/tv/guide/ProgramTableAdapter.java b/src/com/android/tv/guide/ProgramTableAdapter.java
index b9a0593d..e4a67972 100644
--- a/src/com/android/tv/guide/ProgramTableAdapter.java
+++ b/src/com/android/tv/guide/ProgramTableAdapter.java
@@ -45,21 +45,19 @@ import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.common.TvCommonUtils;
import com.android.tv.common.feature.CommonFeatures;
import com.android.tv.data.Channel;
import com.android.tv.data.Program;
import com.android.tv.data.Program.CriticScore;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.guide.ProgramManager.TableEntriesUpdatedListener;
import com.android.tv.parental.ParentalControlSettings;
import com.android.tv.ui.HardwareLayerAnimatorListenerAdapter;
@@ -243,6 +241,16 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
notifyItemChanged(channelIndex, true);
}
+ @Override
+ public void onViewAttachedToWindow(ProgramRowHolder holder) {
+ holder.onAttachedToWindow();
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(ProgramRowHolder holder) {
+ holder.onDetachedFromWindow();
+ }
+
// TODO: make it static
public class ProgramRowHolder extends RecyclerView.ViewHolder
implements ProgramRow.ChildFocusListener {
@@ -304,40 +312,11 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
private final ImageView mInputLogoView;
private boolean mIsInputLogoVisible;
- private AccessibilityStateChangeListener mAccessibilityStateChangeListener =
- new AccessibilityManager.AccessibilityStateChangeListener() {
- @Override
- public void onAccessibilityStateChanged(boolean enable) {
- enable &= !TvCommonUtils.isRunningInTest();
- mDetailView.setFocusable(enable);
- mChannelHeaderView.setFocusable(enable);
- }
- };
public ProgramRowHolder(View itemView) {
super(itemView);
mContainer = (ViewGroup) itemView;
- mContainer.addOnAttachStateChangeListener(
- new View.OnAttachStateChangeListener() {
- @Override
- public void onViewAttachedToWindow(View v) {
- mContainer
- .getViewTreeObserver()
- .addOnGlobalFocusChangeListener(mGlobalFocusChangeListener);
- mAccessibilityManager.addAccessibilityStateChangeListener(
- mAccessibilityStateChangeListener);
- }
-
- @Override
- public void onViewDetachedFromWindow(View v) {
- mContainer
- .getViewTreeObserver()
- .removeOnGlobalFocusChangeListener(mGlobalFocusChangeListener);
- mAccessibilityManager.removeAccessibilityStateChangeListener(
- mAccessibilityStateChangeListener);
- }
- });
mProgramRow = (ProgramRow) mContainer.findViewById(R.id.row);
mDetailView = (ViewGroup) mContainer.findViewById(R.id.detail);
@@ -360,11 +339,16 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
mChannelLogoView = (ImageView) mContainer.findViewById(R.id.channel_logo);
mChannelBlockView = (ImageView) mContainer.findViewById(R.id.channel_block);
mInputLogoView = (ImageView) mContainer.findViewById(R.id.input_logo);
- // TODO: Find a better way to handle talk back.
- boolean accessibilityEnabled = mAccessibilityManager.isEnabled()
- && !TvCommonUtils.isRunningInTest();
- mDetailView.setFocusable(accessibilityEnabled);
- mChannelHeaderView.setFocusable(accessibilityEnabled);
+ mDetailView.setFocusable(mAccessibilityManager.isEnabled());
+ mChannelHeaderView.setFocusable(mAccessibilityManager.isEnabled());
+ mAccessibilityManager.addAccessibilityStateChangeListener(
+ new AccessibilityManager.AccessibilityStateChangeListener() {
+ @Override
+ public void onAccessibilityStateChanged(boolean enable) {
+ mDetailView.setFocusable(enable);
+ mChannelHeaderView.setFocusable(enable);
+ }
+ });
}
public void onBind(int position) {
@@ -524,6 +508,16 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
});
}
+ private void onAttachedToWindow() {
+ mContainer.getViewTreeObserver()
+ .addOnGlobalFocusChangeListener(mGlobalFocusChangeListener);
+ }
+
+ private void onDetachedFromWindow() {
+ mContainer.getViewTreeObserver()
+ .removeOnGlobalFocusChangeListener(mGlobalFocusChangeListener);
+ }
+
private void updateDetailView() {
if (mSelectedEntry == null) {
// The view holder is never on focus before.
diff --git a/src/com/android/tv/guide/TimeListAdapter.java b/src/com/android/tv/guide/TimeListAdapter.java
index 82907a2d..868fed46 100644
--- a/src/com/android/tv/guide/TimeListAdapter.java
+++ b/src/com/android/tv/guide/TimeListAdapter.java
@@ -16,7 +16,6 @@
package com.android.tv.guide;
-import android.content.Context;
import android.content.res.Resources;
import android.support.v7.widget.RecyclerView;
import android.text.format.DateFormat;
@@ -26,10 +25,8 @@ import android.view.ViewGroup;
import android.widget.TextView;
import com.android.tv.R;
-import com.android.tv.util.Utils;
import java.util.Date;
-import java.util.Locale;
import java.util.concurrent.TimeUnit;
/**
@@ -38,28 +35,16 @@ import java.util.concurrent.TimeUnit;
*/
public class TimeListAdapter extends RecyclerView.Adapter<TimeListAdapter.TimeViewHolder> {
private static final long TIME_UNIT_MS = TimeUnit.MINUTES.toMillis(30);
-
- // Ex. 3:00 AM
- private static final String TIME_PATTERN_SAME_DAY = "h:mm a";
- // Ex. Oct 21, 3:00 AM
- private static final String TIME_PATTERN_DIFFERENT_DAY = "MMM d, h:mm a";
-
private static int sRowHeaderOverlapping;
// Nearest half hour at or before the start time.
private long mStartUtcMs;
- private final String mTimePatternSameDay;
- private final String mTimePatternDifferentDay;
public TimeListAdapter(Resources res) {
if (sRowHeaderOverlapping == 0) {
sRowHeaderOverlapping = Math.abs(res.getDimensionPixelOffset(
R.dimen.program_guide_table_header_row_overlap));
}
- Locale locale = res.getConfiguration().locale;
- mTimePatternSameDay = DateFormat.getBestDateTimePattern(locale, TIME_PATTERN_SAME_DAY);
- mTimePatternDifferentDay =
- DateFormat.getBestDateTimePattern(locale, TIME_PATTERN_DIFFERENT_DAY);
}
public void update(long startTimeMs) {
@@ -83,14 +68,10 @@ public class TimeListAdapter extends RecyclerView.Adapter<TimeListAdapter.TimeVi
long endTime = startTime + TIME_UNIT_MS;
View itemView = holder.itemView;
- Date timeDate = new Date(startTime);
- String timeString;
- if (Utils.isInGivenDay(System.currentTimeMillis(), startTime)) {
- timeString = DateFormat.format(mTimePatternSameDay, timeDate).toString();
- } else {
- timeString = DateFormat.format(mTimePatternDifferentDay, timeDate).toString();
- }
- ((TextView) itemView.findViewById(R.id.time)).setText(timeString);
+
+ TextView textView = (TextView) itemView.findViewById(R.id.time);
+ String time = DateFormat.getTimeFormat(itemView.getContext()).format(new Date(startTime));
+ textView.setText(time);
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) itemView.getLayoutParams();
lp.width = GuideUtils.convertMillisToPixel(startTime, endTime);
diff --git a/src/com/android/tv/menu/ActionCardView.java b/src/com/android/tv/menu/ActionCardView.java
index 2fd70bfb..54892cac 100644
--- a/src/com/android/tv/menu/ActionCardView.java
+++ b/src/com/android/tv/menu/ActionCardView.java
@@ -19,8 +19,8 @@ package com.android.tv.menu;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
+import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.RelativeLayout;
import android.widget.TextView;
import com.android.tv.R;
@@ -28,7 +28,7 @@ import com.android.tv.R;
/**
* A view to render an item of TV options.
*/
-public class ActionCardView extends RelativeLayout implements ItemListRowView.CardView<MenuAction> {
+public class ActionCardView extends FrameLayout implements ItemListRowView.CardView<MenuAction> {
private static final String TAG = MenuView.TAG;
private static final boolean DEBUG = MenuView.DEBUG;
@@ -66,7 +66,7 @@ public class ActionCardView extends RelativeLayout implements ItemListRowView.Ca
}
mIconView.setImageDrawable(action.getDrawable(getContext()));
mLabelView.setText(action.getActionName(getContext()));
- mStateView.setText(action.getActionDescription());
+ mStateView.setText(action.getActionDescription(getContext()));
if (action.isEnabled()) {
setEnabled(true);
setFocusable(true);
diff --git a/src/com/android/tv/menu/AppLinkCardView.java b/src/com/android/tv/menu/AppLinkCardView.java
index d23d9a00..bfb5e3f1 100644
--- a/src/com/android/tv/menu/AppLinkCardView.java
+++ b/src/com/android/tv/menu/AppLinkCardView.java
@@ -24,7 +24,6 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
-import android.os.AsyncTask;
import android.support.annotation.Nullable;
import android.support.v7.graphics.Palette;
import android.text.TextUtils;
@@ -56,6 +55,7 @@ public class AppLinkCardView extends BaseCardView<Channel> {
private final int mIconColorFilter;
private ImageView mImageView;
+ private View mGradientView;
private TextView mAppInfoView;
private View mMetaViewHolder;
private Channel mChannel;
@@ -102,115 +102,35 @@ public class AppLinkCardView extends BaseCardView<Channel> {
int linkType = mChannel.getAppLinkType(getContext());
mIntent = mChannel.getAppLinkIntent(getContext());
- CharSequence appLabel = null;
- mImageView.setForeground(null);
switch (linkType) {
case Channel.APP_LINK_TYPE_CHANNEL:
setText(mChannel.getAppLinkText());
mAppInfoView.setVisibility(VISIBLE);
+ mGradientView.setVisibility(VISIBLE);
mAppInfoView.setCompoundDrawablePadding(mIconPadding);
- mAppInfoView.setCompoundDrawablesRelative(null, null, null, null);
- appLabel = mTvInputManagerHelper.getTvInputApplicationLabel(channel.getInputId());
- if (appLabel != null) {
- mAppInfoView.setText(appLabel);
- } else {
- new AsyncTask<Void, Void, CharSequence>() {
- private final String mLoadTvInputId = mChannel.getInputId();
-
- @Override
- protected CharSequence doInBackground(Void... params) {
- if (appInfo != null) {
- return mPackageManager.getApplicationLabel(appInfo);
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(CharSequence appLabel) {
- mTvInputManagerHelper.setTvInputApplicationLabel(
- mLoadTvInputId, appLabel);
- if (mLoadTvInputId != mChannel.getInputId() || !isAttachedToWindow()) {
- return;
- }
- mAppInfoView.setText(appLabel);
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
+ mAppInfoView.setCompoundDrawables(null, null, null, null);
+ mAppInfoView.setText(mPackageManager.getApplicationLabel(appInfo));
if (!TextUtils.isEmpty(mChannel.getAppLinkIconUri())) {
mChannel.loadBitmap(getContext(), Channel.LOAD_IMAGE_TYPE_APP_LINK_ICON,
- mIconWidth, mIconHeight,
- createChannelLogoCallback(
- this, mChannel, Channel.LOAD_IMAGE_TYPE_APP_LINK_ICON));
+ mIconWidth, mIconHeight, createChannelLogoCallback(this, mChannel,
+ Channel.LOAD_IMAGE_TYPE_APP_LINK_ICON));
} else if (appInfo.icon != 0) {
- Drawable appIcon =
- mTvInputManagerHelper.getTvInputApplicationIcon(mChannel.getInputId());
- if (appIcon != null) {
- BitmapUtils.setColorFilterToDrawable(mIconColorFilter, appIcon);
- appIcon.setBounds(0, 0, mIconWidth, mIconHeight);
- mAppInfoView.setCompoundDrawablesRelative(appIcon, null, null, null);
- } else {
- new AsyncTask<Void, Void, Drawable>() {
- private final String mLoadTvInputId = mChannel.getInputId();
-
- @Override
- protected Drawable doInBackground(Void... params) {
- if (appInfo != null) {
- return mPackageManager.getApplicationIcon(appInfo);
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Drawable appIcon) {
- mTvInputManagerHelper.setTvInputApplicationIcon(
- mLoadTvInputId, appIcon);
- if (mLoadTvInputId != mChannel.getInputId()
- || !isAttachedToWindow()) {
- return;
- }
- BitmapUtils.setColorFilterToDrawable(mIconColorFilter, appIcon);
- appIcon.setBounds(0, 0, mIconWidth, mIconHeight);
- mAppInfoView.setCompoundDrawablesRelative(appIcon, null, null, null);
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
+ Drawable appIcon = mPackageManager.getApplicationIcon(appInfo);
+ BitmapUtils.setColorFilterToDrawable(mIconColorFilter, appIcon);
+ appIcon.setBounds(0, 0, mIconWidth, mIconHeight);
+ mAppInfoView.setCompoundDrawables(appIcon, null, null, null);
}
break;
case Channel.APP_LINK_TYPE_APP:
- appLabel = mTvInputManagerHelper.getTvInputApplicationLabel(mChannel.getInputId());
- if (appLabel != null) {
- setText(getContext()
- .getString(R.string.channels_item_app_link_app_launcher, appLabel));
- } else {
- new AsyncTask<Void, Void, CharSequence>() {
- private final String mLoadTvInputId = mChannel.getInputId();
-
- @Override
- protected CharSequence doInBackground(Void... params) {
- if (appInfo != null) {
- return mPackageManager.getApplicationLabel(appInfo);
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(CharSequence appLabel) {
- mTvInputManagerHelper.setTvInputApplicationLabel(
- mLoadTvInputId, appLabel);
- if (mLoadTvInputId != mChannel.getInputId() || !isAttachedToWindow()) {
- return;
- }
- setText(getContext()
- .getString(
- R.string.channels_item_app_link_app_launcher,
- appLabel));
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
+ setText(getContext().getString(
+ R.string.channels_item_app_link_app_launcher,
+ mPackageManager.getApplicationLabel(appInfo)));
mAppInfoView.setVisibility(GONE);
+ mGradientView.setVisibility(GONE);
break;
default:
mAppInfoView.setVisibility(GONE);
+ mGradientView.setVisibility(GONE);
Log.d(TAG, "Should not be here.");
}
@@ -228,6 +148,8 @@ public class AppLinkCardView extends BaseCardView<Channel> {
} else {
setCardImageWithBanner(appInfo);
}
+ // Call super.onBind() at the end intentionally. In order to correctly handle extension of
+ // text view, text should be set before calling super.onBind.
super.onBind(channel, selected);
}
@@ -260,14 +182,13 @@ public class AppLinkCardView extends BaseCardView<Channel> {
}
}
BitmapUtils.setColorFilterToDrawable(mIconColorFilter, drawable);
- mAppInfoView.setCompoundDrawablesRelative(drawable, null, null, null);
+ mAppInfoView.setCompoundDrawables(drawable, null, null, null);
} else if (type == Channel.LOAD_IMAGE_TYPE_APP_LINK_POSTER_ART) {
if (bitmap == null) {
setCardImageWithBanner(
mTvInputManagerHelper.getTvInputAppInfo(mChannel.getInputId()));
} else {
mImageView.setImageBitmap(bitmap);
- mImageView.setForeground(getContext().getDrawable(R.drawable.card_image_gradient));
if (mChannel.getAppLinkColor() == 0) {
extractAndSetMetaViewBackgroundColor(bitmap);
}
@@ -279,6 +200,7 @@ public class AppLinkCardView extends BaseCardView<Channel> {
protected void onFinishInflate() {
super.onFinishInflate();
mImageView = (ImageView) findViewById(R.id.image);
+ mGradientView = findViewById(R.id.image_gradient);
mAppInfoView = (TextView) findViewById(R.id.app_info);
mMetaViewHolder = findViewById(R.id.app_link_text_holder);
}
@@ -287,85 +209,37 @@ public class AppLinkCardView extends BaseCardView<Channel> {
// 1) Provided poster art image, 2) Activity banner, 3) Activity icon, 4) Application banner,
// 5) Application icon, and 6) default image.
private void setCardImageWithBanner(ApplicationInfo appInfo) {
- new AsyncTask<Void, Void, Drawable>() {
- private String mLoadTvInputId = mChannel.getInputId();
- @Override
- protected Drawable doInBackground(Void... params) {
- Drawable banner = null;
- if (mIntent != null) {
- try {
- banner = mPackageManager.getActivityBanner(mIntent);
- if (banner == null) {
- banner = mPackageManager.getActivityIcon(mIntent);
- }
- } catch (PackageManager.NameNotFoundException e) {
- // do nothing.
- }
+ Drawable banner = null;
+ if (mIntent != null) {
+ try {
+ banner = mPackageManager.getActivityBanner(mIntent);
+ if (banner == null) {
+ banner = mPackageManager.getActivityIcon(mIntent);
}
- return banner;
+ } catch (PackageManager.NameNotFoundException e) {
+ // do nothing.
}
+ }
- @Override
- protected void onPostExecute(Drawable banner) {
- if (mLoadTvInputId != mChannel.getInputId() || !isAttachedToWindow()) {
- return;
- }
- if (banner != null) {
- setCardImageWithBannerInternal(banner);
- } else {
- setCardImageWithApplicationInfoBanner(appInfo);
- }
+ if (banner == null && appInfo != null) {
+ if (appInfo.banner != 0) {
+ banner = mPackageManager.getApplicationBanner(appInfo);
+ }
+ if (banner == null && appInfo.icon != 0) {
+ banner = mPackageManager.getApplicationIcon(appInfo);
}
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
-
- private void setCardImageWithApplicationInfoBanner(ApplicationInfo appInfo) {
- Drawable appBanner =
- mTvInputManagerHelper.getTvInputApplicationBanner(mChannel.getInputId());
- if (appBanner != null) {
- setCardImageWithBannerInternal(appBanner);
- } else {
- new AsyncTask<Void, Void, Drawable>() {
- private final String mLoadTvInputId = mChannel.getInputId();
- @Override
- protected Drawable doInBackground(Void... params) {
- Drawable banner = null;
- if (appInfo != null) {
- if (appInfo.banner != 0) {
- banner = mPackageManager.getApplicationBanner(appInfo);
- }
- if (banner == null && appInfo.icon != 0) {
- banner = mPackageManager.getApplicationIcon(appInfo);
- }
- }
- return banner;
- }
-
- @Override
- protected void onPostExecute(Drawable banner) {
- mTvInputManagerHelper.setTvInputApplicationBanner(
- mLoadTvInputId, banner);
- if (mLoadTvInputId != mChannel.getInputId() || !isAttachedToWindow()) {
- return;
- }
- setCardImageWithBannerInternal(banner);
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
- }
- private void setCardImageWithBannerInternal(Drawable banner) {
if (banner == null) {
mImageView.setImageResource(R.drawable.ic_recent_thumbnail_default);
mImageView.setBackgroundResource(R.color.channel_card);
} else {
- Bitmap bitmap = Bitmap.createBitmap(
- mCardImageWidth, mCardImageHeight, Bitmap.Config.ARGB_8888);
+ Bitmap bitmap =
+ Bitmap.createBitmap(mCardImageWidth, mCardImageHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
banner.setBounds(0, 0, mCardImageWidth, mCardImageHeight);
banner.draw(canvas);
mImageView.setImageDrawable(banner);
- mImageView.setForeground(getContext().getDrawable(R.drawable.card_image_gradient));
if (mChannel.getAppLinkColor() == 0) {
extractAndSetMetaViewBackgroundColor(bitmap);
}
diff --git a/src/com/android/tv/menu/BaseCardView.java b/src/com/android/tv/menu/BaseCardView.java
index fa74ce3e..c6a34a5d 100644
--- a/src/com/android/tv/menu/BaseCardView.java
+++ b/src/com/android/tv/menu/BaseCardView.java
@@ -57,7 +57,6 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
private TextView mTextViewFocused;
private final int mCardImageWidth;
private final float mCardHeight;
- private boolean mSelected;
public BaseCardView(Context context) {
this(context, null);
@@ -104,9 +103,23 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
/**
* Called when the view is displayed.
+ *
+ * Before onBind is called, this view's text should be set to determine if it'll be extended
+ * or not in focus state.
*/
@Override
public void onBind(T item, boolean selected) {
+ if (mTextView != null && mTextViewFocused != null) {
+ mTextViewFocused.measure(
+ MeasureSpec.makeMeasureSpec(mCardImageWidth, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
+ mExtendViewOnFocus = mTextViewFocused.getLineCount() > 1;
+ if (mExtendViewOnFocus) {
+ setTextViewFocusedAlpha(selected ? 1f : 0f);
+ } else {
+ setTextViewFocusedAlpha(1f);
+ }
+ }
setFocusAnimatedValue(selected ? SCALE_FACTOR_1F : SCALE_FACTOR_0F);
}
@@ -115,7 +128,6 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
@Override
public void onSelected() {
- mSelected = true;
if (isAttachedToWindow() && getVisibility() == View.VISIBLE) {
startFocusAnimation(SCALE_FACTOR_1F);
} else {
@@ -126,7 +138,6 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
@Override
public void onDeselected() {
- mSelected = false;
if (isAttachedToWindow() && getVisibility() == View.VISIBLE) {
startFocusAnimation(SCALE_FACTOR_0F);
} else {
@@ -145,7 +156,6 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
if (mTextView != null) {
mTextView.setText(resId);
}
- onTextViewUpdated();
}
/**
@@ -158,22 +168,6 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
if (mTextView != null) {
mTextView.setText(text);
}
- onTextViewUpdated();
- }
-
- private void onTextViewUpdated() {
- if (mTextView != null && mTextViewFocused != null) {
- mTextViewFocused.measure(
- MeasureSpec.makeMeasureSpec(mCardImageWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
- mExtendViewOnFocus = mTextViewFocused.getLineCount() > 1;
- if (mExtendViewOnFocus) {
- setTextViewFocusedAlpha(mSelected ? 1f : 0f);
- } else {
- setTextViewFocusedAlpha(1f);
- }
- }
- setFocusAnimatedValue(mSelected ? SCALE_FACTOR_1F : SCALE_FACTOR_0F);
}
/**
@@ -215,18 +209,12 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
setScaleX(scale);
setScaleY(scale);
setTranslationZ(mFocusTranslationZ * animatedValue);
- if (mTextView != null && mTextViewFocused != null) {
+ if (mExtendViewOnFocus) {
ViewGroup.LayoutParams params = mTextView.getLayoutParams();
- int height = mExtendViewOnFocus ? Math.round(mTextViewHeight
- + (mExtendedTextViewHeight - mTextViewHeight) * animatedValue)
- : (int) mTextViewHeight;
- if (height != params.height) {
- params.height = height;
- setTextViewLayoutParams(params);
- }
- if (mExtendViewOnFocus) {
- setTextViewFocusedAlpha(animatedValue);
- }
+ params.height = Math.round(mTextViewHeight
+ + (mExtendedTextViewHeight - mTextViewHeight) * animatedValue);
+ setTextViewLayoutParams(params);
+ setTextViewFocusedAlpha(animatedValue);
}
}
diff --git a/src/com/android/tv/menu/ChannelCardView.java b/src/com/android/tv/menu/ChannelCardView.java
index 4ee56892..1c8015a6 100644
--- a/src/com/android/tv/menu/ChannelCardView.java
+++ b/src/com/android/tv/menu/ChannelCardView.java
@@ -45,6 +45,7 @@ public class ChannelCardView extends BaseCardView<Channel> {
private final int mCardImageHeight;
private ImageView mImageView;
+ private View mGradientView;
private TextView mChannelNumberNameView;
private ProgressBar mProgressBar;
private Channel mChannel;
@@ -70,6 +71,7 @@ public class ChannelCardView extends BaseCardView<Channel> {
protected void onFinishInflate() {
super.onFinishInflate();
mImageView = (ImageView) findViewById(R.id.image);
+ mGradientView = findViewById(R.id.image_gradient);
mChannelNumberNameView = (TextView) findViewById(R.id.channel_number_and_name);
mProgressBar = (ProgressBar) findViewById(R.id.progress);
}
@@ -86,7 +88,7 @@ public class ChannelCardView extends BaseCardView<Channel> {
mChannelNumberNameView.setVisibility(VISIBLE);
mImageView.setImageResource(R.drawable.ic_recent_thumbnail_default);
mImageView.setBackgroundResource(R.color.channel_card);
- mImageView.setForeground(null);
+ mGradientView.setVisibility(View.GONE);
mProgressBar.setVisibility(GONE);
setTextViewEnabled(true);
@@ -99,6 +101,8 @@ public class ChannelCardView extends BaseCardView<Channel> {
}
updateProgramInformation();
+ // Call super.onBind() at the end intentionally. In order to correctly handle extension of
+ // text view, text should be set before calling super.onBind.
super.onBind(channel, selected);
}
@@ -119,7 +123,7 @@ public class ChannelCardView extends BaseCardView<Channel> {
private void updatePosterArt(Bitmap posterArt) {
mImageView.setImageBitmap(posterArt);
- mImageView.setForeground(getContext().getDrawable(R.drawable.card_image_gradient));
+ mGradientView.setVisibility(View.VISIBLE);
}
private void updateProgramInformation() {
diff --git a/src/com/android/tv/menu/ChannelsRow.java b/src/com/android/tv/menu/ChannelsRow.java
index 490d73de..dedf0993 100644
--- a/src/com/android/tv/menu/ChannelsRow.java
+++ b/src/com/android/tv/menu/ChannelsRow.java
@@ -26,14 +26,8 @@ import com.android.tv.recommendation.Recommender;
public class ChannelsRow extends ItemListRow {
public static final String ID = ChannelsRow.class.getName();
- /**
- * Minimum count for recent channels.
- */
- public static final int MIN_COUNT_FOR_RECENT_CHANNELS = 5;
- /**
- * Maximum count for recent channels.
- */
- public static final int MAX_COUNT_FOR_RECENT_CHANNELS = 10;
+ private static final int MIN_COUNT_FOR_RECENT_CHANNELS = 5;
+ private static final int MAX_COUNT_FOR_RECENT_CHANNELS = 10;
private Recommender mTvRecommendation;
private ChannelsRowAdapter mChannelsAdapter;
diff --git a/src/com/android/tv/menu/ChannelsRowAdapter.java b/src/com/android/tv/menu/ChannelsRowAdapter.java
index 4ba6a93a..c8e1bd05 100644
--- a/src/com/android/tv/menu/ChannelsRowAdapter.java
+++ b/src/com/android/tv/menu/ChannelsRowAdapter.java
@@ -31,6 +31,7 @@ import com.android.tv.dvr.DvrDataManager;
import com.android.tv.recommendation.Recommender;
import com.android.tv.util.SetupUtils;
import com.android.tv.util.TvInputManagerHelper;
+import com.android.tv.util.Utils;
import java.util.ArrayList;
import java.util.List;
@@ -129,6 +130,8 @@ public class ChannelsRowAdapter extends ItemListRowView.ItemListAdapter<Channel>
@Override
public void onBindViewHolder(MyViewHolder viewHolder, int position) {
+ super.onBindViewHolder(viewHolder, position);
+
int viewType = getItemViewType(position);
if (viewType == R.layout.menu_card_guide) {
viewHolder.itemView.setOnClickListener(mGuideOnClickListener);
@@ -144,7 +147,6 @@ public class ChannelsRowAdapter extends ItemListRowView.ItemListAdapter<Channel>
viewHolder.itemView.setTag(getItemList().get(position));
viewHolder.itemView.setOnClickListener(mChannelOnClickListener);
}
- super.onBindViewHolder(viewHolder, position);
}
@Override
diff --git a/src/com/android/tv/menu/ItemListRowView.java b/src/com/android/tv/menu/ItemListRowView.java
index 01257628..4919c595 100644
--- a/src/com/android/tv/menu/ItemListRowView.java
+++ b/src/com/android/tv/menu/ItemListRowView.java
@@ -28,7 +28,6 @@ import android.view.ViewGroup;
import com.android.tv.MainActivity;
import com.android.tv.R;
-import com.android.tv.util.ViewCache;
import java.util.Collections;
import java.util.List;
@@ -195,20 +194,9 @@ public class ItemListRowView extends MenuRowView implements OnChildSelectedListe
return mItemList.size();
}
- /**
- * Returns the position of the item.
- */
- protected int getItemPosition(T item) {
- return mItemList.indexOf(item);
- }
-
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- int resId = getLayoutResId(viewType);
- View view = ViewCache.getInstance().getView(resId);
- if (view == null) {
- view = mLayoutInflater.inflate(resId, parent, false);
- }
+ View view = mLayoutInflater.inflate(getLayoutResId(viewType), parent, false);
return new MyViewHolder(view);
}
diff --git a/src/com/android/tv/menu/Menu.java b/src/com/android/tv/menu/Menu.java
index 25e629c1..1160a5b5 100644
--- a/src/com/android/tv/menu/Menu.java
+++ b/src/com/android/tv/menu/Menu.java
@@ -27,30 +27,23 @@ import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
import com.android.tv.ChannelTuner;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.TvOptionsManager;
+import com.android.tv.analytics.DurationTimer;
import com.android.tv.analytics.Tracker;
import com.android.tv.common.TvCommonUtils;
import com.android.tv.common.WeakHandler;
import com.android.tv.menu.MenuRowFactory.PartnerRow;
+import com.android.tv.menu.MenuRowFactory.PipOptionsRow;
import com.android.tv.menu.MenuRowFactory.TvOptionsRow;
import com.android.tv.ui.TunableTvView;
-import com.android.tv.util.DurationTimer;
-import com.android.tv.util.ViewCache;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
/**
* A class which controls the menu.
@@ -88,21 +81,10 @@ public class Menu {
sRowIdListForReason.add(PlayControlsRow.ID); // REASON_PLAY_CONTROLS_JUMP_TO_NEXT
}
- private static final Map<Integer, Integer> PRELOAD_VIEW_IDS = new HashMap<>();
- static {
- PRELOAD_VIEW_IDS.put(R.layout.menu_card_guide, 1);
- PRELOAD_VIEW_IDS.put(R.layout.menu_card_setup, 1);
- PRELOAD_VIEW_IDS.put(R.layout.menu_card_dvr, 1);
- PRELOAD_VIEW_IDS.put(R.layout.menu_card_app_link, 1);
- PRELOAD_VIEW_IDS.put(R.layout.menu_card_channel, ChannelsRow.MAX_COUNT_FOR_RECENT_CHANNELS);
- PRELOAD_VIEW_IDS.put(R.layout.menu_card_action, 7);
- }
-
private static final String SCREEN_NAME = "Menu";
private static final int MSG_HIDE_MENU = 1000;
- private final Context mContext;
private final IMenuView mMenuView;
private final Tracker mTracker;
private final DurationTimer mVisibleTimer = new DurationTimer();
@@ -121,16 +103,15 @@ public class Menu {
@VisibleForTesting
Menu(Context context, IMenuView menuView, MenuRowFactory menuRowFactory,
OnMenuVisibilityChangeListener onMenuVisibilityChangeListener) {
- this(context, null, null, menuView, menuRowFactory, onMenuVisibilityChangeListener);
+ this(context, null, menuView, menuRowFactory, onMenuVisibilityChangeListener);
}
- public Menu(Context context, TunableTvView tvView, TvOptionsManager optionsManager,
- IMenuView menuView, MenuRowFactory menuRowFactory,
+ public Menu(Context context, TunableTvView tvView, IMenuView menuView,
+ MenuRowFactory menuRowFactory,
OnMenuVisibilityChangeListener onMenuVisibilityChangeListener) {
- mContext = context;
mMenuView = menuView;
mTracker = TvApplication.getSingletons(context).getTracker();
- mMenuUpdater = new MenuUpdater(this, tvView, optionsManager);
+ mMenuUpdater = new MenuUpdater(context, tvView, this);
Resources res = context.getResources();
mShowDurationMillis = res.getInteger(R.integer.menu_show_duration);
mOnMenuVisibilityChangeListener = onMenuVisibilityChangeListener;
@@ -149,6 +130,7 @@ public class Menu {
addMenuRow(menuRowFactory.createMenuRow(this, ChannelsRow.class));
addMenuRow(menuRowFactory.createMenuRow(this, PartnerRow.class));
addMenuRow(menuRowFactory.createMenuRow(this, TvOptionsRow.class));
+ addMenuRow(menuRowFactory.createMenuRow(this, PipOptionsRow.class));
mMenuView.setMenuRows(mMenuRows);
}
@@ -178,23 +160,6 @@ public class Menu {
}
/**
- * Preloads the item view used for the menu.
- */
- public void preloadItemViews() {
- LayoutInflater inflater =
- (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- // Use a fake parent to make the layoutParams set correctly.
- ViewGroup fakeParent = new LinearLayout(mContext);
- for (int id : PRELOAD_VIEW_IDS.keySet()) {
- int count = PRELOAD_VIEW_IDS.get(id);
- for (int i = 0; i < count; i++) {
- View view = inflater.inflate(id, fakeParent, false);
- ViewCache.getInstance().putView(id, view);
- }
- }
- }
-
- /**
* Shows the main menu.
*
* @param reason A reason why this is called. See {@link MenuShowReason}
diff --git a/src/com/android/tv/menu/MenuAction.java b/src/com/android/tv/menu/MenuAction.java
index b4356059..0d59552a 100644
--- a/src/com/android/tv/menu/MenuAction.java
+++ b/src/com/android/tv/menu/MenuAction.java
@@ -20,9 +20,9 @@ import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
+import com.android.tv.MainActivity;
import com.android.tv.R;
import com.android.tv.TvOptionsManager;
-import com.android.tv.TvOptionsManager.OptionType;
/**
* A class to define possible actions from main menu.
@@ -36,9 +36,12 @@ public class MenuAction {
public static final MenuAction SELECT_DISPLAY_MODE_ACTION =
new MenuAction(R.string.options_item_display_mode, TvOptionsManager.OPTION_DISPLAY_MODE,
R.drawable.ic_tvoption_aspect);
+ public static final MenuAction PIP_IN_APP_ACTION =
+ new MenuAction(R.string.options_item_pip, TvOptionsManager.OPTION_IN_APP_PIP,
+ R.drawable.ic_tvoption_pip);
public static final MenuAction SYSTEMWIDE_PIP_ACTION =
new MenuAction(R.string.options_item_pip, TvOptionsManager.OPTION_SYSTEMWIDE_PIP,
- R.drawable.ic_tvoption_pip);
+ R.drawable.ic_pip_option_layout2);
public static final MenuAction SELECT_AUDIO_LANGUAGE_ACTION =
new MenuAction(R.string.options_item_multi_audio, TvOptionsManager.OPTION_MULTI_AUDIO,
R.drawable.ic_tvoption_multi_track);
@@ -48,36 +51,34 @@ public class MenuAction {
public static final MenuAction DEV_ACTION =
new MenuAction(R.string.options_item_developer,
TvOptionsManager.OPTION_DEVELOPER, R.drawable.ic_developer_mode_tv_white_48dp);
+ // TODO: Change the icon.
public static final MenuAction SETTINGS_ACTION =
new MenuAction(R.string.options_item_settings, TvOptionsManager.OPTION_SETTINGS,
R.drawable.ic_settings);
+ // Actions in the PIP option row.
+ public static final MenuAction PIP_SELECT_INPUT_ACTION =
+ new MenuAction(R.string.pip_options_item_source, TvOptionsManager.OPTION_PIP_INPUT,
+ R.drawable.ic_pip_option_input);
+ public static final MenuAction PIP_SWAP_ACTION =
+ new MenuAction(R.string.pip_options_item_swap, TvOptionsManager.OPTION_PIP_SWAP,
+ R.drawable.ic_pip_option_swap);
+ public static final MenuAction PIP_SOUND_ACTION =
+ new MenuAction(R.string.pip_options_item_sound, TvOptionsManager.OPTION_PIP_SOUND,
+ R.drawable.ic_pip_option_swap_audio);
+ public static final MenuAction PIP_LAYOUT_ACTION =
+ new MenuAction(R.string.pip_options_item_layout, TvOptionsManager.OPTION_PIP_LAYOUT,
+ R.drawable.ic_pip_option_layout1);
+ public static final MenuAction PIP_SIZE_ACTION =
+ new MenuAction(R.string.pip_options_item_size, TvOptionsManager.OPTION_PIP_SIZE,
+ R.drawable.ic_pip_option_size);
private final String mActionName;
private final int mActionNameResId;
- @OptionType private final int mType;
- private String mActionDescription;
+ private final int mType;
private Drawable mDrawable;
private int mDrawableResId;
private boolean mEnabled = true;
- /**
- * Sets the action description. Returns {@code trye} if the description is changed.
- */
- public static boolean setActionDescription(MenuAction action, String actionDescription) {
- String oldDescription = action.mActionDescription;
- action.mActionDescription = actionDescription;
- return !TextUtils.equals(action.mActionDescription, oldDescription);
- }
-
- /**
- * Enables or disables the action. Returns {@code true} if the value is changed.
- */
- public static boolean setEnabled(MenuAction action, boolean enabled) {
- boolean changed = action.mEnabled != enabled;
- action.mEnabled = enabled;
- return changed;
- }
-
public MenuAction(int actionNameResId, int type, int drawableResId) {
mActionName = null;
mActionNameResId = actionNameResId;
@@ -101,11 +102,11 @@ public class MenuAction {
return context.getString(mActionNameResId);
}
- public String getActionDescription() {
- return mActionDescription;
+ public String getActionDescription(Context context) {
+ return ((MainActivity) context).getTvOptionsManager().getOptionString(mType);
}
- @OptionType public int getType() {
+ public int getType() {
return mType;
}
@@ -119,10 +120,28 @@ public class MenuAction {
return mDrawable;
}
+ /**
+ * Sets drawable resource id.
+ *
+ * @return {@code true} if drawable is changed.
+ */
+ public boolean setDrawableResId(int resId) {
+ if (mDrawableResId == resId) {
+ return false;
+ }
+ mDrawable = null;
+ mDrawableResId = resId;
+ return true;
+ }
+
public boolean isEnabled() {
return mEnabled;
}
+ public void setEnabled(boolean enabled) {
+ mEnabled = enabled;
+ }
+
public int getActionNameResId() {
return mActionNameResId;
}
diff --git a/src/com/android/tv/menu/MenuLayoutManager.java b/src/com/android/tv/menu/MenuLayoutManager.java
index a16ac197..6c767247 100644
--- a/src/com/android/tv/menu/MenuLayoutManager.java
+++ b/src/com/android/tv/menu/MenuLayoutManager.java
@@ -384,15 +384,10 @@ public class MenuLayoutManager {
mSelectedPosition = position;
if (DEBUG) dumpChildren("startRowAnimation()");
+ MenuRowView currentView = mMenuRowViews.get(position);
// Show the children of the next row.
- final MenuRowView currentView = mMenuRowViews.get(position);
- TextView currentTitleView = currentView.getTitleView();
- View currentContentsView = currentView.getContentsView();
- currentTitleView.setVisibility(View.VISIBLE);
- currentContentsView.setVisibility(View.VISIBLE);
- if (currentView instanceof PlayControlsRowView) {
- ((PlayControlsRowView) currentView).onPreselected();
- }
+ currentView.getTitleView().setVisibility(View.VISIBLE);
+ currentView.getContentsView().setVisibility(View.VISIBLE);
// Request focus after the new contents view shows up.
mMenuView.requestFocus();
if (mTempTitleViewForOld == null) {
@@ -412,7 +407,7 @@ public class MenuLayoutManager {
// Old row.
MenuRow oldRow = mMenuRows.get(oldPosition);
- final MenuRowView oldView = mMenuRowViews.get(oldPosition);
+ MenuRowView oldView = mMenuRowViews.get(oldPosition);
View oldContentsView = oldView.getContentsView();
// Old contents view.
animators.add(createAlphaAnimator(oldContentsView, 1.0f, 0.0f, 1.0f, mLinearOutSlowIn)
@@ -473,6 +468,8 @@ public class MenuLayoutManager {
}
// Current row.
Rect currentLayoutRect = new Rect(layouts.get(position));
+ TextView currentTitleView = currentView.getTitleView();
+ View currentContentsView = currentView.getContentsView();
currentContentsView.setAlpha(0.0f);
if (scrollDown) {
// Current title view.
@@ -575,8 +572,9 @@ public class MenuLayoutManager {
for (ViewPropertyValueHolder holder : propertyValuesAfterAnimation) {
holder.property.set(holder.view, holder.value);
}
- oldView.onDeselected();
- currentView.onSelected(true);
+ oldTitleView.setVisibility(View.VISIBLE);
+ mMenuRowViews.get(oldPosition).onDeselected();
+ mMenuRowViews.get(position).onSelected(true);
mTempTitleViewForOld.setVisibility(View.GONE);
mTempTitleViewForCurrent.setVisibility(View.GONE);
layout(mMenuView.getLeft(), mMenuView.getTop(), mMenuView.getRight(),
diff --git a/src/com/android/tv/menu/MenuRowFactory.java b/src/com/android/tv/menu/MenuRowFactory.java
index 2d5453fe..c67a0e04 100644
--- a/src/com/android/tv/menu/MenuRowFactory.java
+++ b/src/com/android/tv/menu/MenuRowFactory.java
@@ -67,6 +67,8 @@ public class MenuRowFactory {
} else if (TvOptionsRow.class.equals(key)) {
return new TvOptionsRow(mMainActivity, menu, mTvCustomizationManager
.getCustomActions(TvCustomizationManager.ID_OPTIONS_ROW));
+ } else if (PipOptionsRow.class.equals(key)) {
+ return new PipOptionsRow(mMainActivity, menu);
}
return null;
}
@@ -75,9 +77,6 @@ public class MenuRowFactory {
* A menu row which represents the TV options row.
*/
public static class TvOptionsRow extends ItemListRow {
- /** The ID of the row. */
- public static final String ID = TvOptionsRow.class.getName();
-
private TvOptionsRow(Context context, Menu menu, List<CustomAction> customActions) {
super(context, menu, R.string.menu_title_options, R.dimen.action_card_height,
new TvOptionsRowAdapter(context, customActions));
@@ -92,6 +91,25 @@ public class MenuRowFactory {
}
/**
+ * A menu row which represents the PIP options row.
+ */
+ public static class PipOptionsRow extends ItemListRow {
+ private final MainActivity mMainActivity;
+
+ private PipOptionsRow(Context context, Menu menu) {
+ super(context, menu, R.string.menu_title_pip_options, R.dimen.action_card_height,
+ new PipOptionsRowAdapter(context));
+ mMainActivity = (MainActivity) context;
+ }
+
+ @Override
+ public boolean isVisible() {
+ // TODO: Remove the dependency on MainActivity.
+ return super.isVisible() && mMainActivity.isPipEnabled();
+ }
+ }
+
+ /**
* A menu row which represents the partner row.
*/
public static class PartnerRow extends ItemListRow {
diff --git a/src/com/android/tv/menu/MenuUpdater.java b/src/com/android/tv/menu/MenuUpdater.java
index 7ad38e74..075b299e 100644
--- a/src/com/android/tv/menu/MenuUpdater.java
+++ b/src/com/android/tv/menu/MenuUpdater.java
@@ -16,14 +16,11 @@
package com.android.tv.menu;
+import android.content.Context;
import android.support.annotation.Nullable;
import com.android.tv.ChannelTuner;
-import com.android.tv.TvOptionsManager;
-import com.android.tv.TvOptionsManager.OptionChangedListener;
-import com.android.tv.TvOptionsManager.OptionType;
import com.android.tv.data.Channel;
-import com.android.tv.menu.MenuRowFactory.TvOptionsRow;
import com.android.tv.ui.TunableTvView;
import com.android.tv.ui.TunableTvView.OnScreenBlockingChangedListener;
@@ -33,10 +30,10 @@ import com.android.tv.ui.TunableTvView.OnScreenBlockingChangedListener;
* <p>As the menu is updated when it shows up, this class handles only the dynamic updates.
*/
public class MenuUpdater {
- private final Menu mMenu;
// Can be null for testing.
- @Nullable private final TunableTvView mTvView;
- @Nullable private final TvOptionsManager mOptionsManager;
+ @Nullable
+ private final TunableTvView mTvView;
+ private final Menu mMenu;
private ChannelTuner mChannelTuner;
private final ChannelTuner.Listener mChannelTunerListener = new ChannelTuner.Listener() {
@@ -45,7 +42,7 @@ public class MenuUpdater {
@Override
public void onBrowsableChannelListChanged() {
- mMenu.update(ChannelsRow.ID);
+ mMenu.update();
}
@Override
@@ -56,17 +53,10 @@ public class MenuUpdater {
mMenu.update(ChannelsRow.ID);
}
};
- private final OptionChangedListener mOptionChangeListener = new OptionChangedListener() {
- @Override
- public void onOptionChanged(@OptionType int optionType, String newString) {
- mMenu.update(TvOptionsRow.ID);
- }
- };
- public MenuUpdater(Menu menu, TunableTvView tvView, TvOptionsManager optionsManager) {
- mMenu = menu;
+ public MenuUpdater(Context context, TunableTvView tvView, Menu menu) {
mTvView = tvView;
- mOptionsManager = optionsManager;
+ mMenu = menu;
if (mTvView != null) {
mTvView.setOnScreenBlockedListener(new OnScreenBlockingChangedListener() {
@Override
@@ -75,18 +65,11 @@ public class MenuUpdater {
}
});
}
- if (mOptionsManager != null) {
- mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_CLOSED_CAPTIONS,
- mOptionChangeListener);
- mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_DISPLAY_MODE,
- mOptionChangeListener);
- mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_MULTI_AUDIO,
- mOptionChangeListener);
- }
}
/**
- * Sets the instance of {@link ChannelTuner}. Call this method when the channel tuner is ready.
+ * Sets the instance of {@link ChannelTuner}. Call this method when the channel tuner is ready
+ * or not available any more.
*/
public void setChannelTuner(ChannelTuner channelTuner) {
if (mChannelTuner != null) {
@@ -96,6 +79,7 @@ public class MenuUpdater {
if (mChannelTuner != null) {
mChannelTuner.addListener(mChannelTunerListener);
}
+ mMenu.update();
}
/**
@@ -108,10 +92,5 @@ public class MenuUpdater {
if (mTvView != null) {
mTvView.setOnScreenBlockedListener(null);
}
- if (mOptionsManager != null) {
- mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_CLOSED_CAPTIONS, null);
- mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_DISPLAY_MODE, null);
- mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_MULTI_AUDIO, null);
- }
}
}
diff --git a/src/com/android/tv/menu/OptionsRowAdapter.java b/src/com/android/tv/menu/OptionsRowAdapter.java
index dd6194a1..93bd0a4d 100644
--- a/src/com/android/tv/menu/OptionsRowAdapter.java
+++ b/src/com/android/tv/menu/OptionsRowAdapter.java
@@ -21,6 +21,8 @@ import android.view.View;
import com.android.tv.R;
import com.android.tv.TvApplication;
+import com.android.tv.TvOptionsManager;
+import com.android.tv.TvOptionsManager.OptionChangedListener;
import com.android.tv.analytics.Tracker;
import java.util.List;
@@ -64,9 +66,12 @@ public abstract class OptionsRowAdapter extends ItemListRowView.ItemListAdapter<
public void update() {
if (mActionList == null) {
mActionList = createActions();
+ updateActions();
setItemList(mActionList);
} else {
- updateActions();
+ if (updateActions()) {
+ setItemList(mActionList);
+ }
}
}
@@ -76,7 +81,7 @@ public abstract class OptionsRowAdapter extends ItemListRowView.ItemListAdapter<
}
protected abstract List<MenuAction> createActions();
- protected abstract void updateActions();
+ protected abstract boolean updateActions();
protected abstract void executeAction(int type);
/**
@@ -88,6 +93,37 @@ public abstract class OptionsRowAdapter extends ItemListRowView.ItemListAdapter<
return mActionList.get(position);
}
+ /**
+ * Sets the action at the given position.
+ * Note that action at the position may differ from returned by {@link #createActions}.
+ * See {@link CustomizableOptionsRowAdapter}
+ */
+ protected void setAction(int position, MenuAction action) {
+ mActionList.set(position, action);
+ }
+
+ /**
+ * Adds an action to the given position.
+ * Note that action at the position may differ from returned by {@link #createActions}.
+ * See {@link CustomizableOptionsRowAdapter}
+ */
+ protected void addAction(int position, MenuAction action) {
+ mActionList.add(position, action);
+ }
+
+ /**
+ * Removes an action at the given position.
+ * Note that action at the position may differ from returned by {@link #createActions}.
+ * See {@link CustomizableOptionsRowAdapter}
+ */
+ protected void removeAction(int position) {
+ mActionList.remove(position);
+ }
+
+ protected int getActionSize() {
+ return mActionList.size();
+ }
+
@Override
public void onBindViewHolder(MyViewHolder viewHolder, int position) {
super.onBindViewHolder(viewHolder, position);
@@ -103,4 +139,14 @@ public abstract class OptionsRowAdapter extends ItemListRowView.ItemListAdapter<
// be preserved.
return mActionList.get(position).getType();
}
+
+ protected void setOptionChangedListener(final MenuAction action) {
+ TvOptionsManager om = getMainActivity().getTvOptionsManager();
+ om.setOptionChangedListener(action.getType(), new OptionChangedListener() {
+ @Override
+ public void onOptionChanged(String newOption) {
+ setItemList(mActionList);
+ }
+ });
+ }
}
diff --git a/src/com/android/tv/menu/PartnerOptionsRowAdapter.java b/src/com/android/tv/menu/PartnerOptionsRowAdapter.java
index c8249a4c..f3e09f80 100644
--- a/src/com/android/tv/menu/PartnerOptionsRowAdapter.java
+++ b/src/com/android/tv/menu/PartnerOptionsRowAdapter.java
@@ -38,7 +38,8 @@ public class PartnerOptionsRowAdapter extends CustomizableOptionsRowAdapter {
}
@Override
- protected void updateActions() {
+ protected boolean updateActions() {
// TODO: Support adding description for custom actions.
+ return false;
}
}
diff --git a/src/com/android/tv/menu/PipOptionsRowAdapter.java b/src/com/android/tv/menu/PipOptionsRowAdapter.java
new file mode 100644
index 00000000..87203e9d
--- /dev/null
+++ b/src/com/android/tv/menu/PipOptionsRowAdapter.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tv.menu;
+
+import android.content.Context;
+import android.text.TextUtils;
+
+import com.android.tv.MainActivity;
+import com.android.tv.R;
+import com.android.tv.TvOptionsManager;
+import com.android.tv.ui.TvViewUiManager;
+import com.android.tv.ui.sidepanel.PipInputSelectorFragment;
+import com.android.tv.util.PipInputManager.PipInput;
+import com.android.tv.util.TvSettings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/*
+ * An adapter of PIP options.
+ */
+public class PipOptionsRowAdapter extends OptionsRowAdapter {
+ private static final int[] DRAWABLE_ID_FOR_LAYOUT = {
+ R.drawable.ic_pip_option_layout1,
+ R.drawable.ic_pip_option_layout2,
+ R.drawable.ic_pip_option_layout3,
+ R.drawable.ic_pip_option_layout4,
+ R.drawable.ic_pip_option_layout5 };
+
+ private final TvOptionsManager mTvOptionsManager;
+ private final TvViewUiManager mTvViewUiManager;
+
+ public PipOptionsRowAdapter(Context context) {
+ super(context);
+ mTvOptionsManager = getMainActivity().getTvOptionsManager();
+ mTvViewUiManager = getMainActivity().getTvViewUiManager();
+ }
+
+ @Override
+ protected List<MenuAction> createActions() {
+ List<MenuAction> actionList = new ArrayList<>();
+ actionList.add(MenuAction.PIP_SELECT_INPUT_ACTION);
+ actionList.add(MenuAction.PIP_SWAP_ACTION);
+ actionList.add(MenuAction.PIP_SOUND_ACTION);
+ actionList.add(MenuAction.PIP_LAYOUT_ACTION);
+ actionList.add(MenuAction.PIP_SIZE_ACTION);
+ for (MenuAction action : actionList) {
+ setOptionChangedListener(action);
+ }
+ return actionList;
+ }
+
+ @Override
+ public boolean updateActions() {
+ boolean changed = false;
+ if (updateSelectInputAction()) {
+ changed = true;
+ }
+ if (updateLayoutAction()) {
+ changed = true;
+ }
+ if (updateSizeAction()) {
+ changed = true;
+ }
+ return changed;
+ }
+
+ private boolean updateSelectInputAction() {
+ String oldInputLabel = mTvOptionsManager.getOptionString(TvOptionsManager.OPTION_PIP_INPUT);
+
+ MainActivity tvActivity = getMainActivity();
+ PipInput newInput = tvActivity.getPipInputManager().getPipInput(tvActivity.getPipChannel());
+ String newInputLabel = newInput == null ? null : newInput.getLabel();
+
+ if (!TextUtils.equals(oldInputLabel, newInputLabel)) {
+ mTvOptionsManager.onPipInputChanged(newInputLabel);
+ return true;
+ }
+ return false;
+ }
+
+ private boolean updateLayoutAction() {
+ return MenuAction.PIP_LAYOUT_ACTION.setDrawableResId(
+ DRAWABLE_ID_FOR_LAYOUT[mTvViewUiManager.getPipLayout()]);
+ }
+
+ private boolean updateSizeAction() {
+ boolean oldEnabled = MenuAction.PIP_SIZE_ACTION.isEnabled();
+ boolean newEnabled = mTvViewUiManager.getPipLayout() != TvSettings.PIP_LAYOUT_SIDE_BY_SIDE;
+ if (oldEnabled != newEnabled) {
+ MenuAction.PIP_SIZE_ACTION.setEnabled(newEnabled);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void executeAction(int type) {
+ switch (type) {
+ case TvOptionsManager.OPTION_PIP_INPUT:
+ getMainActivity().getOverlayManager().getSideFragmentManager().show(
+ new PipInputSelectorFragment());
+ break;
+ case TvOptionsManager.OPTION_PIP_SWAP:
+ getMainActivity().swapPip();
+ break;
+ case TvOptionsManager.OPTION_PIP_SOUND:
+ getMainActivity().togglePipSoundMode();
+ break;
+ case TvOptionsManager.OPTION_PIP_LAYOUT:
+ int oldLayout = mTvViewUiManager.getPipLayout();
+ int newLayout = (oldLayout + 1) % (TvSettings.PIP_LAYOUT_LAST + 1);
+ mTvViewUiManager.setPipLayout(newLayout, true);
+ MenuAction.PIP_LAYOUT_ACTION.setDrawableResId(DRAWABLE_ID_FOR_LAYOUT[newLayout]);
+ break;
+ case TvOptionsManager.OPTION_PIP_SIZE:
+ int oldSize = mTvViewUiManager.getPipSize();
+ int newSize = (oldSize + 1) % (TvSettings.PIP_SIZE_LAST + 1);
+ mTvViewUiManager.setPipSize(newSize, true);
+ break;
+ }
+ }
+}
diff --git a/src/com/android/tv/menu/PlayControlsButton.java b/src/com/android/tv/menu/PlayControlsButton.java
index 77715f28..aff39db3 100644
--- a/src/com/android/tv/menu/PlayControlsButton.java
+++ b/src/com/android/tv/menu/PlayControlsButton.java
@@ -39,9 +39,6 @@ public class PlayControlsButton extends FrameLayout {
private final int mIconColor;
private int mIconFocusedColor;
- private int mImageResourceId;
- private int mTintColor;
-
public PlayControlsButton(Context context) {
this(context, null);
}
@@ -70,21 +67,10 @@ public class PlayControlsButton extends FrameLayout {
* Sets the resource ID of the image to be displayed in the center of this control.
*/
public void setImageResId(int imageResId) {
- int newTintColor = hasFocus() ? mIconFocusedColor : mIconColor;
- if (mImageResourceId != imageResId) {
- mImageResourceId = imageResId;
- mIcon.setImageResource(imageResId);
- updateTint(newTintColor);
- } else if (newTintColor != mTintColor) {
- updateTint(newTintColor);
- }
- }
-
- private void updateTint(int tintColor) {
- mTintColor = tintColor;
- // Since on focus changing, icons' color should be switched with animation,
+ mIcon.setImageResource(imageResId);
+ // Since on foucus changing, icons' color should be switched with animation,
// as a result, selectors cannot be used to switch colors in this case.
- mIcon.getDrawable().setTint(tintColor);
+ mIcon.getDrawable().setTint(hasFocus() ? mIconFocusedColor : mIconColor);
}
/**
@@ -131,9 +117,7 @@ public class PlayControlsButton extends FrameLayout {
} else {
mIcon.setVisibility(View.GONE);
mLabel.setVisibility(View.VISIBLE);
- if (!TextUtils.equals(mLabel.getText(), label)) {
- mLabel.setText(label);
- }
+ mLabel.setText(label);
}
}
diff --git a/src/com/android/tv/menu/PlayControlsRowView.java b/src/com/android/tv/menu/PlayControlsRowView.java
index 4d766788..a620d4dd 100644
--- a/src/com/android/tv/menu/PlayControlsRowView.java
+++ b/src/com/android/tv/menu/PlayControlsRowView.java
@@ -18,10 +18,10 @@ package com.android.tv.menu;
import android.content.Context;
import android.content.res.Resources;
-import android.text.TextUtils;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
@@ -34,16 +34,17 @@ import com.android.tv.common.SoftPreconditions;
import com.android.tv.common.feature.CommonFeatures;
import com.android.tv.data.Channel;
import com.android.tv.data.Program;
-import com.android.tv.dialog.HalfSizedDialogFragment;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrDataManager.OnDvrScheduleLoadFinishedListener;
import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.DvrUiHelper;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.ui.DvrStopRecordingFragment;
-import com.android.tv.dvr.ui.DvrUiHelper;
+import com.android.tv.dvr.ui.HalfSizedDialogFragment;
import com.android.tv.menu.Menu.MenuShowReason;
import com.android.tv.ui.TunableTvView;
+import com.android.tv.util.Utils;
public class PlayControlsRowView extends MenuRowView {
private static final int NORMAL_WIDTH_MAX_BUTTON_COUNT = 5;
@@ -52,10 +53,14 @@ public class PlayControlsRowView extends MenuRowView {
private final int mTimeTextLeftMargin;
private final int mTimelineWidth;
// Views
- private TextView mBackgroundView;
+ private View mBackgroundView;
private View mTimeIndicator;
private TextView mTimeText;
- private PlaybackProgressBar mProgress;
+ private View mProgressEmptyBefore;
+ private View mProgressWatched;
+ private View mProgressBuffered;
+ private View mProgressEmptyAfter;
+ private View mControlBar;
private PlayControlsButton mJumpPreviousButton;
private PlayControlsButton mRewindButton;
private PlayControlsButton mPlayPauseButton;
@@ -64,6 +69,7 @@ public class PlayControlsRowView extends MenuRowView {
private PlayControlsButton mRecordButton;
private TextView mProgramStartTimeText;
private TextView mProgramEndTimeText;
+ private View mUnavailableMessageText;
private TunableTvView mTvView;
private TimeShiftManager mTimeShiftManager;
private final DvrDataManager mDvrDataManager;
@@ -77,8 +83,6 @@ public class PlayControlsRowView extends MenuRowView {
private final int mNormalButtonMargin;
private final int mCompactButtonMargin;
- private final String mUnavailableMessage;
-
private final ScheduledRecordingListener mScheduledRecordingListener
= new ScheduledRecordingListener() {
@Override
@@ -134,7 +138,6 @@ public class PlayControlsRowView extends MenuRowView {
mDvrManager = null;
}
mMainActivity = (MainActivity) context;
- mUnavailableMessage = res.getString(R.string.play_controls_unavailable);
}
@Override
@@ -168,10 +171,14 @@ public class PlayControlsRowView extends MenuRowView {
super.onFinishInflate();
// Clip the ViewGroup(body) to the rounded rectangle of outline.
findViewById(R.id.body).setClipToOutline(true);
- mBackgroundView = (TextView) findViewById(R.id.background);
+ mBackgroundView = findViewById(R.id.background);
mTimeIndicator = findViewById(R.id.time_indicator);
mTimeText = (TextView) findViewById(R.id.time_text);
- mProgress = (PlaybackProgressBar) findViewById(R.id.progress);
+ mProgressEmptyBefore = findViewById(R.id.timeline_bg_start);
+ mProgressWatched = findViewById(R.id.watched);
+ mProgressBuffered = findViewById(R.id.buffered);
+ mProgressEmptyAfter = findViewById(R.id.timeline_bg_end);
+ mControlBar = findViewById(R.id.play_control_bar);
mJumpPreviousButton = (PlayControlsButton) findViewById(R.id.jump_previous);
mRewindButton = (PlayControlsButton) findViewById(R.id.rewind);
mPlayPauseButton = (PlayControlsButton) findViewById(R.id.play_pause);
@@ -180,6 +187,7 @@ public class PlayControlsRowView extends MenuRowView {
mRecordButton = (PlayControlsButton) findViewById(R.id.record);
mProgramStartTimeText = (TextView) findViewById(R.id.program_start_time);
mProgramEndTimeText = (TextView) findViewById(R.id.program_end_time);
+ mUnavailableMessageText = findViewById(R.id.unavailable_text);
initializeButton(mJumpPreviousButton, R.drawable.lb_ic_skip_previous,
R.string.play_controls_description_skip_previous, null, new Runnable() {
@@ -187,7 +195,7 @@ public class PlayControlsRowView extends MenuRowView {
public void run() {
if (mTimeShiftManager.isAvailable()) {
mTimeShiftManager.jumpToPrevious();
- updateControls(true);
+ updateControls();
}
}
});
@@ -227,7 +235,7 @@ public class PlayControlsRowView extends MenuRowView {
public void run() {
if (mTimeShiftManager.isAvailable()) {
mTimeShiftManager.jumpToNext();
- updateControls(true);
+ updateControls();
}
}
});
@@ -257,17 +265,18 @@ public class PlayControlsRowView extends MenuRowView {
if (!(mDvrManager != null && mDvrManager.isChannelRecordable(currentChannel))) {
Toast.makeText(mMainActivity, R.string.dvr_msg_cannot_record_channel,
Toast.LENGTH_SHORT).show();
- } else {
+ } else if (DvrUiHelper.checkStorageStatusAndShowErrorMessage(mMainActivity,
+ currentChannel.getInputId())) {
Program program = TvApplication.getSingletons(mMainActivity).getProgramDataManager()
.getCurrentProgram(currentChannel.getId());
- DvrUiHelper.checkStorageStatusAndShowErrorMessage(mMainActivity,
- currentChannel.getInputId(), new Runnable() {
- @Override
- public void run() {
- DvrUiHelper.requestRecordingCurrentProgram(mMainActivity,
- currentChannel, program, true);
- }
- });
+ if (program == null) {
+ DvrUiHelper.showChannelRecordDurationOptions(mMainActivity, currentChannel);
+ } else if (DvrUiHelper.handleCreateSchedule(mMainActivity, program)) {
+ String msg = mMainActivity.getString(R.string.dvr_msg_current_program_scheduled,
+ program.getTitle(),
+ Utils.toTimeString(program.getEndTimeUtcMillis(), false));
+ Toast.makeText(mMainActivity, msg, Toast.LENGTH_SHORT).show();
+ }
}
} else if (currentChannel != null) {
DvrUiHelper.showStopRecordingDialog(mMainActivity, currentChannel.getId(),
@@ -309,37 +318,39 @@ public class PlayControlsRowView extends MenuRowView {
@Override
public void onAvailabilityChanged() {
updateMenuVisibility();
- PlayControlsRowView.this.updateAll(false);
+ if (isShown()) {
+ PlayControlsRowView.this.updateAll();
+ }
}
@Override
public void onPlayStatusChanged(int status) {
updateMenuVisibility();
- if (mTimeShiftManager.isAvailable()) {
- updateControls(false);
+ if (mTimeShiftManager.isAvailable() && isShown()) {
+ updateControls();
}
}
@Override
public void onRecordTimeRangeChanged() {
- if (mTimeShiftManager.isAvailable()) {
- updateControls(false);
+ if (mTimeShiftManager.isAvailable() && isShown()) {
+ updateControls();
}
}
@Override
public void onCurrentPositionChanged() {
- if (mTimeShiftManager.isAvailable()) {
+ if (mTimeShiftManager.isAvailable() && isShown()) {
initializeTimeline();
- updateControls(false);
+ updateControls();
}
}
@Override
public void onProgramInfoChanged() {
- if (mTimeShiftManager.isAvailable()) {
+ if (mTimeShiftManager.isAvailable() && isShown()) {
initializeTimeline();
- updateControls(false);
+ updateControls();
}
}
@@ -361,8 +372,7 @@ public class PlayControlsRowView extends MenuRowView {
}
}
});
- // force update to initialize everything
- updateAll(true);
+ updateAll();
}
private void initializeTimeline() {
@@ -370,8 +380,6 @@ public class PlayControlsRowView extends MenuRowView {
mTimeShiftManager.getCurrentPositionMs());
mProgramStartTimeMs = program.getStartTimeUtcMillis();
mProgramEndTimeMs = program.getEndTimeUtcMillis();
- mProgress.setMax(mProgramEndTimeMs - mProgramStartTimeMs);
- updateRecTimeText();
SoftPreconditions.checkArgument(mProgramStartTimeMs <= mProgramEndTimeMs);
}
@@ -381,13 +389,10 @@ public class PlayControlsRowView extends MenuRowView {
getMenu().setKeepVisible(keepMenuVisible);
}
- public void onPreselected() {
- updateControls(true);
- }
-
@Override
public void onSelected(boolean showTitle) {
super.onSelected(showTitle);
+ updateControls();
postHideRippleAnimation();
}
@@ -469,32 +474,28 @@ public class PlayControlsRowView extends MenuRowView {
* Updates the view contents. It is called from the PlayControlsRow.
*/
public void update() {
- updateAll(false);
+ updateAll();
}
- private void updateAll(boolean forceUpdate) {
+ private void updateAll() {
if (mTimeShiftManager.isAvailable() && !mTvView.isScreenBlocked()) {
setEnabled(true);
initializeTimeline();
mBackgroundView.setEnabled(true);
- setTextIfNeeded(mBackgroundView, null);
} else {
setEnabled(false);
mBackgroundView.setEnabled(false);
- setTextIfNeeded(mBackgroundView, mUnavailableMessage);
}
- // force the controls be updated no matter it's visible or not.
- updateControls(forceUpdate);
+ updateControls();
}
- private void updateControls(boolean forceUpdate) {
- if (forceUpdate || getContentsView().isShown()) {
- updateTime();
- updateProgress();
- updateButtons();
- updateRecordButton();
- updateButtonMargin();
- }
+ private void updateControls() {
+ updateTime();
+ updateProgress();
+ updateRecTimeText();
+ updateButtons();
+ updateRecordButton();
+ updateButtonMargin();
}
private void updateTime() {
@@ -503,39 +504,70 @@ public class PlayControlsRowView extends MenuRowView {
mTimeIndicator.setVisibility(View.VISIBLE);
} else {
mTimeText.setVisibility(View.INVISIBLE);
- mTimeIndicator.setVisibility(View.GONE);
+ mTimeIndicator.setVisibility(View.INVISIBLE);
return;
}
long currentPositionMs = mTimeShiftManager.getCurrentPositionMs();
+ ViewGroup.MarginLayoutParams params =
+ (ViewGroup.MarginLayoutParams) mTimeText.getLayoutParams();
int currentTimePositionPixel =
convertDurationToPixel(currentPositionMs - mProgramStartTimeMs);
- mTimeText.setTranslationX(currentTimePositionPixel + mTimeTextLeftMargin);
- setTextIfNeeded(mTimeText, getTimeString(currentPositionMs));
- mTimeIndicator.setTranslationX(currentTimePositionPixel + mTimeIndicatorLeftMargin);
+ params.leftMargin = currentTimePositionPixel + mTimeTextLeftMargin;
+ mTimeText.setLayoutParams(params);
+ mTimeText.setText(getTimeString(currentPositionMs));
+ params = (ViewGroup.MarginLayoutParams) mTimeIndicator.getLayoutParams();
+ params.leftMargin = currentTimePositionPixel + mTimeIndicatorLeftMargin;
+ mTimeIndicator.setLayoutParams(params);
}
private void updateProgress() {
if (isEnabled()) {
- long progressStartTimeMs = Math.min(mProgramEndTimeMs,
+ mProgressWatched.setVisibility(View.VISIBLE);
+ mProgressBuffered.setVisibility(View.VISIBLE);
+ mProgressEmptyAfter.setVisibility(View.VISIBLE);
+ } else {
+ mProgressWatched.setVisibility(View.INVISIBLE);
+ mProgressBuffered.setVisibility(View.INVISIBLE);
+ mProgressEmptyAfter.setVisibility(View.INVISIBLE);
+ if (mProgramStartTimeMs < mProgramEndTimeMs) {
+ layoutProgress(mProgressEmptyBefore, mProgramStartTimeMs, mProgramEndTimeMs);
+ } else {
+ // Not initialized yet.
+ layoutProgress(mProgressEmptyBefore, mTimelineWidth);
+ }
+ return;
+ }
+
+ long progressStartTimeMs = Math.min(mProgramEndTimeMs,
Math.max(mProgramStartTimeMs, mTimeShiftManager.getRecordStartTimeMs()));
- long currentPlayingTimeMs = Math.min(mProgramEndTimeMs,
+ long currentPlayingTimeMs = Math.min(mProgramEndTimeMs,
Math.max(mProgramStartTimeMs, mTimeShiftManager.getCurrentPositionMs()));
- long progressEndTimeMs = Math.min(mProgramEndTimeMs,
+ long progressEndTimeMs = Math.min(mProgramEndTimeMs,
Math.max(mProgramStartTimeMs, mTimeShiftManager.getRecordEndTimeMs()));
- mProgress.setProgressRange(progressStartTimeMs - mProgramStartTimeMs,
- progressEndTimeMs - mProgramStartTimeMs);
- mProgress.setProgress(currentPlayingTimeMs - mProgramStartTimeMs);
- } else {
- mProgress.setProgressRange(0, 0);
- }
+
+ layoutProgress(mProgressEmptyBefore, mProgramStartTimeMs, progressStartTimeMs);
+ layoutProgress(mProgressWatched, progressStartTimeMs, currentPlayingTimeMs);
+ layoutProgress(mProgressBuffered, currentPlayingTimeMs, progressEndTimeMs);
+ }
+
+ private void layoutProgress(View progress, long progressStartTimeMs, long progressEndTimeMs) {
+ layoutProgress(progress, Math.max(0,
+ convertDurationToPixel(progressEndTimeMs - progressStartTimeMs)) + 1);
+ }
+
+ private void layoutProgress(View progress, int width) {
+ ViewGroup.MarginLayoutParams params =
+ (ViewGroup.MarginLayoutParams) progress.getLayoutParams();
+ params.width = width;
+ progress.setLayoutParams(params);
}
private void updateRecTimeText() {
if (isEnabled()) {
mProgramStartTimeText.setVisibility(View.VISIBLE);
- setTextIfNeeded(mProgramStartTimeText, getTimeString(mProgramStartTimeMs));
+ mProgramStartTimeText.setText(getTimeString(mProgramStartTimeMs));
mProgramEndTimeText.setVisibility(View.VISIBLE);
- setTextIfNeeded(mProgramEndTimeText, getTimeString(mProgramEndTimeMs));
+ mProgramEndTimeText.setText(getTimeString(mProgramEndTimeMs));
} else {
mProgramStartTimeText.setVisibility(View.GONE);
mProgramEndTimeText.setVisibility(View.GONE);
@@ -544,17 +576,11 @@ public class PlayControlsRowView extends MenuRowView {
private void updateButtons() {
if (isEnabled()) {
- mPlayPauseButton.setVisibility(View.VISIBLE);
- mJumpPreviousButton.setVisibility(View.VISIBLE);
- mJumpNextButton.setVisibility(View.VISIBLE);
- mRewindButton.setVisibility(View.VISIBLE);
- mFastForwardButton.setVisibility(View.VISIBLE);
+ mControlBar.setVisibility(View.VISIBLE);
+ mUnavailableMessageText.setVisibility(View.GONE);
} else {
- mPlayPauseButton.setVisibility(View.GONE);
- mJumpPreviousButton.setVisibility(View.GONE);
- mJumpNextButton.setVisibility(View.GONE);
- mRewindButton.setVisibility(View.GONE);
- mFastForwardButton.setVisibility(View.GONE);
+ mControlBar.setVisibility(View.INVISIBLE);
+ mUnavailableMessageText.setVisibility(View.VISIBLE);
return;
}
@@ -596,12 +622,6 @@ public class PlayControlsRowView extends MenuRowView {
}
private void updateRecordButton() {
- if (isEnabled()) {
- mRecordButton.setVisibility(VISIBLE);
- } else {
- mRecordButton.setVisibility(GONE);
- return;
- }
if (!(mDvrManager != null
&& mDvrManager.isChannelRecordable(mMainActivity.getCurrentChannel()))) {
mRecordButton.setVisibility(View.GONE);
@@ -662,10 +682,4 @@ public class PlayControlsRowView extends MenuRowView {
mDvrDataManager.removeScheduledRecordingListener(mScheduledRecordingListener);
}
}
-
- private void setTextIfNeeded(TextView textView, String text) {
- if (!TextUtils.equals(textView.getText(), text)) {
- textView.setText(text);
- }
- }
}
diff --git a/src/com/android/tv/menu/PlaybackProgressBar.java b/src/com/android/tv/menu/PlaybackProgressBar.java
deleted file mode 100644
index e8061bc6..00000000
--- a/src/com/android/tv/menu/PlaybackProgressBar.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.menu;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.util.AttributeSet;
-import android.view.View;
-
-import com.android.tv.R;
-
-/**
- * A progress bar control which has two progresses which start in the middle of the control.
- */
-public class PlaybackProgressBar extends View {
- private final LayerDrawable mProgressDrawable;
- private final Drawable mPrimaryDrawable;
- private final Drawable mSecondaryDrawable;
- private long mMax = 100;
- private long mProgressStart = 0;
- private long mProgressEnd = 0;
- private long mProgress = 0;
-
- public PlaybackProgressBar(Context context) {
- this(context, null);
- }
-
- public PlaybackProgressBar(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public PlaybackProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
- }
-
- public PlaybackProgressBar(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(
- attrs, R.styleable.PlaybackProgressBar, defStyleAttr, defStyleRes);
- mProgressDrawable =
- (LayerDrawable) a.getDrawable(R.styleable.PlaybackProgressBar_progressDrawable);
- mPrimaryDrawable = mProgressDrawable.findDrawableByLayerId(android.R.id.progress);
- mSecondaryDrawable =
- mProgressDrawable.findDrawableByLayerId(android.R.id.secondaryProgress);
- a.recycle();
- refreshProgress();
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- final int saveCount = canvas.save();
- canvas.translate(getPaddingLeft(), getPaddingTop());
- mProgressDrawable.draw(canvas);
- canvas.restoreToCount(saveCount);
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
- refreshProgress();
- }
-
- public void setMax(long max) {
- if (max < 0) {
- max = 0;
- }
- if (max != mMax) {
- mMax = max;
- if (mProgressStart > max) {
- mProgressStart = max;
- }
- if (mProgressEnd > max) {
- mProgressEnd = max;
- }
- if (mProgress > max) {
- mProgress = max;
- }
- refreshProgress();
- }
- }
-
- /**
- * Sets the start and end position of the progress.
- */
- public void setProgressRange(long start, long end) {
- start = constrain(start, 0, mMax);
- end = constrain(end, start, mMax);
- mProgress = constrain(mProgress, start, end);
- if (start != mProgressStart || end != mProgressEnd) {
- mProgressStart = start;
- mProgressEnd = end;
- setProgressLevels();
- }
- }
-
- /**
- * Sets the progress position.
- */
- public void setProgress(long progress) {
- progress = constrain(progress, mProgressStart, mProgressEnd);
- if (progress != mProgress) {
- mProgress = progress;
- setProgressLevels();
- }
- }
-
- private long constrain(long value, long min, long max) {
- return Math.min(Math.max(value, min), max);
- }
-
- private void refreshProgress() {
- int width = getWidth() - getPaddingStart() - getPaddingEnd();
- int height = getHeight() - getPaddingTop() - getPaddingBottom();
- mProgressDrawable.setBounds(0, 0, width, height);
- setProgressLevels();
- }
-
- private void setProgressLevels() {
- boolean progressUpdated = setProgressBound(mPrimaryDrawable, mProgressStart, mProgress);
- progressUpdated |= setProgressBound(mSecondaryDrawable, mProgress, mProgressEnd);
- if (progressUpdated) {
- postInvalidate();
- }
- }
-
- private boolean setProgressBound(Drawable drawable, long start, long end) {
- Rect oldBounds = drawable.getBounds();
- if (mMax == 0) {
- if (!isEqualRect(oldBounds, 0, 0, 0, 0)) {
- drawable.setBounds(0, 0, 0, 0);
- return true;
- }
- return false;
- }
- int width = mProgressDrawable.getBounds().width();
- int height = mProgressDrawable.getBounds().height();
- int left = (int) (width * start / mMax);
- int right = (int) (width * end / mMax);
- if (!isEqualRect(oldBounds, left, 0, right, height)) {
- drawable.setBounds(left, 0, right, height);
- return true;
- }
- return false;
- }
-
- private boolean isEqualRect(Rect rect, int left, int top, int right, int bottom) {
- return rect.left == left && rect.top == top && rect.right == right && rect.bottom == bottom;
- }
-}
diff --git a/src/com/android/tv/menu/TvOptionsRowAdapter.java b/src/com/android/tv/menu/TvOptionsRowAdapter.java
index 220fcd3a..fb062246 100644
--- a/src/com/android/tv/menu/TvOptionsRowAdapter.java
+++ b/src/com/android/tv/menu/TvOptionsRowAdapter.java
@@ -21,6 +21,7 @@ import android.media.tv.TvTrackInfo;
import android.support.annotation.VisibleForTesting;
import com.android.tv.Features;
+import com.android.tv.R;
import com.android.tv.TvOptionsManager;
import com.android.tv.customization.CustomAction;
import com.android.tv.data.DisplayMode;
@@ -29,6 +30,7 @@ import com.android.tv.ui.sidepanel.ClosedCaptionFragment;
import com.android.tv.ui.sidepanel.DeveloperOptionFragment;
import com.android.tv.ui.sidepanel.DisplayModeFragment;
import com.android.tv.ui.sidepanel.MultiAudioFragment;
+import com.android.tv.util.PipInputManager;
import java.util.ArrayList;
import java.util.List;
@@ -37,6 +39,12 @@ import java.util.List;
* An adapter of options.
*/
public class TvOptionsRowAdapter extends CustomizableOptionsRowAdapter {
+ private static final boolean ENABLE_IN_APP_PIP = false;
+
+ private int mPositionPipAction;
+ // If mInAppPipAction is false, system-wide PIP is used.
+ private boolean mInAppPipAction = true;
+
public TvOptionsRowAdapter(Context context, List<CustomAction> customActions) {
super(context, customActions);
}
@@ -45,62 +53,123 @@ public class TvOptionsRowAdapter extends CustomizableOptionsRowAdapter {
protected List<MenuAction> createBaseActions() {
List<MenuAction> actionList = new ArrayList<>();
actionList.add(MenuAction.SELECT_CLOSED_CAPTION_ACTION);
+ setOptionChangedListener(MenuAction.SELECT_CLOSED_CAPTION_ACTION);
actionList.add(MenuAction.SELECT_DISPLAY_MODE_ACTION);
- if (Features.PICTURE_IN_PICTURE.isEnabled(getMainActivity())) {
- actionList.add(MenuAction.SYSTEMWIDE_PIP_ACTION);
- }
+ setOptionChangedListener(MenuAction.SELECT_DISPLAY_MODE_ACTION);
+ actionList.add(MenuAction.PIP_IN_APP_ACTION);
+ setOptionChangedListener(MenuAction.PIP_IN_APP_ACTION);
+ mPositionPipAction = actionList.size() - 1;
actionList.add(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION);
+ setOptionChangedListener(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION);
actionList.add(MenuAction.MORE_CHANNELS_ACTION);
if (DeveloperOptionFragment.shouldShow()) {
actionList.add(MenuAction.DEV_ACTION);
}
actionList.add(MenuAction.SETTINGS_ACTION);
- updateClosedCaptionAction();
- updateMultiAudioAction();
- updateDisplayModeAction();
+ if (getCustomActions() != null) {
+ // Adjust Pip action position which will be changed by applying custom actions.
+ for (CustomAction customAction : getCustomActions()) {
+ if (customAction.isFront()) {
+ mPositionPipAction++;
+ }
+ }
+ }
+
return actionList;
}
@Override
- protected void updateActions() {
- if (updateClosedCaptionAction()) {
- notifyItemChanged(getItemPosition(MenuAction.SELECT_CLOSED_CAPTION_ACTION));
+ protected boolean updateActions() {
+ boolean changed = false;
+ if (updatePipAction()) {
+ changed = true;
}
if (updateMultiAudioAction()) {
- notifyItemChanged(getItemPosition(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION));
+ changed = true;
}
if (updateDisplayModeAction()) {
- notifyItemChanged(getItemPosition(MenuAction.SELECT_DISPLAY_MODE_ACTION));
+ changed = true;
}
+ return changed;
}
- @VisibleForTesting
- private boolean updateClosedCaptionAction() {
- return updateActionDescription(MenuAction.SELECT_CLOSED_CAPTION_ACTION);
+ private boolean updatePipAction() {
+ // There are four states.
+ // Case 1. The device doesn't even have any input for PIP. (e.g. OTT box without HDMI input)
+ // => Remove the icon.
+ // Case 2. The device has one or more inputs for PIP but none of them are currently
+ // available.
+ // => Show the icon but disable it.
+ // Case 3. The device has one or more available PIP inputs and now it's tuned off.
+ // => Show the icon with "Off".
+ // Case 4. The device has one or more available PIP inputs but it's already turned on.
+ // => Show the icon with "On".
+
+ boolean changed = false;
+
+ // Case 1
+ PipInputManager pipInputManager = getMainActivity().getPipInputManager();
+ if (ENABLE_IN_APP_PIP && pipInputManager.getPipInputSize(false) > 1) {
+ if (!mInAppPipAction) {
+ removeAction(mPositionPipAction);
+ addAction(mPositionPipAction, MenuAction.PIP_IN_APP_ACTION);
+ mInAppPipAction = true;
+ changed = true;
+ }
+ } else {
+ if (mInAppPipAction) {
+ removeAction(mPositionPipAction);
+ mInAppPipAction = false;
+ if (Features.PICTURE_IN_PICTURE.isEnabled(getMainActivity())) {
+ addAction(mPositionPipAction, MenuAction.SYSTEMWIDE_PIP_ACTION);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ // Case 2
+ boolean isPipEnabled = getMainActivity().isPipEnabled();
+ boolean oldEnabled = MenuAction.PIP_IN_APP_ACTION.isEnabled();
+ boolean newEnabled = pipInputManager.getPipInputSize(true) > 0;
+ if (oldEnabled != newEnabled) {
+ // Should not disable the item if the PIP is already turned on so that the user can
+ // force exit it.
+ if (newEnabled || !isPipEnabled) {
+ MenuAction.PIP_IN_APP_ACTION.setEnabled(newEnabled);
+ changed = true;
+ }
+ }
+
+ // Case 3 & 4 - we just need to update the icon.
+ MenuAction.PIP_IN_APP_ACTION.setDrawableResId(
+ isPipEnabled ? R.drawable.ic_tvoption_pip : R.drawable.ic_tvoption_pip_off);
+ return changed;
}
@VisibleForTesting
boolean updateMultiAudioAction() {
List<TvTrackInfo> audioTracks = getMainActivity().getTracks(TvTrackInfo.TYPE_AUDIO);
- boolean enabled = audioTracks != null && audioTracks.size() > 1;
- // Use "|" operator for non-short-circuit evaluation.
- return MenuAction.setEnabled(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION, enabled)
- | updateActionDescription(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION);
+ boolean oldEnabled = MenuAction.SELECT_AUDIO_LANGUAGE_ACTION.isEnabled();
+ boolean newEnabled = audioTracks != null && audioTracks.size() > 1;
+ if (oldEnabled != newEnabled) {
+ MenuAction.SELECT_AUDIO_LANGUAGE_ACTION.setEnabled(newEnabled);
+ return true;
+ }
+ return false;
}
private boolean updateDisplayModeAction() {
TvViewUiManager uiManager = getMainActivity().getTvViewUiManager();
- boolean enabled = uiManager.isDisplayModeAvailable(DisplayMode.MODE_FULL)
+ boolean oldEnabled = MenuAction.SELECT_DISPLAY_MODE_ACTION.isEnabled();
+ boolean newEnabled = uiManager.isDisplayModeAvailable(DisplayMode.MODE_FULL)
|| uiManager.isDisplayModeAvailable(DisplayMode.MODE_ZOOM);
- // Use "|" operator for non-short-circuit evaluation.
- return MenuAction.setEnabled(MenuAction.SELECT_DISPLAY_MODE_ACTION, enabled)
- | updateActionDescription(MenuAction.SELECT_DISPLAY_MODE_ACTION);
- }
-
- private boolean updateActionDescription(MenuAction action) {
- return MenuAction.setActionDescription(action,
- getMainActivity().getTvOptionsManager().getOptionString(action.getType()));
+ if (oldEnabled != newEnabled) {
+ MenuAction.SELECT_DISPLAY_MODE_ACTION.setEnabled(newEnabled);
+ return true;
+ }
+ return false;
}
@Override
@@ -114,6 +183,9 @@ public class TvOptionsRowAdapter extends CustomizableOptionsRowAdapter {
getMainActivity().getOverlayManager().getSideFragmentManager()
.show(new DisplayModeFragment());
break;
+ case TvOptionsManager.OPTION_IN_APP_PIP:
+ getMainActivity().togglePipView();
+ break;
case TvOptionsManager.OPTION_SYSTEMWIDE_PIP:
getMainActivity().enterPictureInPictureMode();
break;
@@ -133,4 +205,4 @@ public class TvOptionsRowAdapter extends CustomizableOptionsRowAdapter {
break;
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/onboarding/SetupSourcesFragment.java b/src/com/android/tv/onboarding/SetupSourcesFragment.java
index f56daec5..7607822c 100644
--- a/src/com/android/tv/onboarding/SetupSourcesFragment.java
+++ b/src/com/android/tv/onboarding/SetupSourcesFragment.java
@@ -38,7 +38,6 @@ import com.android.tv.common.ui.setup.SetupGuidedStepFragment;
import com.android.tv.common.ui.setup.SetupMultiPaneFragment;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.TvInputNewComparator;
-import com.android.tv.tuner.TunerInputController;
import com.android.tv.ui.GuidedActionsStylistWithDivider;
import com.android.tv.util.SetupUtils;
import com.android.tv.util.TvInputManagerHelper;
@@ -205,7 +204,6 @@ public class SetupSourcesFragment extends SetupMultiPaneFragment {
mChannelDataManager.addListener(mChannelDataManagerListener);
super.onCreate(savedInstanceState);
mParentFragment = (SetupSourcesFragment) getParentFragment();
- TunerInputController.executeNetworkTunerDiscoveryAsyncTask(getContext());
}
@Override
diff --git a/src/com/android/tv/receiver/BootCompletedReceiver.java b/src/com/android/tv/receiver/BootCompletedReceiver.java
index 03d7873f..8d6c5a14 100644
--- a/src/com/android/tv/receiver/BootCompletedReceiver.java
+++ b/src/com/android/tv/receiver/BootCompletedReceiver.java
@@ -27,7 +27,7 @@ import com.android.tv.Features;
import com.android.tv.TvActivity;
import com.android.tv.TvApplication;
import com.android.tv.common.feature.CommonFeatures;
-import com.android.tv.dvr.recorder.DvrRecordingService;
+import com.android.tv.dvr.DvrRecordingService;
import com.android.tv.recommendation.NotificationService;
import com.android.tv.util.OnboardingUtils;
import com.android.tv.util.SetupUtils;
diff --git a/src/com/android/tv/receiver/GlobalKeyReceiver.java b/src/com/android/tv/receiver/GlobalKeyReceiver.java
index 2d9ee10e..8cd4fdf1 100644
--- a/src/com/android/tv/receiver/GlobalKeyReceiver.java
+++ b/src/com/android/tv/receiver/GlobalKeyReceiver.java
@@ -20,8 +20,6 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.tv.TvContract;
-import android.os.AsyncTask;
-import android.provider.Settings;
import android.util.Log;
import android.view.KeyEvent;
@@ -33,57 +31,27 @@ import com.android.tv.TvApplication;
public class GlobalKeyReceiver extends BroadcastReceiver {
private static final boolean DEBUG = false;
private static final String TAG = "GlobalKeyReceiver";
-
private static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
- // Settings.Secure.USER_SETUP_COMPLETE is hidden.
- private static final String SETTINGS_USER_SETUP_COMPLETE = "user_setup_complete";
-
- private static boolean sUserSetupComplete;
@Override
public void onReceive(Context context, Intent intent) {
TvApplication.setCurrentRunningProcess(context, true);
- Context appContext = context.getApplicationContext();
- if (DEBUG) Log.d(TAG, "onReceive: " + intent);
- if (sUserSetupComplete) {
- handleIntent(appContext, intent);
- } else {
- new AsyncTask<Void, Void, Boolean>() {
- @Override
- protected Boolean doInBackground(Void... params) {
- return Settings.Secure.getInt(appContext.getContentResolver(),
- SETTINGS_USER_SETUP_COMPLETE, 0) != 0;
- }
-
- @Override
- protected void onPostExecute(Boolean setupComplete) {
- if (DEBUG) Log.d(TAG, "Is setup complete: " + setupComplete);
- sUserSetupComplete = setupComplete;
- if (sUserSetupComplete) {
- handleIntent(appContext, intent);
- }
- }
- }.execute();
- }
- }
-
- private void handleIntent(Context appContext, Intent intent) {
if (ACTION_GLOBAL_BUTTON.equals(intent.getAction())) {
KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
- if (DEBUG) Log.d(TAG, "handleIntent: " + event);
+ if (DEBUG) Log.d(TAG, "onReceive: " + event);
int keyCode = event.getKeyCode();
int action = event.getAction();
if (action == KeyEvent.ACTION_UP) {
switch (keyCode) {
case KeyEvent.KEYCODE_GUIDE:
- appContext.startActivity(
+ context.startActivity(
new Intent(Intent.ACTION_VIEW, TvContract.Programs.CONTENT_URI));
break;
case KeyEvent.KEYCODE_TV:
- ((TvApplication) appContext).handleTvKey();
+ ((TvApplication) context.getApplicationContext()).handleTvKey();
break;
case KeyEvent.KEYCODE_TV_INPUT:
- ((TvApplication) appContext).handleTvInputKey();
+ ((TvApplication) context.getApplicationContext()).handleTvInputKey();
break;
default:
// Do nothing
diff --git a/src/com/android/tv/receiver/PackageIntentsReceiver.java b/src/com/android/tv/receiver/PackageIntentsReceiver.java
index 2d3f8705..26d000e7 100644
--- a/src/com/android/tv/receiver/PackageIntentsReceiver.java
+++ b/src/com/android/tv/receiver/PackageIntentsReceiver.java
@@ -19,10 +19,8 @@ package com.android.tv.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.net.Uri;
import com.android.tv.TvApplication;
-import com.android.tv.util.Partner;
/**
* A class for handling the broadcast intents from PackageManager.
@@ -33,9 +31,5 @@ public class PackageIntentsReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
TvApplication.setCurrentRunningProcess(context, true);
((TvApplication) context.getApplicationContext()).handleInputCountChanged();
-
- Uri uri = intent.getData();
- final String packageName = (uri != null ? uri.getSchemeSpecificPart() : null);
- Partner.reset(context, packageName);
}
}
diff --git a/src/com/android/tv/recommendation/NotificationService.java b/src/com/android/tv/recommendation/NotificationService.java
index a472f559..30ec73e3 100644
--- a/src/com/android/tv/recommendation/NotificationService.java
+++ b/src/com/android/tv/recommendation/NotificationService.java
@@ -426,7 +426,6 @@ public class NotificationService extends Service implements Recommender.Listener
: 100 - (int) (programLeftTimsMs * 100 / programDurationMs);
Intent intent = new Intent(Intent.ACTION_VIEW, channel.getUri());
intent.putExtra(TUNE_PARAMS_RECOMMENDATION_TYPE, mRecommendationType);
- intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
final PendingIntent notificationIntent = PendingIntent.getActivity(this, 0, intent, 0);
// This callback will run on the main thread.
diff --git a/src/com/android/tv/search/DataManagerSearch.java b/src/com/android/tv/search/DataManagerSearch.java
index d90908f1..5f89a21a 100644
--- a/src/com/android/tv/search/DataManagerSearch.java
+++ b/src/com/android/tv/search/DataManagerSearch.java
@@ -265,7 +265,9 @@ public class DataManagerSearch implements SearchInterface {
}
private String buildIntentData(long channelId) {
- return TvContract.buildChannelUri(channelId).toString();
+ return TvContract.buildChannelUri(channelId).buildUpon()
+ .appendQueryParameter(Utils.PARAM_SOURCE, SOURCE_TV_SEARCH)
+ .build().toString();
}
private boolean isRatingBlocked(TvContentRating[] ratings) {
diff --git a/src/com/android/tv/search/SearchInterface.java b/src/com/android/tv/search/SearchInterface.java
index c9a63128..caa45812 100644
--- a/src/com/android/tv/search/SearchInterface.java
+++ b/src/com/android/tv/search/SearchInterface.java
@@ -24,6 +24,8 @@ import java.util.List;
* Interface for channel and program search.
*/
public interface SearchInterface {
+ String SOURCE_TV_SEARCH = "TvSearch";
+
int ACTION_TYPE_AMBIGUOUS = 1;
int ACTION_TYPE_SWITCH_CHANNEL = 2;
int ACTION_TYPE_SWITCH_INPUT = 3;
diff --git a/src/com/android/tv/search/TvProviderSearch.java b/src/com/android/tv/search/TvProviderSearch.java
index ea144786..2ceec19a 100644
--- a/src/com/android/tv/search/TvProviderSearch.java
+++ b/src/com/android/tv/search/TvProviderSearch.java
@@ -38,8 +38,6 @@ import com.android.tv.search.LocalSearchProvider.SearchResult;
import com.android.tv.util.PermissionUtils;
import com.android.tv.util.Utils;
-import junit.framework.Assert;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -191,10 +189,6 @@ public class TvProviderSearch implements SearchInterface {
@WorkerThread
private List<SearchResult> searchChannels(String query, String[] columnForExactMatching,
String[] columnForPartialMatching, Set<Long> channelsFound, int limit) {
- Assert.assertTrue(
- (columnForExactMatching != null && columnForExactMatching.length > 0) ||
- (columnForPartialMatching != null && columnForPartialMatching.length > 0));
-
String[] projection = {
Channels._ID,
Channels.COLUMN_DISPLAY_NUMBER,
@@ -314,10 +308,6 @@ public class TvProviderSearch implements SearchInterface {
String[] columnForPartialMatching, Set<Long> channelsFound, int limit) {
if (DEBUG) Log.d(TAG, "Searching programs: '" + query + "'");
long time = SystemClock.elapsedRealtime();
- Assert.assertTrue(
- (columnForExactMatching != null && columnForExactMatching.length > 0) ||
- (columnForPartialMatching != null && columnForPartialMatching.length > 0));
-
String[] projection = {
Programs.COLUMN_CHANNEL_ID,
Programs.COLUMN_TITLE,
@@ -412,7 +402,9 @@ public class TvProviderSearch implements SearchInterface {
}
private String buildIntentData(long channelId) {
- return TvContract.buildChannelUri(channelId).toString();
+ return TvContract.buildChannelUri(channelId).buildUpon()
+ .appendQueryParameter(Utils.PARAM_SOURCE, SOURCE_TV_SEARCH)
+ .build().toString();
}
private boolean isRatingBlocked(String ratings) {
diff --git a/src/com/android/tv/tuner/ChannelScanFileParser.java b/src/com/android/tv/tuner/ChannelScanFileParser.java
index 8b06aaa9..2dd36074 100644
--- a/src/com/android/tv/tuner/ChannelScanFileParser.java
+++ b/src/com/android/tv/tuner/ChannelScanFileParser.java
@@ -18,7 +18,7 @@ package com.android.tv.tuner;
import android.util.Log;
-import com.android.tv.tuner.data.Channel;
+import com.android.tv.tuner.data.nano.Channel;
import java.io.BufferedReader;
import java.io.IOException;
diff --git a/src/com/android/tv/tuner/TunerHal.java b/src/com/android/tv/tuner/TunerHal.java
index 64394ea3..de19766e 100644
--- a/src/com/android/tv/tuner/TunerHal.java
+++ b/src/com/android/tv/tuner/TunerHal.java
@@ -20,9 +20,6 @@ import android.content.Context;
import android.support.annotation.IntDef;
import android.support.annotation.StringDef;
import android.util.Log;
-import android.util.Pair;
-
-import com.android.tv.Features;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -51,7 +48,6 @@ public abstract class TunerHal implements AutoCloseable {
public static final int TUNER_TYPE_BUILT_IN = 1;
public static final int TUNER_TYPE_USB = 2;
- public static final int TUNER_TYPE_NETWORK = 3;
protected static final int PID_PAT = 0;
protected static final int PID_ATSC_SI_BASE = 0x1ffb;
@@ -73,33 +69,31 @@ public abstract class TunerHal implements AutoCloseable {
*/
public synchronized static TunerHal createInstance(Context context) {
TunerHal tunerHal = null;
- if (useBuiltInTuner(context)) {
+ if (getTunerType(context) == TUNER_TYPE_BUILT_IN) {
}
- if (tunerHal == null && UsbTunerHal.getNumberOfDevices(context) > 0) {
+ if (tunerHal == null) {
tunerHal = new UsbTunerHal(context);
}
- return tunerHal != null && tunerHal.openFirstAvailable() ? tunerHal : null;
+ if (tunerHal.openFirstAvailable()) {
+ return tunerHal;
+ }
+ return null;
}
/**
* Gets the number of tuner devices currently present.
*/
- public static Pair<Integer, Integer> getTunerTypeAndCount(Context context) {
- if (useBuiltInTuner(context)) {
+ public static int getTunerCount(Context context) {
+ if (getTunerType(context) == TUNER_TYPE_BUILT_IN) {
}
- int usbTunerCount = UsbTunerHal.getNumberOfDevices(context);
- if (usbTunerCount > 0) {
- return new Pair<>(TUNER_TYPE_USB, usbTunerCount);
- }
- return new Pair<>(null, 0);
+ return UsbTunerHal.getNumberOfDevices(context);
}
/**
- * Returns if tuner input service would use built-in tuners instead of USB tuners or network
- * tuners.
+ * Gets the type of tuner devices currently used.
*/
- static boolean useBuiltInTuner(Context context) {
- return false;
+ public static int getTunerType(Context context) {
+ return TUNER_TYPE_USB;
}
protected TunerHal(Context context) {
@@ -112,14 +106,6 @@ public abstract class TunerHal implements AutoCloseable {
return mIsStreaming;
}
- /**
- * Returns {@code true} if this tuner HAL can be reused to save tuning time between channels
- * of the same frequency.
- */
- public boolean isReusable() {
- return true;
- }
-
@Override
protected void finalize() throws Throwable {
super.finalize();
@@ -145,12 +131,9 @@ public abstract class TunerHal implements AutoCloseable {
*
* @param frequency a frequency of the channel to tune to
* @param modulation a modulation method of the channel to tune to
- * @param channelNumber channel number when channel number is already known. Some tuner HAL
- * may use channelNumber instead of frequency for tune.
* @return {@code true} if the operation was successful, {@code false} otherwise
*/
- public synchronized boolean tune(int frequency, @ModulationType String modulation,
- String channelNumber) {
+ public synchronized boolean tune(int frequency, @ModulationType String modulation) {
if (!isDeviceOpen()) {
Log.e(TAG, "There's no available device");
return false;
diff --git a/src/com/android/tv/tuner/TunerInputController.java b/src/com/android/tv/tuner/TunerInputController.java
index 65bbbdd0..d89b6a0c 100644
--- a/src/com/android/tv/tuner/TunerInputController.java
+++ b/src/com/android/tv/tuner/TunerInputController.java
@@ -16,40 +16,30 @@
package com.android.tv.tuner;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.os.AsyncTask;
+import android.media.tv.TvInputInfo;
+import android.media.tv.TvInputManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.os.SystemClock;
-import android.preference.PreferenceManager;
-import android.text.TextUtils;
+import android.support.v4.os.BuildCompat;
import android.util.Log;
import android.widget.Toast;
import com.android.tv.Features;
-import com.android.tv.R;
import com.android.tv.TvApplication;
+import com.android.tv.tuner.R;
import com.android.tv.tuner.setup.TunerSetupActivity;
import com.android.tv.tuner.tvinput.TunerTvInputService;
-import com.android.tv.tuner.util.SystemPropertiesProxy;
import com.android.tv.tuner.util.TunerInputInfoUtils;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.Map;
-import java.util.concurrent.TimeUnit;
/**
* Controls the package visibility of {@link TunerTvInputService}.
@@ -61,39 +51,10 @@ import java.util.concurrent.TimeUnit;
public class TunerInputController extends BroadcastReceiver {
private static final boolean DEBUG = true;
private static final String TAG = "TunerInputController";
- private static final String PREFERENCE_IS_NETWORK_TUNER_ATTACHED = "network_tuner";
- private static final String SECURITY_PATCH_LEVEL_KEY = "ro.build.version.security_patch";
- private static final String SECURITY_PATCH_LEVEL_FORMAT = "yyyy-MM-dd";
-
- /**
- * Action of {@link Intent} to check network connection repeatedly when it is necessary.
- */
- public static final String CHECKING_NETWORK_CONNECTION =
- "com.android.tv.action.CHECKING_NETWORK_CONNECTION";
-
- /**
- * Action of {@link Intent} when network tuner is attached.
- */
- public static final String NETWORK_TUNER_ATTACHED =
- "com.android.tv.action.NETWORK_TUNER_ATTACHED";
-
- /**
- * Action of {@link Intent} when network tuner is detached.
- */
- public static final String NETWORK_TUNER_DETACHED =
- "com.android.tv.action.NETWORK_TUNER_DETACHED";
-
- private static final String EXTRA_CHECKING_DURATION =
- "com.android.tv.action.extra.CHECKING_DURATION";
-
- private static final long INITIAL_CHECKING_DURATION_MS = TimeUnit.SECONDS.toMillis(10);
- private static final long MAXIMUM_CHECKING_DURATION_MS = TimeUnit.MINUTES.toMillis(10);
private static final TunerDevice[] TUNER_DEVICES = {
- new TunerDevice(0x2040, 0xb123, null), // WinTV-HVR-955Q
- new TunerDevice(0x07ca, 0x0837, null), // AverTV Volar Hybrid Q
- // WinTV-dualHD (bulk) will be supported after 2017 April security patch.
- new TunerDevice(0x2040, 0x826d, "2017-04-01"), // WinTV-dualHD (bulk)
+ new TunerDevice(0x2040, 0xb123), // WinTV-HVR-955Q
+ new TunerDevice(0x07ca, 0x0837) // AverTV Volar Hybrid Q
};
private static final int MSG_ENABLE_INPUT_SERVICE = 1000;
@@ -109,9 +70,7 @@ public class TunerInputController extends BroadcastReceiver {
if (mDvbDeviceAccessor == null) {
mDvbDeviceAccessor = new DvbDeviceAccessor(context);
}
- boolean enabled = mDvbDeviceAccessor.isDvbDeviceAvailable();
- enableTunerTvInputService(
- context, enabled, false, enabled ? TunerHal.TUNER_TYPE_USB : null);
+ enableTunerTvInputService(context, mDvbDeviceAccessor.isDvbDeviceAvailable());
break;
}
}
@@ -125,35 +84,14 @@ public class TunerInputController extends BroadcastReceiver {
private final int vendorId;
private final int productId;
- // security patch level from which the specific tuner type is supported.
- private final String minSecurityLevel;
-
- private TunerDevice(int vendorId, int productId, String minSecurityLevel) {
+ private TunerDevice(int vendorId, int productId) {
this.vendorId = vendorId;
this.productId = productId;
- this.minSecurityLevel = minSecurityLevel;
}
private boolean equals(UsbDevice device) {
return device.getVendorId() == vendorId && device.getProductId() == productId;
}
-
- private boolean isSupported(String currentSecurityLevel) {
- if (minSecurityLevel == null) {
- return true;
- }
-
- long supportSecurityLevelTimeStamp = 0;
- long currentSecurityLevelTimestamp = 0;
- try {
- SimpleDateFormat format = new SimpleDateFormat(SECURITY_PATCH_LEVEL_FORMAT);
- supportSecurityLevelTimeStamp = format.parse(minSecurityLevel).getTime();
- currentSecurityLevelTimestamp = format.parse(currentSecurityLevel).getTime();
- } catch (ParseException e) {
- }
- return supportSecurityLevelTimeStamp != 0
- && supportSecurityLevelTimeStamp <= currentSecurityLevelTimestamp;
- }
}
@Override
@@ -161,20 +99,17 @@ public class TunerInputController extends BroadcastReceiver {
if (DEBUG) Log.d(TAG, "Broadcast intent received:" + intent);
TvApplication.setCurrentRunningProcess(context, true);
if (!Features.TUNER.isEnabled(context)) {
- enableTunerTvInputService(context, false, false, null);
+ enableTunerTvInputService(context, false);
return;
}
- SharedPreferences sharedPreferences =
- PreferenceManager.getDefaultSharedPreferences(context);
switch (intent.getAction()) {
case Intent.ACTION_BOOT_COMPLETED:
- executeNetworkTunerDiscoveryAsyncTask(context, INITIAL_CHECKING_DURATION_MS);
case TvApplication.ACTION_APPLICATION_FIRST_LAUNCHED:
case UsbManager.ACTION_USB_DEVICE_ATTACHED:
case UsbManager.ACTION_USB_DEVICE_DETACHED:
- if (TunerHal.useBuiltInTuner(context)) {
- enableTunerTvInputService(context, true, false, TunerHal.TUNER_TYPE_BUILT_IN);
+ if (TunerInputInfoUtils.isBuiltInTuner(context)) {
+ enableTunerTvInputService(context, true);
break;
}
// Falls back to the below to check USB tuner devices.
@@ -188,41 +123,7 @@ public class TunerInputController extends BroadcastReceiver {
mHandler.obtainMessage(MSG_ENABLE_INPUT_SERVICE, context),
DVB_DRIVER_CHECK_DELAY_MS);
} else {
- if (sharedPreferences.getBoolean(PREFERENCE_IS_NETWORK_TUNER_ATTACHED, false)) {
- // Since network tuner is attached, do not disable TunerTvInput,
- // just updates the TvInputInfo.
- TunerInputInfoUtils.updateTunerInputInfo(context);
- break;
- }
- enableTunerTvInputService(context, false, false, TextUtils
- .equals(intent.getAction(), UsbManager.ACTION_USB_DEVICE_DETACHED) ?
- TunerHal.TUNER_TYPE_USB : null);
- }
- break;
- case CHECKING_NETWORK_CONNECTION:
- long repeatedDurationMs = intent.getLongExtra(EXTRA_CHECKING_DURATION,
- INITIAL_CHECKING_DURATION_MS);
- executeNetworkTunerDiscoveryAsyncTask(context,
- Math.min(repeatedDurationMs * 2, MAXIMUM_CHECKING_DURATION_MS));
- break;
- case NETWORK_TUNER_ATTACHED:
- // Network tuner detection is initiated by UI. So the app should not
- // be killed.
- sharedPreferences.edit()
- .putBoolean(PREFERENCE_IS_NETWORK_TUNER_ATTACHED, true).apply();
- enableTunerTvInputService(context, true, true, TunerHal.TUNER_TYPE_NETWORK);
- break;
- case NETWORK_TUNER_DETACHED:
- sharedPreferences.edit()
- .putBoolean(PREFERENCE_IS_NETWORK_TUNER_ATTACHED, false).apply();
- if(!isUsbTunerConnected(context) && !TunerHal.useBuiltInTuner(context)) {
- // Network tuner detection is initiated by UI. So the app should not
- // be killed.
- enableTunerTvInputService(context, false, true, TunerHal.TUNER_TYPE_NETWORK);
- } else {
- // Since USB tuner is attached, do not disable TunerTvInput,
- // just updates the TvInputInfo.
- TunerInputInfoUtils.updateTunerInputInfo(context);
+ enableTunerTvInputService(context, false);
}
break;
}
@@ -237,15 +138,12 @@ public class TunerInputController extends BroadcastReceiver {
private boolean isUsbTunerConnected(Context context) {
UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
Map<String, UsbDevice> deviceList = manager.getDeviceList();
- String currentSecurityLevel =
- SystemPropertiesProxy.getString(SECURITY_PATCH_LEVEL_KEY, null);
-
for (UsbDevice device : deviceList.values()) {
if (DEBUG) {
Log.d(TAG, "Device: " + device);
}
for (TunerDevice tuner : TUNER_DEVICES) {
- if (tuner.equals(device) && tuner.isSupported(currentSecurityLevel)) {
+ if (tuner.equals(device)) {
Log.i(TAG, "Tuner found");
return true;
}
@@ -260,8 +158,7 @@ public class TunerInputController extends BroadcastReceiver {
* @param context {@link Context} instance
* @param enabled {@code true} to enable the service; otherwise {@code false}
*/
- private void enableTunerTvInputService(Context context, boolean enabled,
- boolean forceDontKillApp, Integer tunerType) {
+ private void enableTunerTvInputService(Context context, boolean enabled) {
if (DEBUG) Log.d(TAG, "enableTunerTvInputService: " + enabled);
PackageManager pm = context.getPackageManager();
ComponentName componentName = new ComponentName(context, TunerTvInputService.class);
@@ -273,8 +170,7 @@ public class TunerInputController extends BroadcastReceiver {
// Since PackageManager.DONT_KILL_APP delays the operation by 10 seconds
// (PackageManagerService.BROADCAST_DELAY), we'd better avoid using it. It is used only
// when the LiveChannels app is active since we don't want to kill the running app.
- int flags = forceDontKillApp
- || TvApplication.getSingletons(context).getMainActivityWrapper().isCreated()
+ int flags = TvApplication.getSingletons(context).getMainActivityWrapper().isCreated()
? PackageManager.DONT_KILL_APP : 0;
int newState = enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
@@ -283,67 +179,14 @@ public class TunerInputController extends BroadcastReceiver {
TunerSetupActivity.onTvInputEnabled(context, enabled);
// Enable/disable the USB tuner TV input.
pm.setComponentEnabledSetting(componentName, newState, flags);
- if (!enabled && tunerType != null) {
- if (tunerType == TunerHal.TUNER_TYPE_USB) {
- Toast.makeText(context, R.string.msg_usb_tuner_disconnected,
- Toast.LENGTH_SHORT).show();
- } else if (tunerType == TunerHal.TUNER_TYPE_NETWORK) {
- Toast.makeText(context, R.string.msg_network_tuner_disconnected,
- Toast.LENGTH_SHORT).show();
- }
+ if (!enabled) {
+ Toast.makeText(
+ context, R.string.msg_usb_device_detached, Toast.LENGTH_SHORT).show();
}
if (DEBUG) Log.d(TAG, "Status updated:" + enabled);
} else if (enabled) {
- // When # of tuners is changed or the tuner input service is switching from/to using
- // network tuners or the device just boots.
+ // When # of USB tuners is changed or the device just boots.
TunerInputInfoUtils.updateTunerInputInfo(context);
}
}
-
- /**
- * Discovers a network tuner. If the network connection is down, it won't repeatedly checking.
- */
- public static void executeNetworkTunerDiscoveryAsyncTask(final Context context) {
- executeNetworkTunerDiscoveryAsyncTask(context, 0);
- }
-
- /**
- * Discovers a network tuner.
- * @param context {@link Context}
- * @param repeatedDurationMs the time length to wait to repeatedly check network status to start
- * finding network tuner when the network connection is not available.
- * {@code 0} to disable repeatedly checking.
- */
- private static void executeNetworkTunerDiscoveryAsyncTask(final Context context,
- final long repeatedDurationMs) {
- if (!Features.NETWORK_TUNER.isEnabled(context)) {
- return;
- }
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... params) {
- if (isNetworkConnected(context)) {
- // Implement and execute network tuner discovery AsyncTask here.
- } else if (repeatedDurationMs > 0) {
- AlarmManager alarmManager =
- (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- Intent networkCheckingIntent = new Intent(context, TunerInputController.class);
- networkCheckingIntent.setAction(CHECKING_NETWORK_CONNECTION);
- networkCheckingIntent.putExtra(EXTRA_CHECKING_DURATION, repeatedDurationMs);
- PendingIntent alarmIntent = PendingIntent.getBroadcast(
- context, 0, networkCheckingIntent, PendingIntent.FLAG_UPDATE_CURRENT);
- alarmManager.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()
- + repeatedDurationMs, alarmIntent);
- }
- return null;
- }
- }.execute();
- }
-
- private static boolean isNetworkConnected(Context context) {
- ConnectivityManager cm = (ConnectivityManager)
- context.getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo networkInfo = cm.getActiveNetworkInfo();
- return networkInfo != null && networkInfo.isConnected();
- }
}
diff --git a/src/com/android/tv/tuner/TunerPreferences.java b/src/com/android/tv/tuner/TunerPreferences.java
index a387be74..1547e3ae 100644
--- a/src/com/android/tv/tuner/TunerPreferences.java
+++ b/src/com/android/tv/tuner/TunerPreferences.java
@@ -39,7 +39,6 @@ public class TunerPreferences {
private static final String PREFS_KEY_CHANNEL_DATA_VERSION = "channel_data_version";
private static final String PREFS_KEY_SCANNED_CHANNEL_COUNT = "scanned_channel_count";
- private static final String PREFS_KEY_LAST_POSTAL_CODE = "last_postal_code";
private static final String PREFS_KEY_SCAN_DONE = "scan_done";
private static final String PREFS_KEY_LAUNCH_SETUP = "launch_setup";
private static final String PREFS_KEY_STORE_TS_STREAM = "store_ts_stream";
@@ -87,7 +86,8 @@ public class TunerPreferences {
/**
* Releases the resources.
*/
- public static synchronized void release(Context context) {
+ @MainThread
+ public static void release(Context context) {
if (useContentProvider(context) && sContentObserver != null) {
context.getContentResolver().unregisterContentObserver(sContentObserver);
}
@@ -99,8 +99,7 @@ public class TunerPreferences {
* This preferences is used across processes, so the preferences should be loaded again when the
* databases changes.
*/
- @MainThread
- public static void loadPreferences(Context context) {
+ public static synchronized void loadPreferences(Context context) {
if (sLoadPreferencesTask != null
&& sLoadPreferencesTask.getStatus() != AsyncTask.Status.FINISHED) {
sLoadPreferencesTask.cancel(true);
@@ -114,7 +113,8 @@ public class TunerPreferences {
return TisConfiguration.isPackagedWithLiveChannels(context);
}
- public static synchronized int getChannelDataVersion(Context context) {
+ @MainThread
+ public static int getChannelDataVersion(Context context) {
SoftPreconditions.checkState(sInitialized);
if (useContentProvider(context)) {
return sPreferenceValues.getInt(PREFS_KEY_CHANNEL_DATA_VERSION,
@@ -126,7 +126,8 @@ public class TunerPreferences {
}
}
- public static synchronized void setChannelDataVersion(Context context, int version) {
+ @MainThread
+ public static void setChannelDataVersion(Context context, int version) {
if (useContentProvider(context)) {
setPreference(context, PREFS_KEY_CHANNEL_DATA_VERSION, version);
} else {
@@ -136,7 +137,8 @@ public class TunerPreferences {
}
}
- public static synchronized int getScannedChannelCount(Context context) {
+ @MainThread
+ public static int getScannedChannelCount(Context context) {
SoftPreconditions.checkState(sInitialized);
if (useContentProvider(context)) {
return sPreferenceValues.getInt(PREFS_KEY_SCANNED_CHANNEL_COUNT);
@@ -146,7 +148,8 @@ public class TunerPreferences {
}
}
- public static synchronized void setScannedChannelCount(Context context, int channelCount) {
+ @MainThread
+ public static void setScannedChannelCount(Context context, int channelCount) {
if (useContentProvider(context)) {
setPreference(context, PREFS_KEY_SCANNED_CHANNEL_COUNT, channelCount);
} else {
@@ -156,25 +159,8 @@ public class TunerPreferences {
}
}
- public static synchronized String getLastPostalCode(Context context) {
- SoftPreconditions.checkState(sInitialized);
- if (useContentProvider(context)) {
- return sPreferenceValues.getString(PREFS_KEY_LAST_POSTAL_CODE);
- } else {
- return getSharedPreferences(context).getString(PREFS_KEY_LAST_POSTAL_CODE, null);
- }
- }
-
- public static synchronized void setLastPostalCode(Context context, String postalCode) {
- if (useContentProvider(context)) {
- setPreference(context, PREFS_KEY_LAST_POSTAL_CODE, postalCode);
- } else {
- getSharedPreferences(context).edit()
- .putString(PREFS_KEY_LAST_POSTAL_CODE, postalCode).apply();
- }
- }
-
- public static synchronized boolean isScanDone(Context context) {
+ @MainThread
+ public static boolean isScanDone(Context context) {
SoftPreconditions.checkState(sInitialized);
if (useContentProvider(context)) {
return sPreferenceValues.getBoolean(PREFS_KEY_SCAN_DONE);
@@ -184,7 +170,8 @@ public class TunerPreferences {
}
}
- public static synchronized void setScanDone(Context context) {
+ @MainThread
+ public static void setScanDone(Context context) {
if (useContentProvider(context)) {
setPreference(context, PREFS_KEY_SCAN_DONE, true);
} else {
@@ -194,7 +181,8 @@ public class TunerPreferences {
}
}
- public static synchronized boolean shouldShowSetupActivity(Context context) {
+ @MainThread
+ public static boolean shouldShowSetupActivity(Context context) {
SoftPreconditions.checkState(sInitialized);
if (useContentProvider(context)) {
return sPreferenceValues.getBoolean(PREFS_KEY_LAUNCH_SETUP);
@@ -204,7 +192,8 @@ public class TunerPreferences {
}
}
- public static synchronized void setShouldShowSetupActivity(Context context, boolean need) {
+ @MainThread
+ public static void setShouldShowSetupActivity(Context context, boolean need) {
if (useContentProvider(context)) {
setPreference(context, PREFS_KEY_LAUNCH_SETUP, need);
} else {
@@ -214,7 +203,8 @@ public class TunerPreferences {
}
}
- public static synchronized boolean getStoreTsStream(Context context) {
+ @MainThread
+ public static boolean getStoreTsStream(Context context) {
SoftPreconditions.checkState(sInitialized);
if (useContentProvider(context)) {
return sPreferenceValues.getBoolean(PREFS_KEY_STORE_TS_STREAM, false);
@@ -224,7 +214,8 @@ public class TunerPreferences {
}
}
- public static synchronized void setStoreTsStream(Context context, boolean shouldStore) {
+ @MainThread
+ public static void setStoreTsStream(Context context, boolean shouldStore) {
if (useContentProvider(context)) {
setPreference(context, PREFS_KEY_STORE_TS_STREAM, shouldStore);
} else {
@@ -238,23 +229,8 @@ public class TunerPreferences {
return context.getSharedPreferences(SHARED_PREFS_NAME, Context.MODE_PRIVATE);
}
- private static synchronized void setPreference(Context context, String key, String value) {
- sPreferenceValues.putString(key, value);
- savePreference(context, key, value);
- }
-
- private static synchronized void setPreference(Context context, String key, int value) {
- sPreferenceValues.putInt(key, value);
- savePreference(context, key, Integer.toString(value));
- }
-
- private static synchronized void setPreference(Context context, String key, boolean value) {
- sPreferenceValues.putBoolean(key, value);
- savePreference(context, key, Boolean.toString(value));
- }
-
- private static void savePreference(final Context context, final String key,
- final String value) {
+ @MainThread
+ private static void setPreference(final Context context, final String key, final String value) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
@@ -273,6 +249,18 @@ public class TunerPreferences {
}.execute();
}
+ @MainThread
+ private static void setPreference(Context context, String key, int value) {
+ sPreferenceValues.putInt(key, value);
+ setPreference(context, key, Integer.toString(value));
+ }
+
+ @MainThread
+ private static void setPreference(Context context, String key, boolean value) {
+ sPreferenceValues.putBoolean(key, value);
+ setPreference(context, key, Boolean.toString(value));
+ }
+
private static class LoadPreferencesTask extends AsyncTask<Void, Void, Bundle> {
private final Context mContext;
private LoadPreferencesTask(Context context) {
@@ -304,9 +292,6 @@ public class TunerPreferences {
case PREFS_KEY_STORE_TS_STREAM:
bundle.putBoolean(key, Boolean.parseBoolean(value));
break;
- case PREFS_KEY_LAST_POSTAL_CODE:
- bundle.putString(key, value);
- break;
}
}
}
@@ -318,10 +303,8 @@ public class TunerPreferences {
}
@Override
- protected synchronized void onPostExecute(Bundle bundle) {
- if (bundle != null) {
- sPreferenceValues.putAll(bundle);
- }
+ protected void onPostExecute(Bundle bundle) {
+ sPreferenceValues.putAll(bundle);
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/tuner/UsbTunerHal.java b/src/com/android/tv/tuner/UsbTunerHal.java
index b1608ede..22e35ea1 100644
--- a/src/com/android/tv/tuner/UsbTunerHal.java
+++ b/src/com/android/tv/tuner/UsbTunerHal.java
@@ -169,10 +169,6 @@ public class UsbTunerHal extends TunerHal {
* Gets the number of USB tuner devices currently present.
*/
public static int getNumberOfDevices(Context context) {
- try {
- return (new DvbDeviceAccessor(context)).getNumOfDvbDevices();
- } catch (Exception e) {
- return 0;
- }
+ return (new DvbDeviceAccessor(context)).getNumOfDvbDevices();
}
}
diff --git a/src/com/android/tv/tuner/cc/CaptionLayout.java b/src/com/android/tv/tuner/cc/CaptionLayout.java
index c41f1014..a88538df 100644
--- a/src/com/android/tv/tuner/cc/CaptionLayout.java
+++ b/src/com/android/tv/tuner/cc/CaptionLayout.java
@@ -19,7 +19,7 @@ package com.android.tv.tuner.cc;
import android.content.Context;
import android.util.AttributeSet;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import com.android.tv.tuner.layout.ScaledLayout;
/**
diff --git a/src/com/android/tv/tuner/cc/CaptionTrackRenderer.java b/src/com/android/tv/tuner/cc/CaptionTrackRenderer.java
index 3aa40982..3c75caa9 100644
--- a/src/com/android/tv/tuner/cc/CaptionTrackRenderer.java
+++ b/src/com/android/tv/tuner/cc/CaptionTrackRenderer.java
@@ -27,7 +27,7 @@ import com.android.tv.tuner.data.Cea708Data.CaptionPenColor;
import com.android.tv.tuner.data.Cea708Data.CaptionPenLocation;
import com.android.tv.tuner.data.Cea708Data.CaptionWindow;
import com.android.tv.tuner.data.Cea708Data.CaptionWindowAttr;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
diff --git a/src/com/android/tv/tuner/cc/Cea708Parser.java b/src/com/android/tv/tuner/cc/Cea708Parser.java
index c43fe512..92ab0620 100644
--- a/src/com/android/tv/tuner/cc/Cea708Parser.java
+++ b/src/com/android/tv/tuner/cc/Cea708Parser.java
@@ -140,7 +140,6 @@ public class Cea708Parser {
private int mCommand = 0;
private int mListenServiceNumber = 0;
private boolean mDtvCcPacking = false;
- private boolean mFirstServiceNumberDiscovered;
// Assign a dummy listener in order to avoid null checks.
private OnCea708ParserListener mListener = new OnCea708ParserListener() {
@@ -333,14 +332,12 @@ public class Cea708Parser {
mDiscoveredNumBytes.put(
serviceNumber, blockSize + mDiscoveredNumBytes.get(serviceNumber, 0));
}
- if (mLastDiscoveryLaunchedMs + DISCOVERY_PERIOD_MS < SystemClock.elapsedRealtime()
- || !mFirstServiceNumberDiscovered) {
+ if (mLastDiscoveryLaunchedMs + DISCOVERY_PERIOD_MS < SystemClock.elapsedRealtime()) {
for (int i = 0; i < mDiscoveredNumBytes.size(); ++i) {
int discoveredNumBytes = mDiscoveredNumBytes.valueAt(i);
if (discoveredNumBytes >= DISCOVERY_NUM_BYTES_THRESHOLD) {
int discoveredServiceNumber = mDiscoveredNumBytes.keyAt(i);
mListener.discoverServiceNumber(discoveredServiceNumber);
- mFirstServiceNumberDiscovered = true;
}
}
mDiscoveredNumBytes.clear();
diff --git a/src/com/android/tv/tuner/data/PsiData.java b/src/com/android/tv/tuner/data/PsiData.java
index 2c8a52db..67700c6a 100644
--- a/src/com/android/tv/tuner/data/PsiData.java
+++ b/src/com/android/tv/tuner/data/PsiData.java
@@ -17,8 +17,8 @@
package com.android.tv.tuner.data;
-import com.android.tv.tuner.data.Track.AtscAudioTrack;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
+import com.android.tv.tuner.data.nano.Track.AtscAudioTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import java.util.List;
diff --git a/src/com/android/tv/tuner/data/PsipData.java b/src/com/android/tv/tuner/data/PsipData.java
index ac7fdedb..aead4be8 100644
--- a/src/com/android/tv/tuner/data/PsipData.java
+++ b/src/com/android/tv/tuner/data/PsipData.java
@@ -20,11 +20,11 @@ import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.text.format.DateUtils;
-import com.android.tv.tuner.data.Track.AtscAudioTrack;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
+import com.android.tv.tuner.data.nano.Track.AtscAudioTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import com.android.tv.tuner.ts.SectionParser;
import com.android.tv.tuner.util.ConvertUtils;
-import com.android.tv.util.StringUtils;
+import com.android.tv.tuner.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/tv/tuner/data/TunerChannel.java b/src/com/android/tv/tuner/data/TunerChannel.java
index 41f66e7d..89079d77 100644
--- a/src/com/android/tv/tuner/data/TunerChannel.java
+++ b/src/com/android/tv/tuner/data/TunerChannel.java
@@ -19,11 +19,12 @@ package com.android.tv.tuner.data;
import android.support.annotation.NonNull;
import android.util.Log;
-import com.android.tv.tuner.data.Channel.TunerChannelProto;
-import com.android.tv.tuner.data.Track.AtscAudioTrack;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
+import com.android.tv.tuner.data.nano.Channel;
+import com.android.tv.tuner.data.nano.Channel.TunerChannelProto;
+import com.android.tv.tuner.data.nano.Track.AtscAudioTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import com.android.tv.tuner.util.Ints;
-import com.android.tv.util.StringUtils;
+import com.android.tv.tuner.util.StringUtils;
import com.google.protobuf.nano.MessageNano;
import java.io.IOException;
@@ -39,11 +40,6 @@ import java.util.Objects;
public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracksInterface {
private static final String TAG = "TunerChannel";
- /**
- * Channel number separator between major number and minor number.
- */
- public static final char CHANNEL_NUMBER_SEPARATOR = '-';
-
// See ATSC Code Points Registry.
private static final String[] ATSC_SERVICE_TYPE_NAMES = new String[] {
"ATSC Reserved",
@@ -67,7 +63,6 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
// According to ISO13818-1, Mpeg2 StreamType has a range from 0x00 to 0xff.
public static final int INVALID_STREAMTYPE = -1;
- // @GuardedBy(this) Writing operations and toByteArray will be guarded. b/34197766
private final TunerChannelProto mProto;
private TunerChannel(PsipData.VctItem channel, int programNumber,
@@ -150,44 +145,6 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
return new TunerChannel(channel, 0, pmtItems, Channel.TYPE_FILE);
}
- /**
- * Create a TunerChannel object suitable for network tuners
- * @param major Channel number major
- * @param minor Channel number minor
- * @param programNumber Program number
- * @param shortName Short name
- * @param recordingProhibited Recording prohibition info
- * @param videoFormat Video format. Should be {@code null} or one of the followings:
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_240P},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_360P},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_480I},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_480P},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_576I},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_576P},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_720P},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_1080I},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_1080P},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_2160P},
- * {@link android.media.tv.TvContract.Channels#VIDEO_FORMAT_4320P}
- * @return a TunerChannel object
- */
- public static TunerChannel forNetwork(int major, int minor, int programNumber,
- String shortName, boolean recordingProhibited, String videoFormat) {
- TunerChannel tunerChannel = new TunerChannel(programNumber, Collections.EMPTY_LIST);
- tunerChannel.setVirtualMajor(major);
- tunerChannel.setVirtualMinor(minor);
- tunerChannel.setShortName(shortName);
- // Set audio and video pids in order to work around the audio-only channel check.
- tunerChannel.setAudioPids(new ArrayList<>(Arrays.asList(0)));
- tunerChannel.selectAudioTrack(0);
- tunerChannel.setVideoPid(0);
- tunerChannel.setRecordingProhibited(recordingProhibited);
- if (videoFormat != null) {
- tunerChannel.setVideoFormat(videoFormat);
- }
- return tunerChannel;
- }
-
public String getName() {
return (!mProto.shortName.isEmpty()) ? mProto.shortName : mProto.longName;
}
@@ -236,7 +193,7 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
return mProto.videoPid;
}
- synchronized public void setVideoPid(int videoPid) {
+ public void setVideoPid(int videoPid) {
mProto.videoPid = videoPid;
}
@@ -262,7 +219,7 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
return Ints.asList(mProto.audioPids);
}
- synchronized public void setAudioPids(List<Integer> audioPids) {
+ public void setAudioPids(List<Integer> audioPids) {
mProto.audioPids = Ints.toArray(audioPids);
}
@@ -270,7 +227,7 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
return Ints.asList(mProto.audioStreamTypes);
}
- synchronized public void setAudioStreamTypes(List<Integer> audioStreamTypes) {
+ public void setAudioStreamTypes(List<Integer> audioStreamTypes) {
mProto.audioStreamTypes = Ints.toArray(audioStreamTypes);
}
@@ -282,32 +239,32 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
return mProto.type;
}
- synchronized public void setFilepath(String filepath) {
- mProto.filepath = filepath == null ? "" : filepath;
+ public void setFilepath(String filepath) {
+ mProto.filepath = filepath;
}
public String getFilepath() {
return mProto.filepath;
}
- synchronized public void setVirtualMajor(int virtualMajor) {
+ public void setVirtualMajor(int virtualMajor) {
mProto.virtualMajor = virtualMajor;
}
- synchronized public void setVirtualMinor(int virtualMinor) {
+ public void setVirtualMinor(int virtualMinor) {
mProto.virtualMinor = virtualMinor;
}
- synchronized public void setShortName(String shortName) {
- mProto.shortName = shortName == null ? "" : shortName;
+ public void setShortName(String shortName) {
+ mProto.shortName = shortName;
}
- synchronized public void setFrequency(int frequency) {
+ public void setFrequency(int frequency) {
mProto.frequency = frequency;
}
- synchronized public void setModulation(String modulation) {
- mProto.modulation = modulation == null ? "" : modulation;
+ public void setModulation(String modulation) {
+ mProto.modulation = modulation;
}
public boolean hasVideo() {
@@ -322,18 +279,13 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
return mProto.channelId;
}
- synchronized public void setChannelId(long channelId) {
+ public void setChannelId(long channelId) {
mProto.channelId = channelId;
}
public String getDisplayNumber() {
- return getDisplayNumber(true);
- }
-
- public String getDisplayNumber(boolean ignoreZeroMinorNumber) {
- if (mProto.virtualMajor != 0 && (mProto.virtualMinor != 0 || !ignoreZeroMinorNumber)) {
- return String.format("%d%c%d", mProto.virtualMajor, CHANNEL_NUMBER_SEPARATOR,
- mProto.virtualMinor);
+ if (mProto.virtualMajor != 0 && mProto.virtualMinor != 0) {
+ return String.format("%d-%d", mProto.virtualMajor, mProto.virtualMinor);
} else if (mProto.virtualMajor != 0) {
return Integer.toString(mProto.virtualMajor);
} else {
@@ -346,7 +298,7 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
}
@Override
- synchronized public void setHasCaptionTrack() {
+ public void setHasCaptionTrack() {
mProto.hasCaptionTrack = true;
}
@@ -360,7 +312,7 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
return Collections.unmodifiableList(Arrays.asList(mProto.audioTracks));
}
- synchronized public void setAudioTracks(List<AtscAudioTrack> audioTracks) {
+ public void setAudioTracks(List<AtscAudioTrack> audioTracks) {
mProto.audioTracks = audioTracks.toArray(new AtscAudioTrack[audioTracks.size()]);
}
@@ -369,11 +321,11 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
return Collections.unmodifiableList(Arrays.asList(mProto.captionTracks));
}
- synchronized public void setCaptionTracks(List<AtscCaptionTrack> captionTracks) {
+ public void setCaptionTracks(List<AtscCaptionTrack> captionTracks) {
mProto.captionTracks = captionTracks.toArray(new AtscCaptionTrack[captionTracks.size()]);
}
- synchronized public void selectAudioTrack(int index) {
+ public void selectAudioTrack(int index) {
if (0 <= index && index < mProto.audioPids.length) {
mProto.audioTrackIndex = index;
} else {
@@ -381,22 +333,6 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
}
}
- synchronized public void setRecordingProhibited(boolean recordingProhibited) {
- mProto.recordingProhibited = recordingProhibited;
- }
-
- public boolean isRecordingProhibited() {
- return mProto.recordingProhibited;
- }
-
- synchronized public void setVideoFormat(String videoFormat) {
- mProto.videoFormat = videoFormat == null ? "" : videoFormat;
- }
-
- public String getVideoFormat() {
- return mProto.videoFormat;
- }
-
@Override
public String toString() {
switch (mProto.type) {
@@ -423,10 +359,7 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
if (ret != 0) {
return ret;
}
- ret = StringUtils.compare(getName(), channel.getName());
- if (ret != 0) {
- return ret;
- }
+
// For FileTsStreamer, file paths should be compared.
return StringUtils.compare(getFilepath(), channel.getFilepath());
}
@@ -441,19 +374,12 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
@Override
public int hashCode() {
- return Objects.hash(getFrequency(), getProgramNumber(), getName(), getFilepath());
+ return Objects.hash(getFrequency(), getProgramNumber(), getFilepath());
}
// Serialization
- synchronized public byte[] toByteArray() {
- try {
- return MessageNano.toByteArray(mProto);
- } catch (Exception e) {
- // Retry toByteArray. b/34197766
- Log.w(TAG, "TunerChannel or its variables are modified in multiple thread without lock",
- e);
- return MessageNano.toByteArray(mProto);
- }
+ public byte[] toByteArray() {
+ return MessageNano.toByteArray(mProto);
}
public static TunerChannel parseFrom(byte[] data) {
diff --git a/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java b/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java
index 89641530..c105e222 100644
--- a/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java
+++ b/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java
@@ -23,29 +23,17 @@ import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
-import android.util.Pair;
+import com.google.android.exoplayer.C;
import com.google.android.exoplayer.MediaFormat;
import com.google.android.exoplayer.MediaFormatHolder;
import com.google.android.exoplayer.SampleHolder;
+import com.google.android.exoplayer.SampleSource;
+import com.google.android.exoplayer.extractor.ExtractorSampleSource;
+import com.google.android.exoplayer.extractor.ExtractorSampleSource.EventListener;
+import com.google.android.exoplayer.upstream.Allocator;
import com.google.android.exoplayer.upstream.DataSource;
-import com.google.android.exoplayer2.C;
-import com.google.android.exoplayer2.Format;
-import com.google.android.exoplayer2.FormatHolder;
-import com.google.android.exoplayer2.Timeline;
-import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
-import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
-import com.google.android.exoplayer2.source.ExtractorMediaSource;
-import com.google.android.exoplayer2.source.ExtractorMediaSource.EventListener;
-import com.google.android.exoplayer2.source.MediaPeriod;
-import com.google.android.exoplayer2.source.MediaSource;
-import com.google.android.exoplayer2.source.SampleStream;
-import com.google.android.exoplayer2.source.TrackGroupArray;
-import com.google.android.exoplayer2.trackselection.FixedTrackSelection;
-import com.google.android.exoplayer2.trackselection.TrackSelection;
-import com.google.android.exoplayer2.upstream.DataSpec;
-import com.google.android.exoplayer2.upstream.DefaultAllocator;
-import com.android.tv.tuner.exoplayer.ac3.Ac3DefaultTrackRenderer;
+import com.google.android.exoplayer.upstream.DefaultAllocator;
import com.android.tv.tuner.exoplayer.buffer.BufferManager;
import com.android.tv.tuner.exoplayer.buffer.RecordingSampleBuffer;
import com.android.tv.tuner.exoplayer.buffer.SimpleSampleBuffer;
@@ -54,11 +42,10 @@ import com.android.tv.tuner.tvinput.PlaybackBufferListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
-import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
/**
* A class that extracts samples from a live broadcast stream while storing the sample on the disk.
@@ -67,7 +54,11 @@ import java.util.concurrent.atomic.AtomicBoolean;
public class ExoPlayerSampleExtractor implements SampleExtractor {
private static final String TAG = "ExoPlayerSampleExtracto";
- private static final int INVALID_TRACK_INDEX = -1;
+ // Buffer segment size for memory allocator. Copied from demo implementation of ExoPlayer.
+ private static final int BUFFER_SEGMENT_SIZE_IN_BYTES = 64 * 1024;
+ // Buffer segment count for sample source. Copied from demo implementation of ExoPlayer.
+ private static final int BUFFER_SEGMENT_COUNT = 256;
+
private final HandlerThread mSourceReaderThread;
private final long mId;
@@ -79,69 +70,36 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
private AtomicBoolean mOnCompletionCalled = new AtomicBoolean();
private IOException mExceptionOnPrepare;
private List<MediaFormat> mTrackFormats;
- private int mVideoTrackIndex = INVALID_TRACK_INDEX;
- private boolean mVideoTrackMet;
- private long mBaseSamplePts = Long.MIN_VALUE;
private HashMap<Integer, Long> mLastExtractedPositionUsMap = new HashMap<>();
- private final List<Pair<Integer, SampleHolder>> mPendingSamples = new LinkedList<>();
private OnCompletionListener mOnCompletionListener;
private Handler mOnCompletionListenerHandler;
private IOException mError;
- public ExoPlayerSampleExtractor(Uri uri, final DataSource source, BufferManager bufferManager,
+ public ExoPlayerSampleExtractor(Uri uri, DataSource source, BufferManager bufferManager,
PlaybackBufferListener bufferListener, boolean isRecording) {
// It'll be used as a timeshift file chunk name's prefix.
mId = System.currentTimeMillis();
+ Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE_IN_BYTES);
EventListener eventListener = new EventListener() {
+
@Override
- public void onLoadError(IOException error) {
- mError = error;
+ public void onLoadError(int sourceId, IOException e) {
+ mError = e;
}
};
mSourceReaderThread = new HandlerThread("SourceReaderThread");
- mSourceReaderWorker = new SourceReaderWorker(new ExtractorMediaSource(uri,
- new com.google.android.exoplayer2.upstream.DataSource.Factory() {
- @Override
- public com.google.android.exoplayer2.upstream.DataSource createDataSource() {
- // Returns an adapter implementation for ExoPlayer V2 DataSource interface.
- return new com.google.android.exoplayer2.upstream.DataSource() {
- @Override
- public long open(DataSpec dataSpec) throws IOException {
- return source.open(
- new com.google.android.exoplayer.upstream.DataSpec(
- dataSpec.uri, dataSpec.postBody,
- dataSpec.absoluteStreamPosition, dataSpec.position,
- dataSpec.length, dataSpec.key, dataSpec.flags));
- }
-
- @Override
- public int read(byte[] buffer, int offset, int readLength)
- throws IOException {
- return source.read(buffer, offset, readLength);
- }
-
- @Override
- public Uri getUri() {
- return null;
- }
-
- @Override
- public void close() throws IOException {
- source.close();
- }
- };
- }
- },
- new DefaultExtractorsFactory(),
+ mSourceReaderWorker = new SourceReaderWorker(new ExtractorSampleSource(uri, source,
+ allocator, BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE_IN_BYTES,
// Do not create a handler if we not on a looper. e.g. test.
- Looper.myLooper() != null ? new Handler() : null, eventListener));
+ Looper.myLooper() != null ? new Handler() : null,
+ eventListener, 0));
if (isRecording) {
mSampleBuffer = new RecordingSampleBuffer(bufferManager, bufferListener, false,
RecordingSampleBuffer.BUFFER_REASON_RECORDING);
} else {
- if (bufferManager == null) {
+ if (bufferManager == null || bufferManager.isDisabled()) {
mSampleBuffer = new SimpleSampleBuffer(bufferListener);
} else {
mSampleBuffer = new RecordingSampleBuffer(bufferManager, bufferListener, true,
@@ -156,141 +114,43 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
mOnCompletionListenerHandler = handler;
}
- private class SourceReaderWorker implements Handler.Callback, MediaPeriod.Callback {
+ private class SourceReaderWorker implements Handler.Callback {
public static final int MSG_PREPARE = 1;
public static final int MSG_FETCH_SAMPLES = 2;
public static final int MSG_RELEASE = 3;
private static final int RETRY_INTERVAL_MS = 50;
- private final MediaSource mSampleSource;
- private MediaPeriod mMediaPeriod;
- private SampleStream[] mStreams;
+ private final SampleSource mSampleSource;
+ private SampleSource.SampleSourceReader mSampleSourceReader;
private boolean[] mTrackMetEos;
private boolean mMetEos = false;
private long mCurrentPosition;
- private DecoderInputBuffer mDecoderInputBuffer;
- private SampleHolder mSampleHolder;
- private boolean mPrepareRequested;
- public SourceReaderWorker(MediaSource sampleSource) {
+ public SourceReaderWorker(SampleSource sampleSource) {
mSampleSource = sampleSource;
- mSampleSource.prepareSource(null, false, new MediaSource.Listener() {
- @Override
- public void onSourceInfoRefreshed(Timeline timeline, Object manifest) {
- // Dynamic stream change is not supported yet. b/28169263
- // For now, this will cause EOS and playback reset.
- }
- });
- mDecoderInputBuffer = new DecoderInputBuffer(
- DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL);
- mSampleHolder = new SampleHolder(SampleHolder.BUFFER_REPLACEMENT_MODE_NORMAL);
- }
-
- MediaFormat convertFormat(Format format) {
- if (format.sampleMimeType.startsWith("audio/")) {
- return MediaFormat.createAudioFormat(format.id, format.sampleMimeType,
- format.bitrate, format.maxInputSize,
- com.google.android.exoplayer.C.UNKNOWN_TIME_US, format.channelCount,
- format.sampleRate, format.initializationData, format.language,
- format.pcmEncoding);
- } else if (format.sampleMimeType.startsWith("video/")) {
- return MediaFormat.createVideoFormat(
- format.id, format.sampleMimeType, format.bitrate, format.maxInputSize,
- com.google.android.exoplayer.C.UNKNOWN_TIME_US, format.width, format.height,
- format.initializationData, format.rotationDegrees,
- format.pixelWidthHeightRatio, format.projectionData, format.stereoMode);
- } else if (format.sampleMimeType.endsWith("/cea-608")
- || format.sampleMimeType.startsWith("text/")) {
- return MediaFormat.createTextFormat(
- format.id, format.sampleMimeType, format.bitrate,
- com.google.android.exoplayer.C.UNKNOWN_TIME_US, format.language);
- } else {
- return MediaFormat.createFormatForMimeType(
- format.id, format.sampleMimeType, format.bitrate,
- com.google.android.exoplayer.C.UNKNOWN_TIME_US);
- }
- }
-
- @Override
- public void onPrepared(MediaPeriod mediaPeriod) {
- if (mMediaPeriod == null) {
- // This instance is already released while the extractor is preparing.
- return;
- }
- TrackSelection.Factory selectionFactory = new FixedTrackSelection.Factory();
- TrackGroupArray trackGroupArray = mMediaPeriod.getTrackGroups();
- TrackSelection[] selections = new TrackSelection[trackGroupArray.length];
- for (int i = 0; i < selections.length; ++i) {
- selections[i] = selectionFactory.createTrackSelection(trackGroupArray.get(i), 0);
- }
- boolean retain[] = new boolean[trackGroupArray.length];
- boolean reset[] = new boolean[trackGroupArray.length];
- mStreams = new SampleStream[trackGroupArray.length];
- mMediaPeriod.selectTracks(selections, retain, mStreams, reset, 0);
- if (mTrackFormats == null) {
- int trackCount = trackGroupArray.length;
- mTrackMetEos = new boolean[trackCount];
- List<MediaFormat> trackFormats = new ArrayList<>();
- int videoTrackCount = 0;
- for (int i = 0; i < trackCount; i++) {
- Format format = trackGroupArray.get(i).getFormat(0);
- if (format.sampleMimeType.startsWith("video/")) {
- videoTrackCount++;
- mVideoTrackIndex = i;
- }
- trackFormats.add(convertFormat(format));
- }
- if (videoTrackCount > 1) {
- // Disable dropping samples when there are multiple video tracks.
- mVideoTrackIndex = INVALID_TRACK_INDEX;
- }
- mTrackFormats = trackFormats;
- List<String> ids = new ArrayList<>();
- for (int i = 0; i < mTrackFormats.size(); i++) {
- ids.add(String.format(Locale.ENGLISH, "%s_%x", Long.toHexString(mId), i));
- }
- try {
- mSampleBuffer.init(ids, mTrackFormats);
- } catch (IOException e) {
- // In this case, we will not schedule any further operation.
- // mExceptionOnPrepare will be notified to ExoPlayer, and ExoPlayer will
- // call release() eventually.
- mExceptionOnPrepare = e;
- return;
- }
- mSourceReaderHandler.sendEmptyMessage(MSG_FETCH_SAMPLES);
- mPrepared = true;
- }
- }
-
- @Override
- public void onContinueLoadingRequested(MediaPeriod source) {
- source.continueLoading(mCurrentPosition);
}
@Override
public boolean handleMessage(Message message) {
switch (message.what) {
case MSG_PREPARE:
- if (!mPrepareRequested) {
- mPrepareRequested = true;
- mMediaPeriod = mSampleSource.createPeriod(0,
- new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE), 0);
- mMediaPeriod.prepare(this);
- try {
- mMediaPeriod.maybeThrowPrepareError();
- } catch (IOException e) {
- mError = e;
- }
+ mPrepared = prepare();
+ if (!mPrepared && mExceptionOnPrepare == null) {
+ mSourceReaderHandler
+ .sendEmptyMessageDelayed(MSG_PREPARE, RETRY_INTERVAL_MS);
+ } else{
+ mSourceReaderHandler.sendEmptyMessage(MSG_FETCH_SAMPLES);
}
return true;
case MSG_FETCH_SAMPLES:
boolean didSomething = false;
+ SampleHolder sample = new SampleHolder(
+ SampleHolder.BUFFER_REPLACEMENT_MODE_NORMAL);
ConditionVariable conditionVariable = new ConditionVariable();
- int trackCount = mStreams.length;
+ int trackCount = mSampleSourceReader.getTrackCount();
for (int i = 0; i < trackCount; ++i) {
- if (!mTrackMetEos[i] && C.RESULT_NOTHING_READ
- != fetchSample(i, mSampleHolder, conditionVariable)) {
+ if (!mTrackMetEos[i] && SampleSource.NOTHING_READ
+ != fetchSample(i, sample, conditionVariable)) {
if (mMetEos) {
// If mMetEos was on during fetchSample() due to an error,
// fetching from other tracks is not necessary.
@@ -299,7 +159,6 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
didSomething = true;
}
}
- mMediaPeriod.continueLoading(mCurrentPosition);
if (!mMetEos) {
if (didSomething) {
mSourceReaderHandler.sendEmptyMessage(MSG_FETCH_SAMPLES);
@@ -312,10 +171,17 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
}
return true;
case MSG_RELEASE:
- if (mMediaPeriod != null) {
- mSampleSource.releasePeriod(mMediaPeriod);
- mSampleSource.releaseSource();
- mMediaPeriod = null;
+ if (mSampleSourceReader != null) {
+ if (mPrepared) {
+ // ExtractorSampleSource expects all the tracks should be disabled
+ // before releasing.
+ int count = mSampleSourceReader.getTrackCount();
+ for (int i = 0; i < count; ++i) {
+ mSampleSourceReader.disable(i);
+ }
+ }
+ mSampleSourceReader.release();
+ mSampleSourceReader = null;
}
cleanUp();
mSourceReaderHandler.removeCallbacksAndMessages(null);
@@ -324,109 +190,91 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
return false;
}
+ private boolean prepare() {
+ if (mSampleSourceReader == null) {
+ mSampleSourceReader = mSampleSource.register();
+ }
+ if(!mSampleSourceReader.prepare(0)) {
+ return false;
+ }
+ if (mTrackFormats == null) {
+ int trackCount = mSampleSourceReader.getTrackCount();
+ mTrackMetEos = new boolean[trackCount];
+ List<MediaFormat> trackFormats = new ArrayList<>();
+ for (int i = 0; i < trackCount; i++) {
+ trackFormats.add(mSampleSourceReader.getFormat(i));
+ mSampleSourceReader.enable(i, 0);
+
+ }
+ mTrackFormats = trackFormats;
+ List<String> ids = new ArrayList<>();
+ for (int i = 0; i < mTrackFormats.size(); i++) {
+ ids.add(String.format(Locale.ENGLISH, "%s_%x", Long.toHexString(mId), i));
+ }
+ try {
+ mSampleBuffer.init(ids, mTrackFormats);
+ } catch (IOException e) {
+ // In this case, we will not schedule any further operation.
+ // mExceptionOnPrepare will be notified to ExoPlayer, and ExoPlayer will
+ // call release() eventually.
+ mExceptionOnPrepare = e;
+ return false;
+ }
+ }
+ return true;
+ }
+
private int fetchSample(int track, SampleHolder sample,
ConditionVariable conditionVariable) {
- FormatHolder dummyFormatHolder = new FormatHolder();
- mDecoderInputBuffer.clear();
- int ret = mStreams[track].readData(dummyFormatHolder, mDecoderInputBuffer);
- if (ret == C.RESULT_BUFFER_READ
- // Double-check if the extractor provided the data to prevent NPE. b/33758354
- && mDecoderInputBuffer.data != null) {
- if (mCurrentPosition < mDecoderInputBuffer.timeUs) {
- mCurrentPosition = mDecoderInputBuffer.timeUs;
+ mSampleSourceReader.continueBuffering(track, mCurrentPosition);
+
+ MediaFormatHolder formatHolder = new MediaFormatHolder();
+ sample.clearData();
+ int ret = mSampleSourceReader.readData(track, mCurrentPosition, formatHolder, sample);
+ if (ret == SampleSource.SAMPLE_READ) {
+ if (mCurrentPosition < sample.timeUs) {
+ mCurrentPosition = sample.timeUs;
}
try {
Long lastExtractedPositionUs = mLastExtractedPositionUsMap.get(track);
if (lastExtractedPositionUs == null) {
- mLastExtractedPositionUsMap.put(track, mDecoderInputBuffer.timeUs);
+ mLastExtractedPositionUsMap.put(track, sample.timeUs);
} else {
mLastExtractedPositionUsMap.put(track,
- Math.max(lastExtractedPositionUs, mDecoderInputBuffer.timeUs));
+ Math.max(lastExtractedPositionUs, sample.timeUs));
}
- queueSample(track, conditionVariable);
+ queueSample(track, sample, conditionVariable);
} catch (IOException e) {
mLastExtractedPositionUsMap.clear();
mMetEos = true;
mSampleBuffer.setEos();
}
- } else if (ret == C.RESULT_END_OF_INPUT) {
+ } else if (ret == SampleSource.END_OF_STREAM) {
mTrackMetEos[track] = true;
for (int i = 0; i < mTrackMetEos.length; ++i) {
if (!mTrackMetEos[i]) {
break;
}
- if (i == mTrackMetEos.length - 1) {
+ if (i == mTrackMetEos.length -1) {
mMetEos = true;
mSampleBuffer.setEos();
}
}
}
- // TODO: Handle C.RESULT_FORMAT_READ for dynamic resolution change. b/28169263
+ // TODO: Handle SampleSource.FORMAT_READ for dynamic resolution change. b/28169263
return ret;
}
+ }
- private void queueSample(int index, ConditionVariable conditionVariable)
- throws IOException {
- if (mVideoTrackIndex != INVALID_TRACK_INDEX) {
- if (!mVideoTrackMet) {
- if (index != mVideoTrackIndex) {
- SampleHolder sample =
- new SampleHolder(SampleHolder.BUFFER_REPLACEMENT_MODE_NORMAL);
- mSampleHolder.flags =
- (mDecoderInputBuffer.isKeyFrame()
- ? com.google.android.exoplayer.C.SAMPLE_FLAG_SYNC : 0)
- | (mDecoderInputBuffer.isDecodeOnly()
- ? com.google.android.exoplayer.C.SAMPLE_FLAG_DECODE_ONLY
- : 0);
- sample.timeUs = mDecoderInputBuffer.timeUs;
- sample.size = mDecoderInputBuffer.data.position();
- sample.ensureSpaceForWrite(sample.size);
- mDecoderInputBuffer.flip();
- sample.data.position(0);
- sample.data.put(mDecoderInputBuffer.data);
- sample.data.flip();
- mPendingSamples.add(new Pair<>(index, sample));
- return;
- }
- mVideoTrackMet = true;
- mBaseSamplePts =
- mDecoderInputBuffer.timeUs
- - Ac3DefaultTrackRenderer.INITIAL_AUDIO_BUFFERING_TIME_US;
- for (Pair<Integer, SampleHolder> pair : mPendingSamples) {
- if (pair.second.timeUs >= mBaseSamplePts) {
- mSampleBuffer.writeSample(pair.first, pair.second, conditionVariable);
- }
- }
- mPendingSamples.clear();
- } else {
- if (mDecoderInputBuffer.timeUs < mBaseSamplePts
- && mVideoTrackIndex != index) {
- return;
- }
- }
- }
- // Copy the decoder input to the sample holder.
- mSampleHolder.clearData();
- mSampleHolder.flags =
- (mDecoderInputBuffer.isKeyFrame()
- ? com.google.android.exoplayer.C.SAMPLE_FLAG_SYNC : 0)
- | (mDecoderInputBuffer.isDecodeOnly()
- ? com.google.android.exoplayer.C.SAMPLE_FLAG_DECODE_ONLY : 0);
- mSampleHolder.timeUs = mDecoderInputBuffer.timeUs;
- mSampleHolder.size = mDecoderInputBuffer.data.position();
- mSampleHolder.ensureSpaceForWrite(mSampleHolder.size);
- mDecoderInputBuffer.flip();
- mSampleHolder.data.position(0);
- mSampleHolder.data.put(mDecoderInputBuffer.data);
- mSampleHolder.data.flip();
- long writeStartTimeNs = SystemClock.elapsedRealtimeNanos();
- mSampleBuffer.writeSample(index, mSampleHolder, conditionVariable);
-
- // Checks whether the storage has enough bandwidth for recording samples.
- if (mSampleBuffer.isWriteSpeedSlow(mSampleHolder.size,
- SystemClock.elapsedRealtimeNanos() - writeStartTimeNs)) {
- mSampleBuffer.handleWriteSpeedSlow();
- }
+ private void queueSample(int index, SampleHolder sample, ConditionVariable conditionVariable)
+ throws IOException {
+ long writeStartTimeNs = SystemClock.elapsedRealtimeNanos();
+ mSampleBuffer.writeSample(index, sample, conditionVariable);
+
+ // Checks whether the storage has enough bandwidth for recording samples.
+ if (mSampleBuffer.isWriteSpeedSlow(sample.size,
+ SystemClock.elapsedRealtimeNanos() - writeStartTimeNs)) {
+ mSampleBuffer.handleWriteSpeedSlow();
}
}
@@ -480,7 +328,7 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
}
@Override
- public boolean continueBuffering(long positionUs) {
+ public boolean continueBuffering(long positionUs) {
return mSampleBuffer.continueBuffering(positionUs);
}
@@ -538,14 +386,12 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
}
private long getLastExtractedPositionUs() {
- long lastExtractedPositionUs = Long.MIN_VALUE;
- for (Map.Entry<Integer, Long> entry : mLastExtractedPositionUsMap.entrySet()) {
- if (mVideoTrackIndex != entry.getKey()) {
- lastExtractedPositionUs = Math.max(lastExtractedPositionUs, entry.getValue());
- }
+ long lastExtractedPositionUs = Long.MAX_VALUE;
+ for (long value : mLastExtractedPositionUsMap.values()) {
+ lastExtractedPositionUs = Math.min(lastExtractedPositionUs, value);
}
- if (lastExtractedPositionUs == Long.MIN_VALUE) {
- lastExtractedPositionUs = com.google.android.exoplayer.C.UNKNOWN_TIME_US;
+ if (lastExtractedPositionUs == Long.MAX_VALUE) {
+ lastExtractedPositionUs = C.UNKNOWN_TIME_US;
}
return lastExtractedPositionUs;
}
diff --git a/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java b/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java
index b7e42a7c..ec7b4b16 100644
--- a/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java
+++ b/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java
@@ -25,6 +25,7 @@ import com.android.tv.tuner.exoplayer.buffer.RecordingSampleBuffer;
import com.android.tv.tuner.tvinput.PlaybackBufferListener;
import android.os.Handler;
+import android.util.Pair;
import java.io.IOException;
import java.util.ArrayList;
@@ -60,17 +61,18 @@ public class FileSampleExtractor implements SampleExtractor{
@Override
public boolean prepare() throws IOException {
- List<BufferManager.TrackFormat> trackFormatList = mBufferManager.readTrackInfoFiles();
- if (trackFormatList == null || trackFormatList.isEmpty()) {
+ ArrayList<Pair<String, android.media.MediaFormat>> trackInfos =
+ mBufferManager.readTrackInfoFiles();
+ if (trackInfos == null || trackInfos.isEmpty()) {
throw new IOException("Cannot find meta files for the recording.");
}
- mTrackCount = trackFormatList.size();
+ mTrackCount = trackInfos.size();
List<String> ids = new ArrayList<>();
mTrackFormats.clear();
for (int i = 0; i < mTrackCount; ++i) {
- BufferManager.TrackFormat trackFormat = trackFormatList.get(i);
- ids.add(trackFormat.trackId);
- mTrackFormats.add(MediaFormatUtil.createMediaFormat(trackFormat.format));
+ Pair<String, android.media.MediaFormat> pair = trackInfos.get(i);
+ ids.add(pair.first);
+ mTrackFormats.add(MediaFormatUtil.createMediaFormat(pair.second));
}
mSampleBuffer = new RecordingSampleBuffer(mBufferManager, mBufferListener, true,
RecordingSampleBuffer.BUFFER_REASON_RECORDED_PLAYBACK);
diff --git a/src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java b/src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java
index ba0edf20..381b22e9 100644
--- a/src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java
+++ b/src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java
@@ -39,8 +39,8 @@ import com.android.tv.common.SoftPreconditions;
import com.android.tv.tuner.data.Cea708Data;
import com.android.tv.tuner.data.Cea708Data.CaptionEvent;
import com.android.tv.tuner.data.TunerChannel;
-import com.android.tv.tuner.exoplayer.ac3.Ac3DefaultTrackRenderer;
-import com.android.tv.tuner.exoplayer.ac3.Ac3MediaCodecTrackRenderer;
+import com.android.tv.tuner.exoplayer.ac3.Ac3PassthroughTrackRenderer;
+import com.android.tv.tuner.exoplayer.ac3.Ac3TrackRenderer;
import com.android.tv.tuner.source.TsDataSource;
import com.android.tv.tuner.source.TsDataSourceManager;
import com.android.tv.tuner.tvinput.EventDetector;
@@ -48,12 +48,11 @@ import com.android.tv.tuner.tvinput.EventDetector;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-/** MPEG-2 TS stream player implementation using ExoPlayer. */
-public class MpegTsPlayer
- implements ExoPlayer.Listener,
- MediaCodecVideoTrackRenderer.EventListener,
- Ac3DefaultTrackRenderer.EventListener,
- Ac3MediaCodecTrackRenderer.Ac3EventListener {
+/**
+ * MPEG-2 TS stream player implementation using ExoPlayer.
+ */
+public class MpegTsPlayer implements ExoPlayer.Listener, MediaCodecVideoTrackRenderer.EventListener,
+ Ac3PassthroughTrackRenderer.EventListener, Ac3TrackRenderer.Ac3EventListener {
private int mCaptionServiceNumber = Cea708Data.EMPTY_SERVICE_NUMBER;
/**
@@ -305,10 +304,8 @@ public class MpegTsPlayer
SoftPreconditions.checkState(supportSmoothTrickPlay(playbackParams.getSpeed()));
mPlayer.setPlayWhenReady(true);
mTrickplayRunning = true;
- if (mAudioRenderer instanceof Ac3DefaultTrackRenderer) {
- mPlayer.sendMessage(
- mAudioRenderer,
- Ac3DefaultTrackRenderer.MSG_SET_PLAYBACK_SPEED,
+ if (mAudioRenderer instanceof Ac3PassthroughTrackRenderer) {
+ mPlayer.sendMessage(mAudioRenderer, Ac3PassthroughTrackRenderer.MSG_SET_PLAYBACK_SPEED,
playbackParams.getSpeed());
} else {
mPlayer.sendMessage(mAudioRenderer,
@@ -320,9 +317,10 @@ public class MpegTsPlayer
private void stopSmoothTrickplay(boolean calledBySeek) {
if (mTrickplayRunning) {
mTrickplayRunning = false;
- if (mAudioRenderer instanceof Ac3DefaultTrackRenderer) {
- mPlayer.sendMessage(
- mAudioRenderer, Ac3DefaultTrackRenderer.MSG_SET_PLAYBACK_SPEED, 1.0f);
+ if (mAudioRenderer instanceof Ac3PassthroughTrackRenderer) {
+ mPlayer.sendMessage(mAudioRenderer,
+ Ac3PassthroughTrackRenderer.MSG_SET_PLAYBACK_SPEED,
+ 1.0f);
} else {
mPlayer.sendMessage(mAudioRenderer,
MediaCodecAudioTrackRenderer.MSG_SET_PLAYBACK_PARAMS,
@@ -425,8 +423,8 @@ public class MpegTsPlayer
*/
public void setVolume(float volume) {
mVolume = volume;
- if (mAudioRenderer instanceof Ac3DefaultTrackRenderer) {
- mPlayer.sendMessage(mAudioRenderer, Ac3DefaultTrackRenderer.MSG_SET_VOLUME, volume);
+ if (mAudioRenderer instanceof Ac3PassthroughTrackRenderer) {
+ mPlayer.sendMessage(mAudioRenderer, Ac3PassthroughTrackRenderer.MSG_SET_VOLUME, volume);
} else {
mPlayer.sendMessage(mAudioRenderer, MediaCodecAudioTrackRenderer.MSG_SET_VOLUME,
volume);
@@ -439,9 +437,9 @@ public class MpegTsPlayer
* @param enable enables the audio when {@code true}, disables otherwise.
*/
public void setAudioTrack(boolean enable) {
- if (mAudioRenderer instanceof Ac3DefaultTrackRenderer) {
- mPlayer.sendMessage(
- mAudioRenderer, Ac3DefaultTrackRenderer.MSG_SET_AUDIO_TRACK, enable ? 1 : 0);
+ if (mAudioRenderer instanceof Ac3PassthroughTrackRenderer) {
+ mPlayer.sendMessage(mAudioRenderer, Ac3PassthroughTrackRenderer.MSG_SET_AUDIO_TRACK,
+ enable ? 1 : 0);
} else {
mPlayer.sendMessage(mAudioRenderer, MediaCodecAudioTrackRenderer.MSG_SET_VOLUME,
enable ? mVolume : 0.0f);
@@ -497,28 +495,6 @@ public class MpegTsPlayer
}
/**
- * Returns the index of the currently selected track for the specified renderer.
- *
- * @param rendererIndex The index of the renderer.
- * @return The selected track. A negative value or a value greater than or equal to the renderer's
- * track count indicates that the renderer is disabled.
- */
- public int getSelectedTrack(int rendererIndex) {
- return mPlayer.getSelectedTrack(rendererIndex);
- }
-
- /**
- * Returns the format of a track.
- *
- * @param rendererIndex The index of the renderer.
- * @param trackIndex The index of the track.
- * @return The format of the track.
- */
- public MediaFormat getTrackFormat(int rendererIndex, int trackIndex) {
- return mPlayer.getTrackFormat(rendererIndex, trackIndex);
- }
-
- /**
* Gets the main handler of the player.
*/
/* package */ Handler getMainHandler() {
@@ -674,4 +650,4 @@ public class MpegTsPlayer
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java b/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java
index a1a97d3d..0e46c9cf 100644
--- a/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java
+++ b/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java
@@ -21,10 +21,9 @@ import android.content.Context;
import com.google.android.exoplayer.SampleSource;
import com.google.android.exoplayer.TrackRenderer;
import com.google.android.exoplayer.upstream.DataSource;
-import com.android.tv.Features;
import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilder;
import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilderCallback;
-import com.android.tv.tuner.exoplayer.ac3.Ac3DefaultTrackRenderer;
+import com.android.tv.tuner.exoplayer.ac3.Ac3PassthroughTrackRenderer;
import com.android.tv.tuner.exoplayer.buffer.BufferManager;
import com.android.tv.tuner.tvinput.PlaybackBufferListener;
@@ -53,12 +52,10 @@ public class MpegTsRendererBuilder implements RendererBuilder {
SampleSource sampleSource = new MpegTsSampleSource(extractor);
MpegTsVideoTrackRenderer videoRenderer = new MpegTsVideoTrackRenderer(mContext,
sampleSource, mpegTsPlayer.getMainHandler(), mpegTsPlayer);
- // TODO: Only using Ac3DefaultTrackRenderer for A/V sync issue. We will use
- // {@link Ac3MediaCodecTrackRenderer} when we use ExoPlayer's extractor.
- TrackRenderer audioRenderer =
- new Ac3DefaultTrackRenderer(
- sampleSource, mpegTsPlayer.getMainHandler(), mpegTsPlayer,
- !Features.AC3_SOFTWARE_DECODE.isEnabled(mContext));
+ // TODO: Only using Ac3PassthroughTrackRenderer for A/V sync issue. We will use
+ // {@link Ac3TrackRenderer} when we use ExoPlayer's extractor.
+ TrackRenderer audioRenderer = new Ac3PassthroughTrackRenderer(sampleSource,
+ mpegTsPlayer.getMainHandler(), mpegTsPlayer);
Cea708TextTrackRenderer textRenderer = new Cea708TextTrackRenderer(sampleSource);
TrackRenderer[] renderers = new TrackRenderer[MpegTsPlayer.RENDERER_COUNT];
diff --git a/src/com/android/tv/tuner/exoplayer/ac3/Ac3DefaultTrackRenderer.java b/src/com/android/tv/tuner/exoplayer/ac3/Ac3PassthroughTrackRenderer.java
index d442fde8..9dae2e34 100644
--- a/src/com/android/tv/tuner/exoplayer/ac3/Ac3DefaultTrackRenderer.java
+++ b/src/com/android/tv/tuner/exoplayer/ac3/Ac3PassthroughTrackRenderer.java
@@ -23,15 +23,16 @@ import android.util.Log;
import com.google.android.exoplayer.CodecCounters;
import com.google.android.exoplayer.ExoPlaybackException;
import com.google.android.exoplayer.MediaClock;
+import com.google.android.exoplayer.MediaCodecAudioTrackRenderer;
import com.google.android.exoplayer.MediaFormat;
import com.google.android.exoplayer.MediaFormatHolder;
+import com.google.android.exoplayer.MediaFormatUtil;
import com.google.android.exoplayer.SampleHolder;
import com.google.android.exoplayer.SampleSource;
import com.google.android.exoplayer.TrackRenderer;
import com.google.android.exoplayer.audio.AudioTrack;
import com.google.android.exoplayer.util.Assertions;
import com.google.android.exoplayer.util.MimeTypes;
-import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
import com.android.tv.tuner.tvinput.TunerDebug;
import java.io.IOException;
@@ -39,9 +40,9 @@ import java.nio.ByteBuffer;
import java.util.ArrayList;
/**
- * Decodes and renders AC3 audio. Supports passthrough playback and ffmpeg based software decoding.
+ * Decodes and renders AC3 audio.
*/
-public class Ac3DefaultTrackRenderer extends TrackRenderer implements MediaClock {
+public class Ac3PassthroughTrackRenderer extends TrackRenderer implements MediaClock {
public static final int MSG_SET_VOLUME = 10000;
public static final int MSG_SET_AUDIO_TRACK = MSG_SET_VOLUME + 1;
public static final int MSG_SET_PLAYBACK_SPEED = MSG_SET_VOLUME + 2;
@@ -50,14 +51,7 @@ public class Ac3DefaultTrackRenderer extends TrackRenderer implements MediaClock
// One AC3 sample has 1536 frames, and its duration is 32ms.
public static final long AC3_SAMPLE_DURATION_US = 32000;
- // This is around 150ms, 150ms is big enough not to under-run AudioTrack,
- // and 150ms is also small enough to fill the buffer rapidly.
- static int BUFFERED_SAMPLES_IN_AUDIOTRACK = 5;
- public static final long INITIAL_AUDIO_BUFFERING_TIME_US =
- BUFFERED_SAMPLES_IN_AUDIOTRACK * AC3_SAMPLE_DURATION_US;
-
-
- private static final String TAG = "Ac3DefaultTrackRenderer";
+ private static final String TAG = "Ac3PassthroughTrackRenderer";
private static final boolean DEBUG = false;
/**
@@ -99,8 +93,6 @@ public class Ac3DefaultTrackRenderer extends TrackRenderer implements MediaClock
private final AudioClock mAudioClock;
private MediaFormat mFormat;
- private boolean mFormatConfigured;
- private int mSampleSize;
private final ByteBuffer mOutputBuffer;
private boolean mOutputReady;
private int mTrackIndex;
@@ -114,15 +106,10 @@ public class Ac3DefaultTrackRenderer extends TrackRenderer implements MediaClock
private long mInterpolatedTimeUs;
private long mPreviousPositionUs;
private boolean mIsStopped;
- private boolean mEnabled = true;
- private boolean mIsMuted;
private ArrayList<Integer> mTracksIndex;
- public Ac3DefaultTrackRenderer(
- SampleSource source,
- Handler eventHandler,
- EventListener listener,
- boolean usePassthrough) {
+ public Ac3PassthroughTrackRenderer(SampleSource source, Handler eventHandler,
+ EventListener listener) {
mSource = source.register();
mEventHandler = eventHandler;
mEventListener = listener;
@@ -338,38 +325,14 @@ public class Ac3DefaultTrackRenderer extends TrackRenderer implements MediaClock
}
}
- private MediaFormat convertMediaFormatToRaw(MediaFormat format) {
- return MediaFormat.createAudioFormat(
- format.trackId,
- MimeTypes.AUDIO_RAW,
- format.bitrate,
- format.maxInputSize,
- format.durationUs,
- format.channelCount,
- format.sampleRate,
- format.initializationData,
- format.language);
- }
-
private void onInputFormatChanged(MediaFormatHolder formatHolder)
throws ExoPlaybackException {
- mFormat = formatHolder.format;
- mFormatConfigured = true;
+ mFormat = formatHolder.format;
if (DEBUG) {
Log.d(TAG, "AudioTrack was configured to FORMAT: " + mFormat.toString());
}
clearDecodeState();
- AUDIO_TRACK.reconfigure(mFormat.getFrameworkMediaFormatV16(), 0);
- }
-
- private void onSampleSizeChanged(int sampleSize) {
- if (DEBUG) {
- Log.d(TAG, "Sample size was changed to : " + sampleSize);
- }
- clearDecodeState();
- int audioBufferSize = sampleSize * BUFFERED_SAMPLES_IN_AUDIOTRACK;
- mSampleSize = sampleSize;
- AUDIO_TRACK.reconfigure(mFormat.getFrameworkMediaFormatV16(), audioBufferSize);
+ AUDIO_TRACK.reconfigure(mFormat.getFrameworkMediaFormatV16());
}
private boolean feedInputBuffer() throws IOException, ExoPlaybackException {
@@ -396,11 +359,8 @@ public class Ac3DefaultTrackRenderer extends TrackRenderer implements MediaClock
return false;
}
default: {
- if (mSampleHolder.size != mSampleSize && mFormatConfigured) {
- onSampleSizeChanged(mSampleHolder.size);
- }
mSampleHolder.data.flip();
- decodeDone(mSampleHolder.data, mSampleHolder.timeUs);
+ decodeDone(mSampleHolder.data, mSampleHolder.timeUs);
return true;
}
}
@@ -551,29 +511,24 @@ public class Ac3DefaultTrackRenderer extends TrackRenderer implements MediaClock
public void handleMessage(int messageType, Object message) throws ExoPlaybackException {
switch (messageType) {
case MSG_SET_VOLUME:
- float volume = (Float) message;
- // Workaround: we cannot mute the audio track by setting the volume to 0, we need to
- // disable the AUDIO_TRACK for this intent. However, enabling/disabling audio track
- // whenever volume is being set might cause side effects, therefore we only handle
- // "explicit mute operations", i.e., only after certain non-zero volume has been
- // set, the subsequent volume setting operations will be consider as mute/un-mute
- // operations and thus enable/disable the audio track.
- if (mIsMuted && volume > 0) {
- mIsMuted = false;
- if (mEnabled) {
- setStatus(true);
- }
- } else if (!mIsMuted && volume == 0) {
- mIsMuted = true;
- if (mEnabled) {
- setStatus(false);
- }
- }
- AUDIO_TRACK.setVolume(volume);
+ AUDIO_TRACK.setVolume((Float) message);
break;
case MSG_SET_AUDIO_TRACK:
- mEnabled = (Integer) message == 1;
- setStatus(mEnabled);
+ boolean enabled = (Integer) message == 1;
+ if (enabled == AUDIO_TRACK.isEnabled()) {
+ return;
+ }
+ if (!enabled) {
+ // mAudioClock can be different from getPositionUs. In order to sync them,
+ // we set mAudioClock.
+ mAudioClock.setPositionUs(getPositionUs());
+ }
+ AUDIO_TRACK.setStatus(enabled);
+ if (enabled) {
+ // When AUDIO_TRACK is enabled, we need to clear AUDIO_TRACK and seek to
+ // the current position. If not, AUDIO_TRACK has the obsolete data.
+ seekTo(mAudioClock.getPositionUs());
+ }
break;
case MSG_SET_PLAYBACK_SPEED:
mAudioClock.setPlaybackSpeed((Float) message);
@@ -582,21 +537,4 @@ public class Ac3DefaultTrackRenderer extends TrackRenderer implements MediaClock
super.handleMessage(messageType, message);
}
}
-
- private void setStatus(boolean enabled) {
- if (enabled == AUDIO_TRACK.isEnabled()) {
- return;
- }
- if (!enabled) {
- // mAudioClock can be different from getPositionUs. In order to sync them,
- // we set mAudioClock.
- mAudioClock.setPositionUs(getPositionUs());
- }
- AUDIO_TRACK.setStatus(enabled);
- if (enabled) {
- // When AUDIO_TRACK is enabled, we need to clear AUDIO_TRACK and seek to
- // the current position. If not, AUDIO_TRACK has the obsolete data.
- seekTo(mAudioClock.getPositionUs());
- }
- }
}
diff --git a/src/com/android/tv/tuner/exoplayer/ac3/Ac3MediaCodecTrackRenderer.java b/src/com/android/tv/tuner/exoplayer/ac3/Ac3TrackRenderer.java
index 604959d1..2bf86b5a 100644
--- a/src/com/android/tv/tuner/exoplayer/ac3/Ac3MediaCodecTrackRenderer.java
+++ b/src/com/android/tv/tuner/exoplayer/ac3/Ac3TrackRenderer.java
@@ -25,14 +25,14 @@ import com.google.android.exoplayer.SampleSource;
/**
* MPEG-2 TS audio track renderer.
- *
- * <p>Since the audio output from {@link android.media.MediaExtractor} contains extra samples at the
- * beginning, using original {@link MediaCodecAudioTrackRenderer} as audio renderer causes
- * asynchronous Audio/Video outputs. This class calculates the offset of audio data and adjust the
- * presentation times to avoid the asynchronous Audio/Video problem.
+ * <p>Since the audio output from {@link android.media.MediaExtractor} contains extra samples at
+ * the beginning, using original {@link MediaCodecAudioTrackRenderer} as audio renderer causes
+ * asynchronous Audio/Video outputs.
+ * This class calculates the offset of audio data and adjust the presentation times to avoid the
+ * asynchronous Audio/Video problem.
*/
-public class Ac3MediaCodecTrackRenderer extends MediaCodecAudioTrackRenderer {
- private final String TAG = "Ac3MediaCodecTrackRenderer";
+public class Ac3TrackRenderer extends MediaCodecAudioTrackRenderer {
+ private final String TAG = "Ac3TrackRenderer";
private final boolean DEBUG = false;
private final Ac3EventListener mListener;
@@ -47,11 +47,8 @@ public class Ac3MediaCodecTrackRenderer extends MediaCodecAudioTrackRenderer {
void onAudioTrackSetPlaybackParamsError(IllegalArgumentException e);
}
- public Ac3MediaCodecTrackRenderer(
- SampleSource source,
- MediaCodecSelector mediaCodecSelector,
- Handler eventHandler,
- EventListener eventListener) {
+ public Ac3TrackRenderer(SampleSource source, MediaCodecSelector mediaCodecSelector,
+ Handler eventHandler, EventListener eventListener) {
super(source, mediaCodecSelector, eventHandler, eventListener);
mListener = (Ac3EventListener) eventListener;
}
diff --git a/src/com/android/tv/tuner/exoplayer/ac3/AudioTrackMonitor.java b/src/com/android/tv/tuner/exoplayer/ac3/AudioTrackMonitor.java
index 6f152490..bfdf08ac 100644
--- a/src/com/android/tv/tuner/exoplayer/ac3/AudioTrackMonitor.java
+++ b/src/com/android/tv/tuner/exoplayer/ac3/AudioTrackMonitor.java
@@ -98,8 +98,8 @@ public class AudioTrackMonitor {
long now = SystemClock.elapsedRealtime();
if (mExpireMs != 0 && now >= mExpireMs) {
if (DEBUG) {
- long sampleDuration =
- (mTotalCount - 1) * Ac3DefaultTrackRenderer.AC3_SAMPLE_DURATION_US / 1000;
+ long sampleDuration = (mTotalCount - 1) *
+ Ac3PassthroughTrackRenderer.AC3_SAMPLE_DURATION_US / 1000;
long totalDuration = now - mStartMs;
StringBuilder ptsBuilder = new StringBuilder();
ptsBuilder.append("PTS received ").append(mSampleCount).append(", ")
diff --git a/src/com/android/tv/tuner/exoplayer/ac3/AudioTrackWrapper.java b/src/com/android/tv/tuner/exoplayer/ac3/AudioTrackWrapper.java
index 393e12c3..bc3c5d00 100644
--- a/src/com/android/tv/tuner/exoplayer/ac3/AudioTrackWrapper.java
+++ b/src/com/android/tv/tuner/exoplayer/ac3/AudioTrackWrapper.java
@@ -18,7 +18,6 @@ package com.android.tv.tuner.exoplayer.ac3;
import android.media.MediaFormat;
-import com.google.android.exoplayer.C;
import com.google.android.exoplayer.audio.AudioTrack;
import java.nio.ByteBuffer;
@@ -29,10 +28,6 @@ import java.nio.ByteBuffer;
* This wrapper class will do nothing in disabled status for those operations.
*/
public class AudioTrackWrapper {
- private static final int PCM16_FRAME_BYTES = 2;
- private static final int AC3_FRAMES_IN_ONE_SAMPLE = 1536;
- private static final int BUFFERED_SAMPLES_IN_AUDIOTRACK =
- Ac3DefaultTrackRenderer.BUFFERED_SAMPLES_IN_AUDIOTRACK;
private final AudioTrack mAudioTrack = new AudioTrack();
private int mAudioSessionID;
private boolean mIsEnabled;
@@ -111,7 +106,7 @@ public class AudioTrackWrapper {
mAudioTrack.setVolume(volume);
}
- public void reconfigure(MediaFormat format, int audioBufferSize) {
+ public void reconfigure(MediaFormat format) {
if (!mIsEnabled || format == null) {
return;
}
@@ -122,9 +117,9 @@ public class AudioTrackWrapper {
try {
pcmEncoding = format.getInteger(MediaFormat.KEY_PCM_ENCODING);
} catch (Exception e) {
- pcmEncoding = C.ENCODING_PCM_16BIT;
+ pcmEncoding = com.google.android.exoplayer.MediaFormat.NO_VALUE;
}
- // TODO: Handle non-AC3.
+ // TODO: Handle non-AC3 or non-passthrough audio.
if (MediaFormat.MIMETYPE_AUDIO_AC3.equalsIgnoreCase(mimeType) && channelCount != 2) {
// Workarounds b/25955476.
// Since all devices and platforms does not support passthrough for non-stereo AC3,
@@ -132,14 +127,7 @@ public class AudioTrackWrapper {
// In other words, the channel count should be always 2.
channelCount = 2;
}
- if (MediaFormat.MIMETYPE_AUDIO_RAW.equalsIgnoreCase(mimeType)) {
- audioBufferSize =
- channelCount
- * PCM16_FRAME_BYTES
- * AC3_FRAMES_IN_ONE_SAMPLE
- * BUFFERED_SAMPLES_IN_AUDIOTRACK;
- }
- mAudioTrack.configure(mimeType, channelCount, sampleRate, pcmEncoding, audioBufferSize);
+ mAudioTrack.configure(mimeType, channelCount, sampleRate, pcmEncoding);
}
public void handleDiscontinuity() {
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java b/src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java
index 112e9dc4..eb596e93 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java
@@ -25,14 +25,13 @@ import android.util.Log;
import android.util.Pair;
import com.google.android.exoplayer.SampleHolder;
-import com.android.tv.common.SoftPreconditions;
import com.android.tv.tuner.exoplayer.SampleExtractor;
import com.android.tv.util.Utils;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.ConcurrentModificationException;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
@@ -60,8 +59,7 @@ public class BufferManager {
private final SampleChunk.SampleChunkCreator mSampleChunkCreator;
// Maps from track name to a map which maps from starting position to {@link SampleChunk}.
- private final Map<String, SortedMap<Long, Pair<SampleChunk, Integer>>> mChunkMap =
- new ArrayMap<>();
+ private final Map<String, SortedMap<Long, SampleChunk>> mChunkMap = new ArrayMap<>();
private final Map<String, Long> mStartPositionMap = new ArrayMap<>();
private final Map<String, ChunkEvictedListener> mEvictListeners = new ArrayMap<>();
private final StorageManager mStorageManager;
@@ -79,11 +77,13 @@ public class BufferManager {
}
};
+ private volatile boolean mClosed = false;
private int mMinSampleSizeForSpeedCheck = MINIMUM_SAMPLE_SIZE_FOR_SPEED_CHECK;
private long mTotalWriteSize;
private long mTotalWriteTimeNs;
private float mWriteBandwidth = 0.0f;
private volatile int mSpeedCheckCount;
+ private boolean mDisabled = false;
public interface ChunkEvictedListener {
void onChunkEvicted(String id, long createdTimeMs);
@@ -174,66 +174,6 @@ public class BufferManager {
}
/**
- * A Track format which will be loaded and saved from the permanent storage for recordings.
- */
- public static class TrackFormat {
-
- /**
- * The track id for the specified track. The track id will be used as a track identifier
- * for recordings.
- */
- public final String trackId;
-
- /**
- * The {@link MediaFormat} for the specified track.
- */
- public final MediaFormat format;
-
- /**
- * Creates TrackFormat.
- * @param trackId
- * @param format
- */
- public TrackFormat(String trackId, MediaFormat format) {
- this.trackId = trackId;
- this.format = format;
- }
- }
-
- /**
- * A Holder for a sample position which will be loaded from the index file for recordings.
- */
- public static class PositionHolder {
-
- /**
- * The current sample position in microseconds.
- * The position is identical to the PTS(presentation time stamp) of the sample.
- */
- public final long positionUs;
-
- /**
- * Base sample position for the current {@link SampleChunk}.
- */
- public final long basePositionUs;
-
- /**
- * The file offset for the current sample in the current {@link SampleChunk}.
- */
- public final int offset;
-
- /**
- * Creates a holder for a specific position in the recording.
- * @param positionUs
- * @param offset
- */
- public PositionHolder(long positionUs, long basePositionUs, int offset) {
- this.positionUs = positionUs;
- this.basePositionUs = basePositionUs;
- this.offset = offset;
- }
- }
-
- /**
* Storage configuration and policy manager for {@link BufferManager}
*/
public interface StorageManager {
@@ -246,6 +186,11 @@ public class BufferManager {
File getBufferDir();
/**
+ * Cleans up storage.
+ */
+ void clearStorage();
+
+ /**
* Informs whether the storage is used for persistent use. (eg. dvr recording/play)
*
* @return {@code true} if stored files are persistent
@@ -275,27 +220,29 @@ public class BufferManager {
* Reads track name & {@link MediaFormat} from storage.
*
* @param isAudio {@code true} if it is for audio track
- * @return {@link List} of TrackFormat
+ * @return {@link Pair} of track name & {@link MediaFormat}
+ * @throws IOException
*/
- List<TrackFormat> readTrackInfoFiles(boolean isAudio);
+ Pair<String, MediaFormat> readTrackInfoFile(boolean isAudio) throws IOException;
/**
- * Reads key sample positions for each written sample from storage.
+ * Reads sample indexes for each written sample from storage.
*
* @param trackId track name
* @return indexes of the specified track
* @throws IOException
*/
- ArrayList<PositionHolder> readIndexFile(String trackId) throws IOException;
+ ArrayList<Long> readIndexFile(String trackId) throws IOException;
/**
* Writes track information to storage.
*
- * @param formatList {@list List} of TrackFormat
+ * @param trackId track name
+ * @param format {@link android.media.MediaFormat} of the track
* @param isAudio {@code true} if it is for audio track
* @throws IOException
*/
- void writeTrackInfoFiles(List<TrackFormat> formatList, boolean isAudio)
+ void writeTrackInfoFile(String trackId, MediaFormat format, boolean isAudio)
throws IOException;
/**
@@ -305,7 +252,7 @@ public class BufferManager {
* @param index {@link SampleChunk} container
* @throws IOException
*/
- void writeIndexFile(String trackName, SortedMap<Long, Pair<SampleChunk, Integer>> index)
+ void writeIndexFile(String trackName, SortedMap<Long, SampleChunk> index)
throws IOException;
}
@@ -360,6 +307,7 @@ public class BufferManager {
SampleChunk.SampleChunkCreator sampleChunkCreator) {
mStorageManager = storageManager;
mSampleChunkCreator = sampleChunkCreator;
+ clearBuffer(true);
}
public void registerChunkEvictedListener(String id, ChunkEvictedListener listener) {
@@ -370,44 +318,44 @@ public class BufferManager {
mEvictListeners.remove(id);
}
+ private void clearBuffer(boolean deleteFiles) {
+ mChunkMap.clear();
+ if (deleteFiles) {
+ mStorageManager.clearStorage();
+ }
+ mBufferSize = 0;
+ }
+
private static String getFileName(String id, long positionUs) {
return String.format(Locale.ENGLISH, "%s_%016x.chunk", id, positionUs);
}
/**
- * Creates a new {@link SampleChunk} for caching samples if it is needed.
+ * Creates a new {@link SampleChunk} for caching samples.
*
* @param id the name of the track
- * @param positionUs current position to write a sample in micro seconds.
+ * @param positionUs starting position of the {@link SampleChunk} in micro seconds.
* @param samplePool {@link SamplePool} for the fast creation of samples.
- * @param currentChunk the current {@link SampleChunk} to write, {@code null} when to create
- * a new {@link SampleChunk}.
- * @param currentOffset the current offset to write.
* @return returns the created {@link SampleChunk}.
* @throws IOException
*/
- public SampleChunk createNewWriteFileIfNeeded(String id, long positionUs, SamplePool samplePool,
- SampleChunk currentChunk, int currentOffset) throws IOException {
+ public SampleChunk createNewWriteFile(String id, long positionUs,
+ SamplePool samplePool) throws IOException {
if (!maybeEvictChunk()) {
throw new IOException("Not enough storage space");
}
- SortedMap<Long, Pair<SampleChunk, Integer>> map = mChunkMap.get(id);
+ SortedMap<Long, SampleChunk> map = mChunkMap.get(id);
if (map == null) {
map = new TreeMap<>();
mChunkMap.put(id, map);
mStartPositionMap.put(id, positionUs);
mPendingDelete.init(id);
}
- if (currentChunk == null) {
- File file = new File(mStorageManager.getBufferDir(), getFileName(id, positionUs));
- SampleChunk sampleChunk = mSampleChunkCreator
- .createSampleChunk(samplePool, file, positionUs, mChunkCallback);
- map.put(positionUs, new Pair(sampleChunk, 0));
- return sampleChunk;
- } else {
- map.put(positionUs, new Pair(currentChunk, currentOffset));
- return null;
- }
+ File file = new File(mStorageManager.getBufferDir(), getFileName(id, positionUs));
+ SampleChunk sampleChunk = mSampleChunkCreator.createSampleChunk(samplePool, file,
+ positionUs, mChunkCallback);
+ map.put(positionUs, sampleChunk);
+ return sampleChunk;
}
/**
@@ -418,10 +366,10 @@ public class BufferManager {
* @throws IOException
*/
public void loadTrackFromStorage(String trackId, SamplePool samplePool) throws IOException {
- ArrayList<PositionHolder> keyPositions = mStorageManager.readIndexFile(trackId);
- long startPositionUs = keyPositions.size() > 0 ? keyPositions.get(0).positionUs : 0;
+ ArrayList<Long> keyPositions = mStorageManager.readIndexFile(trackId);
+ long startPositionUs = keyPositions.size() > 0 ? keyPositions.get(0) : 0;
- SortedMap<Long, Pair<SampleChunk, Integer>> map = mChunkMap.get(trackId);
+ SortedMap<Long, SampleChunk> map = mChunkMap.get(trackId);
if (map == null) {
map = new TreeMap<>();
mChunkMap.put(trackId, map);
@@ -429,15 +377,11 @@ public class BufferManager {
mPendingDelete.init(trackId);
}
SampleChunk chunk = null;
- long basePositionUs = -1;
- for (PositionHolder position: keyPositions) {
- if (position.basePositionUs != basePositionUs) {
- chunk = mSampleChunkCreator.loadSampleChunkFromFile(samplePool,
- mStorageManager.getBufferDir(), getFileName(trackId, position.positionUs),
- position.positionUs, mChunkCallback, chunk);
- basePositionUs = position.basePositionUs;
- }
- map.put(position.positionUs, new Pair(chunk, position.offset));
+ for (long positionUs: keyPositions) {
+ chunk = mSampleChunkCreator.loadSampleChunkFromFile(samplePool,
+ mStorageManager.getBufferDir(), getFileName(trackId, positionUs), positionUs,
+ mChunkCallback, chunk);
+ map.put(positionUs, chunk);
}
}
@@ -448,19 +392,19 @@ public class BufferManager {
* @param positionUs the position.
* @return returns the found {@link SampleChunk}.
*/
- public Pair<SampleChunk, Integer> getReadFile(String id, long positionUs) {
- SortedMap<Long, Pair<SampleChunk, Integer>> map = mChunkMap.get(id);
+ public SampleChunk getReadFile(String id, long positionUs) {
+ SortedMap<Long, SampleChunk> map = mChunkMap.get(id);
if (map == null) {
return null;
}
- Pair<SampleChunk, Integer> ret;
- SortedMap<Long, Pair<SampleChunk, Integer>> headMap = map.headMap(positionUs + 1);
+ SampleChunk sampleChunk;
+ SortedMap<Long, SampleChunk> headMap = map.headMap(positionUs + 1);
if (!headMap.isEmpty()) {
- ret = headMap.get(headMap.lastKey());
+ sampleChunk = headMap.get(headMap.lastKey());
} else {
- ret = map.get(map.firstKey());
+ sampleChunk = map.get(map.firstKey());
}
- return ret;
+ return sampleChunk;
}
/**
@@ -495,16 +439,15 @@ public class BufferManager {
// Since chunks are persistent, we cannot evict chunks.
return false;
}
- SortedMap<Long, Pair<SampleChunk, Integer>> earliestChunkMap = null;
+ SortedMap<Long, SampleChunk> earliestChunkMap = null;
SampleChunk earliestChunk = null;
String earliestChunkId = null;
- for (Map.Entry<String, SortedMap<Long, Pair<SampleChunk, Integer>>> entry :
- mChunkMap.entrySet()) {
- SortedMap<Long, Pair<SampleChunk, Integer>> map = entry.getValue();
+ for (Map.Entry<String, SortedMap<Long, SampleChunk>> entry : mChunkMap.entrySet()) {
+ SortedMap<Long, SampleChunk> map = entry.getValue();
if (map.isEmpty()) {
continue;
}
- SampleChunk chunk = map.get(map.firstKey()).first;
+ SampleChunk chunk = map.get(map.firstKey());
if (earliestChunk == null
|| chunk.getCreatedTimeMs() < earliestChunk.getCreatedTimeMs()) {
earliestChunkMap = map;
@@ -530,9 +473,8 @@ public class BufferManager {
}
pendingDelete = mPendingDelete.getSize();
}
- for (Map.Entry<String, SortedMap<Long, Pair<SampleChunk, Integer>>> entry :
- mChunkMap.entrySet()) {
- SortedMap<Long, Pair<SampleChunk, Integer>> map = entry.getValue();
+ for (Map.Entry<String, SortedMap<Long, SampleChunk>> entry : mChunkMap.entrySet()) {
+ SortedMap<Long, SampleChunk> map = entry.getValue();
if (map.isEmpty()) {
continue;
}
@@ -547,74 +489,70 @@ public class BufferManager {
* @return returns all track information which is found by {@link BufferManager.StorageManager}.
* @throws IOException
*/
- public List<TrackFormat> readTrackInfoFiles() throws IOException {
- List<TrackFormat> trackFormatList = new ArrayList<>();
- trackFormatList.addAll(mStorageManager.readTrackInfoFiles(false));
- trackFormatList.addAll(mStorageManager.readTrackInfoFiles(true));
- if (trackFormatList.isEmpty()) {
- throw new IOException("No track information to load");
+ public ArrayList<Pair<String, MediaFormat>> readTrackInfoFiles() throws IOException {
+ ArrayList<Pair<String, MediaFormat>> trackInfos = new ArrayList<>();
+ try {
+ trackInfos.add(mStorageManager.readTrackInfoFile(false));
+ } catch (FileNotFoundException e) {
+ // There can be a single track only recording. (eg. audio-only, video-only)
+ // So the exception should not stop the read.
}
- return trackFormatList;
+ try {
+ trackInfos.add(mStorageManager.readTrackInfoFile(true));
+ } catch (FileNotFoundException e) {
+ // See above catch block.
+ }
+ return trackInfos;
}
/**
* Writes track information and index information for all tracks.
*
- * @param audios list of audio track information
- * @param videos list of audio track information
+ * @param audio audio information.
+ * @param video video information.
* @throws IOException
*/
- public void writeMetaFiles(List<TrackFormat> audios, List<TrackFormat> videos)
+ public void writeMetaFiles(Pair<String, MediaFormat> audio, Pair<String, MediaFormat> video)
throws IOException {
- if (audios.isEmpty() && videos.isEmpty()) {
- throw new IOException("No track information to save");
- }
- if (!audios.isEmpty()) {
- mStorageManager.writeTrackInfoFiles(audios, true);
- for (TrackFormat trackFormat : audios) {
- SortedMap<Long, Pair<SampleChunk, Integer>> map =
- mChunkMap.get(trackFormat.trackId);
- if (map == null) {
- throw new IOException("Audio track index missing");
- }
- mStorageManager.writeIndexFile(trackFormat.trackId, map);
+ if (audio != null) {
+ mStorageManager.writeTrackInfoFile(audio.first, audio.second, true);
+ SortedMap<Long, SampleChunk> map = mChunkMap.get(audio.first);
+ if (map == null) {
+ throw new IOException("Audio track index missing");
}
+ mStorageManager.writeIndexFile(audio.first, map);
}
- if (!videos.isEmpty()) {
- mStorageManager.writeTrackInfoFiles(videos, false);
- for (TrackFormat trackFormat : videos) {
- SortedMap<Long, Pair<SampleChunk, Integer>> map =
- mChunkMap.get(trackFormat.trackId);
- if (map == null) {
- throw new IOException("Video track index missing");
- }
- mStorageManager.writeIndexFile(trackFormat.trackId, map);
+ if (video != null) {
+ mStorageManager.writeTrackInfoFile(video.first, video.second, false);
+ SortedMap<Long, SampleChunk> map = mChunkMap.get(video.first);
+ if (map == null) {
+ throw new IOException("Video track index missing");
}
+ mStorageManager.writeIndexFile(video.first, map);
}
}
/**
+ * Marks it is closed and it is not used anymore.
+ */
+ public void close() {
+ // Clean-up may happen after this is called.
+ mClosed = true;
+ }
+
+ /**
* Releases all the resources.
*/
public void release() {
- try {
- mPendingDelete.release();
- for (Map.Entry<String, SortedMap<Long, Pair<SampleChunk, Integer>>> entry :
- mChunkMap.entrySet()) {
- SampleChunk toRelease = null;
- for (Pair<SampleChunk, Integer> positions : entry.getValue().values()) {
- if (toRelease != positions.first) {
- toRelease = positions.first;
- SampleChunk.IoState.release(toRelease, !mStorageManager.isPersistent());
- }
- }
+ mPendingDelete.release();
+ for (Map.Entry<String, SortedMap<Long, SampleChunk>> entry : mChunkMap.entrySet()) {
+ for (SampleChunk chunk : entry.getValue().values()) {
+ SampleChunk.IoState.release(chunk, !mStorageManager.isPersistent());
}
- mChunkMap.clear();
- } catch (ConcurrentModificationException | NullPointerException e) {
- // TODO: remove this after it it confirmed that race condition issues are resolved.
- // b/32492258, b/32373376
- SoftPreconditions.checkState(false, "Exception on BufferManager#release: ",
- e.toString());
+ }
+ mChunkMap.clear();
+ if (mClosed) {
+ clearBuffer(!mStorageManager.isPersistent());
}
}
@@ -673,6 +611,20 @@ public class BufferManager {
}
/**
+ * Marks {@link BufferManager} object disabled to prevent it from the future use.
+ */
+ public void disable() {
+ mDisabled = true;
+ }
+
+ /**
+ * Returns if {@link BufferManager} object is disabled.
+ */
+ public boolean isDisabled() {
+ return mDisabled;
+ }
+
+ /**
* Returns if {@link BufferManager} has checked the write speed,
* which is suitable for Trickplay.
*/
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java b/src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java
index bea3defd..6a0502a7 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java
@@ -17,12 +17,8 @@
package com.android.tv.tuner.exoplayer.buffer;
import android.media.MediaFormat;
-import android.util.Log;
import android.util.Pair;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
-import com.google.protobuf.nano.MessageNano;
-
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
@@ -32,25 +28,18 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
import java.util.SortedMap;
/**
* Manages DVR storage.
*/
public class DvrStorageManager implements BufferManager.StorageManager {
- private static final String TAG = "DvrStorageManager";
// TODO: make serializable classes and use protobuf after internal data structure is finalized.
private static final String KEY_PIXEL_WIDTH_HEIGHT_RATIO =
"com.google.android.videos.pixelWidthHeightRatio";
- private static final String META_FILE_TYPE_AUDIO = "audio";
- private static final String META_FILE_TYPE_VIDEO = "video";
- private static final String META_FILE_TYPE_CAPTION = "caption";
private static final String META_FILE_SUFFIX = ".meta";
private static final String IDX_FILE_SUFFIX = ".idx";
- private static final String IDX_FILE_SUFFIX_V2 = IDX_FILE_SUFFIX + "2";
// Size of minimum reserved storage buffer which will be used to save meta files
// and index files after actual recording finished.
@@ -70,6 +59,18 @@ public class DvrStorageManager implements BufferManager.StorageManager {
}
@Override
+ public void clearStorage() {
+ if (mIsRecording) {
+ File[] files = mBufferDir.listFiles();
+ if (files != null && files.length > 0) {
+ for (File file : files) {
+ file.delete();
+ }
+ }
+ }
+ }
+
+ @Override
public File getBufferDir() {
return mBufferDir;
}
@@ -131,17 +132,6 @@ public class DvrStorageManager implements BufferManager.StorageManager {
}
}
- private void readFormatStringOptional(DataInputStream in, MediaFormat format, String key) {
- try {
- String str = readString(in);
- if (str != null) {
- format.setString(key, str);
- }
- } catch (IOException e) {
- // Since we are reading optional field, ignore the exception.
- }
- }
-
private ByteBuffer readByteBuffer(DataInputStream in) throws IOException {
int len = in.readInt();
if (len <= 0) {
@@ -165,104 +155,39 @@ public class DvrStorageManager implements BufferManager.StorageManager {
}
@Override
- public List<BufferManager.TrackFormat> readTrackInfoFiles(boolean isAudio) {
- List<BufferManager.TrackFormat> trackFormatList = new ArrayList<>();
- int index = 0;
- boolean trackNotFound = false;
- do {
- String fileName = (isAudio ? META_FILE_TYPE_AUDIO : META_FILE_TYPE_VIDEO)
- + ((index == 0) ? META_FILE_SUFFIX : (index + META_FILE_SUFFIX));
- File file = new File(getBufferDir(), fileName);
- try (DataInputStream in = new DataInputStream(new FileInputStream(file))) {
- String name = readString(in);
- MediaFormat format = new MediaFormat();
- readFormatString(in, format, MediaFormat.KEY_MIME);
- readFormatInt(in, format, MediaFormat.KEY_MAX_INPUT_SIZE);
- readFormatInt(in, format, MediaFormat.KEY_WIDTH);
- readFormatInt(in, format, MediaFormat.KEY_HEIGHT);
- readFormatInt(in, format, MediaFormat.KEY_CHANNEL_COUNT);
- readFormatInt(in, format, MediaFormat.KEY_SAMPLE_RATE);
- readFormatFloat(in, format, KEY_PIXEL_WIDTH_HEIGHT_RATIO);
- for (int i = 0; i < 3; ++i) {
- readFormatByteBuffer(in, format, "csd-" + i);
- }
- readFormatLong(in, format, MediaFormat.KEY_DURATION);
-
- // This is optional since language field is added later.
- readFormatStringOptional(in, format, MediaFormat.KEY_LANGUAGE);
- trackFormatList.add(new BufferManager.TrackFormat(name, format));
- } catch (IOException e) {
- trackNotFound = true;
+ public Pair<String, MediaFormat> readTrackInfoFile(boolean isAudio) throws IOException {
+ File file = new File(getBufferDir(), (isAudio ? "audio" : "video") + META_FILE_SUFFIX);
+ try (DataInputStream in = new DataInputStream(new FileInputStream(file))) {
+ String name = readString(in);
+ MediaFormat format = new MediaFormat();
+ readFormatString(in, format, MediaFormat.KEY_MIME);
+ readFormatInt(in, format, MediaFormat.KEY_MAX_INPUT_SIZE);
+ readFormatInt(in, format, MediaFormat.KEY_WIDTH);
+ readFormatInt(in, format, MediaFormat.KEY_HEIGHT);
+ readFormatInt(in, format, MediaFormat.KEY_CHANNEL_COUNT);
+ readFormatInt(in, format, MediaFormat.KEY_SAMPLE_RATE);
+ readFormatFloat(in, format, KEY_PIXEL_WIDTH_HEIGHT_RATIO);
+ for (int i = 0; i < 3; ++i) {
+ readFormatByteBuffer(in, format, "csd-" + i);
}
- index++;
- } while(!trackNotFound);
- return trackFormatList;
- }
-
- /**
- * Reads caption information from files.
- *
- * @return a list of {@link AtscCaptionTrack} objects which store caption information.
- */
- public List<AtscCaptionTrack> readCaptionInfoFiles() {
- List<AtscCaptionTrack> tracks = new ArrayList<>();
- int index = 0;
- boolean trackNotFound = false;
- do {
- String fileName = META_FILE_TYPE_CAPTION +
- ((index == 0) ? META_FILE_SUFFIX : (index + META_FILE_SUFFIX));
- File file = new File(getBufferDir(), fileName);
- try (DataInputStream in = new DataInputStream(new FileInputStream(file))) {
- byte[] data = new byte[(int) file.length()];
- in.read(data);
- tracks.add(AtscCaptionTrack.parseFrom(data));
- } catch (IOException e) {
- trackNotFound = true;
- }
- index++;
- } while(!trackNotFound);
- return tracks;
- }
-
- private ArrayList<BufferManager.PositionHolder> readOldIndexFile(File indexFile)
- throws IOException {
- ArrayList<BufferManager.PositionHolder> indices = new ArrayList<>();
- try (DataInputStream in = new DataInputStream(new FileInputStream(indexFile))) {
- long count = in.readLong();
- for (long i = 0; i < count; ++i) {
- long positionUs = in.readLong();
- indices.add(new BufferManager.PositionHolder(positionUs, positionUs, 0));
- }
- return indices;
+ readFormatLong(in, format, MediaFormat.KEY_DURATION);
+ return new Pair<>(name, format);
}
}
- private ArrayList<BufferManager.PositionHolder> readNewIndexFile(File indexFile)
- throws IOException {
- ArrayList<BufferManager.PositionHolder> indices = new ArrayList<>();
- try (DataInputStream in = new DataInputStream(new FileInputStream(indexFile))) {
+ @Override
+ public ArrayList<Long> readIndexFile(String trackId) throws IOException {
+ ArrayList<Long> indices = new ArrayList<>();
+ File file = new File(getBufferDir(), trackId + IDX_FILE_SUFFIX);
+ try (DataInputStream in = new DataInputStream(new FileInputStream(file))) {
long count = in.readLong();
for (long i = 0; i < count; ++i) {
- long positionUs = in.readLong();
- long basePositionUs = in.readLong();
- int offset = in.readInt();
- indices.add(new BufferManager.PositionHolder(positionUs, basePositionUs, offset));
+ indices.add(in.readLong());
}
return indices;
}
}
- @Override
- public ArrayList<BufferManager.PositionHolder> readIndexFile(String trackId)
- throws IOException {
- File file = new File(getBufferDir(), trackId + IDX_FILE_SUFFIX_V2);
- if (file.exists()) {
- return readNewIndexFile(file);
- } else {
- return readOldIndexFile(new File(getBufferDir(),trackId + IDX_FILE_SUFFIX));
- }
- }
-
private void writeFormatInt(DataOutputStream out, MediaFormat format, String key)
throws IOException {
if (format.containsKey(key)) {
@@ -329,63 +254,33 @@ public class DvrStorageManager implements BufferManager.StorageManager {
}
@Override
- public void writeTrackInfoFiles(List<BufferManager.TrackFormat> formatList, boolean isAudio)
+ public void writeTrackInfoFile(String trackId, MediaFormat format, boolean isAudio)
throws IOException {
- for (int i = 0; i < formatList.size() ; ++i) {
- BufferManager.TrackFormat trackFormat = formatList.get(i);
- String fileName = (isAudio ? META_FILE_TYPE_AUDIO : META_FILE_TYPE_VIDEO)
- + ((i == 0) ? META_FILE_SUFFIX : (i + META_FILE_SUFFIX));
- File file = new File(getBufferDir(), fileName);
- try (DataOutputStream out = new DataOutputStream(new FileOutputStream(file))) {
- writeString(out, trackFormat.trackId);
- writeFormatString(out, trackFormat.format, MediaFormat.KEY_MIME);
- writeFormatInt(out, trackFormat.format, MediaFormat.KEY_MAX_INPUT_SIZE);
- writeFormatInt(out, trackFormat.format, MediaFormat.KEY_WIDTH);
- writeFormatInt(out, trackFormat.format, MediaFormat.KEY_HEIGHT);
- writeFormatInt(out, trackFormat.format, MediaFormat.KEY_CHANNEL_COUNT);
- writeFormatInt(out, trackFormat.format, MediaFormat.KEY_SAMPLE_RATE);
- writeFormatFloat(out, trackFormat.format, KEY_PIXEL_WIDTH_HEIGHT_RATIO);
- for (int j = 0; j < 3; ++j) {
- writeFormatByteBuffer(out, trackFormat.format, "csd-" + j);
- }
- writeFormatLong(out, trackFormat.format, MediaFormat.KEY_DURATION);
- writeFormatString(out, trackFormat.format, MediaFormat.KEY_LANGUAGE);
- }
- }
- }
-
- /**
- * Writes caption information to files.
- *
- * @param tracks a list of {@link AtscCaptionTrack} objects which store caption information.
- */
- public void writeCaptionInfoFiles(List<AtscCaptionTrack> tracks) {
- if (tracks == null || tracks.isEmpty()) {
- return;
- }
- for (int i = 0; i < tracks.size(); i++) {
- AtscCaptionTrack track = tracks.get(i);
- String fileName = META_FILE_TYPE_CAPTION +
- ((i == 0) ? META_FILE_SUFFIX : (i + META_FILE_SUFFIX));
- File file = new File(getBufferDir(), fileName);
- try (DataOutputStream out = new DataOutputStream(new FileOutputStream(file))) {
- out.write(MessageNano.toByteArray(track));
- } catch (Exception e) {
- Log.e(TAG, "Fail to write caption info to files", e);
+ File file = new File(getBufferDir(), (isAudio ? "audio" : "video") + META_FILE_SUFFIX);
+ try (DataOutputStream out = new DataOutputStream(new FileOutputStream(file))) {
+ writeString(out, trackId);
+ writeFormatString(out, format, MediaFormat.KEY_MIME);
+ writeFormatInt(out, format, MediaFormat.KEY_MAX_INPUT_SIZE);
+ writeFormatInt(out, format, MediaFormat.KEY_WIDTH);
+ writeFormatInt(out, format, MediaFormat.KEY_HEIGHT);
+ writeFormatInt(out, format, MediaFormat.KEY_CHANNEL_COUNT);
+ writeFormatInt(out, format, MediaFormat.KEY_SAMPLE_RATE);
+ writeFormatFloat(out, format, KEY_PIXEL_WIDTH_HEIGHT_RATIO);
+ for (int i = 0; i < 3; ++i) {
+ writeFormatByteBuffer(out, format, "csd-" + i);
}
+ writeFormatLong(out, format, MediaFormat.KEY_DURATION);
}
}
@Override
- public void writeIndexFile(String trackName, SortedMap<Long, Pair<SampleChunk, Integer>> index)
+ public void writeIndexFile(String trackName, SortedMap<Long, SampleChunk> index)
throws IOException {
- File indexFile = new File(getBufferDir(), trackName + IDX_FILE_SUFFIX_V2);
+ File indexFile = new File(getBufferDir(), trackName + IDX_FILE_SUFFIX);
try (DataOutputStream out = new DataOutputStream(new FileOutputStream(indexFile))) {
out.writeLong(index.size());
- for (Map.Entry<Long, Pair<SampleChunk, Integer>> entry : index.entrySet()) {
- out.writeLong(entry.getKey());
- out.writeLong(entry.getValue().first.getStartPositionUs());
- out.writeInt(entry.getValue().second);
+ for (Long key : index.keySet()) {
+ out.writeLong(key);
}
}
}
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java b/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java
index af0c3f0d..4869b49f 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java
@@ -66,14 +66,9 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
public static final int BUFFER_REASON_RECORDING = 2;
/**
- * The minimum duration to support seek in Trickplay.
+ * The duration of a chunk of samples, {@link SampleChunk}.
*/
- static final long MIN_SEEK_DURATION_US = TimeUnit.MILLISECONDS.toMicros(500);
-
- /**
- * The duration of a {@link SampleChunk} for recordings.
- */
- static final long RECORDING_CHUNK_DURATION_US = MIN_SEEK_DURATION_US * 1200; // 10 minutes
+ static final long CHUNK_DURATION_US = TimeUnit.MILLISECONDS.toMicros(500);
private static final long BUFFER_WRITE_TIMEOUT_MS = 10 * 1000; // 10 seconds
private static final long BUFFER_NEEDED_US =
1000L * Math.max(MpegTsPlayer.MIN_BUFFER_MS, MpegTsPlayer.MIN_REBUFFER_MS);
@@ -84,6 +79,7 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
private int mTrackCount;
private boolean[] mTrackSelected;
+ private List<String> mIds;
private List<SampleQueue> mReadSampleQueues;
private final SamplePool mSamplePool = new SamplePool();
private long mLastBufferedPositionUs = C.UNKNOWN_TIME_US;
@@ -134,6 +130,7 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
if (mTrackCount <= 0) {
throw new IOException("No tracks to initialize");
}
+ mIds = ids;
mTrackSelected = new boolean[mTrackCount];
mReadSampleQueues = new ArrayList<>();
mSampleChunkIoHelper = new SampleChunkIoHelper(ids, mediaFormats, mBufferReason,
@@ -142,9 +139,6 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
mReadSampleQueues.add(i, new SampleQueue(mSamplePool));
}
mSampleChunkIoHelper.init();
- for (int i = 0; i < mTrackCount; ++i) {
- mBufferManager.registerChunkEvictedListener(ids.get(i), RecordingSampleBuffer.this);
- }
}
@Override
@@ -152,6 +146,8 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
if (!mTrackSelected[index]) {
mTrackSelected[index] = true;
mReadSampleQueues.get(index).clear();
+ mBufferManager.registerChunkEvictedListener(mIds.get(index),
+ RecordingSampleBuffer.this);
mSampleChunkIoHelper.openRead(index, mCurrentPlaybackPositionUs);
}
}
@@ -161,7 +157,7 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
if (mTrackSelected[index]) {
mTrackSelected[index] = false;
mReadSampleQueues.get(index).clear();
- mSampleChunkIoHelper.closeRead(index);
+ mBufferManager.unregisterChunkEvictedListener(mIds.get(index));
}
}
@@ -197,6 +193,7 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
}
// Disables buffering samples afterwards, and notifies the disk speed is slow.
Log.w(TAG, "Disk is too slow for trickplay");
+ mBufferManager.disable();
mBufferListener.onDiskTooSlow();
}
@@ -208,7 +205,7 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
private boolean maybeReadSample(SampleQueue queue, int index) {
if (queue.getLastQueuedPositionUs() != null
&& queue.getLastQueuedPositionUs() > mCurrentPlaybackPositionUs + BUFFER_NEEDED_US
- && queue.isDurationGreaterThan(MIN_SEEK_DURATION_US)) {
+ && queue.isDurationGreaterThan(CHUNK_DURATION_US)) {
// The speed of queuing samples can be higher than the playback speed.
// If the duration of the samples in the queue is not limited,
// samples can be accumulated and there can be out-of-memory issues.
@@ -303,7 +300,7 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
public void onChunkEvicted(String id, long createdTimeMs) {
if (mBufferListener != null) {
mBufferListener.onBufferStartTimeChanged(
- createdTimeMs + TimeUnit.MICROSECONDS.toMillis(MIN_SEEK_DURATION_US));
+ createdTimeMs + TimeUnit.MICROSECONDS.toMillis(CHUNK_DURATION_US));
}
}
}
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/SampleChunk.java b/src/com/android/tv/tuner/exoplayer/buffer/SampleChunk.java
index ab6d1a75..552caaef 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/SampleChunk.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/SampleChunk.java
@@ -151,23 +151,18 @@ public class SampleChunk {
mCurrentOffset = 0;
}
- private void reset(SampleChunk chunk, long offset) {
- mChunk = chunk;
- mCurrentOffset = offset;
- }
-
/**
* Prepares for read I/O operation from a new SampleChunk.
*
* @param chunk the new SampleChunk to read from
* @throws IOException
*/
- void openRead(SampleChunk chunk, long offset) throws IOException {
+ void openRead(SampleChunk chunk) throws IOException {
if (mChunk != null) {
mChunk.closeRead();
}
chunk.openRead();
- reset(chunk, offset);
+ reset(chunk);
}
/**
@@ -246,20 +241,6 @@ public class SampleChunk {
}
/**
- * Returns the current SampleChunk for subsequent I/O operation.
- */
- SampleChunk getChunk() {
- return mChunk;
- }
-
- /**
- * Returns the current offset of the current SampleChunk for subsequent I/O operation.
- */
- long getOffset() {
- return mCurrentOffset;
- }
-
- /**
* Releases SampleChunk. the SampleChunk will not be used anymore.
*
* @param chunk to release
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java b/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java
index ca97a91a..37ae4022 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java
@@ -21,7 +21,6 @@ import android.os.ConditionVariable;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
-import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;
@@ -32,9 +31,7 @@ import com.android.tv.common.SoftPreconditions;
import com.android.tv.tuner.exoplayer.buffer.RecordingSampleBuffer.BufferReason;
import java.io.IOException;
-import java.util.LinkedList;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
@@ -49,13 +46,11 @@ public class SampleChunkIoHelper implements Handler.Callback {
private static final int MSG_OPEN_READ = 1;
private static final int MSG_OPEN_WRITE = 2;
- private static final int MSG_CLOSE_READ = 3;
- private static final int MSG_CLOSE_WRITE = 4;
- private static final int MSG_READ = 5;
- private static final int MSG_WRITE = 6;
- private static final int MSG_RELEASE = 7;
+ private static final int MSG_CLOSE_WRITE = 3;
+ private static final int MSG_READ = 4;
+ private static final int MSG_WRITE = 5;
+ private static final int MSG_RELEASE = 6;
- private final long mSampleChunkDurationUs;
private final int mTrackCount;
private final List<String> mIds;
private final List<MediaFormat> mMediaFormats;
@@ -67,11 +62,9 @@ public class SampleChunkIoHelper implements Handler.Callback {
private Handler mIoHandler;
private final ConcurrentLinkedQueue<SampleHolder> mReadSampleBuffers[];
private final ConcurrentLinkedQueue<SampleHolder> mHandlerReadSampleBuffers[];
- private final long[] mWriteIndexEndPositionUs;
- private final long[] mWriteChunkEndPositionUs;
+ private final long[] mWriteEndPositionUs;
private final SampleChunk.IoState[] mReadIoStates;
private final SampleChunk.IoState[] mWriteIoStates;
- private final Set<Integer> mSelectedTracks = new ArraySet<>();
private long mBufferDurationUs = 0;
private boolean mWriteEnded;
private boolean mErrorNotified;
@@ -136,20 +129,11 @@ public class SampleChunkIoHelper implements Handler.Callback {
mReadSampleBuffers = new ConcurrentLinkedQueue[mTrackCount];
mHandlerReadSampleBuffers = new ConcurrentLinkedQueue[mTrackCount];
- mWriteIndexEndPositionUs = new long[mTrackCount];
- mWriteChunkEndPositionUs = new long[mTrackCount];
+ mWriteEndPositionUs = new long[mTrackCount];
mReadIoStates = new SampleChunk.IoState[mTrackCount];
mWriteIoStates = new SampleChunk.IoState[mTrackCount];
-
- // Small chunk duration for live playback will give more fine grained storage usage
- // and eviction handling for trickplay.
- mSampleChunkDurationUs =
- bufferReason == RecordingSampleBuffer.BUFFER_REASON_LIVE_PLAYBACK ?
- RecordingSampleBuffer.MIN_SEEK_DURATION_US :
- RecordingSampleBuffer.RECORDING_CHUNK_DURATION_US;
for (int i = 0; i < mTrackCount; ++i) {
- mWriteIndexEndPositionUs[i] = RecordingSampleBuffer.MIN_SEEK_DURATION_US;
- mWriteChunkEndPositionUs[i] = mSampleChunkDurationUs;
+ mWriteEndPositionUs[i] = RecordingSampleBuffer.CHUNK_DURATION_US;
mReadIoStates[i] = new SampleChunk.IoState();
mWriteIoStates[i] = new SampleChunk.IoState();
}
@@ -220,15 +204,6 @@ public class SampleChunkIoHelper implements Handler.Callback {
}
/**
- * Closes read from the specified track.
- *
- * @param index track index
- */
- public void closeRead(int index) {
- mIoHandler.sendMessage(mIoHandler.obtainMessage(MSG_CLOSE_READ, index));
- }
-
- /**
* Notifies writes are finished.
*/
public void closeWrite() {
@@ -254,19 +229,21 @@ public class SampleChunkIoHelper implements Handler.Callback {
try {
if (mBufferReason == RecordingSampleBuffer.BUFFER_REASON_RECORDING && mTrackCount > 0) {
// Saves meta information for recording.
- List<BufferManager.TrackFormat> audios = new LinkedList<>();
- List<BufferManager.TrackFormat> videos = new LinkedList<>();
+ Pair<String, android.media.MediaFormat> audio = null, video = null;
for (int i = 0; i < mTrackCount; ++i) {
android.media.MediaFormat format =
mMediaFormats.get(i).getFrameworkMediaFormatV16();
format.setLong(android.media.MediaFormat.KEY_DURATION, mBufferDurationUs);
- if (MimeTypes.isAudio(mMediaFormats.get(i).mimeType)) {
- audios.add(new BufferManager.TrackFormat(mIds.get(i), format));
- } else if (MimeTypes.isVideo(mMediaFormats.get(i).mimeType)) {
- videos.add(new BufferManager.TrackFormat(mIds.get(i), format));
+ if (audio == null && MimeTypes.isAudio(mMediaFormats.get(i).mimeType)) {
+ audio = new Pair<>(mIds.get(i), format);
+ } else if (video == null && MimeTypes.isVideo(mMediaFormats.get(i).mimeType)) {
+ video = new Pair<>(mIds.get(i), format);
+ }
+ if (audio != null && video != null) {
+ break;
}
}
- mBufferManager.writeMetaFiles(audios, videos);
+ mBufferManager.writeMetaFiles(audio, video);
}
} finally {
mBufferManager.release();
@@ -288,9 +265,6 @@ public class SampleChunkIoHelper implements Handler.Callback {
case MSG_OPEN_WRITE:
doOpenWrite((int) message.obj);
return true;
- case MSG_CLOSE_READ:
- doCloseRead((int) message.obj);
- return true;
case MSG_CLOSE_WRITE:
doCloseWrite();
return true;
@@ -317,16 +291,14 @@ public class SampleChunkIoHelper implements Handler.Callback {
private void doOpenRead(IoParams params) throws IOException {
int index = params.index;
mIoHandler.removeMessages(MSG_READ, index);
- Pair<SampleChunk, Integer> readPosition =
- mBufferManager.getReadFile(mIds.get(index), params.positionUs);
- if (readPosition == null) {
+ SampleChunk chunk = mBufferManager.getReadFile(mIds.get(index), params.positionUs);
+ if (chunk == null) {
String errorMessage = "Chunk ID:" + mIds.get(index) + " pos:" + params.positionUs
+ "is not found";
- SoftPreconditions.checkNotNull(readPosition, TAG, errorMessage);
+ SoftPreconditions.checkNotNull(chunk, TAG, errorMessage);
throw new IOException(errorMessage);
}
- mSelectedTracks.add(index);
- mReadIoStates[index].openRead(readPosition.first, (long) readPosition.second);
+ mReadIoStates[index].openRead(chunk);
if (mHandlerReadSampleBuffers[index] != null) {
SampleHolder sample;
while ((sample = mHandlerReadSampleBuffers[index].poll()) != null) {
@@ -338,22 +310,10 @@ public class SampleChunkIoHelper implements Handler.Callback {
}
private void doOpenWrite(int index) throws IOException {
- SampleChunk chunk = mBufferManager.createNewWriteFileIfNeeded(mIds.get(index), 0,
- mSamplePool, null, 0);
+ SampleChunk chunk = mBufferManager.createNewWriteFile(mIds.get(index), 0, mSamplePool);
mWriteIoStates[index].openWrite(chunk);
}
- private void doCloseRead(int index) {
- mSelectedTracks.remove(index);
- if (mHandlerReadSampleBuffers[index] != null) {
- SampleHolder sample;
- while ((sample = mHandlerReadSampleBuffers[index].poll()) != null) {
- mSamplePool.releaseSample(sample);
- }
- }
- mIoHandler.removeMessages(MSG_READ, index);
- }
-
private void doRead(int index) throws IOException {
mIoHandler.removeMessages(MSG_READ, index);
if (mHandlerReadSampleBuffers[index].size() >= MAX_READ_BUFFER_SAMPLES) {
@@ -397,21 +357,13 @@ public class SampleChunkIoHelper implements Handler.Callback {
if (sample.timeUs > mBufferDurationUs) {
mBufferDurationUs = sample.timeUs;
}
- if (sample.timeUs >= mWriteIndexEndPositionUs[index]) {
- SampleChunk currentChunk = sample.timeUs >= mWriteChunkEndPositionUs[index] ?
- null : mWriteIoStates[params.index].getChunk();
- int currentOffset = (int) mWriteIoStates[params.index].getOffset();
- nextChunk = mBufferManager.createNewWriteFileIfNeeded(
- mIds.get(index), mWriteIndexEndPositionUs[index], mSamplePool,
- currentChunk, currentOffset);
- mWriteIndexEndPositionUs[index] =
- ((sample.timeUs / RecordingSampleBuffer.MIN_SEEK_DURATION_US) + 1) *
- RecordingSampleBuffer.MIN_SEEK_DURATION_US;
- if (nextChunk != null) {
- mWriteChunkEndPositionUs[index] =
- ((sample.timeUs / mSampleChunkDurationUs) + 1)
- * mSampleChunkDurationUs;
- }
+
+ if (sample.timeUs >= mWriteEndPositionUs[index]) {
+ nextChunk = mBufferManager.createNewWriteFile(mIds.get(index),
+ mWriteEndPositionUs[index], mSamplePool);
+ mWriteEndPositionUs[index] =
+ ((sample.timeUs / RecordingSampleBuffer.CHUNK_DURATION_US) + 1) *
+ RecordingSampleBuffer.CHUNK_DURATION_US;
}
}
mWriteIoStates[params.index].write(params.sample, nextChunk);
@@ -439,22 +391,15 @@ public class SampleChunkIoHelper implements Handler.Callback {
mIoHandler.removeCallbacksAndMessages(null);
mFinished = true;
conditionVariable.open();
- mSelectedTracks.clear();
}
private void releaseEvictedChunks() {
- if (mBufferReason != RecordingSampleBuffer.BUFFER_REASON_LIVE_PLAYBACK
- || mSelectedTracks.isEmpty()) {
+ if (mBufferReason != RecordingSampleBuffer.BUFFER_REASON_LIVE_PLAYBACK) {
return;
}
- long currentStartPositionUs = Long.MAX_VALUE;
- for (int trackIndex : mSelectedTracks) {
- currentStartPositionUs = Math.min(currentStartPositionUs,
- mReadIoStates[trackIndex].getStartPositionUs());
- }
for (int i = 0; i < mTrackCount; ++i) {
long evictEndPositionUs = Math.min(mBufferManager.getStartPositionUs(mIds.get(i)),
- currentStartPositionUs);
+ mReadIoStates[i].getStartPositionUs());
mBufferManager.evictChunks(mIds.get(i), evictEndPositionUs);
}
}
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/SampleQueue.java b/src/com/android/tv/tuner/exoplayer/buffer/SampleQueue.java
index 75eac5a2..7b098f40 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/SampleQueue.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/SampleQueue.java
@@ -43,7 +43,6 @@ public class SampleQueue {
if (sampleFromQueue == null) {
return SampleSource.NOTHING_READ;
}
- sample.ensureSpaceForWrite(sampleFromQueue.size);
sample.size = sampleFromQueue.size;
sample.flags = sampleFromQueue.flags;
sample.timeUs = sampleFromQueue.timeUs;
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/SimpleSampleBuffer.java b/src/com/android/tv/tuner/exoplayer/buffer/SimpleSampleBuffer.java
index 0b219b41..40c4ef95 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/SimpleSampleBuffer.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/SimpleSampleBuffer.java
@@ -19,7 +19,6 @@ package com.android.tv.tuner.exoplayer.buffer;
import android.os.ConditionVariable;
import android.support.annotation.NonNull;
-
import com.google.android.exoplayer.C;
import com.google.android.exoplayer.MediaFormat;
import com.google.android.exoplayer.SampleHolder;
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java b/src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java
index 9fe921b8..258a5cd0 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java
@@ -17,23 +17,20 @@
package com.android.tv.tuner.exoplayer.buffer;
import android.content.Context;
+import android.media.MediaFormat;
import android.os.AsyncTask;
+import android.os.Looper;
import android.provider.Settings;
-import android.support.annotation.NonNull;
import android.util.Pair;
-import com.android.tv.common.SoftPreconditions;
-
import java.io.File;
import java.util.ArrayList;
-import java.util.List;
import java.util.SortedMap;
/**
* Manages Trickplay storage.
*/
public class TrickplayStorageManager implements BufferManager.StorageManager {
- // TODO: Support multi-sessions.
private static final String BUFFER_DIR = "timeshift";
// Copied from android.provider.Settings.Global (hidden fields)
@@ -46,68 +43,53 @@ public class TrickplayStorageManager implements BufferManager.StorageManager {
private static final int DEFAULT_THRESHOLD_PERCENTAGE = 10;
private static final long DEFAULT_THRESHOLD_MAX_BYTES = 500L * 1024 * 1024;
- private static AsyncTask<Void, Void, Void> sLastCacheCleanUpTask;
- private static File sBufferDir;
- private static long sStorageBufferBytes;
-
+ private final File mBufferDir;
private final long mMaxBufferSize;
+ private final long mStorageBufferBytes;
- private static void initParamsIfNeeded(Context context, @NonNull File path) {
- // TODO: Support multi-sessions.
- SoftPreconditions.checkState(
- sBufferDir == null || sBufferDir.equals(path));
- if (path.equals(sBufferDir)) {
- return;
- }
- sBufferDir = path;
+ private static long getStorageBufferBytes(Context context, File path) {
long lowPercentage = Settings.Global.getInt(context.getContentResolver(),
SYS_STORAGE_THRESHOLD_PERCENTAGE, DEFAULT_THRESHOLD_PERCENTAGE);
- long lowPercentageToBytes = path.getTotalSpace() * lowPercentage / 100;
+ long lowBytes = path.getTotalSpace() * lowPercentage / 100;
long maxLowBytes = Settings.Global.getLong(context.getContentResolver(),
SYS_STORAGE_THRESHOLD_MAX_BYTES, DEFAULT_THRESHOLD_MAX_BYTES);
- sStorageBufferBytes = Math.min(lowPercentageToBytes, maxLowBytes);
+ return Math.min(lowBytes, maxLowBytes);
}
- public TrickplayStorageManager(Context context, @NonNull File baseDir, long maxBufferSize) {
- initParamsIfNeeded(context, new File(baseDir, BUFFER_DIR));
- sBufferDir.mkdirs();
+ public TrickplayStorageManager(Context context, File baseDir, long maxBufferSize) {
+ mBufferDir = new File(baseDir, BUFFER_DIR);
+ mBufferDir.mkdirs();
mMaxBufferSize = maxBufferSize;
clearStorage();
+ mStorageBufferBytes = getStorageBufferBytes(context, mBufferDir);
}
- private void clearStorage() {
- long now = System.currentTimeMillis();
- if (sLastCacheCleanUpTask != null) {
- sLastCacheCleanUpTask.cancel(true);
+ @Override
+ public void clearStorage() {
+ File files[] = mBufferDir.listFiles();
+ if (files == null || files.length == 0) {
+ return;
}
- sLastCacheCleanUpTask = new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... params) {
- if (isCancelled()) {
- return null;
- }
- File files[] = sBufferDir.listFiles();
- if (files == null || files.length == 0) {
- return null;
- }
- for (File file : files) {
- if (isCancelled()) {
- break;
- }
- long lastModified = file.lastModified();
- if (lastModified != 0 && lastModified < now) {
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ for (File file : files) {
file.delete();
}
+ return null;
}
- return null;
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ } else {
+ for (File file : files) {
+ file.delete();
}
- };
- sLastCacheCleanUpTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
}
@Override
public File getBufferDir() {
- return sBufferDir;
+ return mBufferDir;
}
@Override
@@ -122,26 +104,25 @@ public class TrickplayStorageManager implements BufferManager.StorageManager {
@Override
public boolean hasEnoughBuffer(long pendingDelete) {
- return sBufferDir.getUsableSpace() + pendingDelete >= sStorageBufferBytes;
+ return mBufferDir.getUsableSpace() + pendingDelete >= mStorageBufferBytes;
}
@Override
- public List<BufferManager.TrackFormat> readTrackInfoFiles(boolean isAudio) {
+ public Pair<String, MediaFormat> readTrackInfoFile(boolean isAudio) {
return null;
}
@Override
- public ArrayList<BufferManager.PositionHolder> readIndexFile(String trackId) {
+ public ArrayList<Long> readIndexFile(String trackId) {
return null;
}
@Override
- public void writeTrackInfoFiles(List<BufferManager.TrackFormat> formatList, boolean isAudio) {
+ public void writeTrackInfoFile(String trackId, MediaFormat format, boolean isAudio) {
}
@Override
- public void writeIndexFile(String trackName,
- SortedMap<Long, Pair<SampleChunk, Integer>> index) {
+ public void writeIndexFile(String trackName, SortedMap<Long, SampleChunk> index) {
}
}
diff --git a/src/com/android/tv/tuner/setup/ConnectionTypeFragment.java b/src/com/android/tv/tuner/setup/ConnectionTypeFragment.java
index 53678a85..97d9ece3 100644
--- a/src/com/android/tv/tuner/setup/ConnectionTypeFragment.java
+++ b/src/com/android/tv/tuner/setup/ConnectionTypeFragment.java
@@ -36,24 +36,6 @@ public class ConnectionTypeFragment extends SetupMultiPaneFragment {
"com.android.tv.tuner.setup.ConnectionTypeFragment";
@Override
- public void onCreate(Bundle savedInstanceState) {
- ((TunerSetupActivity) getActivity()).generateTunerHal();
- super.onCreate(savedInstanceState);
- }
-
- @Override
- public void onResume() {
- ((TunerSetupActivity) getActivity()).generateTunerHal();
- super.onResume();
- }
-
- @Override
- public void onDestroy() {
- ((TunerSetupActivity) getActivity()).clearTunerHal();
- super.onDestroy();
- }
-
- @Override
protected SetupGuidedStepFragment onCreateContentFragment() {
return new ContentFragment();
}
diff --git a/src/com/android/tv/tuner/setup/PostalCodeFragment.java b/src/com/android/tv/tuner/setup/PostalCodeFragment.java
deleted file mode 100644
index a4dd494c..00000000
--- a/src/com/android/tv/tuner/setup/PostalCodeFragment.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.tuner.setup;
-
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
-import android.support.v17.leanback.widget.GuidedAction;
-import android.support.v17.leanback.widget.GuidedActionsStylist;
-import android.text.InputFilter;
-import android.text.Spanned;
-import android.text.TextUtils;
-import android.view.View;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.tv.R;
-import com.android.tv.common.ui.setup.SetupGuidedStepFragment;
-import com.android.tv.common.ui.setup.SetupMultiPaneFragment;
-import com.android.tv.tuner.util.PostalCodeUtils;
-
-import java.util.List;
-
-/**
- * A fragment for initial screen.
- */
-public class PostalCodeFragment extends SetupMultiPaneFragment {
- public static final String ACTION_CATEGORY =
- "com.android.tv.tuner.setup.PostalCodeFragment";
- private static final int VIEW_TYPE_EDITABLE = 1;
-
- @Override
- protected SetupGuidedStepFragment onCreateContentFragment() {
- ContentFragment fragment = new ContentFragment();
- Bundle arguments = new Bundle();
- arguments.putBoolean(SetupGuidedStepFragment.KEY_THREE_PANE, true);
- fragment.setArguments(arguments);
- return fragment;
- }
-
- @Override
- protected String getActionCategory() {
- return ACTION_CATEGORY;
- }
-
- @Override
- protected boolean needsDoneButton() {
- return true;
- }
-
- @Override
- protected boolean needsSkipButton() {
- return true;
- }
-
- @Override
- protected void setOnClickAction(View view, final String category, final int actionId) {
- if (actionId == ACTION_DONE) {
- view.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- CharSequence postalCode =
- ((ContentFragment) getContentFragment()).mEditAction.getTitle();
- if (postalCode != null && postalCode.length() == 5) {
- PostalCodeUtils.setLastPostalCode(getContext(), postalCode.toString());
- onActionClick(category, actionId);
- } else {
- ContentFragment contentFragment = (ContentFragment) getContentFragment();
- contentFragment.mEditAction.setDescription(
- getString(R.string.postal_code_invalid_warning));
- contentFragment.notifyActionChanged(0);
- contentFragment.mEditedActionView.performClick();
- }
- }
- });
- } else if (actionId == ACTION_SKIP) {
- super.setOnClickAction(view, category, ACTION_SKIP);
- }
- }
-
- public static class ContentFragment extends SetupGuidedStepFragment {
- private GuidedAction mEditAction;
- private View mEditedActionView;
- private View mDoneActionView;
- private boolean mProceed;
-
- @Override
- public void onGuidedActionFocused(GuidedAction action) {
- if (action.equals(mEditAction)) {
- if (mProceed) {
- // "NEXT" in IME was just clicked, moves focus to Done button.
- if (mDoneActionView == null) {
- mDoneActionView = getActivity().findViewById(R.id.button_done);
- }
- mDoneActionView.requestFocus();
- mProceed = false;
- } else {
- // Directly opens IME to input postal/zip code.
- if (mEditedActionView == null) {
- mEditedActionView = getView().findViewById(R.id.guidedactions_editable);
- ((TextView) mEditedActionView.findViewById(R.id.guidedactions_item_title))
- .setFilters(new InputFilter[]{new InputFilter() {
- @Override
- public CharSequence filter(CharSequence source, int start,
- int end, Spanned dest, int dstart, int dend) {
- try {
- Integer.parseInt(source.toString());
- return null;
- } catch (NumberFormatException e) {
- return "";
- }
- }
- }, new InputFilter.LengthFilter(5)});
- }
- mEditedActionView.performClick();
- }
- }
- }
-
- @Override
- public long onGuidedActionEditedAndProceed(GuidedAction action) {
- mProceed = true;
- return 0;
- }
-
- @NonNull
- @Override
- public Guidance onCreateGuidance(Bundle savedInstanceState) {
- String title = getString(R.string.postal_code_guidance_title);
- String description = getString(R.string.postal_code_guidance_description);
- String breadcrumb = getString(R.string.ut_setup_breadcrumb);
- return new Guidance(title, description, breadcrumb, null);
- }
-
- @Override
- public void onCreateActions(@NonNull List<GuidedAction> actions,
- Bundle savedInstanceState) {
- String description = getString(R.string.postal_code_action_description);
- mEditAction = new GuidedAction.Builder(getActivity()).id(0).editable(true)
- .description(description).build();
- actions.add(mEditAction);
- }
-
- @Override
- protected String getActionCategory() {
- return ACTION_CATEGORY;
- }
-
- @Override
- public GuidedActionsStylist onCreateActionsStylist() {
- return new GuidedActionsStylist() {
- @Override
- public int getItemViewType(GuidedAction action) {
- if (action.isEditable()) {
- return VIEW_TYPE_EDITABLE;
- }
- return super.getItemViewType(action);
- }
-
- @Override
- public int onProvideItemLayoutId(int viewType) {
- if (viewType == VIEW_TYPE_EDITABLE) {
- return R.layout.guided_action_editable;
- }
- return super.onProvideItemLayoutId(viewType);
- }
- };
- }
- }
-} \ No newline at end of file
diff --git a/src/com/android/tv/tuner/setup/ScanFragment.java b/src/com/android/tv/tuner/setup/ScanFragment.java
index 75b28e32..3b61debb 100644
--- a/src/com/android/tv/tuner/setup/ScanFragment.java
+++ b/src/com/android/tv/tuner/setup/ScanFragment.java
@@ -21,7 +21,6 @@ import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
-import android.os.Build;
import android.os.Bundle;
import android.os.ConditionVariable;
import android.os.Handler;
@@ -36,13 +35,14 @@ import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
+import com.android.tv.common.AutoCloseableUtils;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.common.ui.setup.SetupFragment;
import com.android.tv.tuner.ChannelScanFileParser;
-import com.android.tv.tuner.R;
import com.android.tv.tuner.TunerHal;
+import com.android.tv.tuner.R;
import com.android.tv.tuner.TunerPreferences;
-import com.android.tv.tuner.data.Channel;
+import com.android.tv.tuner.data.nano.Channel;
import com.android.tv.tuner.data.PsipData;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.source.FileTsStreamer;
@@ -51,6 +51,7 @@ import com.android.tv.tuner.source.TsStreamer;
import com.android.tv.tuner.source.TunerTsStreamer;
import com.android.tv.tuner.tvinput.ChannelDataManager;
import com.android.tv.tuner.tvinput.EventDetector;
+import com.android.tv.tuner.util.TunerInputInfoUtils;
import junit.framework.Assert;
@@ -66,7 +67,6 @@ import java.util.concurrent.TimeUnit;
public class ScanFragment extends SetupFragment {
private static final String TAG = "ScanFragment";
private static final boolean DEBUG = false;
-
// In the fake mode, the connection to antenna or cable is not necessary.
// Instead dummy channels are added.
private static final boolean FAKE_MODE = false;
@@ -98,7 +98,6 @@ public class ScanFragment extends SetupFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- if (DEBUG) Log.d(TAG, "onCreateView");
View view = super.onCreateView(inflater, container, savedInstanceState);
mChannelDataManager = new ChannelDataManager(getActivity());
mChannelDataManager.checkDataVersion(getActivity());
@@ -121,19 +120,13 @@ public class ScanFragment extends SetupFragment {
}
});
Bundle args = getArguments();
- int tunerType = (args == null ? 0 : args.getInt(TunerSetupActivity.KEY_TUNER_TYPE, 0));
// TODO: Handle the case when the fragment is restored.
startScan(args == null ? 0 : args.getInt(EXTRA_FOR_CHANNEL_SCAN_FILE, 0));
TextView scanTitleView = (TextView) view.findViewById(R.id.tune_title);
- switch (tunerType) {
- case TunerHal.TUNER_TYPE_USB:
- scanTitleView.setText(R.string.ut_channel_scan);
- break;
- case TunerHal.TUNER_TYPE_NETWORK:
- scanTitleView.setText(R.string.nt_channel_scan);
- break;
- default:
- scanTitleView.setText(R.string.bt_channel_scan);
+ if (TunerInputInfoUtils.isBuiltInTuner(getActivity())){
+ scanTitleView.setText(R.string.bt_channel_scan);
+ } else {
+ scanTitleView.setText(R.string.ut_channel_scan);
}
return view;
}
@@ -154,14 +147,12 @@ public class ScanFragment extends SetupFragment {
}
@Override
- public void onPause() {
- Log.d(TAG, "onPause");
+ public void onDetach() {
if (mChannelScanTask != null) {
// Ensure scan task will stop.
- Log.w(TAG, "The activity went to the background. Stopping channel scan.");
mChannelScanTask.stopScan();
}
- super.onPause();
+ super.onDetach();
}
/**
@@ -177,9 +168,7 @@ public class ScanFragment extends SetupFragment {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
- if (mChannelScanTask != null) {
- mChannelScanTask.showFinishingProgressDialog();
- }
+ mChannelScanTask.showFinishingProgressDialog();
}
}, SHOW_PROGRESS_DIALOG_DELAY_MS);
@@ -266,7 +255,7 @@ public class ScanFragment extends SetupFragment {
if (FAKE_MODE) {
mScanTsStreamer = new FakeTsStreamer(this);
} else {
- TunerHal hal = ((TunerSetupActivity) mActivity).getTunerHal();
+ TunerHal hal = TunerHal.createInstance(mActivity.getApplicationContext());
if (hal == null) {
throw new RuntimeException("Failed to open a DVB device");
}
@@ -327,17 +316,10 @@ public class ScanFragment extends SetupFragment {
@Override
protected void onProgressUpdate(Integer... values) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- mProgressBar.setProgress(values[0], true);
- } else {
- mProgressBar.setProgress(values[0]);
- }
+ mProgressBar.setProgress(values[0]);
}
private void stopScan() {
- if (mLatch != null) {
- mLatch.countDown();
- }
mConditionStopped.open();
}
@@ -378,7 +360,11 @@ public class ScanFragment extends SetupFragment {
if (mConditionStopped.block(-1)) {
break;
}
- publishProgress(MAX_PROGRESS * i++ / mScanChannelList.size());
+ onProgressUpdate(MAX_PROGRESS * i++ / mScanChannelList.size());
+ }
+ if (mScanTsStreamer instanceof TunerTsStreamer) {
+ AutoCloseableUtils.closeQuietly(
+ ((TunerTsStreamer) mScanTsStreamer).getTunerHal());
}
mChannelDataManager.notifyScanCompleted();
if (!mConditionStopped.block(-1)) {
@@ -468,13 +454,7 @@ public class ScanFragment extends SetupFragment {
if (mFinishingProgressDialog != null) {
mFinishingProgressDialog.dismiss();
}
- // If the fragment is not resumed, the next fragment (scan result page) can't be
- // displayed. In that case, just close the activity.
- if (isResumed()) {
- onActionClick(ACTION_CATEGORY, mIsCanceled ? ACTION_CANCEL : ACTION_FINISH);
- } else if (getActivity() != null) {
- getActivity().finish();
- }
+ onActionClick(ACTION_CATEGORY, mIsCanceled ? ACTION_CANCEL : ACTION_FINISH);
mChannelScanTask = null;
}
}
diff --git a/src/com/android/tv/tuner/setup/ScanResultFragment.java b/src/com/android/tv/tuner/setup/ScanResultFragment.java
index 3b8cd823..068543cd 100644
--- a/src/com/android/tv/tuner/setup/ScanResultFragment.java
+++ b/src/com/android/tv/tuner/setup/ScanResultFragment.java
@@ -26,7 +26,6 @@ import android.support.v17.leanback.widget.GuidedAction;
import com.android.tv.common.ui.setup.SetupGuidedStepFragment;
import com.android.tv.common.ui.setup.SetupMultiPaneFragment;
import com.android.tv.tuner.R;
-import com.android.tv.tuner.TunerHal;
import com.android.tv.tuner.TunerPreferences;
import com.android.tv.tuner.util.TunerInputInfoUtils;
@@ -77,19 +76,11 @@ public class ScanResultFragment extends SetupMultiPaneFragment {
mChannelCountOnPreference, mChannelCountOnPreference);
breadcrumb = null;
} else {
- Bundle args = getArguments();
- int tunerType =
- (args == null ? 0 : args.getInt(TunerSetupActivity.KEY_TUNER_TYPE, 0));
title = getString(R.string.ut_result_not_found_title);
- switch (tunerType) {
- case TunerHal.TUNER_TYPE_USB:
- description = getString(R.string.ut_result_not_found_description);
- break;
- case TunerHal.TUNER_TYPE_NETWORK:
- description = getString(R.string.nt_result_not_found_description);
- break;
- default:
- description = getString(R.string.bt_result_not_found_description);
+ if (TunerInputInfoUtils.isBuiltInTuner(getActivity())) {
+ description = getString(R.string.bt_result_not_found_description);
+ } else {
+ description = getString(R.string.ut_result_not_found_description);
}
breadcrumb = getString(R.string.ut_setup_breadcrumb);
}
diff --git a/src/com/android/tv/tuner/setup/TunerSetupActivity.java b/src/com/android/tv/tuner/setup/TunerSetupActivity.java
index f618c699..78121bc5 100644
--- a/src/com/android/tv/tuner/setup/TunerSetupActivity.java
+++ b/src/com/android/tv/tuner/setup/TunerSetupActivity.java
@@ -29,53 +29,35 @@ import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.tv.TvContract;
-import android.os.AsyncTask;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.VisibleForTesting;
import android.support.v4.app.NotificationCompat;
-import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Toast;
import com.android.tv.TvApplication;
-import com.android.tv.common.AutoCloseableUtils;
import com.android.tv.common.TvCommonConstants;
import com.android.tv.common.TvCommonUtils;
import com.android.tv.common.ui.setup.SetupActivity;
import com.android.tv.common.ui.setup.SetupFragment;
import com.android.tv.common.ui.setup.SetupMultiPaneFragment;
-import com.android.tv.experiments.Experiments;
import com.android.tv.tuner.R;
import com.android.tv.tuner.TunerHal;
import com.android.tv.tuner.TunerPreferences;
import com.android.tv.tuner.tvinput.TunerTvInputService;
-import com.android.tv.tuner.util.PostalCodeUtils;
-import com.android.tv.util.LocationUtils;
-
-import java.util.Locale;
-import java.util.concurrent.Executor;
+import com.android.tv.tuner.util.TunerInputInfoUtils;
/**
* An activity that serves tuner setup process.
*/
public class TunerSetupActivity extends SetupActivity {
- private static final String TAG = "TunerSetupActivity";
- private static final boolean DEBUG = false;
-
- /**
- * Key for passing tuner type to sub-fragments.
- */
- public static final String KEY_TUNER_TYPE = "TunerSetupActivity.tunerType";
-
+ private final String TAG = "TunerSetupActivity";
// For the recommendation card
private static final String TV_ACTIVITY_CLASS_NAME = "com.android.tv.TvActivity";
private static final String NOTIFY_TAG = "TunerSetup";
private static final int NOTIFY_ID = 1000;
private static final String TAG_DRAWABLE = "drawable";
private static final String TAG_ICON = "ic_launcher_s";
- private static final int PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 1;
private static final int CHANNEL_MAP_SCAN_FILE[] = {
R.raw.ut_us_atsc_center_frequencies_8vsb,
@@ -87,13 +69,9 @@ public class TunerSetupActivity extends SetupActivity {
R.raw.ut_kr_dev_cj_cable_center_frequencies_qam256};
private ScanFragment mLastScanFragment;
- private Integer mTunerType;
- private TunerHalFactory mTunerHalFactory;
- private boolean mNeedToShowPostalCodeFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
- if (DEBUG) Log.d(TAG, "onCreate");
TvApplication.setCurrentRunningProcess(this, false);
super.onCreate(savedInstanceState);
// TODO: check {@link shouldShowRequestPermissionRationale}.
@@ -101,49 +79,13 @@ public class TunerSetupActivity extends SetupActivity {
!= PackageManager.PERMISSION_GRANTED) {
// No need to check the request result.
requestPermissions(new String[] {android.Manifest.permission.ACCESS_COARSE_LOCATION},
- PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
- }
- mTunerType = TunerHal.getTunerTypeAndCount(this).first;
- if (mTunerType == null) {
- finish();
- } else {
- mTunerHalFactory = new TunerHalFactory(getApplicationContext());
- }
- try {
- // Updating postal code takes time, therefore we called it here for "warm-up".
- PostalCodeUtils.setLastPostalCode(this, null);
- PostalCodeUtils.updatePostalCode(this);
- } catch (Exception e) {
- // Do nothing. If the last known postal code is null, we'll show guided fragment to
- // prompt users to input postal code before ConnectionTypeFragment is shown.
- Log.i(TAG, "Can't get postal code:" + e);
- }
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
- @NonNull int[] grantResults) {
- if (requestCode == PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION) {
- if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
- && Experiments.CLOUD_EPG.get()) {
- try {
- // Updating postal code takes time, therefore we should update postal code
- // right after the permission is granted, so that the subsequent operations,
- // especially EPG fetcher, could get the newly updated postal code.
- PostalCodeUtils.updatePostalCode(this);
- } catch (Exception e) {
- // Do nothing
- }
- }
+ 0);
}
}
@Override
protected Fragment onCreateInitialFragment() {
SetupFragment fragment = new WelcomeFragment();
- Bundle args = new Bundle();
- args.putInt(KEY_TUNER_TYPE, mTunerType);
- fragment.setArguments(args);
fragment.setShortDistance(SetupFragment.FRAGMENT_EXIT_TRANSITION
| SetupFragment.FRAGMENT_REENTER_TRANSITION);
return fragment;
@@ -160,41 +102,33 @@ public class TunerSetupActivity extends SetupActivity {
finish();
break;
default: {
- if (mNeedToShowPostalCodeFragment
- || Locale.US.getCountry().equalsIgnoreCase(
- LocationUtils.getCurrentCountry(getApplicationContext()))
- && TextUtils.isEmpty(PostalCodeUtils.getLastPostalCode(this))) {
- // We cannot get postal code automatically. Postal code input fragment
- // should always be shown even if users have input some valid postal
- // code in this activity before.
- mNeedToShowPostalCodeFragment = true;
- showPostalCodeFragment();
- } else {
- showConnectionTypeFragment();
- }
+ SetupFragment fragment = new ConnectionTypeFragment();
+ fragment.setShortDistance(SetupFragment.FRAGMENT_ENTER_TRANSITION
+ | SetupFragment.FRAGMENT_RETURN_TRANSITION);
+ showFragment(fragment, true);
break;
}
}
return true;
- case PostalCodeFragment.ACTION_CATEGORY:
- if (actionId == SetupMultiPaneFragment.ACTION_DONE
- || actionId == SetupMultiPaneFragment.ACTION_SKIP) {
- showConnectionTypeFragment();
- }
- return true;
case ConnectionTypeFragment.ACTION_CATEGORY:
- if (mTunerHalFactory.get() == null) {
+ TunerHal hal = TunerHal.createInstance(getApplicationContext());
+ if (hal == null) {
finish();
Toast.makeText(getApplicationContext(),
R.string.ut_channel_scan_tuner_unavailable,Toast.LENGTH_LONG).show();
return true;
}
+ try {
+ hal.close();
+ } catch (Exception e) {
+ Log.e(TAG, "Tuner hal close failed", e);
+ return true;
+ }
mLastScanFragment = new ScanFragment();
- Bundle args1 = new Bundle();
- args1.putInt(ScanFragment.EXTRA_FOR_CHANNEL_SCAN_FILE,
+ Bundle args = new Bundle();
+ args.putInt(ScanFragment.EXTRA_FOR_CHANNEL_SCAN_FILE,
CHANNEL_MAP_SCAN_FILE[actionId]);
- args1.putInt(KEY_TUNER_TYPE, mTunerType);
- mLastScanFragment.setArguments(args1);
+ mLastScanFragment.setArguments(args);
showFragment(mLastScanFragment, true);
return true;
case ScanFragment.ACTION_CATEGORY:
@@ -203,11 +137,7 @@ public class TunerSetupActivity extends SetupActivity {
getFragmentManager().popBackStack();
return true;
case ScanFragment.ACTION_FINISH:
- mTunerHalFactory.clear();
SetupFragment fragment = new ScanResultFragment();
- Bundle args2 = new Bundle();
- args2.putInt(KEY_TUNER_TYPE, mTunerType);
- fragment.setArguments(args2);
fragment.setShortDistance(SetupFragment.FRAGMENT_EXIT_TRANSITION
| SetupFragment.FRAGMENT_REENTER_TRANSITION);
showFragment(fragment, true);
@@ -283,7 +213,7 @@ public class TunerSetupActivity extends SetupActivity {
String inputId = TvContract.buildInputId(new ComponentName(context.getPackageName(),
TunerTvInputService.class.getName()));
- // Make an intent to launch the setup activity of TV tuner input.
+ // Make an intent to launch the setup activity of USB tuner TV input.
Intent intent = TvCommonUtils.createSetupIntent(
new Intent(context, TunerSetupActivity.class), inputId);
intent.putExtra(TvCommonConstants.EXTRA_INPUT_ID, inputId);
@@ -294,27 +224,6 @@ public class TunerSetupActivity extends SetupActivity {
}
/**
- * Gets the currently used tuner HAL.
- */
- TunerHal getTunerHal() {
- return mTunerHalFactory.get();
- }
-
- /**
- * Generates tuner HAL.
- */
- void generateTunerHal() {
- mTunerHalFactory.generate();
- }
-
- /**
- * Clears the currently used tuner HAL.
- */
- void clearTunerHal() {
- mTunerHalFactory.clear();
- }
-
- /**
* Returns a {@link PendingIntent} to launch the tuner TV input service.
*
* @param context a {@link Context} instance
@@ -333,19 +242,12 @@ public class TunerSetupActivity extends SetupActivity {
Resources resources = context.getResources();
String focusedTitle = resources.getString(
R.string.ut_setup_recommendation_card_focused_title);
- int titleStringId = 0;
- switch (TunerHal.getTunerTypeAndCount(context).first) {
- case TunerHal.TUNER_TYPE_BUILT_IN:
- titleStringId = R.string.bt_setup_recommendation_card_title;
- break;
- case TunerHal.TUNER_TYPE_USB:
- titleStringId = R.string.ut_setup_recommendation_card_title;
- break;
- case TunerHal.TUNER_TYPE_NETWORK:
- titleStringId = R.string.nt_setup_recommendation_card_title;
- break;
+ String title;
+ if (TunerInputInfoUtils.isBuiltInTuner(context)) {
+ title = resources.getString(R.string.bt_setup_recommendation_card_title);
+ } else {
+ title = resources.getString(R.string.ut_setup_recommendation_card_title);
}
- String title = resources.getString(titleStringId);
Bitmap largeIcon = BitmapFactory.decodeResource(resources,
R.drawable.recommendation_antenna);
@@ -367,20 +269,6 @@ public class TunerSetupActivity extends SetupActivity {
notificationManager.notify(NOTIFY_TAG, NOTIFY_ID, notification);
}
- private void showPostalCodeFragment() {
- SetupFragment fragment = new PostalCodeFragment();
- fragment.setShortDistance(SetupFragment.FRAGMENT_ENTER_TRANSITION
- | SetupFragment.FRAGMENT_RETURN_TRANSITION);
- showFragment(fragment, true);
- }
-
- private void showConnectionTypeFragment() {
- SetupFragment fragment = new ConnectionTypeFragment();
- fragment.setShortDistance(SetupFragment.FRAGMENT_ENTER_TRANSITION
- | SetupFragment.FRAGMENT_RETURN_TRANSITION);
- showFragment(fragment, true);
- }
-
/**
* Cancels the previously shown recommendation card.
*
@@ -391,80 +279,4 @@ public class TunerSetupActivity extends SetupActivity {
.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(NOTIFY_TAG, NOTIFY_ID);
}
-
- @VisibleForTesting
- static class TunerHalFactory {
- private Context mContext;
- @VisibleForTesting
- TunerHal mTunerHal;
- private GenerateTunerHalTask mGenerateTunerHalTask;
- private final Executor mExecutor;
-
- TunerHalFactory(Context context) {
- this(context, AsyncTask.SERIAL_EXECUTOR);
- }
-
- TunerHalFactory(Context context, Executor executor) {
- mContext = context;
- mExecutor = executor;
- }
-
- /**
- * Returns tuner HAL currently used. If it's {@code null} and tuner HAL is not generated
- * before, tries to generate it synchronously.
- */
- TunerHal get() {
- if (mGenerateTunerHalTask != null
- && mGenerateTunerHalTask.getStatus() != AsyncTask.Status.FINISHED) {
- try {
- return mGenerateTunerHalTask.get();
- } catch (Exception e) {
- Log.e(TAG, "Cannot get Tuner HAL: " + e);
- }
- } else if (mGenerateTunerHalTask == null && mTunerHal == null) {
- mTunerHal = createInstance();
- }
- return mTunerHal;
- }
-
- /**
- * Generates tuner hal for scanning with asynchronous tasks.
- */
- void generate() {
- if (mGenerateTunerHalTask == null && mTunerHal == null) {
- mGenerateTunerHalTask = new GenerateTunerHalTask();
- mGenerateTunerHalTask.executeOnExecutor(mExecutor);
- }
- }
-
- /**
- * Clears the currently used tuner hal.
- */
- void clear() {
- if (mGenerateTunerHalTask != null) {
- mGenerateTunerHalTask.cancel(true);
- mGenerateTunerHalTask = null;
- }
- if (mTunerHal != null) {
- AutoCloseableUtils.closeQuietly(mTunerHal);
- mTunerHal = null;
- }
- }
-
- protected TunerHal createInstance() {
- return TunerHal.createInstance(mContext);
- }
-
- class GenerateTunerHalTask extends AsyncTask<Void, Void, TunerHal> {
- @Override
- protected TunerHal doInBackground(Void... args) {
- return createInstance();
- }
-
- @Override
- protected void onPostExecute(TunerHal tunerHal) {
- mTunerHal = tunerHal;
- }
- }
- }
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/tuner/setup/WelcomeFragment.java b/src/com/android/tv/tuner/setup/WelcomeFragment.java
index a3dddc72..7e809411 100644
--- a/src/com/android/tv/tuner/setup/WelcomeFragment.java
+++ b/src/com/android/tv/tuner/setup/WelcomeFragment.java
@@ -27,7 +27,6 @@ import android.view.ViewGroup;
import com.android.tv.common.ui.setup.SetupGuidedStepFragment;
import com.android.tv.common.ui.setup.SetupMultiPaneFragment;
import com.android.tv.tuner.R;
-import com.android.tv.tuner.TunerHal;
import com.android.tv.tuner.TunerPreferences;
import com.android.tv.tuner.util.TunerInputInfoUtils;
@@ -42,9 +41,7 @@ public class WelcomeFragment extends SetupMultiPaneFragment {
@Override
protected SetupGuidedStepFragment onCreateContentFragment() {
- ContentFragment fragment = new ContentFragment();
- fragment.setArguments(getArguments());
- return fragment;
+ return new ContentFragment();
}
@Override
@@ -73,33 +70,20 @@ public class WelcomeFragment extends SetupMultiPaneFragment {
public Guidance onCreateGuidance(Bundle savedInstanceState) {
String title;
String description;
- int tunerType = getArguments().getInt(TunerSetupActivity.KEY_TUNER_TYPE,
- TunerHal.TUNER_TYPE_BUILT_IN);
if (mChannelCountOnPreference == 0) {
- switch (tunerType) {
- case TunerHal.TUNER_TYPE_USB:
- title = getString(R.string.ut_setup_new_title);
- description = getString(R.string.ut_setup_new_description);
- break;
- case TunerHal.TUNER_TYPE_NETWORK:
- title = getString(R.string.nt_setup_new_title);
- description = getString(R.string.nt_setup_new_description);
- break;
- default:
- title = getString(R.string.bt_setup_new_title);
- description = getString(R.string.bt_setup_new_description);
+ if (TunerInputInfoUtils.isBuiltInTuner(getActivity())) {
+ title = getString(R.string.bt_setup_new_title);
+ description = getString(R.string.bt_setup_new_description);
+ } else {
+ title = getString(R.string.ut_setup_new_title);
+ description = getString(R.string.ut_setup_new_description);
}
} else {
title = getString(R.string.bt_setup_again_title);
- switch (tunerType) {
- case TunerHal.TUNER_TYPE_USB:
- description = getString(R.string.ut_setup_again_description);
- break;
- case TunerHal.TUNER_TYPE_NETWORK:
- description = getString(R.string.nt_setup_again_description);
- break;
- default:
- description = getString(R.string.bt_setup_again_description);
+ if (TunerInputInfoUtils.isBuiltInTuner(getActivity())) {
+ description = getString(R.string.bt_setup_again_description);
+ } else {
+ description = getString(R.string.ut_setup_again_description);
}
}
return new Guidance(title, description, null, null);
diff --git a/src/com/android/tv/tuner/source/FileTsStreamer.java b/src/com/android/tv/tuner/source/FileTsStreamer.java
index 80ec8a56..14997ee4 100644
--- a/src/com/android/tv/tuner/source/FileTsStreamer.java
+++ b/src/com/android/tv/tuner/source/FileTsStreamer.java
@@ -256,7 +256,7 @@ public class FileTsStreamer implements TsStreamer {
* Returns whether the current pid filter is empty or not.
*/
public boolean isFilterEmpty() {
- return mPids.size() == 0;
+ return mPids.size() > 0;
}
/**
diff --git a/src/com/android/tv/tuner/source/TsDataSourceManager.java b/src/com/android/tv/tuner/source/TsDataSourceManager.java
index 32504b95..ccbb75ba 100644
--- a/src/com/android/tv/tuner/source/TsDataSourceManager.java
+++ b/src/com/android/tv/tuner/source/TsDataSourceManager.java
@@ -17,10 +17,8 @@
package com.android.tv.tuner.source;
import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-import com.android.tv.tuner.TunerHal;
-import com.android.tv.tuner.data.Channel;
+import com.android.tv.tuner.data.nano.Channel;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.tvinput.EventDetector;
@@ -129,14 +127,6 @@ public class TsDataSourceManager {
}
/**
- * Add tuner hal into TunerTsStreamerManager for test.
- */
- @VisibleForTesting
- public void addTunerHalForTest(TunerHal tunerHal) {
- mTunerStreamerManager.addTunerHal(tunerHal, mId);
- }
-
- /**
* Releases persistent resources.
*/
public void release() {
diff --git a/src/com/android/tv/tuner/source/TunerTsStreamer.java b/src/com/android/tv/tuner/source/TunerTsStreamer.java
index 65b11a5a..b24048e6 100644
--- a/src/com/android/tv/tuner/source/TunerTsStreamer.java
+++ b/src/com/android/tv/tuner/source/TunerTsStreamer.java
@@ -42,17 +42,15 @@ public class TunerTsStreamer implements TsStreamer {
private static final int MIN_READ_UNIT = 1500;
private static final int READ_BUFFER_SIZE = MIN_READ_UNIT * 10; // ~15KB
private static final int CIRCULAR_BUFFER_SIZE = MIN_READ_UNIT * 20000; // ~ 30MB
- private static final int TS_PACKET_SIZE = 188;
private static final int READ_TIMEOUT_MS = 5000; // 5 secs.
private static final int BUFFER_UNDERRUN_SLEEP_MS = 10;
- private static final int READ_ERROR_STREAMING_ENDED = -1;
- private static final int READ_ERROR_BUFFER_OVERWRITTEN = -2;
private final Object mCircularBufferMonitor = new Object();
private final byte[] mCircularBuffer = new byte[CIRCULAR_BUFFER_SIZE];
private long mBytesFetched;
private final AtomicLong mLastReadPosition = new AtomicLong();
+ private boolean mEndOfStreamSent;
private boolean mStreaming;
private final TunerHal mTunerHal;
@@ -61,7 +59,6 @@ public class TunerTsStreamer implements TsStreamer {
private final EventDetector mEventDetector;
private final TsStreamWriter mTsStreamWriter;
- private String mChannelNumber;
public static class TunerDataSource extends TsDataSource {
private final TunerTsStreamer mTsStreamer;
@@ -106,15 +103,6 @@ public class TunerTsStreamer implements TsStreamer {
offset, readLength);
if (ret > 0) {
mLastReadPosition.addAndGet(ret);
- } else if (ret == READ_ERROR_BUFFER_OVERWRITTEN) {
- long currentPosition = mStartBufferedPosition + mLastReadPosition.get();
- long endPosition = mTsStreamer.getBufferedPosition();
- long diff = ((endPosition - currentPosition + TS_PACKET_SIZE - 1) / TS_PACKET_SIZE)
- * TS_PACKET_SIZE;
- Log.w(TAG, "Demux position jump by overwritten buffer: " + diff);
- mStartBufferedPosition = currentPosition + diff;
- mLastReadPosition.set(0);
- return 0;
}
return ret;
}
@@ -126,10 +114,7 @@ public class TunerTsStreamer implements TsStreamer {
*/
public TunerTsStreamer(TunerHal tunerHal, EventListener eventListener, Context context) {
mTunerHal = tunerHal;
- mEventDetector = new EventDetector(mTunerHal);
- if (eventListener != null) {
- mEventDetector.registerListener(eventListener);
- }
+ mEventDetector = new EventDetector(mTunerHal, eventListener);
mTsStreamWriter = context != null && TunerPreferences.getStoreTsStream(context) ?
new TsStreamWriter(context) : null;
}
@@ -140,8 +125,7 @@ public class TunerTsStreamer implements TsStreamer {
@Override
public boolean startStream(TunerChannel channel) {
- if (mTunerHal.tune(channel.getFrequency(), channel.getModulation(),
- channel.getDisplayNumber(false))) {
+ if (mTunerHal.tune(channel.getFrequency(), channel.getModulation())) {
if (channel.hasVideo()) {
mTunerHal.addPidFilter(channel.getVideoPid(),
TunerHal.FILTER_TYPE_VIDEO);
@@ -164,7 +148,6 @@ public class TunerTsStreamer implements TsStreamer {
channel.getProgramNumber());
}
mChannel = channel;
- mChannelNumber = channel.getDisplayNumber();
synchronized (mCircularBufferMonitor) {
if (mStreaming) {
Log.w(TAG, "Streaming should be stopped before start streaming");
@@ -173,6 +156,7 @@ public class TunerTsStreamer implements TsStreamer {
mStreaming = true;
mBytesFetched = 0;
mLastReadPosition.set(0L);
+ mEndOfStreamSent = false;
}
if (mTsStreamWriter != null) {
mTsStreamWriter.setChannel(mChannel);
@@ -188,7 +172,7 @@ public class TunerTsStreamer implements TsStreamer {
@Override
public boolean startStream(ChannelScanFileParser.ScanChannel channel) {
- if (mTunerHal.tune(channel.frequency, channel.modulation, null)) {
+ if (mTunerHal.tune(channel.frequency, channel.modulation)) {
mEventDetector.startDetecting(
channel.frequency, channel.modulation, EventDetector.ALL_PROGRAM_NUMBERS);
synchronized (mCircularBufferMonitor) {
@@ -199,6 +183,7 @@ public class TunerTsStreamer implements TsStreamer {
mStreaming = true;
mBytesFetched = 0;
mLastReadPosition.set(0L);
+ mEndOfStreamSent = false;
}
mStreamingThread = new StreamingThread();
mStreamingThread.start();
@@ -273,22 +258,6 @@ public class TunerTsStreamer implements TsStreamer {
}
}
- public String getStreamerInfo() {
- return "Channel: " + mChannelNumber + ", Streaming: " + mStreaming;
- }
-
- public void registerListener(EventListener listener) {
- if (mEventDetector != null && listener != null) {
- mEventDetector.registerListener(listener);
- }
- }
-
- public void unregisterListener(EventListener listener) {
- if (mEventDetector != null) {
- mEventDetector.unregisterListener(listener);
- }
- }
-
private class StreamingThread extends Thread {
@Override
public void run() {
@@ -352,14 +321,21 @@ public class TunerTsStreamer implements TsStreamer {
* @throws IOException
*/
public int readAt(long pos, byte[] buffer, int offset, int amount) throws IOException {
+ long readStartTime = System.currentTimeMillis();
while (true) {
synchronized (mCircularBufferMonitor) {
- if (!mStreaming) {
- return READ_ERROR_STREAMING_ENDED;
+ if (mEndOfStreamSent || !mStreaming) {
+ return -1;
}
if (mBytesFetched - CIRCULAR_BUFFER_SIZE > pos) {
- Log.w(TAG, "Demux is requesting the data which is already overwritten.");
- return READ_ERROR_BUFFER_OVERWRITTEN;
+ Log.e(TAG, "Demux is requesting the data which is already overwritten.");
+ return -1;
+ }
+ if (System.currentTimeMillis() - readStartTime > READ_TIMEOUT_MS) {
+ // Nothing was received during READ_TIMEOUT_MS before.
+ mEndOfStreamSent = true;
+ mCircularBufferMonitor.notifyAll();
+ return -1;
}
if (mBytesFetched < pos + amount) {
try {
diff --git a/src/com/android/tv/tuner/source/TunerTsStreamerManager.java b/src/com/android/tv/tuner/source/TunerTsStreamerManager.java
index fcd14116..cf1f6dcf 100644
--- a/src/com/android/tv/tuner/source/TunerTsStreamerManager.java
+++ b/src/com/android/tv/tuner/source/TunerTsStreamerManager.java
@@ -42,7 +42,6 @@ class TunerTsStreamerManager {
private final Object mCancelLock = new Object();
private final StreamerFinder mStreamerFinder = new StreamerFinder();
private final Map<Integer, TsStreamerCreator> mCreators = new HashMap<>();
- private final Map<Integer, EventDetector.EventListener> mListeners = new HashMap<>();
private final Map<TsDataSource, TunerTsStreamer> mSourceToStreamerMap = new HashMap<>();
private final TunerHalManager mTunerHalManager = new TunerHalManager();
private static TunerTsStreamerManager sInstance;
@@ -69,8 +68,6 @@ class TunerTsStreamerManager {
mStreamerFinder.appendSessionLocked(channel, sessionId);
TunerTsStreamer streamer = mStreamerFinder.getStreamerLocked(channel);
TsDataSource source = streamer.createDataSource();
- mListeners.put(sessionId, listener);
- streamer.registerListener(listener);
mSourceToStreamerMap.put(source, streamer);
return source;
}
@@ -86,8 +83,6 @@ class TunerTsStreamerManager {
if (!creator.isCancelledLocked()) {
mStreamerFinder.putLocked(channel, sessionId, streamer);
TsDataSource source = streamer.createDataSource();
- mListeners.put(sessionId, listener);
- streamer.registerListener(listener);
mSourceToStreamerMap.put(source, streamer);
return source;
}
@@ -109,8 +104,6 @@ class TunerTsStreamerManager {
if (streamer == null) {
return;
}
- EventDetector.EventListener listener = mListeners.remove(sessionId);
- streamer.unregisterListener(listener);
TunerChannel channel = streamer.getChannel();
SoftPreconditions.checkState(channel != null);
mStreamerFinder.removeSessionLocked(channel, sessionId);
@@ -132,13 +125,6 @@ class TunerTsStreamerManager {
}
}
- /**
- * Add tuner hal into TunerHalManager for test.
- */
- void addTunerHal(TunerHal tunerHal, int sessionId) {
- mTunerHalManager.addTunerHal(tunerHal, sessionId);
- }
-
synchronized void release(int sessionId) {
mTunerHalManager.releaseCachedHal(sessionId);
}
@@ -275,16 +261,16 @@ class TunerTsStreamerManager {
}
private void releaseTunerHal(TunerHal hal, int sessionId, boolean reuse) {
- if (!reuse || !hal.isReusable()) {
+ if (!reuse) {
AutoCloseableUtils.closeQuietly(hal);
return;
}
TunerHal cachedHal = mTunerHals.get(sessionId);
if (cachedHal != hal) {
mTunerHals.put(sessionId, hal);
- if (cachedHal != null) {
- AutoCloseableUtils.closeQuietly(cachedHal);
- }
+ }
+ if (cachedHal != null && cachedHal != hal) {
+ AutoCloseableUtils.closeQuietly(cachedHal);
}
}
@@ -297,9 +283,5 @@ class TunerTsStreamerManager {
AutoCloseableUtils.closeQuietly(hal);
}
}
-
- private void addTunerHal(TunerHal tunerHal, int sessionId) {
- mTunerHals.put(sessionId, tunerHal);
- }
}
} \ No newline at end of file
diff --git a/src/com/android/tv/tuner/ts/SectionParser.java b/src/com/android/tv/tuner/ts/SectionParser.java
index fe972cd1..8c1f6a1b 100644
--- a/src/com/android/tv/tuner/ts/SectionParser.java
+++ b/src/com/android/tv/tuner/ts/SectionParser.java
@@ -22,7 +22,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
-import com.android.tv.tuner.data.Channel;
+import com.android.tv.tuner.data.nano.Channel;
import com.android.tv.tuner.data.PsiData.PatItem;
import com.android.tv.tuner.data.PsiData.PmtItem;
import com.android.tv.tuner.data.PsipData.Ac3AudioDescriptor;
@@ -39,8 +39,8 @@ import com.android.tv.tuner.data.PsipData.RatingRegion;
import com.android.tv.tuner.data.PsipData.RegionalRating;
import com.android.tv.tuner.data.PsipData.TsDescriptor;
import com.android.tv.tuner.data.PsipData.VctItem;
-import com.android.tv.tuner.data.Track.AtscAudioTrack;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
+import com.android.tv.tuner.data.nano.Track.AtscAudioTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import com.android.tv.tuner.util.ByteArrayBuffer;
import com.ibm.icu.text.UnicodeDecompressor;
@@ -367,10 +367,6 @@ public class SectionParser {
mParsedEttItems.clear();
}
- public void resetVersionNumbers() {
- mSectionVersionMap.clear();
- }
-
private void parseSection(byte[] data) {
if (!checkSanity(data)) {
Log.d(TAG, "Bad CRC!");
@@ -514,8 +510,10 @@ public class SectionParser {
pos += 11 + descriptorsLength;
results.add(new MgtItem(tableType, tableTypePid));
}
- // Skip the remaining descriptor part which we don't use.
-
+ if ((data[pos] & 0xf0) != 0xf0) {
+ Log.e(TAG, "Broken MGT.");
+ return false;
+ }
if (mListener != null) {
mListener.onMgtParsed(results);
}
@@ -719,9 +717,6 @@ public class SectionParser {
if (audioDescriptor.getLanguage() != null) {
audioTrack.language = audioDescriptor.getLanguage();
}
- if (audioTrack.language == null) {
- audioTrack.language = "";
- }
audioTrack.audioType = AtscAudioTrack.AUDIOTYPE_UNDEFINED;
audioTrack.channelCount = audioDescriptor.getNumChannels();
audioTrack.sampleRate = audioDescriptor.getSampleRate();
@@ -953,7 +948,6 @@ public class SectionParser {
pos += 3;
boolean ccType = (data[pos] & 0x80) != 0;
if (!ccType) {
- pos +=3;
continue;
}
int captionServiceNumber = data[pos] & 0x3f;
diff --git a/src/com/android/tv/tuner/ts/TsParser.java b/src/com/android/tv/tuner/ts/TsParser.java
index 21b5a942..c24c2a21 100644
--- a/src/com/android/tv/tuner/ts/TsParser.java
+++ b/src/com/android/tv/tuner/ts/TsParser.java
@@ -102,7 +102,6 @@ public class TsParser {
}
protected abstract void handleData(byte[] data, boolean startIndicator);
- protected abstract void resetDataVersions();
}
private class SectionStream extends Stream {
@@ -139,11 +138,6 @@ public class TsParser {
mSectionParser.parseSections(mPacket);
}
- @Override
- protected void resetDataVersions() {
- mSectionParser.resetVersionNumbers();
- }
-
private final OutputListener mSectionListener = new OutputListener() {
@Override
public void onPatParsed(List<PatItem> items) {
@@ -457,16 +451,4 @@ public class TsParser {
}
return incompleteChannels;
}
-
- /**
- * Reset the versions so that data with old version number can be handled.
- */
- public void resetDataVersions() {
- for (int eitPid : mEITPids) {
- Stream stream = mStreamMap.get(eitPid);
- if (stream != null) {
- stream.resetDataVersions();
- }
- }
- }
}
diff --git a/src/com/android/tv/tuner/tvinput/ChannelDataManager.java b/src/com/android/tv/tuner/tvinput/ChannelDataManager.java
index 885cef9f..a16bc522 100644
--- a/src/com/android/tv/tuner/tvinput/ChannelDataManager.java
+++ b/src/com/android/tv/tuner/tvinput/ChannelDataManager.java
@@ -30,7 +30,6 @@ import android.os.HandlerThread;
import android.os.Message;
import android.os.RemoteException;
import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
import android.text.format.DateUtils;
import android.util.Log;
@@ -38,7 +37,6 @@ import com.android.tv.tuner.TunerPreferences;
import com.android.tv.tuner.data.PsipData.EitItem;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.util.ConvertUtils;
-import com.android.tv.util.PermissionUtils;
import java.util.ArrayList;
import java.util.Collections;
@@ -194,14 +192,11 @@ public class ChannelDataManager implements Handler.Callback {
public void release() {
mHandler.removeCallbacksAndMessages(null);
- releaseSafely();
+ mHandlerThread.quitSafely();
}
public void releaseSafely() {
mHandlerThread.quitSafely();
- mListener = null;
- mChannelScanListener = null;
- mChannelScanHandler = null;
}
public TunerChannel getChannel(long channelId) {
@@ -440,7 +435,7 @@ public class ChannelDataManager implements Handler.Callback {
}
}
ops.add(buildContentProviderOperation(ContentProviderOperation.newInsert(
- TvContract.Programs.CONTENT_URI), newItem, channel));
+ TvContract.Programs.CONTENT_URI), newItem, channel.getChannelId()));
if (ops.size() >= BATCH_OPERATION_COUNT) {
applyBatch(channel.getName(), ops);
ops.clear();
@@ -510,7 +505,7 @@ public class ChannelDataManager implements Handler.Callback {
continue;
}
ops.add(buildContentProviderOperation(ContentProviderOperation.newInsert(
- TvContract.Programs.CONTENT_URI), item, channel));
+ TvContract.Programs.CONTENT_URI), item, channel.getChannelId()));
if (ops.size() >= BATCH_OPERATION_COUNT) {
applyBatch(channel.getName(), ops);
ops.clear();
@@ -521,13 +516,9 @@ public class ChannelDataManager implements Handler.Callback {
}
private ContentProviderOperation buildContentProviderOperation(
- ContentProviderOperation.Builder builder, EitItem item, TunerChannel channel) {
- if (channel != null) {
- builder.withValue(TvContract.Programs.COLUMN_CHANNEL_ID, channel.getChannelId());
- if (BuildCompat.isAtLeastN()) {
- builder.withValue(TvContract.Programs.COLUMN_RECORDING_PROHIBITED,
- channel.isRecordingProhibited() ? 1 : 0);
- }
+ ContentProviderOperation.Builder builder, EitItem item, Long channelId) {
+ if (channelId != null) {
+ builder.withValue(TvContract.Programs.COLUMN_CHANNEL_ID, channelId);
}
if (item != null) {
builder.withValue(TvContract.Programs.COLUMN_TITLE, item.getTitleText())
@@ -565,10 +556,7 @@ public class ChannelDataManager implements Handler.Callback {
values.put(TvContract.Channels.COLUMN_DISPLAY_NAME, channel.getName());
values.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA, channel.toByteArray());
values.put(TvContract.Channels.COLUMN_DESCRIPTION, channel.getDescription());
- values.put(TvContract.Channels.COLUMN_VIDEO_FORMAT, channel.getVideoFormat());
values.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_FLAG1, VERSION);
- values.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_FLAG2,
- channel.isRecordingProhibited() ? 1 : 0);
if (channelId <= 0) {
values.put(TvContract.Channels.COLUMN_INPUT_ID, mInputId);
@@ -610,29 +598,13 @@ public class ChannelDataManager implements Handler.Callback {
}
private void checkVersion() {
- if (PermissionUtils.hasAccessAllEpg(mContext)) {
- String selection = TvContract.Channels.COLUMN_INTERNAL_PROVIDER_FLAG1 + "<>?";
- try (Cursor cursor = mContext.getContentResolver().query(mChannelsUri,
- CHANNEL_DATA_SELECTION_ARGS, selection,
- new String[] {Integer.toString(VERSION)}, null)) {
- if (cursor != null && cursor.moveToFirst()) {
- // The stored channel data seem outdated. Delete them all.
- clearChannels();
- }
- }
- } else {
- try (Cursor cursor = mContext.getContentResolver().query(mChannelsUri,
- new String[] { TvContract.Channels.COLUMN_INTERNAL_PROVIDER_FLAG1 },
- null, null, null)) {
- if (cursor != null) {
- while (cursor.moveToNext()) {
- int version = cursor.getInt(0);
- if (version != VERSION) {
- clearChannels();
- break;
- }
- }
- }
+ String selection = TvContract.Channels.COLUMN_INTERNAL_PROVIDER_FLAG1 + "<>?";
+ try (Cursor cursor = mContext.getContentResolver().query(mChannelsUri,
+ CHANNEL_DATA_SELECTION_ARGS, selection,
+ new String[] {Integer.toString(VERSION)}, null)) {
+ if (cursor != null && cursor.moveToFirst()) {
+ // The stored channel data seem outdated. Delete them all.
+ clearChannels();
}
}
}
diff --git a/src/com/android/tv/tuner/tvinput/EventDetector.java b/src/com/android/tv/tuner/tvinput/EventDetector.java
index 96b20a4b..a132398f 100644
--- a/src/com/android/tv/tuner/tvinput/EventDetector.java
+++ b/src/com/android/tv/tuner/tvinput/EventDetector.java
@@ -21,8 +21,8 @@ import android.util.SparseArray;
import android.util.SparseBooleanArray;
import com.android.tv.tuner.TunerHal;
-import com.android.tv.tuner.data.Track.AtscAudioTrack;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
+import com.android.tv.tuner.data.nano.Track.AtscAudioTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.ts.TsParser;
import com.android.tv.tuner.data.PsiData;
@@ -51,7 +51,7 @@ public class EventDetector {
private final SparseArray<TunerChannel> mChannelMap = new SparseArray<>();
private final SparseBooleanArray mVctCaptionTracksFound = new SparseBooleanArray();
private final SparseBooleanArray mEitCaptionTracksFound = new SparseBooleanArray();
- private final List<EventListener> mEventListeners = new ArrayList<>();
+ private final EventListener mEventListener;
private int mFrequency;
private String mModulation;
private int mProgramNumber = ALL_PROGRAM_NUMBERS;
@@ -105,10 +105,8 @@ public class EventDetector {
item.setHasCaptionTrack();
}
}
- if (tunerChannel != null && !mEventListeners.isEmpty()) {
- for (EventListener eventListener : mEventListeners) {
- eventListener.onEventDetected(tunerChannel, items);
- }
+ if (tunerChannel != null && mEventListener != null) {
+ mEventListener.onEventDetected(tunerChannel, items);
}
}
@@ -119,10 +117,8 @@ public class EventDetector {
@Override
public void onAllVctItemsParsed() {
- if (!mEventListeners.isEmpty()) {
- for (EventListener eventListener : mEventListeners) {
- eventListener.onChannelScanDone();
- }
+ if (mEventListener != null) {
+ mEventListener.onChannelScanDone();
}
}
@@ -165,10 +161,8 @@ public class EventDetector {
if (!found) {
mVctProgramNumberSet.add(channelProgramNumber);
}
- if (!mEventListeners.isEmpty()) {
- for (EventListener eventListener : mEventListeners) {
- eventListener.onChannelDetected(tunerChannel, !found);
- }
+ if (mEventListener != null) {
+ mEventListener.onChannelDetected(tunerChannel, !found);
}
}
};
@@ -203,9 +197,11 @@ public class EventDetector {
/**
* Creates a detector for ATSC TV channles and program information.
* @param usbTunerInteface {@link TunerHal}
+ * @param listener for ATSC TV channels and program information
*/
- public EventDetector(TunerHal usbTunerInteface) {
+ public EventDetector(TunerHal usbTunerInteface, EventListener listener) {
mTunerHal = usbTunerInteface;
+ mEventListener = listener;
}
private void reset() {
@@ -262,28 +258,4 @@ public class EventDetector {
public List<TunerChannel> getMalFormedChannels() {
return mTsParser.getMalFormedChannels();
}
-
- /**
- * Registers an EventListener.
- * @param eventListener the listener to be registered
- */
- public void registerListener(EventListener eventListener) {
- if (mTsParser != null) {
- // Resets the version numbers so that the new listener can receive the EIT items.
- // Otherwise, each EIT session is handled only once unless there is a new version.
- mTsParser.resetDataVersions();
- }
- mEventListeners.add(eventListener);
- }
-
- /**
- * Unregisters an EventListener.
- * @param eventListener the listener to be unregistered
- */
- public void unregisterListener(EventListener eventListener) {
- boolean removed = mEventListeners.remove(eventListener);
- if (!removed && DEBUG) {
- Log.d(TAG, "Cannot unregister a non-registered listener!");
- }
- }
}
diff --git a/src/com/android/tv/tuner/tvinput/FileSourceEventDetector.java b/src/com/android/tv/tuner/tvinput/FileSourceEventDetector.java
index 46ff4ea1..61de24f4 100644
--- a/src/com/android/tv/tuner/tvinput/FileSourceEventDetector.java
+++ b/src/com/android/tv/tuner/tvinput/FileSourceEventDetector.java
@@ -24,8 +24,8 @@ import com.android.tv.tuner.data.PsiData.PatItem;
import com.android.tv.tuner.data.PsiData.PmtItem;
import com.android.tv.tuner.data.PsipData.EitItem;
import com.android.tv.tuner.data.PsipData.VctItem;
-import com.android.tv.tuner.data.Track.AtscAudioTrack;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
+import com.android.tv.tuner.data.nano.Track.AtscAudioTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.source.FileTsStreamer;
import com.android.tv.tuner.ts.TsParser;
diff --git a/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java b/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java
index 0be29f25..6ec55e4f 100644
--- a/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java
+++ b/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java
@@ -33,17 +33,13 @@ import android.support.annotation.MainThread;
import android.support.annotation.Nullable;
import android.util.Log;
-import android.util.Pair;
-import com.google.android.exoplayer.C;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.common.recording.RecordingCapability;
import com.android.tv.dvr.DvrStorageStatusManager;
-import com.android.tv.dvr.data.RecordedProgram;
+import com.android.tv.dvr.RecordedProgram;
import com.android.tv.tuner.DvbDeviceAccessor;
import com.android.tv.tuner.data.PsipData;
-import com.android.tv.tuner.data.PsipData.EitItem;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.exoplayer.ExoPlayerSampleExtractor;
import com.android.tv.tuner.exoplayer.SampleExtractor;
@@ -57,10 +53,10 @@ import java.io.File;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Random;
+import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
@@ -75,7 +71,6 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
private static final String SORT_BY_TIME = TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS
+ ", " + TvContract.Programs.COLUMN_CHANNEL_ID + ", "
+ TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS;
- private static final long TUNING_RETRY_INTERVAL_MS = TimeUnit.SECONDS.toMillis(4);
private static final long STORAGE_MONITOR_INTERVAL_MS = TimeUnit.SECONDS.toMillis(4);
private static final long MIN_PARTIAL_RECORDING_DURATION_MS = TimeUnit.SECONDS.toMillis(10);
private static final long PREPARE_RECORDER_POLL_MS = 50;
@@ -85,23 +80,20 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
private static final int MSG_STOP_RECORDING = 4;
private static final int MSG_MONITOR_STORAGE_STATUS = 5;
private static final int MSG_RELEASE = 6;
- private static final int MSG_UPDATE_CC_INFO = 7;
private final RecordingCapability mCapabilities;
public RecordingCapability getCapabilities() {
return mCapabilities;
}
- @IntDef({STATE_IDLE, STATE_TUNING, STATE_TUNED, STATE_RECORDING})
+ @IntDef({STATE_IDLE, STATE_TUNED, STATE_RECORDING})
@Retention(RetentionPolicy.SOURCE)
public @interface DvrSessionState {}
private static final int STATE_IDLE = 1;
- private static final int STATE_TUNING = 2;
- private static final int STATE_TUNED = 3;
- private static final int STATE_RECORDING = 4;
+ private static final int STATE_TUNED = 2;
+ private static final int STATE_RECORDING = 3;
private static final long CHANNEL_ID_NONE = -1;
- private static final int MAX_TUNING_RETRY = 6;
private final Context mContext;
private final ChannelDataManager mChannelDataManager;
@@ -116,16 +108,13 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
private long mRecordStartTime;
private long mRecordEndTime;
private boolean mRecorderRunning;
+ private BufferManager mBufferManager;
private SampleExtractor mRecorder;
private final TunerRecordingSession mSession;
@DvrSessionState private int mSessionState = STATE_IDLE;
private final String mInputId;
private Uri mProgramUri;
- private PsipData.EitItem mCurrenProgram;
- private List<AtscCaptionTrack> mCaptionTracks;
- private DvrStorageManager mDvrStorageManager;
-
public TunerRecordingSessionWorker(Context context, String inputId,
ChannelDataManager dataManager, TunerRecordingSession session) {
mRandom.setSeed(System.nanoTime());
@@ -168,7 +157,6 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
if (mChannel == null || mChannel.compareTo(channel) != 0) {
return;
}
- mHandler.obtainMessage(MSG_UPDATE_CC_INFO, new Pair<>(channel, items)).sendToTarget();
mChannelDataManager.notifyEventDetected(channel, items);
}
@@ -190,7 +178,7 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
@MainThread
public void tune(Uri channelUri) {
mHandler.removeCallbacksAndMessages(null);
- mHandler.obtainMessage(MSG_TUNE, 0, 0, channelUri).sendToTarget();
+ mHandler.obtainMessage(MSG_TUNE, channelUri).sendToTarget();
}
/**
@@ -223,22 +211,11 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
switch (msg.what) {
case MSG_TUNE: {
Uri channelUri = (Uri) msg.obj;
- int retryCount = msg.arg1;
if (DEBUG) Log.d(TAG, "Tune to " + channelUri);
if (doTune(channelUri)) {
- if (mSessionState == STATE_TUNED) {
- mSession.onTuned(channelUri);
- } else {
- Log.w(TAG, "Tuner stream cannot be created due to resource shortage.");
- if (retryCount < MAX_TUNING_RETRY) {
- Message tuneMsg =
- mHandler.obtainMessage(MSG_TUNE, retryCount + 1, 0, channelUri);
- mHandler.sendMessageDelayed(tuneMsg, TUNING_RETRY_INTERVAL_MS);
- } else {
- mSession.onError(TvInputManager.RECORDING_ERROR_RESOURCE_BUSY);
- reset();
- }
- }
+ mSession.onTuned(channelUri);
+ } else {
+ reset();
}
return true;
}
@@ -304,12 +281,6 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
mHandler.getLooper().quitSafely();
return true;
}
- case MSG_UPDATE_CC_INFO: {
- Pair<TunerChannel, List<EitItem>> pair =
- (Pair<TunerChannel, List<EitItem>>) msg.obj;
- updateCaptionTracks(pair.first, pair.second);
- return true;
- }
}
return false;
}
@@ -339,17 +310,20 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
mRecorder.release();
mRecorder = null;
}
+ if (mBufferManager != null) {
+ mBufferManager.close();
+ mBufferManager = null;
+ }
if (mTunerSource != null) {
mSourceManager.releaseDataSource(mTunerSource);
mTunerSource = null;
}
- mDvrStorageManager = null;
mSessionState = STATE_IDLE;
mRecorderRunning = false;
}
private boolean doTune(Uri channelUri) {
- if (mSessionState != STATE_IDLE && mSessionState != STATE_TUNING) {
+ if (mSessionState != STATE_IDLE) {
mSession.onError(TvInputManager.RECORDING_ERROR_UNKNOWN);
Log.e(TAG, "Tuning was requested from wrong status.");
return false;
@@ -359,10 +333,6 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
mSession.onError(TvInputManager.RECORDING_ERROR_UNKNOWN);
Log.w(TAG, "Failed to start recording. Couldn't find the channel for " + mChannel);
return false;
- } else if (mChannel.isRecordingProhibited()) {
- mSession.onError(TvInputManager.RECORDING_ERROR_UNKNOWN);
- Log.w(TAG, "Failed to start recording. Not a recordable channel: " + mChannel);
- return false;
}
if (!mDvrStorageStatusManager.isStorageSufficient()) {
mSession.onError(TvInputManager.RECORDING_ERROR_INSUFFICIENT_SPACE);
@@ -371,9 +341,9 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
}
mTunerSource = mSourceManager.createDataSource(mContext, mChannel, this);
if (mTunerSource == null) {
- // Retry tuning in this case.
- mSessionState = STATE_TUNING;
- return true;
+ mSession.onError(TvInputManager.RECORDING_ERROR_RESOURCE_BUSY);
+ Log.w(TAG, "Tuner stream cannot be created due to resource shortage.");
+ return false;
}
mSessionState = STATE_TUNED;
return true;
@@ -395,10 +365,10 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
}
// Since tuning might be happened a while ago, shifts the start position of tuned source.
mTunerSource.shiftStartPosition(mTunerSource.getBufferedPosition());
+ mBufferManager = new BufferManager(new DvrStorageManager(mStorageDir, true));
mRecordStartTime = System.currentTimeMillis();
- mDvrStorageManager = new DvrStorageManager(mStorageDir, true);
- mRecorder = new ExoPlayerSampleExtractor(Uri.EMPTY, mTunerSource,
- new BufferManager(mDvrStorageManager), this, true);
+ mRecorder = new ExoPlayerSampleExtractor(Uri.EMPTY, mTunerSource, mBufferManager, this,
+ true);
mRecorder.setOnCompletionListener(this, mHandler);
mProgramUri = programUri;
mSessionState = STATE_RECORDING;
@@ -422,34 +392,6 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
Log.i(TAG, "Recording stopped");
}
- private void updateCaptionTracks(TunerChannel channel, List<PsipData.EitItem> items) {
- if (mChannel == null || channel == null || mChannel.compareTo(channel) != 0
- || items == null || items.isEmpty()) {
- return;
- }
- PsipData.EitItem currentProgram = getCurrentProgram(items);
- if (currentProgram == null || !currentProgram.hasCaptionTrack()
- || mCurrenProgram != null && mCurrenProgram.compareTo(currentProgram) == 0) {
- return;
- }
- mCurrenProgram = currentProgram;
- mCaptionTracks = new ArrayList<>(currentProgram.getCaptionTracks());
- if (DEBUG) {
- Log.d(TAG, "updated " + mCaptionTracks.size() + " caption tracks for "
- + currentProgram);
- }
- }
-
- private PsipData.EitItem getCurrentProgram(List<PsipData.EitItem> items) {
- for (PsipData.EitItem item : items) {
- if (mRecordStartTime >= item.getStartTimeUtcMillis()
- && mRecordStartTime < item.getEndTimeUtcMillis()) {
- return item;
- }
- }
- return null;
- }
-
private static class Program {
private final long mChannelId;
private final String mTitle;
@@ -624,25 +566,15 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
return;
}
Log.i(TAG, "recording finished " + (success ? "completely" : "partially"));
- long recordEndTime =
- (lastExtractedPositionUs == C.UNKNOWN_TIME_US)
- ? System.currentTimeMillis()
- : mRecordStartTime + lastExtractedPositionUs / 1000;
- Uri uri =
- insertRecordedProgram(
- getRecordedProgram(),
- mChannel.getChannelId(),
- Uri.fromFile(mStorageDir).toString(),
- 1024 * 1024,
- mRecordStartTime,
- recordEndTime);
+ Uri uri = insertRecordedProgram(getRecordedProgram(), mChannel.getChannelId(),
+ Uri.fromFile(mStorageDir).toString(), 1024 * 1024, mRecordStartTime,
+ mRecordStartTime + TimeUnit.MICROSECONDS.toMillis(lastExtractedPositionUs));
if (uri == null) {
new DeleteRecordingTask().execute(mStorageDir);
mSession.onError(TvInputManager.RECORDING_ERROR_UNKNOWN);
Log.e(TAG, "Inserting a recording to DB failed");
return;
}
- mDvrStorageManager.writeCaptionInfoFiles(mCaptionTracks);
mSession.onRecordFinished(uri);
}
diff --git a/src/com/android/tv/tuner/tvinput/TunerSession.java b/src/com/android/tv/tuner/tvinput/TunerSession.java
index d1ee3c6f..5c61402e 100644
--- a/src/com/android/tv/tuner/tvinput/TunerSession.java
+++ b/src/com/android/tv/tuner/tvinput/TunerSession.java
@@ -41,7 +41,7 @@ import com.android.tv.tuner.R;
import com.android.tv.tuner.cc.CaptionLayout;
import com.android.tv.tuner.cc.CaptionTrackRenderer;
import com.android.tv.tuner.data.Cea708Data.CaptionEvent;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import com.android.tv.tuner.exoplayer.buffer.BufferManager;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.util.GlobalSettingsUtils;
@@ -81,7 +81,8 @@ public class TunerSession extends TvInputService.Session implements Handler.Call
private boolean mPlayPaused;
private long mTuneStartTimestamp;
- public TunerSession(Context context, ChannelDataManager channelDataManager) {
+ public TunerSession(Context context, ChannelDataManager channelDataManager,
+ BufferManager bufferManager) {
super(context);
mContext = context;
mUiHandler = new Handler(this);
@@ -96,9 +97,12 @@ public class TunerSession extends TvInputService.Session implements Handler.Call
mStatusView.setVisibility(showDebug ? View.VISIBLE : View.INVISIBLE);
mAudioStatusView = (TextView) mOverlayView.findViewById(R.id.audio_status);
mAudioStatusView.setVisibility(View.INVISIBLE);
+ mAudioStatusView.setText(Html.fromHtml(StatusTextUtils.getAudioWarningInHTML(
+ context.getString(R.string.ut_surround_sound_disabled))));
CaptionLayout captionLayout = (CaptionLayout) mOverlayView.findViewById(R.id.caption);
mCaptionTrackRenderer = new CaptionTrackRenderer(captionLayout);
- mSessionWorker = new TunerSessionWorker(context, channelDataManager, this);
+ mSessionWorker = new TunerSessionWorker(context, channelDataManager,
+ bufferManager, this);
}
public boolean isReleased() {
@@ -268,13 +272,10 @@ public class TunerSession extends TvInputService.Session implements Handler.Call
// setting is "never".
final int value = GlobalSettingsUtils.getEncodedSurroundOutputSettings(mContext);
if (value == GlobalSettingsUtils.ENCODED_SURROUND_OUTPUT_NEVER) {
- mAudioStatusView.setText(Html.fromHtml(StatusTextUtils.getAudioWarningInHTML(
- mContext.getString(R.string.ut_surround_sound_disabled))));
+ mAudioStatusView.setVisibility(View.VISIBLE);
} else {
- mAudioStatusView.setText(Html.fromHtml(StatusTextUtils.getAudioWarningInHTML(
- mContext.getString(R.string.audio_passthrough_not_supported))));
+ Log.e(TAG, "Audio is unavailable, surround sound setting is " + value);
}
- mAudioStatusView.setVisibility(View.VISIBLE);
return true;
}
case MSG_UI_HIDE_AUDIO_UNPLAYABLE: {
diff --git a/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java b/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java
index 41f8ce5f..5230298e 100644
--- a/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java
+++ b/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java
@@ -35,7 +35,6 @@ import android.support.annotation.AnyThread;
import android.support.annotation.MainThread;
import android.support.annotation.WorkerThread;
import android.text.Html;
-import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
@@ -48,30 +47,28 @@ import com.android.tv.common.SoftPreconditions;
import com.android.tv.common.TvContentRatingCache;
import com.android.tv.tuner.TunerPreferences;
import com.android.tv.tuner.data.Cea708Data;
-import com.android.tv.tuner.data.Channel;
import com.android.tv.tuner.data.PsipData.EitItem;
import com.android.tv.tuner.data.PsipData.TvTracksInterface;
-import com.android.tv.tuner.data.Track.AtscAudioTrack;
-import com.android.tv.tuner.data.Track.AtscCaptionTrack;
import com.android.tv.tuner.data.TunerChannel;
+import com.android.tv.tuner.data.nano.Channel;
+import com.android.tv.tuner.data.nano.Track.AtscAudioTrack;
+import com.android.tv.tuner.data.nano.Track.AtscCaptionTrack;
import com.android.tv.tuner.exoplayer.MpegTsRendererBuilder;
import com.android.tv.tuner.exoplayer.buffer.BufferManager;
-import com.android.tv.tuner.exoplayer.buffer.BufferManager.StorageManager;
import com.android.tv.tuner.exoplayer.buffer.DvrStorageManager;
import com.android.tv.tuner.exoplayer.MpegTsPlayer;
-import com.android.tv.tuner.exoplayer.buffer.TrickplayStorageManager;
import com.android.tv.tuner.source.TsDataSource;
import com.android.tv.tuner.source.TsDataSourceManager;
import com.android.tv.tuner.util.StatusTextUtils;
-import com.android.tv.tuner.util.SystemPropertiesProxy;
import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.CountDownLatch;
/**
* {@link TunerSessionWorker} implements a handler thread which processes TV input jobs
@@ -85,9 +82,6 @@ public class TunerSessionWorker implements PlaybackBufferListener,
private static final boolean DEBUG = false;
private static final boolean ENABLE_PROFILER = true;
private static final String PLAY_FROM_CHANNEL = "channel";
- private static final String MAX_BUFFER_SIZE_KEY = "tv.tuner.buffersize_mbytes";
- private static final int MAX_BUFFER_SIZE_DEF = 2 * 1024; // 2GB
- private static final int MIN_BUFFER_SIZE_DEF = 256; // 256MB
// Public messages
public static final int MSG_SELECT_TRACK = 1;
@@ -153,18 +147,10 @@ public class TunerSessionWorker implements PlaybackBufferListener,
private static final int EXPECTED_KEY_FRAME_INTERVAL_MS = 500;
private static final int MIN_TRICKPLAY_SEEK_INTERVAL_MS = 20;
private static final int TRICKPLAY_MONITOR_INTERVAL_MS = 250;
- private static final int RELEASE_WAIT_INTERVAL_MS = 50;
-
- // Since release() is done asynchronously, synchronization between multiple TunerSessionWorker
- // creation/release is required.
- // This is used to guarantee that at most one active TunerSessionWorker exists at any give time.
- private static Semaphore sActiveSessionSemaphore = new Semaphore(1);
private final Context mContext;
private final ChannelDataManager mChannelDataManager;
private final TsDataSourceManager mSourceManager;
- private final int mMaxTrickplayBufferSizeMb;
- private final File mTrickplayBufferDir;
private volatile Surface mSurface;
private volatile float mVolume = 1.0f;
private volatile boolean mCaptionEnabled;
@@ -173,7 +159,6 @@ public class TunerSessionWorker implements PlaybackBufferListener,
private volatile Long mRecordingDuration;
private volatile long mRecordStartTimeMs;
private volatile long mBufferStartTimeMs;
- private volatile boolean mTrickplayDisabled;
private String mRecordingId;
private final Handler mHandler;
private int mRetryCount;
@@ -192,19 +177,19 @@ public class TunerSessionWorker implements PlaybackBufferListener,
private TvContentRating mUnblockedContentRating;
private long mLastPositionMs;
private AudioCapabilities mAudioCapabilities;
+ private final CountDownLatch mReleaseLatch = new CountDownLatch(1);
private long mLastLimitInBytes;
+ private long mLastPositionInBytes;
+ private final BufferManager mBufferManager;
private final TvContentRatingCache mTvContentRatingCache = TvContentRatingCache.getInstance();
private final TunerSession mSession;
private int mPlayerState = ExoPlayer.STATE_IDLE;
private long mPreparingStartTimeMs;
private long mBufferingStartTimeMs;
private long mReadyStartTimeMs;
- private boolean mIsActiveSession;
- private boolean mReleaseRequested; // Guarded by mReleaseLock
- private final Object mReleaseLock = new Object();
public TunerSessionWorker(Context context, ChannelDataManager channelDataManager,
- TunerSession tunerSession) {
+ BufferManager bufferManager, TunerSession tunerSession) {
if (DEBUG) Log.d(TAG, "TunerSessionWorker created");
mContext = context;
@@ -226,10 +211,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
(CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);
mCaptionEnabled = captioningManager.isEnabled();
mPlaybackParams.setSpeed(1.0f);
- mMaxTrickplayBufferSizeMb =
- SystemPropertiesProxy.getInt(MAX_BUFFER_SIZE_KEY, MAX_BUFFER_SIZE_DEF);
- mTrickplayBufferDir = context.getCacheDir();
- mTrickplayDisabled = mTrickplayBufferDir == null;
+ mBufferManager = bufferManager;
mPreparingStartTimeMs = INVALID_TIME;
mBufferingStartTimeMs = INVALID_TIME;
mReadyStartTimeMs = INVALID_TIME;
@@ -303,21 +285,24 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
private Long getDurationForRecording(String recordingId) {
- DvrStorageManager storageManager =
+ try {
+ DvrStorageManager storageManager =
new DvrStorageManager(new File(getRecordingPath()), false);
- List<BufferManager.TrackFormat> trackFormatList =
- storageManager.readTrackInfoFiles(false);
- if (trackFormatList.isEmpty()) {
- trackFormatList = storageManager.readTrackInfoFiles(true);
- }
- if (!trackFormatList.isEmpty()) {
- BufferManager.TrackFormat trackFormat = trackFormatList.get(0);
- Long durationUs = trackFormat.format.getLong(MediaFormat.KEY_DURATION);
+ Pair<String, MediaFormat> trackInfo = null;
+ try {
+ trackInfo = storageManager.readTrackInfoFile(false);
+ } catch (FileNotFoundException e) {
+ }
+ if (trackInfo == null) {
+ trackInfo = storageManager.readTrackInfoFile(true);
+ }
+ Long durationUs = trackInfo.second.getLong(MediaFormat.KEY_DURATION);
// we need duration by milli for trickplay notification.
return durationUs != null ? durationUs / 1000 : null;
+ } catch (IOException e) {
+ Log.e(TAG, "meta file for recording was not found: " + recordingId);
+ return null;
}
- Log.e(TAG, "meta file for recording was not found: " + recordingId);
- return null;
}
@MainThread
@@ -356,12 +341,16 @@ public class TunerSessionWorker implements PlaybackBufferListener,
@MainThread
public void release() {
if (DEBUG) Log.d(TAG, "release()");
- synchronized (mReleaseLock) {
- mReleaseRequested = true;
- }
mChannelDataManager.setListener(null);
mHandler.removeCallbacksAndMessages(null);
mHandler.sendEmptyMessage(MSG_RELEASE);
+ try {
+ mReleaseLatch.await();
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Couldn't wait for finish of MSG_RELEASE", e);
+ } finally {
+ mHandler.getLooper().quitSafely();
+ }
}
// MpegTsPlayer.Listener
@@ -378,7 +367,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (playbackState == ExoPlayer.STATE_READY) {
if (DEBUG) Log.d(TAG, "ExoPlayer ready");
if (!mPlayerStarted) {
- sendMessage(MSG_START_PLAYBACK, System.identityHashCode(mPlayer));
+ sendMessage(MSG_START_PLAYBACK, mPlayer);
}
mReadyStartTimeMs = SystemClock.elapsedRealtime();
} else if (playbackState == ExoPlayer.STATE_PREPARING) {
@@ -390,7 +379,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
// notification of STATE_ENDED from MpegTsPlayer will be ignored afterwards.
Log.i(TAG, "Player ended: end of stream");
if (mChannel != null) {
- sendMessage(MSG_RETRY_PLAYBACK, System.identityHashCode(mPlayer));
+ sendMessage(MSG_RETRY_PLAYBACK, mPlayer);
}
}
mPlayerState = playbackState;
@@ -408,8 +397,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
// If we are playing live stream, retrying playback maybe helpful. But for recorded stream,
// retrying playback is not helpful.
if (mChannel != null) {
- mHandler.obtainMessage(MSG_RETRY_PLAYBACK, System.identityHashCode(mPlayer))
- .sendToTarget();
+ mHandler.obtainMessage(MSG_RETRY_PLAYBACK, mPlayer).sendToTarget();
}
}
@@ -427,12 +415,8 @@ public class TunerSessionWorker implements PlaybackBufferListener,
public void onDrawnToSurface(MpegTsPlayer player, Surface surface) {
if (mSurface != null && mPlayerStarted) {
if (DEBUG) Log.d(TAG, "MSG_DRAWN_TO_SURFACE");
- if (mRecordingId != null) {
- // Workaround of b/33298048: set it to 1 instead of 0.
- mBufferStartTimeMs = mRecordStartTimeMs = 1;
- } else {
- mBufferStartTimeMs = mRecordStartTimeMs = System.currentTimeMillis();
- }
+ mBufferStartTimeMs = mRecordStartTimeMs =
+ (mRecordingId != null) ? 0 : System.currentTimeMillis();
notifyVideoAvailable();
mReportedDrawnToSurface = true;
@@ -515,8 +499,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
@Override
public void onDiskTooSlow() {
- mTrickplayDisabled = true;
- sendMessage(MSG_RETRY_PLAYBACK, System.identityHashCode(mPlayer));
+ sendMessage(MSG_RETRY_PLAYBACK, mPlayer);
}
// EventDetector.EventListener
@@ -619,28 +602,6 @@ public class TunerSessionWorker implements PlaybackBufferListener,
return true;
}
notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING);
- if (!mIsActiveSession) {
- // Wait until release is finished if there is a pending release.
- try {
- while (!sActiveSessionSemaphore.tryAcquire(
- RELEASE_WAIT_INTERVAL_MS, TimeUnit.MILLISECONDS)) {
- synchronized (mReleaseLock) {
- if (mReleaseRequested) {
- return true;
- }
- }
- }
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- synchronized (mReleaseLock) {
- if (mReleaseRequested) {
- sActiveSessionSemaphore.release();
- return true;
- }
- }
- mIsActiveSession = true;
- }
Uri channelUri = (Uri) msg.obj;
String recording = null;
long channelId = parseChannel(channelUri);
@@ -655,8 +616,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_UNKNOWN);
return true;
}
- clearCallbacksAndMessagesSafely();
- mChannelDataManager.removeAllCallbacksAndMessages();
+ mHandler.removeCallbacksAndMessages(null);
if (channel != null) {
mChannelDataManager.requestProgramsData(channel);
}
@@ -664,8 +624,8 @@ public class TunerSessionWorker implements PlaybackBufferListener,
// TODO: Need to refactor. notifyContentAllowed() should not be called if parental
// control is turned on.
mSession.notifyContentAllowed();
- resetTvTracks();
resetPlayback();
+ resetTvTracks();
mHandler.sendEmptyMessageDelayed(MSG_RESCHEDULE_PROGRAMS,
RESCHEDULE_PROGRAMS_INITIAL_DELAY_MS);
return true;
@@ -673,7 +633,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
case MSG_STOP_TUNE: {
if (DEBUG) Log.d(TAG, "MSG_STOP_TUNE");
mChannel = null;
- stopPlayback(true);
+ stopPlayback();
stopCaptionTrack();
resetTvTracks();
notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_UNKNOWN);
@@ -682,17 +642,14 @@ public class TunerSessionWorker implements PlaybackBufferListener,
case MSG_RELEASE: {
if (DEBUG) Log.d(TAG, "MSG_RELEASE");
mHandler.removeCallbacksAndMessages(null);
- stopPlayback(true);
+ stopPlayback();
stopCaptionTrack();
mSourceManager.release();
- mHandler.getLooper().quitSafely();
- if (mIsActiveSession) {
- sActiveSessionSemaphore.release();
- }
+ mReleaseLatch.countDown();
return true;
}
case MSG_RETRY_PLAYBACK: {
- if (System.identityHashCode(mPlayer) == (int) msg.obj) {
+ if (mPlayer == msg.obj) {
Log.i(TAG, "Retrying the playback for channel: " + mChannel);
mHandler.removeMessages(MSG_RETRY_PLAYBACK);
// When there is a request of retrying playback, don't reuse TunerHal.
@@ -701,14 +658,13 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (DEBUG) {
Log.d(TAG, "MSG_RETRY_PLAYBACK " + mRetryCount);
}
- mChannelDataManager.removeAllCallbacksAndMessages();
if (mRetryCount <= MAX_IMMEDIATE_RETRY_COUNT) {
resetPlayback();
} else {
// When it reaches this point, it may be due to an error that occurred in
// the tuner device. Calling stopPlayback() resets the tuner device
// to recover from the error.
- stopPlayback(false);
+ stopPlayback();
stopCaptionTrack();
notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL);
@@ -723,14 +679,13 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
case MSG_RESET_PLAYBACK: {
if (DEBUG) Log.d(TAG, "MSG_RESET_PLAYBACK");
- mChannelDataManager.removeAllCallbacksAndMessages();
resetPlayback();
return true;
}
case MSG_START_PLAYBACK: {
if (DEBUG) Log.d(TAG, "MSG_START_PLAYBACK");
if (mChannel != null || mRecordingId != null) {
- startPlayback((int) msg.obj);
+ startPlayback(msg.obj);
}
return true;
}
@@ -835,11 +790,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
return true;
}
case MSG_RESCHEDULE_PROGRAMS: {
- if (mHandler.hasMessages(MSG_SCHEDULE_OF_PROGRAMS)) {
- mHandler.sendEmptyMessage(MSG_RESCHEDULE_PROGRAMS);
- } else {
- doReschedulePrograms();
- }
+ doReschedulePrograms();
return true;
}
case MSG_PARENTAL_CONTROLS: {
@@ -863,8 +814,11 @@ public class TunerSessionWorker implements PlaybackBufferListener,
return true;
}
case MSG_SELECT_TRACK: {
- if (mChannel != null || mRecordingId != null) {
+ if (mChannel != null) {
doSelectTrack(msg.arg1, (String) msg.obj);
+ } else if (mRecordingId != null) {
+ // TODO : mChannel == null && mRecordingId != null
+ Log.d(TAG, "track selected for recording");
}
return true;
}
@@ -955,6 +909,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
TsDataSource source = mPlayer.getDataSource();
long limitInBytes = source != null ? source.getBufferedPosition() : 0L;
+ long positionInBytes = source != null ? source.getLastReadPosition() : 0L;
if (TunerDebug.ENABLED) {
TunerDebug.calculateDiff();
mSession.sendUiMessage(TunerSession.MSG_UI_SET_STATUS_TEXT,
@@ -972,8 +927,14 @@ public class TunerSessionWorker implements PlaybackBufferListener,
TunerDebug.getVideoPtsUsRate()
)));
}
+ if (DEBUG) {
+ Log.d(TAG, String.format("MSG_CHECK_SIGNAL position: %d, limit: %d",
+ positionInBytes, limitInBytes));
+ }
mSession.sendUiMessage(TunerSession.MSG_UI_HIDE_MESSAGE);
long currentTime = SystemClock.elapsedRealtime();
+ boolean noBufferRead = positionInBytes == mLastPositionInBytes
+ && limitInBytes == mLastLimitInBytes;
boolean isBufferingTooLong = mBufferingStartTimeMs != INVALID_TIME
&& currentTime - mBufferingStartTimeMs
> PLAYBACK_STATE_CHANGED_WAITING_THRESHOLD_MS;
@@ -982,11 +943,11 @@ public class TunerSessionWorker implements PlaybackBufferListener,
> PLAYBACK_STATE_CHANGED_WAITING_THRESHOLD_MS;
boolean isWeakSignal = source != null
&& mChannel.getType() == Channel.TYPE_TUNER
- && (isBufferingTooLong || isPreparingTooLong);
+ && (noBufferRead || isBufferingTooLong || isPreparingTooLong);
if (isWeakSignal && !mReportedWeakSignal) {
if (!mHandler.hasMessages(MSG_RETRY_PLAYBACK)) {
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RETRY_PLAYBACK,
- System.identityHashCode(mPlayer)), PLAYBACK_RETRY_DELAY_MS);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MSG_RETRY_PLAYBACK, mPlayer), PLAYBACK_RETRY_DELAY_MS);
}
if (mPlayer != null) {
mPlayer.setAudioTrack(false);
@@ -1005,6 +966,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
}
mLastLimitInBytes = limitInBytes;
+ mLastPositionInBytes = positionInBytes;
mHandler.sendEmptyMessageDelayed(MSG_CHECK_SIGNAL, CHECK_NO_SIGNAL_PERIOD_MS);
return true;
}
@@ -1037,8 +999,15 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (trackId == null) {
return;
}
- if (numTrackId != mPlayer.getSelectedTrack(MpegTsPlayer.TRACK_TYPE_AUDIO)) {
- mPlayer.setSelectedTrack(MpegTsPlayer.TRACK_TYPE_AUDIO, numTrackId);
+ AtscAudioTrack audioTrack = mAudioTrackMap.get(numTrackId);
+ if (audioTrack == null) {
+ return;
+ }
+ int oldAudioPid = mChannel.getAudioPid();
+ mChannel.selectAudioTrack(audioTrack.index);
+ int newAudioPid = mChannel.getAudioPid();
+ if (oldAudioPid != newAudioPid) {
+ mPlayer.setSelectedTrack(MpegTsPlayer.TRACK_TYPE_AUDIO, audioTrack.index);
}
mSession.notifyTrackSelected(type, trackId);
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
@@ -1061,22 +1030,11 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
}
- private MpegTsPlayer createPlayer(AudioCapabilities capabilities) {
+ private MpegTsPlayer createPlayer(AudioCapabilities capabilities, BufferManager bufferManager) {
if (capabilities == null) {
Log.w(TAG, "No Audio Capabilities");
}
- BufferManager bufferManager = null;
- if (mRecordingId != null) {
- StorageManager storageManager =
- new DvrStorageManager(new File(getRecordingPath()), false);
- bufferManager = new BufferManager(storageManager);
- updateCaptionTracks(((DvrStorageManager)storageManager).readCaptionInfoFiles());
- } else if (!mTrickplayDisabled && mMaxTrickplayBufferSizeMb >= MIN_BUFFER_SIZE_DEF) {
- bufferManager = new BufferManager(new TrickplayStorageManager(mContext,
- mTrickplayBufferDir, 1024L * 1024 * mMaxTrickplayBufferSizeMb));
- } else {
- Log.w(TAG, "Trickplay is disabled.");
- }
+
MpegTsPlayer player = new MpegTsPlayer(
new MpegTsRendererBuilder(mContext, bufferManager, this),
mHandler, mSourceManager, capabilities, this);
@@ -1111,26 +1069,24 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
private void updateTvTracks(TvTracksInterface tvTracksInterface, boolean fromPmt) {
- synchronized (tvTracksInterface) {
- if (DEBUG) {
- Log.d(TAG, "UpdateTvTracks " + tvTracksInterface);
- }
- List<AtscAudioTrack> audioTracks = tvTracksInterface.getAudioTracks();
- List<AtscCaptionTrack> captionTracks = tvTracksInterface.getCaptionTracks();
- // According to ATSC A/69 chapter 6.9, both PMT and EIT should have descriptors for audio
- // tracks, but in real world, we see some bogus audio track info in EIT, so, we trust audio
- // track info in PMT more and use info in EIT only when we have nothing.
- if (audioTracks != null && !audioTracks.isEmpty()
- && (mChannel == null || mChannel.getAudioTracks() == null || fromPmt)) {
- updateAudioTracks(audioTracks);
- }
- if (captionTracks == null || captionTracks.isEmpty()) {
- if (tvTracksInterface.hasCaptionTrack()) {
- updateCaptionTracks(captionTracks);
- }
- } else {
+ if (DEBUG) {
+ Log.d(TAG, "UpdateTvTracks " + tvTracksInterface);
+ }
+ List<AtscAudioTrack> audioTracks = tvTracksInterface.getAudioTracks();
+ List<AtscCaptionTrack> captionTracks = tvTracksInterface.getCaptionTracks();
+ // According to ATSC A/69 chapter 6.9, both PMT and EIT should have descriptors for audio
+ // tracks, but in real world, we see some bogus audio track info in EIT, so, we trust audio
+ // track info in PMT more and use info in EIT only when we have nothing.
+ if (audioTracks != null && !audioTracks.isEmpty()
+ && (mChannel.getAudioTracks() == null || fromPmt)) {
+ updateAudioTracks(audioTracks);
+ }
+ if (captionTracks == null || captionTracks.isEmpty()) {
+ if (tvTracksInterface.hasCaptionTrack()) {
updateCaptionTracks(captionTracks);
}
+ } else {
+ updateCaptionTracks(captionTracks);
}
}
@@ -1176,24 +1132,25 @@ public class TunerSessionWorker implements PlaybackBufferListener,
int audioTrackCount = mPlayer.getTrackCount(MpegTsPlayer.TRACK_TYPE_AUDIO);
removeTvTracks(TvTrackInfo.TYPE_AUDIO);
for (int i = 0; i < audioTrackCount; i++) {
- // We use language information from EIT/VCT only when the player does not provide
- // languages.
- com.google.android.exoplayer.MediaFormat infoFromPlayer =
- mPlayer.getTrackFormat(MpegTsPlayer.TRACK_TYPE_AUDIO, i);
- AtscAudioTrack infoFromEit = mAudioTrackMap.get(i);
- AtscAudioTrack infoFromVct = (mChannel != null
- && mChannel.getAudioTracks().size() == mAudioTrackMap.size()
- && i < mChannel.getAudioTracks().size())
- ? mChannel.getAudioTracks().get(i) : null;
- String language = !TextUtils.isEmpty(infoFromPlayer.language) ? infoFromPlayer.language
- : (infoFromEit != null && infoFromEit.language != null) ? infoFromEit.language
- : (infoFromVct != null && infoFromVct.language != null)
- ? infoFromVct.language : null;
+ AtscAudioTrack audioTrack = mAudioTrackMap.get(i);
+ if (audioTrack == null) {
+ continue;
+ }
+ String language = audioTrack.language;
+ if (language == null && mChannel.getAudioTracks() != null
+ && mChannel.getAudioTracks().size() == mAudioTrackMap.size()) {
+ // If a language is not present, use a language field in PMT section parsed.
+ language = mChannel.getAudioTracks().get(i).language;
+ }
+ // Save the index to the audio track.
+ // Later, when an audio track is selected, both the audio pid and its audio stream
+ // type reside in the selected index position of the tuner channel's audio data.
+ audioTrack.index = i;
TvTrackInfo.Builder builder = new TvTrackInfo.Builder(
TvTrackInfo.TYPE_AUDIO, AUDIO_TRACK_PREFIX + i);
builder.setLanguage(language);
- builder.setAudioChannelCount(infoFromPlayer.channelCount);
- builder.setAudioSampleRate(infoFromPlayer.sampleRate);
+ builder.setAudioChannelCount(audioTrack.channelCount);
+ builder.setAudioSampleRate(audioTrack.sampleRate);
TvTrackInfo track = builder.build();
mTvTracks.add(track);
}
@@ -1269,10 +1226,8 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
}
- private void stopPlayback(boolean removeChannelDataCallbacks) {
- if (removeChannelDataCallbacks) {
- mChannelDataManager.removeAllCallbacksAndMessages();
- }
+ private void stopPlayback() {
+ mChannelDataManager.removeAllCallbacksAndMessages();
if (mPlayer != null) {
mPlayer.setPlayWhenReady(false);
mPlayer.release();
@@ -1289,9 +1244,9 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
}
- private void startPlayback(int playerHashCode) {
+ private void startPlayback(Object playerObj) {
// TODO: provide hasAudio()/hasVideo() for play recordings.
- if (mPlayer == null || System.identityHashCode(mPlayer) != playerHashCode) {
+ if (mPlayer == null || mPlayer != playerObj) {
return;
}
if (mChannel != null && !mChannel.hasAudio()) {
@@ -1304,7 +1259,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (mChannel != null && ((mChannel.hasAudio() && !mPlayer.hasAudio())
|| (mChannel.hasVideo() && !mPlayer.hasVideo()))) {
// Tracks haven't been detected in the extractor. Try again.
- sendMessage(MSG_RETRY_PLAYBACK, System.identityHashCode(mPlayer));
+ sendMessage(MSG_RETRY_PLAYBACK, mPlayer);
return;
}
// Since mSurface is volatile, we define a local variable surface to keep the same value
@@ -1331,7 +1286,9 @@ public class TunerSessionWorker implements PlaybackBufferListener,
return;
}
mSourceManager.setKeepTuneStatus(true);
- MpegTsPlayer player = createPlayer(mAudioCapabilities);
+ BufferManager bufferManager = mChannel != null ? mBufferManager : new BufferManager(
+ new DvrStorageManager(new File(getRecordingPath()), false));
+ MpegTsPlayer player = createPlayer(mAudioCapabilities, bufferManager);
player.setCaptionServiceNumber(Cea708Data.EMPTY_SERVICE_NUMBER);
player.setVideoEventListener(this);
player.setCaptionServiceNumber(mCaptionTrack != null ?
@@ -1343,8 +1300,8 @@ public class TunerSessionWorker implements PlaybackBufferListener,
// When prepare failed, there may be some errors related to hardware. In that
// case, retry playback immediately may not help.
notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL);
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RETRY_PLAYBACK,
- System.identityHashCode(mPlayer)), PLAYBACK_RETRY_DELAY_MS);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RETRY_PLAYBACK, mPlayer),
+ PLAYBACK_RETRY_DELAY_MS);
}
} else {
mPlayer = player;
@@ -1357,7 +1314,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
private void resetPlayback() {
long timestamp, oldTimestamp;
timestamp = SystemClock.elapsedRealtime();
- stopPlayback(false);
+ stopPlayback();
stopCaptionTrack();
if (ENABLE_PROFILER) {
oldTimestamp = timestamp;
@@ -1379,12 +1336,8 @@ public class TunerSessionWorker implements PlaybackBufferListener,
mRecordingDuration = recording != null ? getDurationForRecording(recording) : null;
mProgram = null;
mPrograms = null;
- if (mRecordingId != null) {
- // Workaround of b/33298048: set it to 1 instead of 0.
- mBufferStartTimeMs = mRecordStartTimeMs = 1;
- } else {
- mBufferStartTimeMs = mRecordStartTimeMs = System.currentTimeMillis();
- }
+ mBufferStartTimeMs = mRecordStartTimeMs =
+ (mRecordingId != null) ? 0 : System.currentTimeMillis();
mLastPositionMs = 0;
mCaptionTrack = null;
mHandler.sendEmptyMessage(MSG_PARENTAL_CONTROLS);
@@ -1591,15 +1544,15 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
mChannelBlocked = channelBlocked;
if (mChannelBlocked) {
- clearCallbacksAndMessagesSafely();
- stopPlayback(true);
+ mHandler.removeCallbacksAndMessages(null);
+ stopPlayback();
resetTvTracks();
if (contentRating != null) {
mSession.notifyContentBlocked(contentRating);
}
mHandler.sendEmptyMessageDelayed(MSG_PARENTAL_CONTROLS, PARENTAL_CONTROLS_INTERVAL_MS);
} else {
- clearCallbacksAndMessagesSafely();
+ mHandler.removeCallbacksAndMessages(null);
resetPlayback();
mSession.notifyContentAllowed();
mHandler.sendEmptyMessageDelayed(MSG_RESCHEDULE_PROGRAMS,
@@ -1609,17 +1562,6 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
}
- @WorkerThread
- private void clearCallbacksAndMessagesSafely() {
- // If MSG_RELEASE is removed, TunerSessionWorker will hang forever.
- // Do not remove messages, after release is requested from MainThread.
- synchronized (mReleaseLock) {
- if (!mReleaseRequested) {
- mHandler.removeCallbacksAndMessages(null);
- }
- }
- }
-
private boolean hasEnoughBackwardBuffer() {
return mPlayer.getCurrentPosition() + BUFFER_UNDERFLOW_BUFFER_MS
>= mBufferStartTimeMs - mRecordStartTimeMs;
diff --git a/src/com/android/tv/tuner/tvinput/TunerTvInputService.java b/src/com/android/tv/tuner/tvinput/TunerTvInputService.java
index 6594e089..684ebdbd 100644
--- a/src/com/android/tv/tuner/tvinput/TunerTvInputService.java
+++ b/src/com/android/tv/tuner/tvinput/TunerTvInputService.java
@@ -28,6 +28,9 @@ import com.google.android.exoplayer.audio.AudioCapabilities;
import com.google.android.exoplayer.audio.AudioCapabilitiesReceiver;
import com.android.tv.TvApplication;
import com.android.tv.common.feature.CommonFeatures;
+import com.android.tv.tuner.exoplayer.buffer.BufferManager;
+import com.android.tv.tuner.exoplayer.buffer.TrickplayStorageManager;
+import com.android.tv.tuner.util.SystemPropertiesProxy;
import java.util.Collections;
import java.util.Set;
@@ -42,6 +45,9 @@ public class TunerTvInputService extends TvInputService
private static final String TAG = "TunerTvInputService";
private static final boolean DEBUG = false;
+ private static final String MAX_BUFFER_SIZE_KEY = "tv.tuner.buffersize_mbytes";
+ private static final int MAX_BUFFER_SIZE_DEF = 2 * 1024; // 2GB
+ private static final int MIN_BUFFER_SIZE_DEF = 256; // 256MB
private static final int DVR_STORAGE_CLEANUP_JOB_ID = 100;
// WeakContainer for {@link TvInputSessionImpl}
@@ -49,6 +55,7 @@ public class TunerTvInputService extends TvInputService
private ChannelDataManager mChannelDataManager;
private AudioCapabilitiesReceiver mAudioCapabilitiesReceiver;
private AudioCapabilities mAudioCapabilities;
+ private BufferManager mBufferManager;
@Override
public void onCreate() {
@@ -58,6 +65,7 @@ public class TunerTvInputService extends TvInputService
mChannelDataManager = new ChannelDataManager(getApplicationContext());
mAudioCapabilitiesReceiver = new AudioCapabilitiesReceiver(getApplicationContext(), this);
mAudioCapabilitiesReceiver.register();
+ mBufferManager = createBufferManager();
if (CommonFeatures.DVR.isEnabled(this)) {
JobScheduler jobScheduler =
(JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
@@ -71,6 +79,11 @@ public class TunerTvInputService extends TvInputService
jobScheduler.schedule(job);
}
}
+ if (mBufferManager == null) {
+ Log.i(TAG, "Trickplay is disabled");
+ } else {
+ Log.i(TAG, "Trickplay is enabled");
+ }
}
@Override
@@ -79,6 +92,9 @@ public class TunerTvInputService extends TvInputService
super.onDestroy();
mChannelDataManager.release();
mAudioCapabilitiesReceiver.unregister();
+ if (mBufferManager != null) {
+ mBufferManager.close();
+ }
}
@Override
@@ -90,7 +106,8 @@ public class TunerTvInputService extends TvInputService
public Session onCreateSession(String inputId) {
if (DEBUG) Log.d(TAG, "onCreateSession");
try {
- final TunerSession session = new TunerSession(this, mChannelDataManager);
+ final TunerSession session = new TunerSession(
+ this, mChannelDataManager, mBufferManager);
mTunerSessions.add(session);
session.setAudioCapabilities(mAudioCapabilities);
session.setOverlayViewEnabled(true);
@@ -112,6 +129,17 @@ public class TunerTvInputService extends TvInputService
}
}
+ private BufferManager createBufferManager() {
+ int maxBufferSizeMb =
+ SystemPropertiesProxy.getInt(MAX_BUFFER_SIZE_KEY, MAX_BUFFER_SIZE_DEF);
+ if (maxBufferSizeMb >= MIN_BUFFER_SIZE_DEF) {
+ return new BufferManager(
+ new TrickplayStorageManager(getApplicationContext(), getCacheDir(),
+ 1024L * 1024 * maxBufferSizeMb));
+ }
+ return null;
+ }
+
public static String getInputId(Context context) {
return TvContract.buildInputId(new ComponentName(context, TunerTvInputService.class));
}
diff --git a/src/com/android/tv/tuner/util/PostalCodeUtils.java b/src/com/android/tv/tuner/util/PostalCodeUtils.java
deleted file mode 100644
index 3942ce95..00000000
--- a/src/com/android/tv/tuner/util/PostalCodeUtils.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.tuner.util;
-
-import android.content.Context;
-import android.location.Address;
-import android.support.annotation.Nullable;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.tv.tuner.TunerPreferences;
-import com.android.tv.util.LocationUtils;
-
-import java.io.IOException;
-import java.util.Locale;
-
-/**
- * A utility class to update, get, and set the last known postal or zip code.
- */
-public class PostalCodeUtils {
- private static final String TAG = "PostalCodeUtils";
- private static final String SUPPORTED_COUNTRY_CODE = Locale.US.getCountry();
-
- /** Returns {@code true} if postal code has been changed */
- public static boolean updatePostalCode(Context context)
- throws IOException, SecurityException, NoPostalCodeException {
- String postalCode = getPostalCode(context);
- String lastPostalCode = getLastPostalCode(context);
- if (TextUtils.isEmpty(postalCode)) {
- if (TextUtils.isEmpty(lastPostalCode)) {
- throw new NoPostalCodeException();
- }
- } else if (!TextUtils.equals(postalCode, lastPostalCode)) {
- setLastPostalCode(context, postalCode);
- return true;
- }
- return false;
- }
-
- /**
- * Gets the last stored postal or zip code, which might be decided by {@link LocationUtils} or
- * input by users.
- */
- public static String getLastPostalCode(Context context) {
- return TunerPreferences.getLastPostalCode(context);
- }
-
- /**
- * Sets the last stored postal or zip code. This method will overwrite the value written by
- * calling {@link #updatePostalCode(Context)}.
- */
- public static void setLastPostalCode(Context context, String postalCode) {
- Log.i(TAG, "Set Postal Code:" + postalCode);
- TunerPreferences.setLastPostalCode(context, postalCode);
- }
-
- @Nullable
- private static String getPostalCode(Context context) throws IOException, SecurityException {
- Address address = LocationUtils.getCurrentAddress(context);
- if (address != null) {
- Log.i(TAG, "Current country and postal code is " + address.getCountryName() + ", "
- + address.getPostalCode());
- if (TextUtils.equals(address.getCountryCode(), SUPPORTED_COUNTRY_CODE)) {
- return address.getPostalCode();
- }
- }
- return null;
- }
-
- /** An {@link java.lang.Exception} class to notify no valid postal or zip code is available. */
- public static class NoPostalCodeException extends Exception {
- public NoPostalCodeException() {
- }
- }
-} \ No newline at end of file
diff --git a/src/com/android/tv/util/StringUtils.java b/src/com/android/tv/tuner/util/StringUtils.java
index 659807e2..15571e75 100644
--- a/src/com/android/tv/util/StringUtils.java
+++ b/src/com/android/tv/tuner/util/StringUtils.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.util;
+package com.android.tv.tuner.util;
/**
* Utility class for handling {@link String}.
diff --git a/src/com/android/tv/tuner/util/SystemPropertiesProxy.java b/src/com/android/tv/tuner/util/SystemPropertiesProxy.java
index 2817ccbf..62a64361 100644
--- a/src/com/android/tv/tuner/util/SystemPropertiesProxy.java
+++ b/src/com/android/tv/tuner/util/SystemPropertiesProxy.java
@@ -58,20 +58,4 @@ public class SystemPropertiesProxy {
}
return def;
}
-
- public static String getString(String key, String def) throws IllegalArgumentException {
- try {
- Class SystemPropertiesClass = Class.forName("android.os.SystemProperties");
- Method getIntMethod =
- SystemPropertiesClass.getDeclaredMethod("get", String.class, String.class);
- getIntMethod.setAccessible(true);
- return (String) getIntMethod.invoke(SystemPropertiesClass, key, def);
- } catch (InvocationTargetException
- | IllegalAccessException
- | NoSuchMethodException
- | ClassNotFoundException e) {
- Log.e(TAG, "Failed to invoke SystemProperties.get()", e);
- }
- return def;
- }
}
diff --git a/src/com/android/tv/tuner/util/TunerInputInfoUtils.java b/src/com/android/tv/tuner/util/TunerInputInfoUtils.java
index fd9ec77d..5c411f64 100644
--- a/src/com/android/tv/tuner/util/TunerInputInfoUtils.java
+++ b/src/com/android/tv/tuner/util/TunerInputInfoUtils.java
@@ -25,7 +25,6 @@ import android.os.Build;
import android.support.annotation.Nullable;
import android.support.v4.os.BuildCompat;
import android.util.Log;
-import android.util.Pair;
import com.android.tv.common.feature.CommonFeatures;
import com.android.tv.tuner.R;
@@ -44,31 +43,23 @@ public class TunerInputInfoUtils {
*/
@Nullable
@TargetApi(Build.VERSION_CODES.N)
- public static TvInputInfo buildTunerInputInfo(Context context) {
- Pair<Integer, Integer> tunerTypeAndCount = TunerHal.getTunerTypeAndCount(context);
- if (tunerTypeAndCount.first == null || tunerTypeAndCount.second == 0) {
+ public static TvInputInfo buildTunerInputInfo(Context context, boolean fromBuiltInTuner) {
+ int numOfDevices = TunerHal.getTunerCount(context);
+ if (numOfDevices == 0) {
return null;
}
- int inputLabelId = 0;
- switch (tunerTypeAndCount.first) {
- case TunerHal.TUNER_TYPE_BUILT_IN:
- inputLabelId = R.string.bt_app_name;
- break;
- case TunerHal.TUNER_TYPE_USB:
- inputLabelId = R.string.ut_app_name;
- break;
- case TunerHal.TUNER_TYPE_NETWORK:
- inputLabelId = R.string.nt_app_name;
- break;
+ TvInputInfo.Builder builder = new TvInputInfo.Builder(context, new ComponentName(context,
+ TunerTvInputService.class));
+ if (fromBuiltInTuner) {
+ builder.setLabel(R.string.bt_app_name);
+ } else {
+ builder.setLabel(R.string.ut_app_name);
}
try {
- TvInputInfo.Builder builder = new TvInputInfo.Builder(context,
- new ComponentName(context, TunerTvInputService.class));
- return builder.setLabel(inputLabelId)
- .setCanRecord(CommonFeatures.DVR.isEnabled(context))
- .setTunerCount(tunerTypeAndCount.second)
+ return builder.setCanRecord(CommonFeatures.DVR.isEnabled(context))
+ .setTunerCount(numOfDevices)
.build();
- } catch (IllegalArgumentException | NullPointerException e) {
+ } catch (NullPointerException e) {
// TunerTvInputService is not enabled.
return null;
}
@@ -82,7 +73,7 @@ public class TunerInputInfoUtils {
public static void updateTunerInputInfo(Context context) {
if (BuildCompat.isAtLeastN()) {
if (DEBUG) Log.d(TAG, "updateTunerInputInfo()");
- TvInputInfo info = buildTunerInputInfo(context);
+ TvInputInfo info = buildTunerInputInfo(context, isBuiltInTuner(context));
if (info != null) {
((TvInputManager) context.getSystemService(Context.TV_INPUT_SERVICE))
.updateTvInputInfo(info);
@@ -97,4 +88,13 @@ public class TunerInputInfoUtils {
}
}
}
-} \ No newline at end of file
+
+ /**
+ * Returns if the current tuner service is for a built-in tuner.
+ *
+ * @param context {@link Context} instance
+ */
+ public static boolean isBuiltInTuner(Context context) {
+ return TunerHal.getTunerType(context) == TunerHal.TUNER_TYPE_BUILT_IN;
+ }
+}
diff --git a/src/com/android/tv/ui/AppLayerTvView.java b/src/com/android/tv/ui/AppLayerTvView.java
index 6a83c541..09acb36b 100644
--- a/src/com/android/tv/ui/AppLayerTvView.java
+++ b/src/com/android/tv/ui/AppLayerTvView.java
@@ -22,7 +22,6 @@ import android.util.AttributeSet;
import android.view.SurfaceView;
import android.view.View;
-import com.android.tv.util.Debug;
import com.android.tv.experiments.Experiments;
/**
@@ -60,13 +59,4 @@ public class AppLayerTvView extends TvView {
}
super.onViewAdded(child);
}
-
- @Override
- public void getLocationOnScreen(int[] outLocation) {
- super.getLocationOnScreen(outLocation);
-
- // The TvView.MySessionCallback.onSessionCreated() will call this method indirectly.
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log(
- "AppLayerTvView.getLocationOnScreen, session created");
- }
}
diff --git a/src/com/android/tv/ui/ChannelBannerView.java b/src/com/android/tv/ui/ChannelBannerView.java
index eed536a8..3cf4de83 100644
--- a/src/com/android/tv/ui/ChannelBannerView.java
+++ b/src/com/android/tv/ui/ChannelBannerView.java
@@ -57,7 +57,7 @@ import com.android.tv.data.Channel;
import com.android.tv.data.Program;
import com.android.tv.data.StreamInfo;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.parental.ContentRatingsManager;
import com.android.tv.util.ImageCache;
import com.android.tv.util.ImageLoader;
@@ -98,8 +98,8 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
private static final String EMPTY_STRING = "";
- private Program mNoProgram;
- private Program mLockedChannelProgram;
+ private static Program sNoProgram;
+ private static Program sLockedChannelProgram;
private static String sClosedCaptionMark;
private final MainActivity mMainActivity;
@@ -123,7 +123,6 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
private String mProgramDescriptionText;
private View mAnchorView;
private Channel mCurrentChannel;
- private boolean mCurrentChannelLogoExists;
private Program mLastUpdatedProgram;
private final Handler mHandler = new Handler();
private final DvrManager mDvrManager;
@@ -131,7 +130,6 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
private TvContentRating mBlockingContentRating;
private int mLockType;
- private boolean mUpdateOnTune;
private Animator mResizeAnimator;
private int mCurrentHeight;
@@ -194,7 +192,7 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
@Override
public void run() {
removeCallbacks(this);
- updateViews(false);
+ updateViews(null);
}
};
@@ -245,14 +243,18 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
mContentRatingsManager = TvApplication.getSingletons(getContext())
.getTvInputManagerHelper().getContentRatingsManager();
- mNoProgram = new Program.Builder()
- .setTitle(context.getString(R.string.channel_banner_no_title))
- .setDescription(EMPTY_STRING)
- .build();
- mLockedChannelProgram = new Program.Builder()
- .setTitle(context.getString(R.string.channel_banner_locked_channel_title))
- .setDescription(EMPTY_STRING)
- .build();
+ if (sNoProgram == null) {
+ sNoProgram = new Program.Builder()
+ .setTitle(context.getString(R.string.channel_banner_no_title))
+ .setDescription(EMPTY_STRING)
+ .build();
+ }
+ if (sLockedChannelProgram == null){
+ sLockedChannelProgram = new Program.Builder()
+ .setTitle(context.getString(R.string.channel_banner_locked_channel_title))
+ .setDescription(EMPTY_STRING)
+ .build();
+ }
if (sClosedCaptionMark == null) {
sClosedCaptionMark = context.getString(R.string.closed_caption);
}
@@ -343,17 +345,19 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
* Set new lock type.
*
* @param lockType Any of LOCK_NONE, LOCK_PROGRAM_DETAIL, or LOCK_CHANNEL_INFO.
- * @return the previous lock type of the channel banner.
+ * @return {@code true} only if lock type is changed
* @throws IllegalArgumentException if lockType is invalid.
*/
- public int setLockType(int lockType) {
+ public boolean setLockType(int lockType) {
if (lockType != LOCK_NONE && lockType != LOCK_CHANNEL_INFO
&& lockType != LOCK_PROGRAM_DETAIL) {
throw new IllegalArgumentException("No such lock type " + lockType);
}
- int previousLockType = mLockType;
- mLockType = lockType;
- return previousLockType;
+ if (mLockType != lockType) {
+ mLockType = lockType;
+ return true;
+ }
+ return false;
}
/**
@@ -368,34 +372,31 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
/**
* Update channel banner view.
*
- * @param updateOnTune {@false} denotes the channel banner is updated due to other reasons than
- * tuning. The channel info will not be updated in this case.
+ * @param info A StreamInfo that includes stream information.
+ * If it's {@code null}, only program information will be updated.
*/
- public void updateViews(boolean updateOnTune) {
+ public void updateViews(StreamInfo info) {
resetAnimationEffects();
- mUpdateOnTune = updateOnTune;
- if (mUpdateOnTune) {
+ Channel channel = mMainActivity.getCurrentChannel();
+ if (!Objects.equals(mCurrentChannel, channel)) {
+ mBlockingContentRating = null;
if (isShown()) {
scheduleHide();
}
- mBlockingContentRating = null;
- mCurrentChannel = mMainActivity.getCurrentChannel();
- mCurrentChannelLogoExists =
- mCurrentChannel != null && mCurrentChannel.channelLogoExists();
- updateStreamInfo(null);
+ }
+ mCurrentChannel = channel;
+ mChannelView.setVisibility(VISIBLE);
+ if (info != null) {
+ // If the current channels between ChannelTuner and TvView are different,
+ // the stream information should not be seen.
+ updateStreamInfo(channel != null && channel.equals(info.getCurrentChannel()) ? info
+ : null);
updateChannelInfo();
}
updateProgramInfo(mMainActivity.getCurrentProgram());
- mChannelView.setVisibility(VISIBLE);
- mUpdateOnTune = false;
}
- /**
- * Update channel banner view with stream info.
- *
- * @param info A StreamInfo that includes stream information.
- */
- public void updateStreamInfo(StreamInfo info) {
+ private void updateStreamInfo(StreamInfo info) {
// Update stream information in a channel.
if (mLockType != LOCK_CHANNEL_INFO && info != null) {
updateText(mClosedCaptionTextView, info.hasClosedCaption() ? sClosedCaptionMark
@@ -413,6 +414,9 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
mAspectRatioTextView.setVisibility(View.GONE);
mResolutionTextView.setVisibility(View.GONE);
mAudioChannelTextView.setVisibility(View.GONE);
+ for (int i = 0; i < DISPLAYED_CONTENT_RATINGS_COUNT; i++) {
+ mContentRatingsTextViews[i].setVisibility(View.GONE);
+ }
}
}
@@ -463,7 +467,7 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
}
mChannelLogoImageView.setImageBitmap(null);
mChannelLogoImageView.setVisibility(View.GONE);
- if (mCurrentChannel != null && mCurrentChannelLogoExists) {
+ if (mCurrentChannel != null) {
mCurrentChannel.loadBitmap(getContext(), Channel.LOAD_IMAGE_TYPE_CHANNEL_LOGO,
mChannelLogoImageViewWidth, mChannelLogoImageViewHeight,
createChannelLogoCallback(this, mCurrentChannel));
@@ -546,9 +550,8 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
if (mResizeAnimator == null) {
String description = mProgramDescriptionTextView.getText().toString();
- boolean programDescriptionNeedFadeAnimation =
- !description.equals(mProgramDescriptionText) && !mUpdateOnTune;
- updateBannerHeight(programDescriptionNeedFadeAnimation);
+ boolean needFadeAnimation = !description.equals(mProgramDescriptionText);
+ updateBannerHeight(needFadeAnimation);
} else {
mProgramInfoUpdatePendingByResizing = true;
}
@@ -556,9 +559,9 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
private void updateProgramInfo(Program program) {
if (mLockType == LOCK_CHANNEL_INFO) {
- program = mLockedChannelProgram;
+ program = sLockedChannelProgram;
} else if (program == null || !program.isValid() || TextUtils.isEmpty(program.getTitle())) {
- program = mNoProgram;
+ program = sNoProgram;
}
if (mLastUpdatedProgram == null
@@ -587,9 +590,9 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
mProgramDescriptionText = program.getDescription();
}
String description = mProgramDescriptionTextView.getText().toString();
- boolean programDescriptionNeedFadeAnimation = (isProgramChanged
- || !description.equals(mProgramDescriptionText)) && !mUpdateOnTune;
- updateBannerHeight(programDescriptionNeedFadeAnimation);
+ boolean needFadeAnimation = isProgramChanged
+ || !description.equals(mProgramDescriptionText);
+ updateBannerHeight(needFadeAnimation);
} else {
mProgramInfoUpdatePendingByResizing = true;
}
@@ -600,7 +603,7 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
if (program == null) {
return;
}
- updateProgramTextView(program == mLockedChannelProgram, program.getTitle(),
+ updateProgramTextView(program == sLockedChannelProgram, program.getTitle(),
program.getEpisodeDisplayTitle(getContext()));
}
@@ -627,8 +630,9 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mProgramTextView.setText(text);
}
- int width = mProgramDescriptionTextViewWidth + (mCurrentChannelLogoExists ?
- 0 : mChannelLogoImageViewWidth + mChannelLogoImageViewMarginStart);
+ int width = mProgramDescriptionTextViewWidth
+ - ((mChannelLogoImageView.getVisibility() != View.VISIBLE)
+ ? 0 : mChannelLogoImageViewWidth + mChannelLogoImageViewMarginStart);
ViewGroup.LayoutParams lp = mProgramTextView.getLayoutParams();
lp.width = width;
mProgramTextView.setLayoutParams(lp);
@@ -651,27 +655,23 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
}
private void updateProgramRatings(Program program) {
- if (mLockType == LOCK_CHANNEL_INFO) {
- for (int i = 0; i < DISPLAYED_CONTENT_RATINGS_COUNT; i++) {
- mContentRatingsTextViews[i].setVisibility(View.GONE);
- }
- } else if (mBlockingContentRating != null) {
+ if (mBlockingContentRating != null) {
mContentRatingsTextViews[0].setText(
mContentRatingsManager.getDisplayNameForRating(mBlockingContentRating));
mContentRatingsTextViews[0].setVisibility(View.VISIBLE);
for (int i = 1; i < DISPLAYED_CONTENT_RATINGS_COUNT; i++) {
mContentRatingsTextViews[i].setVisibility(View.GONE);
}
- } else {
- TvContentRating[] ratings = (program == null) ? null : program.getContentRatings();
- for (int i = 0; i < DISPLAYED_CONTENT_RATINGS_COUNT; i++) {
- if (ratings == null || ratings.length <= i) {
- mContentRatingsTextViews[i].setVisibility(View.GONE);
- } else {
- mContentRatingsTextViews[i].setText(
- mContentRatingsManager.getDisplayNameForRating(ratings[i]));
- mContentRatingsTextViews[i].setVisibility(View.VISIBLE);
- }
+ return;
+ }
+ TvContentRating[] ratings = (program == null) ? null : program.getContentRatings();
+ for (int i = 0; i < DISPLAYED_CONTENT_RATINGS_COUNT; i++) {
+ if (ratings == null || ratings.length <= i) {
+ mContentRatingsTextViews[i].setVisibility(View.GONE);
+ } else {
+ mContentRatingsTextViews[i].setText(
+ mContentRatingsManager.getDisplayNameForRating(ratings[i]));
+ mContentRatingsTextViews[i].setVisibility(View.VISIBLE);
}
}
}
@@ -769,7 +769,7 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
mLastUpdatedProgram = program;
}
- private void updateBannerHeight(boolean needProgramDescriptionFadeAnimation) {
+ private void updateBannerHeight(boolean needFadeAnimation) {
Assert.assertNull(mResizeAnimator);
// Need to measure the layout height with the new description text.
CharSequence oldDescription = mProgramDescriptionTextView.getText();
@@ -785,13 +785,12 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
layoutParams.height = targetHeight;
setLayoutParams(layoutParams);
}
- } else if (mCurrentHeight != targetHeight || needProgramDescriptionFadeAnimation) {
+ } else if (mCurrentHeight != targetHeight || needFadeAnimation) {
// Restore description text for fade in/out animation.
- if (needProgramDescriptionFadeAnimation) {
+ if (needFadeAnimation) {
mProgramDescriptionTextView.setText(oldDescription);
}
- mResizeAnimator =
- createResizeAnimator(targetHeight, needProgramDescriptionFadeAnimation);
+ mResizeAnimator = createResizeAnimator(targetHeight, needFadeAnimation);
mResizeAnimator.start();
}
}
diff --git a/src/com/android/tv/ui/KeypadChannelSwitchView.java b/src/com/android/tv/ui/KeypadChannelSwitchView.java
index ac5d841d..abc05bad 100644
--- a/src/com/android/tv/ui/KeypadChannelSwitchView.java
+++ b/src/com/android/tv/ui/KeypadChannelSwitchView.java
@@ -39,7 +39,7 @@ import android.widget.TextView;
import com.android.tv.MainActivity;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.util.DurationTimer;
+import com.android.tv.analytics.DurationTimer;
import com.android.tv.analytics.Tracker;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
diff --git a/src/com/android/tv/ui/SelectInputView.java b/src/com/android/tv/ui/SelectInputView.java
index 88872a0a..5e25ae43 100644
--- a/src/com/android/tv/ui/SelectInputView.java
+++ b/src/com/android/tv/ui/SelectInputView.java
@@ -18,6 +18,7 @@ package com.android.tv.ui;
import android.content.Context;
import android.content.res.Resources;
+import android.hardware.hdmi.HdmiDeviceInfo;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager;
import android.media.tv.TvInputManager.TvInputCallback;
@@ -36,13 +37,14 @@ import android.widget.TextView;
import com.android.tv.ApplicationSingletons;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.util.DurationTimer;
+import com.android.tv.analytics.DurationTimer;
import com.android.tv.analytics.Tracker;
import com.android.tv.data.Channel;
import com.android.tv.util.TvInputManagerHelper;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -56,7 +58,7 @@ public class SelectInputView extends VerticalGridView implements
private final TvInputManagerHelper mTvInputManagerHelper;
private final List<TvInputInfo> mInputList = new ArrayList<>();
- private final TvInputManagerHelper.InputComparator mComparator;
+ private final InputsComparator mComparator = new InputsComparator();
private final Tracker mTracker;
private final DurationTimer mViewDurationTimer = new DurationTimer();
private final TvInputCallback mTvInputCallback = new TvInputCallback() {
@@ -147,7 +149,6 @@ public class SelectInputView extends VerticalGridView implements
ApplicationSingletons appSingletons = TvApplication.getSingletons(context);
mTracker = appSingletons.getTracker();
mTvInputManagerHelper = appSingletons.getTvInputManagerHelper();
- mComparator = new TvInputManagerHelper.InputComparator(context, mTvInputManagerHelper);
Resources resources = context.getResources();
mInputItemHeight = resources.getDimensionPixelSize(R.dimen.input_banner_item_height);
@@ -384,6 +385,72 @@ public class SelectInputView extends VerticalGridView implements
}
}
+ private class InputsComparator implements Comparator<TvInputInfo> {
+ @Override
+ public int compare(TvInputInfo lhs, TvInputInfo rhs) {
+ if (lhs == null) {
+ return (rhs == null) ? 0 : 1;
+ }
+ if (rhs == null) {
+ return -1;
+ }
+
+ boolean enabledL = isInputEnabled(lhs);
+ boolean enabledR = isInputEnabled(rhs);
+ if (enabledL != enabledR) {
+ return enabledL ? -1 : 1;
+ }
+
+ int priorityL = getPriority(lhs);
+ int priorityR = getPriority(rhs);
+ if (priorityL != priorityR) {
+ return priorityR - priorityL;
+ }
+
+ String customLabelL = (String) lhs.loadCustomLabel(getContext());
+ String customLabelR = (String) rhs.loadCustomLabel(getContext());
+ if (!TextUtils.equals(customLabelL, customLabelR)) {
+ customLabelL = customLabelL == null ? "" : customLabelL;
+ customLabelR = customLabelR == null ? "" : customLabelR;
+ return customLabelL.compareToIgnoreCase(customLabelR);
+ }
+
+ String labelL = (String) lhs.loadLabel(getContext());
+ String labelR = (String) rhs.loadLabel(getContext());
+ labelL = labelL == null ? "" : labelL;
+ labelR = labelR == null ? "" : labelR;
+ return labelL.compareToIgnoreCase(labelR);
+ }
+
+ private int getPriority(TvInputInfo info) {
+ switch (info.getType()) {
+ case TvInputInfo.TYPE_TUNER:
+ return 9;
+ case TvInputInfo.TYPE_HDMI:
+ HdmiDeviceInfo hdmiInfo = info.getHdmiDeviceInfo();
+ if (hdmiInfo != null && hdmiInfo.isCecDevice()) {
+ return 8;
+ }
+ return 7;
+ case TvInputInfo.TYPE_DVI:
+ return 6;
+ case TvInputInfo.TYPE_COMPONENT:
+ return 5;
+ case TvInputInfo.TYPE_SVIDEO:
+ return 4;
+ case TvInputInfo.TYPE_COMPOSITE:
+ return 3;
+ case TvInputInfo.TYPE_DISPLAY_PORT:
+ return 2;
+ case TvInputInfo.TYPE_VGA:
+ return 1;
+ case TvInputInfo.TYPE_SCART:
+ default:
+ return 0;
+ }
+ }
+ }
+
/**
* A callback interface for the input selection.
*/
diff --git a/src/com/android/tv/ui/TunableTvView.java b/src/com/android/tv/ui/TunableTvView.java
index 8f4f40f5..cbe459fb 100644
--- a/src/com/android/tv/ui/TunableTvView.java
+++ b/src/com/android/tv/ui/TunableTvView.java
@@ -19,16 +19,9 @@ package com.android.tv.ui;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.TimeInterpolator;
-import android.app.AlertDialog;
-import android.app.ApplicationErrorReport;
+import android.annotation.SuppressLint;
import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
import android.content.pm.PackageManager;
-import android.graphics.Bitmap;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
import android.media.PlaybackParams;
import android.media.tv.TvContentRating;
import android.media.tv.TvInputInfo;
@@ -45,6 +38,7 @@ import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
+import android.support.v4.os.BuildCompat;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.AttributeSet;
@@ -62,20 +56,14 @@ import com.android.tv.InputSessionManager;
import com.android.tv.InputSessionManager.TvViewSession;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.data.Program;
-import com.android.tv.data.ProgramDataManager;
-import com.android.tv.parental.ParentalControlSettings;
-import com.android.tv.util.DurationTimer;
-import com.android.tv.util.Debug;
+import com.android.tv.analytics.DurationTimer;
import com.android.tv.analytics.Tracker;
-import com.android.tv.common.BuildConfig;
import com.android.tv.common.feature.CommonFeatures;
import com.android.tv.data.Channel;
import com.android.tv.data.StreamInfo;
import com.android.tv.data.WatchedHistoryManager;
import com.android.tv.parental.ContentRatingsManager;
import com.android.tv.recommendation.NotificationService;
-import com.android.tv.util.ImageLoader;
import com.android.tv.util.NetworkUtils;
import com.android.tv.util.PermissionUtils;
import com.android.tv.util.TvInputManagerHelper;
@@ -117,13 +105,14 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
private static final int FADING_IN = 2;
private static final int FADING_OUT = 3;
+ // It is too small to see the description text without PIP_BLOCK_SCREEN_SCALE_FACTOR.
+ private static final float PIP_BLOCK_SCREEN_SCALE_FACTOR = 1.2f;
+
private AppLayerTvView mTvView;
private TvViewSession mTvViewSession;
private Channel mCurrentChannel;
private TvInputManagerHelper mInputManagerHelper;
private ContentRatingsManager mContentRatingsManager;
- private ParentalControlSettings mParentalControlSettings;
- private ProgramDataManager mProgramDataManager;
@Nullable
private WatchedHistoryManager mWatchedHistoryManager;
private boolean mStarted;
@@ -137,7 +126,6 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
private int mAudioChannelCount = StreamInfo.AUDIO_CHANNEL_COUNT_UNKNOWN;
private boolean mHasClosedCaption = false;
private boolean mVideoAvailable;
- private boolean mAudioAvailable;
private boolean mScreenBlocked;
private OnScreenBlockingChangedListener mOnScreenBlockedListener;
private TvContentRating mBlockedContentRating;
@@ -148,8 +136,10 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
private boolean mParentControlEnabled;
private int mFixedSurfaceWidth;
private int mFixedSurfaceHeight;
+ private boolean mIsPip;
+ private int mScreenHeight;
+ private int mShrunkenTvViewHeight;
private final boolean mCanModifyParentalControls;
- private boolean mIsUnderShrunken;
@TimeShiftState private int mTimeShiftState = TIME_SHIFT_STATE_NONE;
private TimeShiftListener mTimeShiftListener;
@@ -166,15 +156,13 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
// A View to hide screen when there's problem in video playback.
private final BlockScreenView mHideScreenView;
- private final int mHideScreenImageColorFilter;
-
- // A spinner view to show buffering status.
- private final View mBufferingSpinnerView;
- private TuningBlockView mTuningBlockView;
// A View to block screen until onContentAllowed is received if parental control is on.
private final View mBlockScreenForTuneView;
+ // A spinner view to show buffering status.
+ private final View mBufferingSpinnerView;
+
// A View for fade-in/out animation
private final View mDimScreenView;
private int mFadeState = FADED_IN;
@@ -298,66 +286,14 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
@Override
public void onVideoAvailable(String inputId) {
- if (DEBUG) Log.d(TAG, "onVideoAvailable: {inputId=" + inputId + "}");
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log("Start up of Live TV ends," +
- " TunableTvView.onVideoAvailable resets timer");
- long startUpDurationTime = Debug.getTimer(Debug.TAG_START_UP_TIMER).reset();
- Debug.removeTimer(Debug.TAG_START_UP_TIMER);
- if (BuildConfig.ENG
- && startUpDurationTime > Debug.TIME_START_UP_DURATION_THRESHOLD) {
- showAlertDialogForLongStartUp();
- }
unhideScreenByVideoAvailability();
if (mOnTuneListener != null) {
mOnTuneListener.onStreamInfoChanged(TunableTvView.this);
}
}
- private void showAlertDialogForLongStartUp() {
- new AlertDialog.Builder(getContext()).setTitle(
- getContext().getString(R.string.settings_send_feedback))
- .setMessage("Because the start up time of Live channels is too long," +
- " please send feedback")
- .setPositiveButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- Intent intent = new Intent(Intent.ACTION_APP_ERROR);
- ApplicationErrorReport report = new ApplicationErrorReport();
- report.packageName = report.processName = getContext()
- .getApplicationContext().getPackageName();
- report.time = System.currentTimeMillis();
- report.type = ApplicationErrorReport.TYPE_CRASH;
-
- // Add the crash info to add title of feedback automatically.
- ApplicationErrorReport.CrashInfo crash = new
- ApplicationErrorReport.CrashInfo();
- crash.exceptionClassName =
- "Live TV start up takes long time";
- crash.exceptionMessage =
- "The start up time of Live TV is too long";
- report.crashInfo = crash;
-
- intent.putExtra(Intent.EXTRA_BUG_REPORT, report);
- getContext().startActivity(intent);
- }
- })
- .setNegativeButton(android.R.string.no, null)
- .show();
- }
-
@Override
public void onVideoUnavailable(String inputId, int reason) {
- if (reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING
- && reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING) {
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log(
- "TunableTvView.onVideoUnAvailable reason = (" + reason
- + ") and removes timer");
- Debug.removeTimer(Debug.TAG_START_UP_TIMER);
- } else {
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log(
- "TunableTvView.onVideoUnAvailable reason = (" + reason + ")");
- }
hideScreenByVideoAvailability(inputId, reason);
if (mOnTuneListener != null) {
mOnTuneListener.onStreamInfoChanged(TunableTvView.this);
@@ -375,8 +311,7 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
@Override
public void onContentAllowed(String inputId) {
mBlockScreenForTuneView.setVisibility(View.GONE);
- mBlockedContentRating = null;
- checkBlockScreenAndMuteNeeded();
+ unblockScreenByContentRating();
if (mOnTuneListener != null) {
mOnTuneListener.onContentAllowed();
}
@@ -384,8 +319,7 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
@Override
public void onContentBlocked(String inputId, TvContentRating rating) {
- mBlockedContentRating = rating;
- checkBlockScreenAndMuteNeeded();
+ blockScreenByContentRating(rating);
if (mOnTuneListener != null) {
mOnTuneListener.onContentBlocked();
}
@@ -393,10 +327,6 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
@Override
public void onTimeShiftStatusChanged(String inputId, int status) {
- if (DEBUG) {
- Log.d(TAG, "onTimeShiftStatusChanged: {inputId=" + inputId + ", status=" + status +
- "}");
- }
boolean available = status == TvInputManager.TIME_SHIFT_STATUS_AVAILABLE;
setTimeShiftAvailable(available);
}
@@ -448,8 +378,6 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
mHideScreenView = (BlockScreenView) findViewById(R.id.hide_screen);
mHideScreenView.setImageVisibility(false);
mBufferingSpinnerView = findViewById(R.id.buffering_spinner);
- mHideScreenImageColorFilter = getResources().getColor(
- R.color.tvview_block_image_color_filter, null);
mBlockScreenForTuneView = findViewById(R.id.block_screen_for_tune);
mDimScreenView = findViewById(R.id.dim);
mDimScreenView.animate().setListener(new AnimatorListenerAdapter() {
@@ -469,23 +397,27 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
});
}
- public void initialize(AppLayerTvView tvView, TuningBlockView tuningBlockView,
- ProgramDataManager programDataManager, TvInputManagerHelper tvInputManagerHelper) {
+ public void initialize(AppLayerTvView tvView, boolean isPip, int screenHeight,
+ int shrunkenTvViewHeight) {
mTvView = tvView;
- mTuningBlockView = tuningBlockView;
- mProgramDataManager = programDataManager;
- mInputManagerHelper = tvInputManagerHelper;
- mContentRatingsManager = tvInputManagerHelper.getContentRatingsManager();
- mParentalControlSettings = tvInputManagerHelper.getParentalControlSettings();
if (mInputSessionManager != null) {
mTvViewSession = mInputSessionManager.createTvViewSession(tvView, this, mCallback);
} else {
mTvView.setCallback(mCallback);
}
+ mIsPip = isPip;
+ mScreenHeight = screenHeight;
+ mShrunkenTvViewHeight = shrunkenTvViewHeight;
+ mTvView.setZOrderOnTop(isPip);
copyLayoutParamsToTvView();
}
- public void start() {
+ public void start(TvInputManagerHelper tvInputManagerHelper) {
+ mInputManagerHelper = tvInputManagerHelper;
+ mContentRatingsManager = tvInputManagerHelper.getContentRatingsManager();
+ if (mStarted) {
+ return;
+ }
mStarted = true;
}
@@ -565,13 +497,6 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
mWatchedHistoryManager = watchedHistoryManager;
}
- /**
- * Sets if the TunableTvView is under shrunken.
- */
- public void setIsUnderShrunken(boolean isUnderShrunken) {
- mIsUnderShrunken = isUnderShrunken;
- }
-
public boolean isPlaying() {
return mStarted;
}
@@ -594,7 +519,6 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
* if the state is disconnected or channelId doesn't exist, it returns false.
*/
public boolean tuneTo(Channel channel, Bundle params, OnTuneListener listener) {
- Debug.getTimer(Debug.TAG_START_UP_TIMER).log("TunableTvView.tuneTo");
if (!mStarted) {
throw new IllegalStateException("TvView isn't started");
}
@@ -636,7 +560,6 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
mVideoDisplayAspectRatio = 0f;
mAudioChannelCount = StreamInfo.AUDIO_CHANNEL_COUNT_UNKNOWN;
mHasClosedCaption = false;
- mBlockedContentRating = null;
mTimeShiftCurrentPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
// To reduce the IPCs, unregister the callback here and register it when necessary.
mTvView.setTimeShiftPositionCallback(null);
@@ -648,12 +571,12 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
}
hideScreenByVideoAvailability(mInputInfo.getId(),
TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING);
- updateBlockScreenUI(false);
if (mTvViewSession != null) {
mTvViewSession.tune(channel, params, listener);
} else {
mTvView.tune(mInputInfo.getId(), mCurrentChannel.getUri(), params);
}
+ unblockScreenByContentRating();
if (channel.isPassthrough()) {
mBlockScreenForTuneView.setVisibility(View.GONE);
} else if (mParentControlEnabled) {
@@ -792,11 +715,6 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
}
@Override
- public boolean isVideoOrAudioAvailable() {
- return mVideoAvailable || mAudioAvailable;
- }
-
- @Override
public int getVideoUnavailableReason() {
return mVideoUnavailableReason;
}
@@ -829,7 +747,7 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
}
/**
- * Returns if the screen is blocked by {@link #blockOrUnblockScreen(boolean)}.
+ * Returns if the screen is blocked by {@link #blockScreen()}.
*/
public boolean isScreenBlocked() {
return mScreenBlocked;
@@ -848,18 +766,38 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
}
/**
- * Blocks/unblocks current TV screen and mutes.
+ * Locks current TV screen and mutes.
* There would be black screen with lock icon in order to show that
* screen block is intended and not an error.
* TODO: Accept parameter to show lock icon or not.
- *
- * @param blockOrUnblock {@code true} to block the screen, or {@code false} to unblock.
*/
- public void blockOrUnblockScreen(boolean blockOrUnblock) {
- mScreenBlocked = blockOrUnblock;
+ public void blockScreen() {
+ mScreenBlocked = true;
checkBlockScreenAndMuteNeeded();
if (mOnScreenBlockedListener != null) {
- mOnScreenBlockedListener.onScreenBlockingChanged(blockOrUnblock);
+ mOnScreenBlockedListener.onScreenBlockingChanged(true);
+ }
+ }
+
+ private void blockScreenByContentRating(TvContentRating rating) {
+ mBlockedContentRating = rating;
+ checkBlockScreenAndMuteNeeded();
+ }
+
+ @Override
+ @SuppressLint("RtlHardcoded")
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ if (mIsPip) {
+ int height = bottom - top;
+ float scale;
+ if (mBlockScreenType == BLOCK_SCREEN_TYPE_SHRUNKEN_TV_VIEW) {
+ scale = height * PIP_BLOCK_SCREEN_SCALE_FACTOR / mShrunkenTvViewHeight;
+ } else {
+ scale = height * PIP_BLOCK_SCREEN_SCALE_FACTOR / mScreenHeight;
+ }
+ // TODO: need to get UX confirmation.
+ mBlockScreenView.scaleContainerView(scale);
}
}
@@ -881,7 +819,17 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
|| tvViewLp.gravity != lp.gravity
|| tvViewLp.height != lp.height
|| tvViewLp.width != lp.width) {
- tvViewLp.leftMargin = lp.leftMargin;
+ if (lp.topMargin == tvViewLp.topMargin && lp.leftMargin == tvViewLp.leftMargin
+ && !BuildCompat.isAtLeastN()) {
+ // HACK: If top and left position aren't changed and SurfaceHolder.setFixedSize is
+ // used, SurfaceView doesn't catch the width and height change. It causes a bug that
+ // PIP size change isn't shown when PIP is located TOP|LEFT. So we adjust 1 px for
+ // small size PIP as a workaround.
+ // Note: This framework issue has been fixed from NYC.
+ tvViewLp.leftMargin = lp.leftMargin + 1;
+ } else {
+ tvViewLp.leftMargin = lp.leftMargin;
+ }
tvViewLp.topMargin = lp.topMargin;
tvViewLp.bottomMargin = lp.bottomMargin;
tvViewLp.rightMargin = lp.rightMargin;
@@ -997,109 +945,96 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
private void checkBlockScreenAndMuteNeeded() {
updateBlockScreenUI(false);
- updateMuteStatus();
+ if (mScreenBlocked || mBlockedContentRating != null) {
+ mute();
+ if (mIsPip) {
+ // If we don't make mTvView invisible, some frames are leaked when a user changes
+ // PIP layout in options.
+ // Note: When video is unavailable, we keep the mTvView's visibility, because
+ // TIS implementation may not send video available with no surface.
+ mTvView.setVisibility(View.INVISIBLE);
+ }
+ } else {
+ unmuteIfPossible();
+ if (mIsPip) {
+ mTvView.setVisibility(View.VISIBLE);
+ }
+ }
+ }
+
+ public void unblockScreen() {
+ mScreenBlocked = false;
+ checkBlockScreenAndMuteNeeded();
+ if (mOnScreenBlockedListener != null) {
+ mOnScreenBlockedListener.onScreenBlockingChanged(false);
+ }
+ }
+
+ private void unblockScreenByContentRating() {
+ mBlockedContentRating = null;
+ checkBlockScreenAndMuteNeeded();
}
@UiThread
private void hideScreenByVideoAvailability(String inputId, int reason) {
mVideoAvailable = false;
- mAudioAvailable = false;
mVideoUnavailableReason = reason;
if (mInternetCheckTask != null) {
mInternetCheckTask.cancel(true);
mInternetCheckTask = null;
}
- if (reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING) {
- // Tuning block view will apply animation when unhide screen, so let's end the
- // animation if it is running.
- mTuningBlockView.endFadeOutAnimator();
- }
switch (reason) {
case TvInputManager.VIDEO_UNAVAILABLE_REASON_AUDIO_ONLY:
mHideScreenView.setVisibility(VISIBLE);
mHideScreenView.setImageVisibility(false);
mHideScreenView.setText(R.string.tvview_msg_audio_only);
- mTuningBlockView.setVisibility(GONE);
mBufferingSpinnerView.setVisibility(GONE);
- mAudioAvailable = true;
+ unmuteIfPossible();
break;
case TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING:
mBufferingSpinnerView.setVisibility(VISIBLE);
+ mute();
break;
case TvInputManager.VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL:
mHideScreenView.setVisibility(VISIBLE);
mHideScreenView.setText(R.string.tvview_msg_weak_signal);
- mTuningBlockView.setVisibility(GONE);
mBufferingSpinnerView.setVisibility(GONE);
+ mute();
break;
case TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING:
+ mHideScreenView.setVisibility(VISIBLE);
+ mHideScreenView.setImageVisibility(false);
+ mHideScreenView.setText(null);
mBufferingSpinnerView.setVisibility(VISIBLE);
- if (shouldShowImageForTuning()) {
- mHideScreenView.setVisibility(GONE);
- mTuningBlockView.setVisibility(VISIBLE);
- mTuningBlockView.setImageVisibility(false);
- showImageForTuning();
- } else {
- mHideScreenView.setVisibility(VISIBLE);
- mHideScreenView.setImageVisibility(false);
- mHideScreenView.setText(null);
- mTuningBlockView.setVisibility(GONE);
- }
+ mute();
break;
case VIDEO_UNAVAILABLE_REASON_NOT_TUNED:
mHideScreenView.setVisibility(VISIBLE);
mHideScreenView.setImageVisibility(false);
mHideScreenView.setText(null);
- mTuningBlockView.setVisibility(GONE);
mBufferingSpinnerView.setVisibility(GONE);
+ mute();
break;
case VIDEO_UNAVAILABLE_REASON_NO_RESOURCE:
mHideScreenView.setVisibility(VISIBLE);
mHideScreenView.setImageVisibility(false);
mHideScreenView.setText(getTuneConflictMessage(inputId));
- mTuningBlockView.setVisibility(GONE);
mBufferingSpinnerView.setVisibility(GONE);
+ mute();
break;
case TvInputManager.VIDEO_UNAVAILABLE_REASON_UNKNOWN:
default:
mHideScreenView.setVisibility(VISIBLE);
mHideScreenView.setImageVisibility(false);
mHideScreenView.setText(null);
- mTuningBlockView.setVisibility(GONE);
mBufferingSpinnerView.setVisibility(GONE);
+ mute();
if (mCurrentChannel != null && !mCurrentChannel.isPhysicalTunerChannel()) {
mInternetCheckTask = new InternetCheckTask();
mInternetCheckTask.execute();
}
break;
}
- updateMuteStatus();
- }
-
- private boolean shouldShowImageForTuning() {
- if (getWidth() == 0 || getWidth() == 0 || mCurrentChannel == null || !isBundledInput()
- || mIsUnderShrunken || (mParentControlEnabled && (mCurrentChannel.isLocked()))) {
- return false;
- }
- Program currentProgram = mProgramDataManager.getCurrentProgram(mCurrentChannel.getId());
- if (currentProgram == null) {
- return false;
- }
- TvContentRating rating =
- mParentalControlSettings.getBlockedRating(currentProgram.getContentRatings());
- return !(mParentControlEnabled && rating != null);
- }
-
- private void showImageForTuning() {
- mTuningBlockView.setImage(null);
- if (mCurrentChannel == null) {
- return;
- }
- Program currentProgram = mProgramDataManager.getCurrentProgram(mCurrentChannel.getId());
- if (currentProgram != null) {
- currentProgram.loadPosterArt(getContext(), getWidth(), getHeight(),
- createProgramPosterArtCallback(mTuningBlockView, mCurrentChannel.getId()));
- }
}
private String getTuneConflictMessage(String inputId) {
@@ -1117,43 +1052,25 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
private void unhideScreenByVideoAvailability() {
mVideoAvailable = true;
- mAudioAvailable = true;
- mTuningBlockView.hideWithAnimationIfNeeded();
mHideScreenView.setVisibility(GONE);
mBufferingSpinnerView.setVisibility(GONE);
- updateMuteStatus();
- }
-
- private void updateMuteStatus() {
- // Workaround: TunerTvInputService uses AC3 pass-through implementation, which disables
- // audio tracks to enforce the mute request. We don't want to send mute request if we are
- // not going to block the screen to prevent the video jankiness resulted by disabling audio
- // track before the playback is started. In other way, we should send unmute request before
- // the playback is started, because TunerTvInput will remember the muted state and mute
- // itself right way when the playback is going to be started, which results the initial
- // jankiness, too.
- boolean isBundledInput = isBundledInput();
- if ((isBundledInput || mAudioAvailable) && !mScreenBlocked
- && mBlockedContentRating == null) {
- if (mIsMuted) {
- mIsMuted = false;
- mTvView.setStreamVolume(mVolume);
- }
- } else {
- if (!mIsMuted) {
- if ((mInputInfo == null || isBundledInput)
- && !mScreenBlocked && mBlockedContentRating == null) {
- return;
- }
- mIsMuted = true;
- mTvView.setStreamVolume(0);
- }
+ unmuteIfPossible();
+ }
+
+ private void unmuteIfPossible() {
+ if (mVideoAvailable && !mScreenBlocked && mBlockedContentRating == null) {
+ unmute();
}
}
- private boolean isBundledInput() {
- return mInputInfo != null && mInputInfo.getType() == TvInputInfo.TYPE_TUNER
- && Utils.isBundledInput(mInputInfo.getId());
+ private void mute() {
+ mIsMuted = true;
+ mTvView.setStreamVolume(0);
+ }
+
+ private void unmute() {
+ mIsMuted = false;
+ mTvView.setStreamVolume(mVolume);
}
/** Returns true if this view is faded out. */
@@ -1351,25 +1268,6 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
return mTimeShiftCurrentPositionMs;
}
- private ImageLoader.ImageLoaderCallback<TuningBlockView> createProgramPosterArtCallback(
- TuningBlockView view, final long channelId) {
- return new ImageLoader.ImageLoaderCallback<TuningBlockView>(view) {
- @Override
- public void onBitmapLoaded(TuningBlockView view, @Nullable Bitmap posterArt) {
- if (posterArt == null || getCurrentChannel() == null
- || channelId != getCurrentChannel().getId()
- || !shouldShowImageForTuning()) {
- return;
- }
- Drawable drawablePosterArt = new BitmapDrawable(view.getResources(), posterArt);
- drawablePosterArt.mutate().setColorFilter(
- mHideScreenImageColorFilter, PorterDuff.Mode.SRC_OVER);
- view.setImage(drawablePosterArt);
- view.setImageVisibility(true);
- }
- };
- }
-
/**
* Used to receive the time-shift events.
*/
diff --git a/src/com/android/tv/ui/TuningBlockView.java b/src/com/android/tv/ui/TuningBlockView.java
deleted file mode 100644
index 2914b461..00000000
--- a/src/com/android/tv/ui/TuningBlockView.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.ui;
-
-import android.animation.Animator;
-import android.animation.AnimatorInflater;
-import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-
-import com.android.tv.R;
-import com.android.tv.common.SoftPreconditions;
-
-/**
- * A view to block the screen while tuning channels.
- */
-public class TuningBlockView extends FrameLayout{
- private final static String TAG = "TuningBlockView";
-
- private ImageView mImageView;
- private Animator mFadeOut;
-
- public TuningBlockView(Context context) {
- this(context, null, 0);
- }
-
- public TuningBlockView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public TuningBlockView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mImageView = (ImageView) findViewById(R.id.image);
- mFadeOut = AnimatorInflater.loadAnimator(
- getContext(), R.animator.tuning_block_view_fade_out);
- mFadeOut.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- setVisibility(GONE);
- }
- });
- mFadeOut.setTarget(mImageView);
- }
-
- /**
- * Sets image to the image view. This method should be called after finishing inflate the view.
- */
- public void setImage(Drawable imageDrawable) {
- SoftPreconditions.checkState(mImageView != null, TAG, "imageView is null");
- mImageView.setImageDrawable(imageDrawable);
- }
-
- /**
- * Sets the visibility of image view.
- * This method should be called after finishing inflate the view.
- */
- public void setImageVisibility(boolean visible) {
- SoftPreconditions.checkState(mImageView != null, TAG, "imageView is null");
- mImageView.setAlpha(1.0f);
- mImageView.setVisibility(visible ? VISIBLE: GONE);
- }
-
- /**
- * Returns if the image view is visible.
- * This method should be called after finishing inflate the view.
- */
- public boolean isImageArtVisible() {
- SoftPreconditions.checkState(mImageView != null, TAG, "imageView is null");
- return mImageView.getVisibility() == VISIBLE;
- }
-
- /**
- * Hides the view with animation if needed.
- */
- public void hideWithAnimationIfNeeded() {
- if (getVisibility() == VISIBLE && isImageArtVisible()) {
- mFadeOut.start();
- } else {
- setVisibility(GONE);
- }
- }
-
- /**
- * Ends the fade out animator.
- */
- public void endFadeOutAnimator() {
- if (mFadeOut != null && mFadeOut.isRunning()) {
- mFadeOut.end();
- }
- }
-}
diff --git a/src/com/android/tv/ui/TvOverlayManager.java b/src/com/android/tv/ui/TvOverlayManager.java
index f86e6e95..e14b286b 100644
--- a/src/com/android/tv/ui/TvOverlayManager.java
+++ b/src/com/android/tv/ui/TvOverlayManager.java
@@ -39,7 +39,6 @@ import com.android.tv.MainActivity.KeyHandlerResultType;
import com.android.tv.R;
import com.android.tv.TimeShiftManager;
import com.android.tv.TvApplication;
-import com.android.tv.TvOptionsManager;
import com.android.tv.analytics.Tracker;
import com.android.tv.common.WeakHandler;
import com.android.tv.common.feature.CommonFeatures;
@@ -47,14 +46,13 @@ import com.android.tv.common.ui.setup.OnActionClickListener;
import com.android.tv.common.ui.setup.SetupFragment;
import com.android.tv.common.ui.setup.SetupMultiPaneFragment;
import com.android.tv.data.ChannelDataManager;
-import com.android.tv.dialog.DvrHistoryDialogFragment;
import com.android.tv.dialog.FullscreenDialogFragment;
-import com.android.tv.dialog.HalfSizedDialogFragment;
import com.android.tv.dialog.PinDialogFragment;
import com.android.tv.dialog.RecentlyWatchedDialogFragment;
import com.android.tv.dialog.SafeDismissDialogFragment;
import com.android.tv.dvr.DvrDataManager;
-import com.android.tv.dvr.ui.browse.DvrBrowseActivity;
+import com.android.tv.dvr.ui.DvrActivity;
+import com.android.tv.dvr.ui.HalfSizedDialogFragment;
import com.android.tv.guide.ProgramGuide;
import com.android.tv.menu.Menu;
import com.android.tv.menu.Menu.MenuShowReason;
@@ -165,7 +163,6 @@ public class TvOverlayManager {
private static final Set<String> AVAILABLE_DIALOG_TAGS = new HashSet<>();
static {
AVAILABLE_DIALOG_TAGS.add(RecentlyWatchedDialogFragment.DIALOG_TAG);
- AVAILABLE_DIALOG_TAGS.add(DvrHistoryDialogFragment.DIALOG_TAG);
AVAILABLE_DIALOG_TAGS.add(PinDialogFragment.DIALOG_TAG);
AVAILABLE_DIALOG_TAGS.add(FullscreenDialogFragment.DIALOG_TAG);
AVAILABLE_DIALOG_TAGS.add(SettingsFragment.LicenseActionItem.DIALOG_TAG);
@@ -198,10 +195,10 @@ public class TvOverlayManager {
private OnBackStackChangedListener mOnBackStackChangedListener;
public TvOverlayManager(MainActivity mainActivity, ChannelTuner channelTuner,
- TunableTvView tvView, TvOptionsManager optionsManager,
- KeypadChannelSwitchView keypadChannelSwitchView, ChannelBannerView channelBannerView,
- InputBannerView inputBannerView, SelectInputView selectInputView,
- ViewGroup sceneContainer, ProgramGuideSearchFragment searchFragment) {
+ TunableTvView tvView, KeypadChannelSwitchView keypadChannelSwitchView,
+ ChannelBannerView channelBannerView, InputBannerView inputBannerView,
+ SelectInputView selectInputView, ViewGroup sceneContainer,
+ ProgramGuideSearchFragment searchFragment) {
mMainActivity = mainActivity;
mChannelTuner = channelTuner;
ApplicationSingletons singletons = TvApplication.getSingletons(mainActivity);
@@ -228,8 +225,7 @@ public class TvOverlayManager {
});
// Menu
MenuView menuView = (MenuView) mainActivity.findViewById(R.id.menu);
- mMenu = new Menu(mainActivity, tvView, optionsManager, menuView,
- new MenuRowFactory(mainActivity, tvView),
+ mMenu = new Menu(mainActivity, tvView, menuView, new MenuRowFactory(mainActivity, tvView),
new Menu.OnMenuVisibilityChangeListener() {
@Override
public void onMenuVisibilityChange(boolean visible) {
@@ -545,7 +541,7 @@ public class TvOverlayManager {
* Shows DVR manager.
*/
public void showDvrManager() {
- Intent intent = new Intent(mMainActivity, DvrBrowseActivity.class);
+ Intent intent = new Intent(mMainActivity, DvrActivity.class);
mMainActivity.startActivity(intent);
}
@@ -568,14 +564,6 @@ public class TvOverlayManager {
}
/**
- * Shows DVR history dialog.
- */
- public void showDvrHistoryDialog() {
- showDialogFragment(DvrHistoryDialogFragment.DIALOG_TAG,
- new DvrHistoryDialogFragment(), false);
- }
-
- /**
* Shows banner view.
*/
public void showBanner() {
@@ -686,7 +674,7 @@ public class TvOverlayManager {
}
if ((flags & FLAG_HIDE_OVERLAYS_KEEP_SIDE_PANELS) != 0) {
// Keeps side panels.
- } else if (mSideFragmentManager.isActive()) {
+ } else if (mSideFragmentManager.isSidePanelVisible()) {
if ((flags & FLAG_HIDE_OVERLAYS_KEEP_SIDE_PANEL_HISTORY) != 0) {
mSideFragmentManager.hideSidePanel(withAnimation);
} else {
diff --git a/src/com/android/tv/ui/TvViewUiManager.java b/src/com/android/tv/ui/TvViewUiManager.java
index 8d3b14f7..bf874fc7 100644
--- a/src/com/android/tv/ui/TvViewUiManager.java
+++ b/src/com/android/tv/ui/TvViewUiManager.java
@@ -52,8 +52,9 @@ import com.android.tv.data.DisplayMode;
import com.android.tv.util.TvSettings;
/**
- * The TvViewUiManager is responsible for handling UI layouting and animation of main TvView.
- * It also control the settings regarding TvView UI such as display mode.
+ * The TvViewUiManager is responsible for handling UI layouting and animation of main and PIP
+ * TvViews. It also control the settings regarding TvView UI such as display mode, PIP layout,
+ * and PIP size.
*/
public class TvViewUiManager {
private static final String TAG = "TvViewManager";
@@ -68,11 +69,18 @@ public class TvViewUiManager {
private final Resources mResources;
private final FrameLayout mContentView;
private final TunableTvView mTvView;
+ private final TunableTvView mPipView;
private final TvOptionsManager mTvOptionsManager;
+ private final int mTvViewPapWidth;
private final int mTvViewShrunkenStartMargin;
private final int mTvViewShrunkenEndMargin;
+ private final int mTvViewPapStartMargin;
+ private final int mTvViewPapEndMargin;
private int mWindowWidth;
private int mWindowHeight;
+ private final int mPipViewHorizontalMargin;
+ private final int mPipViewTopMargin;
+ private final int mPipViewBottomMargin;
private final SharedPreferences mSharedPreferences;
private final TimeInterpolator mLinearOutSlowIn;
private final TimeInterpolator mFastOutLinearIn;
@@ -105,6 +113,9 @@ public class TvViewUiManager {
private boolean mIsUnderShrunkenTvView;
private int mTvViewStartMargin;
private int mTvViewEndMargin;
+ private int mPipLayout;
+ private int mPipSize;
+ private boolean mPipStarted;
private ObjectAnimator mTvViewAnimator;
private FrameLayout.LayoutParams mTvViewLayoutParams;
// TV view's position when the display mode is FULL. It is used to compute PIP location relative
@@ -119,11 +130,12 @@ public class TvViewUiManager {
private int mAppliedTvViewEndMargin;
private float mAppliedVideoDisplayAspectRatio;
- public TvViewUiManager(Context context, TunableTvView tvView,
+ public TvViewUiManager(Context context, TunableTvView tvView, TunableTvView pipView,
FrameLayout contentView, TvOptionsManager tvOptionManager) {
mContext = context;
mResources = mContext.getResources();
mTvView = tvView;
+ mPipView = pipView;
mContentView = contentView;
mTvOptionsManager = tvOptionManager;
@@ -135,12 +147,18 @@ public class TvViewUiManager {
mWindowWidth = size.x;
mWindowHeight = size.y;
- // Have an assumption that TvView Shrinking happens only in full screen.
+ // Have an assumption that PIP and TvView Shrinking happens only in full screen.
mTvViewShrunkenStartMargin = mResources
.getDimensionPixelOffset(R.dimen.shrunken_tvview_margin_start);
mTvViewShrunkenEndMargin =
mResources.getDimensionPixelOffset(R.dimen.shrunken_tvview_margin_end)
+ mResources.getDimensionPixelSize(R.dimen.side_panel_width);
+ int papMarginHorizontal = mResources
+ .getDimensionPixelOffset(R.dimen.papview_margin_horizontal);
+ int papSpacing = mResources.getDimensionPixelOffset(R.dimen.papview_spacing);
+ mTvViewPapWidth = (mWindowWidth - papSpacing) / 2 - papMarginHorizontal;
+ mTvViewPapStartMargin = papMarginHorizontal + mTvViewPapWidth + papSpacing;
+ mTvViewPapEndMargin = papMarginHorizontal;
mTvViewFrame = createMarginLayoutParams(0, 0, 0, 0);
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
@@ -149,6 +167,11 @@ public class TvViewUiManager {
.loadInterpolator(mContext, android.R.interpolator.linear_out_slow_in);
mFastOutLinearIn = AnimationUtils
.loadInterpolator(mContext, android.R.interpolator.fast_out_linear_in);
+
+ mPipViewHorizontalMargin = mResources
+ .getDimensionPixelOffset(R.dimen.pipview_margin_horizontal);
+ mPipViewTopMargin = mResources.getDimensionPixelOffset(R.dimen.pipview_margin_top);
+ mPipViewBottomMargin = mResources.getDimensionPixelOffset(R.dimen.pipview_margin_bottom);
}
public void onConfigurationChanged(final int windowWidth, final int windowHeight) {
@@ -177,11 +200,18 @@ public class TvViewUiManager {
*/
public void startShrunkenTvView() {
mIsUnderShrunkenTvView = true;
- mTvView.setIsUnderShrunken(true);
mTvViewStartMarginBeforeShrunken = mTvViewStartMargin;
mTvViewEndMarginBeforeShrunken = mTvViewEndMargin;
- setTvViewMargin(mTvViewShrunkenStartMargin, mTvViewShrunkenEndMargin);
+ if (mPipStarted && getPipLayout() == TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) {
+ float sidePanelWidth = mResources.getDimensionPixelOffset(R.dimen.side_panel_width);
+ float factor = 1.0f - sidePanelWidth / mWindowWidth;
+ int startMargin = (int) (mTvViewPapStartMargin * factor);
+ int endMargin = (int) (mTvViewPapEndMargin * factor + sidePanelWidth);
+ setTvViewMargin(startMargin, endMargin);
+ } else {
+ setTvViewMargin(mTvViewShrunkenStartMargin, mTvViewShrunkenEndMargin);
+ }
mDisplayModeBeforeShrunken = setDisplayMode(DisplayMode.MODE_NORMAL, false, true);
}
@@ -191,7 +221,6 @@ public class TvViewUiManager {
*/
public void endShrunkenTvView() {
mIsUnderShrunkenTvView = false;
- mTvView.setIsUnderShrunken(false);
setTvViewMargin(mTvViewStartMarginBeforeShrunken, mTvViewEndMarginBeforeShrunken);
setDisplayMode(mDisplayModeBeforeShrunken, false, true);
}
@@ -298,6 +327,120 @@ public class TvViewUiManager {
}
/**
+ * Returns the current PIP layout. The layout should be one of
+ * {@link TvSettings#PIP_LAYOUT_BOTTOM_RIGHT}, {@link TvSettings#PIP_LAYOUT_TOP_RIGHT},
+ * {@link TvSettings#PIP_LAYOUT_TOP_LEFT}, {@link TvSettings#PIP_LAYOUT_BOTTOM_LEFT} and
+ * {@link TvSettings#PIP_LAYOUT_SIDE_BY_SIDE}.
+ */
+ public int getPipLayout() {
+ return mPipLayout;
+ }
+
+ /**
+ * Sets the PIP layout. The layout should be one of
+ * {@link TvSettings#PIP_LAYOUT_BOTTOM_RIGHT}, {@link TvSettings#PIP_LAYOUT_TOP_RIGHT},
+ * {@link TvSettings#PIP_LAYOUT_TOP_LEFT}, {@link TvSettings#PIP_LAYOUT_BOTTOM_LEFT} and
+ * {@link TvSettings#PIP_LAYOUT_SIDE_BY_SIDE}.
+ *
+ * @param storeInPreference if true, the stored value will be restored by
+ * {@link #restorePipLayout()}.
+ */
+ public void setPipLayout(int pipLayout, boolean storeInPreference) {
+ mPipLayout = pipLayout;
+ if (storeInPreference) {
+ TvSettings.setPipLayout(mContext, pipLayout);
+ }
+ updatePipView(mTvViewFrame);
+ if (mPipLayout == TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) {
+ setTvViewMargin(mTvViewPapStartMargin, mTvViewPapEndMargin);
+ setDisplayMode(DisplayMode.MODE_NORMAL, false, false);
+ } else {
+ setTvViewMargin(0, 0);
+ restoreDisplayMode(false);
+ }
+ mTvOptionsManager.onPipLayoutChanged(pipLayout);
+ }
+
+ /**
+ * Restores the PIP layout which {@link #setPipLayout} lastly stores.
+ */
+ public void restorePipLayout() {
+ setPipLayout(TvSettings.getPipLayout(mContext), false);
+ }
+
+ /**
+ * Called when PIP is started.
+ */
+ public void onPipStart() {
+ mPipStarted = true;
+ updatePipView();
+ mPipView.setVisibility(View.VISIBLE);
+ }
+
+ /**
+ * Called when PIP is stopped.
+ */
+ public void onPipStop() {
+ setTvViewMargin(0, 0);
+ mPipView.setVisibility(View.GONE);
+ mPipStarted = false;
+ }
+
+ /**
+ * Called when PIP is resumed.
+ */
+ public void showPipForResume() {
+ mPipView.setVisibility(View.VISIBLE);
+ }
+
+ /**
+ * Called when PIP is paused.
+ */
+ public void hidePipForPause() {
+ if (mPipLayout != TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) {
+ mPipView.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * Updates PIP view. It is usually called, when video resolution in PIP is updated.
+ */
+ public void updatePipView() {
+ updatePipView(mTvViewFrame);
+ }
+
+ /**
+ * Returns the size of the PIP view.
+ */
+ public int getPipSize() {
+ return mPipSize;
+ }
+
+ /**
+ * Sets PIP size and applies it immediately.
+ *
+ * @param pipSize PIP size. The value should be one of {@link TvSettings#PIP_SIZE_BIG}
+ * and {@link TvSettings#PIP_SIZE_SMALL}.
+ * @param storeInPreference if true, the stored value will be restored by
+ * {@link #restorePipSize()}.
+ */
+ public void setPipSize(int pipSize, boolean storeInPreference) {
+ mPipSize = pipSize;
+ if (storeInPreference) {
+ TvSettings.setPipSize(mContext, pipSize);
+ }
+ updatePipView(mTvViewFrame);
+ mTvOptionsManager.onPipSizeChanged(pipSize);
+ }
+
+ /**
+ * Restores the PIP size which {@link #setPipSize} lastly stores.
+ */
+ public void restorePipSize() {
+ setPipSize(TvSettings.getPipSize(mContext), false);
+ }
+
+ /**
* This margins will be applied when applyDisplayMode is called.
*/
private void setTvViewMargin(int tvViewStartMargin, int tvViewEndMargin) {
@@ -397,6 +540,113 @@ public class TvViewUiManager {
} else {
mTvView.setLayoutParams(layoutParams);
}
+ updatePipView(mTvViewFrame);
+ }
+ }
+
+ /**
+ * The redlines assume that the ratio of the TV screen is 16:9. If the radio is not 16:9, the
+ * layout of PAP can be broken.
+ */
+ @SuppressLint("RtlHardcoded")
+ private void updatePipView(MarginLayoutParams tvViewFrame) {
+ if (!mPipStarted) {
+ return;
+ }
+ int width;
+ int height;
+ int startMargin;
+ int endMargin;
+ int topMargin;
+ int bottomMargin;
+ int gravity;
+
+ if (mPipLayout == TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) {
+ gravity = Gravity.CENTER_VERTICAL | Gravity.START;
+ height = tvViewFrame.height;
+ float videoDisplayAspectRatio = mPipView.getVideoDisplayAspectRatio();
+ if (videoDisplayAspectRatio <= 0f) {
+ width = tvViewFrame.width;
+ } else {
+ width = (int) (height * videoDisplayAspectRatio);
+ if (width > tvViewFrame.width) {
+ width = tvViewFrame.width;
+ }
+ }
+ startMargin = mResources.getDimensionPixelOffset(R.dimen.papview_margin_horizontal)
+ * tvViewFrame.width / mTvViewPapWidth + (tvViewFrame.width - width) / 2;
+ endMargin = 0;
+ topMargin = 0;
+ bottomMargin = 0;
+ } else {
+ int tvViewWidth = tvViewFrame.width;
+ int tvViewHeight = tvViewFrame.height;
+ int tvStartMargin = tvViewFrame.getMarginStart();
+ int tvEndMargin = tvViewFrame.getMarginEnd();
+ int tvTopMargin = tvViewFrame.topMargin;
+ int tvBottomMargin = tvViewFrame.bottomMargin;
+ float horizontalScaleFactor = (float) tvViewWidth / mWindowWidth;
+ float verticalScaleFactor = (float) tvViewHeight / mWindowHeight;
+
+ int maxWidth;
+ if (mPipSize == TvSettings.PIP_SIZE_SMALL) {
+ maxWidth = (int) (mResources.getDimensionPixelSize(R.dimen.pipview_small_size_width)
+ * horizontalScaleFactor);
+ height = (int) (mResources.getDimensionPixelSize(R.dimen.pipview_small_size_height)
+ * verticalScaleFactor);
+ } else if (mPipSize == TvSettings.PIP_SIZE_BIG) {
+ maxWidth = (int) (mResources.getDimensionPixelSize(R.dimen.pipview_large_size_width)
+ * horizontalScaleFactor);
+ height = (int) (mResources.getDimensionPixelSize(R.dimen.pipview_large_size_height)
+ * verticalScaleFactor);
+ } else {
+ throw new IllegalArgumentException("Invalid PIP size: " + mPipSize);
+ }
+ float videoDisplayAspectRatio = mPipView.getVideoDisplayAspectRatio();
+ if (videoDisplayAspectRatio <= 0f) {
+ width = maxWidth;
+ } else {
+ width = (int) (height * videoDisplayAspectRatio);
+ if (width > maxWidth) {
+ width = maxWidth;
+ }
+ }
+
+ startMargin = tvStartMargin + (int) (mPipViewHorizontalMargin * horizontalScaleFactor);
+ endMargin = tvEndMargin + (int) (mPipViewHorizontalMargin * horizontalScaleFactor);
+ topMargin = tvTopMargin + (int) (mPipViewTopMargin * verticalScaleFactor);
+ bottomMargin = tvBottomMargin + (int) (mPipViewBottomMargin * verticalScaleFactor);
+
+ switch (mPipLayout) {
+ case TvSettings.PIP_LAYOUT_TOP_LEFT:
+ gravity = Gravity.TOP | Gravity.LEFT;
+ break;
+ case TvSettings.PIP_LAYOUT_TOP_RIGHT:
+ gravity = Gravity.TOP | Gravity.RIGHT;
+ break;
+ case TvSettings.PIP_LAYOUT_BOTTOM_LEFT:
+ gravity = Gravity.BOTTOM | Gravity.LEFT;
+ break;
+ case TvSettings.PIP_LAYOUT_BOTTOM_RIGHT:
+ gravity = Gravity.BOTTOM | Gravity.RIGHT;
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid PIP location: " + mPipLayout);
+ }
+ }
+
+ FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mPipView.getLayoutParams();
+ if (lp.width != width || lp.height != height || lp.getMarginStart() != startMargin
+ || lp.getMarginEnd() != endMargin || lp.topMargin != topMargin
+ || lp.bottomMargin != bottomMargin || lp.gravity != gravity) {
+ lp.width = width;
+ lp.height = height;
+ lp.setMarginStart(startMargin);
+ lp.setMarginEnd(endMargin);
+ lp.topMargin = topMargin;
+ lp.bottomMargin = bottomMargin;
+ lp.gravity = gravity;
+ mPipView.setLayoutParams(lp);
}
}
@@ -446,6 +696,7 @@ public class TvViewUiManager {
mLastAnimatedTvViewFrame = new MarginLayoutParams(0, 0);
interpolateMarginsRelative(mLastAnimatedTvViewFrame,
mOldTvViewFrame, mTvViewFrame, fraction);
+ updatePipView(mLastAnimatedTvViewFrame);
}
});
}
diff --git a/src/com/android/tv/ui/sidepanel/ClosedCaptionFragment.java b/src/com/android/tv/ui/sidepanel/ClosedCaptionFragment.java
index e5c23372..d6ccdf6b 100644
--- a/src/com/android/tv/ui/sidepanel/ClosedCaptionFragment.java
+++ b/src/com/android/tv/ui/sidepanel/ClosedCaptionFragment.java
@@ -82,9 +82,8 @@ public class ClosedCaptionFragment extends SideFragment {
}
mItems.add(item);
- for (int i = 0; i < tracks.size(); i++) {
- final TvTrackInfo track = tracks.get(i);
- item = new ClosedCaptionOptionItem(getLabel(track, i),
+ for (final TvTrackInfo track : tracks) {
+ item = new ClosedCaptionOptionItem(getLabel(track),
CaptionSettings.OPTION_ON, track.getId(), track.getLanguage());
if (isEnabled && track.getId().equals(trackId)) {
item.setChecked(true);
@@ -173,11 +172,11 @@ public class ClosedCaptionFragment extends SideFragment {
super.onDestroyView();
}
- private String getLabel(TvTrackInfo track, int trackIndex) {
+ private String getLabel(TvTrackInfo track) {
if (track.getLanguage() != null) {
return new Locale(track.getLanguage()).getDisplayName();
}
- return getString(R.string.closed_caption_unknown_language, trackIndex + 1);
+ return getString(R.string.default_language);
}
private class ClosedCaptionOptionItem extends RadioButtonItem {
diff --git a/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java b/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java
index fac24696..0d189cca 100644
--- a/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java
+++ b/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java
@@ -18,6 +18,8 @@ package com.android.tv.ui.sidepanel;
import android.accounts.Account;
import android.app.Activity;
+import android.app.ApplicationErrorReport;
+import android.content.Intent;
import android.support.annotation.NonNull;
import android.util.Log;
import android.widget.Toast;
@@ -25,7 +27,6 @@ import android.widget.Toast;
import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.common.BuildConfig;
-import com.android.tv.common.feature.CommonFeatures;
import com.android.tv.data.epg.EpgFetcher;
import com.android.tv.experiments.Experiments;
import com.android.tv.tuner.TunerPreferences;
@@ -53,14 +54,6 @@ public class DeveloperOptionFragment extends SideFragment {
@Override
protected List<Item> getItemList() {
List<Item> items = new ArrayList<>();
- if (CommonFeatures.DVR.isEnabled(getContext())) {
- items.add(new ActionItem(getString(R.string.dev_item_dvr_history)) {
- @Override
- protected void onSelected() {
- getMainActivity().getOverlayManager().showDvrHistoryDialog();
- }
- });
- }
if (BuildConfig.ENG) {
items.add(new ActionItem(getString(R.string.dev_item_watch_history)) {
@Override
@@ -69,6 +62,18 @@ public class DeveloperOptionFragment extends SideFragment {
}
});
}
+ items.add(new ActionItem(getString(R.string.dev_item_send_feedback)) {
+ @Override
+ protected void onSelected() {
+ Intent intent = new Intent(Intent.ACTION_APP_ERROR);
+ ApplicationErrorReport report = new ApplicationErrorReport();
+ report.packageName = report.processName = getContext().getPackageName();
+ report.time = System.currentTimeMillis();
+ report.type = ApplicationErrorReport.TYPE_NONE;
+ intent.putExtra(Intent.EXTRA_BUG_REPORT, report);
+ startActivityForResult(intent, 0);
+ }
+ });
items.add(new SwitchItem(getString(R.string.dev_item_store_ts_on),
getString(R.string.dev_item_store_ts_off),
getString(R.string.dev_item_store_ts_description)) {
diff --git a/src/com/android/tv/ui/sidepanel/Item.java b/src/com/android/tv/ui/sidepanel/Item.java
index 4e47e75b..00f16427 100644
--- a/src/com/android/tv/ui/sidepanel/Item.java
+++ b/src/com/android/tv/ui/sidepanel/Item.java
@@ -24,7 +24,6 @@ import android.view.ViewGroup;
public abstract class Item {
private View mItemView;
private boolean mEnabled = true;
- private boolean mClickable = true;
public void setEnabled(boolean enabled) {
if (mEnabled != enabled) {
@@ -36,16 +35,6 @@ public abstract class Item {
}
/**
- * Sets the item to be clickable or not.
- */
- public void setClickable(boolean clickable) {
- mClickable = clickable;
- if (mItemView != null) {
- mItemView.setClickable(clickable);
- }
- }
-
- /**
* Returns whether this item is enabled.
*/
public boolean isEnabled() {
@@ -75,7 +64,6 @@ public abstract class Item {
*/
protected void onUpdate() {
setEnabledInternal(mItemView, mEnabled);
- mItemView.setClickable(mClickable);
}
protected abstract void onSelected();
diff --git a/src/com/android/tv/ui/sidepanel/PipInputSelectorFragment.java b/src/com/android/tv/ui/sidepanel/PipInputSelectorFragment.java
new file mode 100644
index 00000000..dec017a8
--- /dev/null
+++ b/src/com/android/tv/ui/sidepanel/PipInputSelectorFragment.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tv.ui.sidepanel;
+
+import android.media.tv.TvInputInfo;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.tv.R;
+import com.android.tv.util.PipInputManager;
+import com.android.tv.util.PipInputManager.PipInput;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public class PipInputSelectorFragment extends SideFragment {
+ private static final String TAG = "PipInputSelector";
+ private static final String TRACKER_LABEL = "PIP input source";
+
+ private final List<Item> mInputItems = new ArrayList<>();
+ private PipInputManager mPipInputManager;
+ private PipInput mInitialPipInput;
+ private boolean mSelected;
+
+ private final PipInputManager.Listener mPipInputListener = new PipInputManager.Listener() {
+ @Override
+ public void onPipInputStateUpdated() {
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public void onPipInputListUpdated() {
+ refreshInputList();
+ setItems(mInputItems);
+ }
+ };
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ mPipInputManager = getMainActivity().getPipInputManager();
+ mPipInputManager.addListener(mPipInputListener);
+ getMainActivity().startShrunkenTvView(false, false);
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ mInitialPipInput = mPipInputManager.getPipInput(getMainActivity().getPipChannel());
+ if (mInitialPipInput == null) {
+ Log.w(TAG, "PIP should be on");
+ closeFragment();
+ }
+ int count = 0;
+ for (Item item : mInputItems) {
+ InputItem inputItem = (InputItem) item;
+ if (Objects.equals(inputItem.mPipInput, mInitialPipInput)) {
+ setSelectedPosition(count);
+ break;
+ }
+ ++count;
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ mPipInputManager.removeListener(mPipInputListener);
+ if (!mSelected) {
+ getMainActivity().tuneToChannelForPip(mInitialPipInput.getChannel());
+ }
+ getMainActivity().endShrunkenTvView();
+ }
+
+ @Override
+ protected String getTitle() {
+ return getString(R.string.side_panel_title_pip_input_source);
+ }
+
+ @Override
+ public String getTrackerLabel() {
+ return TRACKER_LABEL;
+ }
+
+ @Override
+ protected List<Item> getItemList() {
+ refreshInputList();
+ return mInputItems;
+ }
+
+ private void refreshInputList() {
+ mInputItems.clear();
+ for (PipInput input : mPipInputManager.getPipInputList(false)) {
+ mInputItems.add(new InputItem(input));
+ }
+ }
+
+ private class InputItem extends RadioButtonItem {
+ private final PipInput mPipInput;
+
+ private InputItem(PipInput input) {
+ super(input.getLongLabel());
+ mPipInput = input;
+ setEnabled(isAvailable());
+ }
+
+ @Override
+ protected void onUpdate() {
+ super.onUpdate();
+ setEnabled(mPipInput.isAvailable());
+ setChecked(mPipInput == mInitialPipInput);
+ }
+
+ @Override
+ protected void onFocused() {
+ super.onFocused();
+ if (isEnabled()) {
+ getMainActivity().tuneToChannelForPip(mPipInput.getChannel());
+ }
+ }
+
+ @Override
+ protected void onSelected() {
+ super.onSelected();
+ if (isEnabled()) {
+ mSelected = true;
+ closeFragment();
+ }
+ }
+
+ private boolean isAvailable() {
+ if (!mPipInput.isAvailable()) {
+ return false;
+ }
+
+ // If this input shares the same parent with the current main input, you cannot select
+ // it. (E.g. two HDMI CEC devices that are connected to HDMI port 1 through an A/V
+ // receiver.)
+ PipInput pipInput = mPipInputManager.getPipInput(getMainActivity().getCurrentChannel());
+ if (pipInput == null) {
+ return false;
+ }
+ TvInputInfo mainInputInfo = pipInput.getInputInfo();
+ TvInputInfo pipInputInfo = mPipInput.getInputInfo();
+ return mainInputInfo == null || pipInputInfo == null
+ || !TextUtils.equals(mainInputInfo.getId(), pipInputInfo.getId())
+ && !TextUtils.equals(mainInputInfo.getParentId(), pipInputInfo.getParentId());
+ }
+ }
+}
diff --git a/src/com/android/tv/ui/sidepanel/SettingsFragment.java b/src/com/android/tv/ui/sidepanel/SettingsFragment.java
index f6aa4f86..e8033a22 100644
--- a/src/com/android/tv/ui/sidepanel/SettingsFragment.java
+++ b/src/com/android/tv/ui/sidepanel/SettingsFragment.java
@@ -16,8 +16,6 @@
package com.android.tv.ui.sidepanel;
-import android.app.ApplicationErrorReport;
-import android.content.Intent;
import android.view.View;
import android.widget.Toast;
@@ -151,26 +149,12 @@ public class SettingsFragment extends SideFragment {
// But, we may be able to turn on channel lock feature regardless of the permission.
// It's TBD.
}
- items.add(new ActionItem(getString(R.string.settings_send_feedback)) {
- @Override
- protected void onSelected() {
- Intent intent = new Intent(Intent.ACTION_APP_ERROR);
- ApplicationErrorReport report = new ApplicationErrorReport();
- report.packageName = report.processName = getContext().getPackageName();
- report.time = System.currentTimeMillis();
- report.type = ApplicationErrorReport.TYPE_NONE;
- intent.putExtra(Intent.EXTRA_BUG_REPORT, report);
- startActivityForResult(intent, 0);
- }
- });
if (LicenseUtils.hasLicenses(activity.getAssets())) {
items.add(new LicenseActionItem(activity));
}
// Show version.
- SimpleActionItem version = new SimpleActionItem(getString(R.string.settings_menu_version),
- ((TvApplication) activity.getApplicationContext()).getVersionName());
- version.setClickable(false);
- items.add(version);
+ items.add(new SimpleItem(getString(R.string.settings_menu_version),
+ ((TvApplication) activity.getApplicationContext()).getVersionName()));
return items;
}
diff --git a/src/com/android/tv/ui/sidepanel/SideFragment.java b/src/com/android/tv/ui/sidepanel/SideFragment.java
index bb815eb8..8df56cd2 100644
--- a/src/com/android/tv/ui/sidepanel/SideFragment.java
+++ b/src/com/android/tv/ui/sidepanel/SideFragment.java
@@ -26,26 +26,24 @@ import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.tv.MainActivity;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.util.DurationTimer;
+import com.android.tv.analytics.DurationTimer;
import com.android.tv.analytics.HasTrackerLabel;
import com.android.tv.analytics.Tracker;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.ProgramDataManager;
import com.android.tv.util.SystemProperties;
-import com.android.tv.util.ViewCache;
import java.util.List;
public abstract class SideFragment extends Fragment implements HasTrackerLabel {
public static final int INVALID_POSITION = -1;
- private static final int PRELOADED_VIEW_SIZE = 7;
+ private static final int RECYCLED_VIEW_POOL_SIZE = 7;
private static final int[] PRELOADED_VIEW_IDS = {
R.layout.option_item_radio_button,
R.layout.option_item_channel_lock,
@@ -53,8 +51,7 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
R.layout.option_item_channel_check
};
- private static RecyclerView.RecycledViewPool sRecycledViewPool =
- new RecyclerView.RecycledViewPool();
+ private static RecyclerView.RecycledViewPool sRecycledViewPool;
private VerticalGridView mListView;
private ItemAdapter mAdapter;
@@ -92,6 +89,13 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
+ if (sRecycledViewPool == null) {
+ // sRecycledViewPool should be initialized by calling preloadRecycledViews()
+ // before the entering animation of this fragment starts,
+ // because it takes long time and if it is called after the animation starts (e.g. here)
+ // it can affect the animation.
+ throw new IllegalStateException("The RecyclerView pool has not been initialized.");
+ }
View view = inflater.inflate(getFragmentLayoutResourceId(), container, false);
TextView textView = (TextView) view.findViewById(R.id.side_panel_title);
@@ -232,27 +236,30 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
}
/**
- * Preloads the item views.
+ * Preloads the view holders.
*/
- public static void preloadItemViews(Context context) {
+ public static void preloadRecycledViews(Context context) {
+ if (sRecycledViewPool != null) {
+ return;
+ }
+ sRecycledViewPool = new RecyclerView.RecycledViewPool();
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- // Use a fake parent to make the layoutParams set correctly.
- ViewGroup fakeParent = new LinearLayout(context);
for (int id : PRELOADED_VIEW_IDS) {
- sRecycledViewPool.setMaxRecycledViews(id, PRELOADED_VIEW_SIZE);
- for (int j = 0; j < PRELOADED_VIEW_SIZE; ++j) {
- View view = inflater.inflate(id, fakeParent, false);
- ViewCache.getInstance().putView(id, view);
+ sRecycledViewPool.setMaxRecycledViews(id, RECYCLED_VIEW_POOL_SIZE);
+ for (int j = 0; j < RECYCLED_VIEW_POOL_SIZE; ++j) {
+ ItemAdapter.ViewHolder viewHolder = new ItemAdapter.ViewHolder(
+ inflater.inflate(id, null, false));
+ sRecycledViewPool.putRecycledView(viewHolder);
}
}
}
/**
- * Releases the recycled view pool.
+ * Releases the pre-loaded view holders.
*/
- public static void releaseRecycledViewPool() {
- sRecycledViewPool.clear();
+ public static void releasePreloadedRecycledViews() {
+ sRecycledViewPool = null;
}
private static class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {
@@ -271,11 +278,7 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view = ViewCache.getInstance().getView(viewType);
- if (view == null) {
- view = mLayoutInflater.inflate(viewType, parent, false);
- }
- return new ViewHolder(view);
+ return new ViewHolder(mLayoutInflater.inflate(viewType, parent, false));
}
@Override
diff --git a/src/com/android/tv/ui/sidepanel/SideFragmentManager.java b/src/com/android/tv/ui/sidepanel/SideFragmentManager.java
index 4398b3f3..553cd9d7 100644
--- a/src/com/android/tv/ui/sidepanel/SideFragmentManager.java
+++ b/src/com/android/tv/ui/sidepanel/SideFragmentManager.java
@@ -99,6 +99,7 @@ public class SideFragmentManager {
* Shows the given {@link SideFragment}.
*/
public void show(SideFragment sideFragment, boolean showEnterAnimation) {
+ SideFragment.preloadRecycledViews(mActivity);
if (isHiding()) {
mHideAnimator.end();
}
@@ -177,6 +178,7 @@ public class SideFragmentManager {
* @param withAnimation specifies if animation should be shown.
*/
public void showSidePanel(boolean withAnimation) {
+ SideFragment.preloadRecycledViews(mActivity);
if (mFragmentCount == 0) {
return;
}
diff --git a/src/com/android/tv/ui/sidepanel/SimpleActionItem.java b/src/com/android/tv/ui/sidepanel/SimpleItem.java
index 42553b66..52a5f13f 100644
--- a/src/com/android/tv/ui/sidepanel/SimpleActionItem.java
+++ b/src/com/android/tv/ui/sidepanel/SimpleItem.java
@@ -19,12 +19,12 @@ package com.android.tv.ui.sidepanel;
/**
* A simple item which shows title and description.
*/
-public class SimpleActionItem extends ActionItem {
- public SimpleActionItem(String title) {
+public class SimpleItem extends ActionItem {
+ public SimpleItem(String title) {
super(title);
}
- public SimpleActionItem(String title, String description) {
+ public SimpleItem(String title, String description) {
super(title, description);
}
diff --git a/src/com/android/tv/util/AsyncDbTask.java b/src/com/android/tv/util/AsyncDbTask.java
index 3cc91e40..78243642 100644
--- a/src/com/android/tv/util/AsyncDbTask.java
+++ b/src/com/android/tv/util/AsyncDbTask.java
@@ -31,7 +31,7 @@ import android.util.Range;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
import com.android.tv.data.Program;
-import com.android.tv.dvr.data.RecordedProgram;
+import com.android.tv.dvr.RecordedProgram;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/tv/util/Debug.java b/src/com/android/tv/util/Debug.java
deleted file mode 100644
index 67a2683d..00000000
--- a/src/com/android/tv/util/Debug.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.util;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A class only for help developers.
- */
-public class Debug {
- /**
- * A threshold of start up time, when the start up time of Live TV is more than it,
- * a warning will show to the developer.
- */
- public static final long TIME_START_UP_DURATION_THRESHOLD = TimeUnit.SECONDS.toMillis(6);
- /**
- * Tag for measuring start up time of Live TV.
- */
- public static final String TAG_START_UP_TIMER = "start_up_timer";
-
- /**
- * A global map for duration timers.
- */
- private final static Map<String, DurationTimer> sTimerMap = new HashMap<>();
-
- /**
- * Returns the global duration timer by tag.
- */
- public static DurationTimer getTimer(String tag) {
- if (sTimerMap.get(tag) != null) {
- return sTimerMap.get(tag);
- }
- DurationTimer timer = new DurationTimer(tag, true);
- sTimerMap.put(tag, timer);
- return timer;
- }
-
- /**
- * Removes the global duration timer by tag.
- */
- public static DurationTimer removeTimer(String tag) {
- return sTimerMap.remove(tag);
- }
-}
diff --git a/src/com/android/tv/util/LocationUtils.java b/src/com/android/tv/util/LocationUtils.java
index 2ae6db18..8e3b59e9 100644
--- a/src/com/android/tv/util/LocationUtils.java
+++ b/src/com/android/tv/util/LocationUtils.java
@@ -16,9 +16,7 @@
package com.android.tv.util;
-import android.Manifest;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
@@ -27,7 +25,6 @@ import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
-import com.android.tv.tuner.util.PostalCodeUtils;
import java.io.IOException;
import java.util.List;
@@ -42,7 +39,6 @@ public class LocationUtils {
private static Context sApplicationContext;
private static Address sAddress;
- private static String sCountry;
private static IOException sError;
/**
@@ -63,19 +59,6 @@ public class LocationUtils {
return null;
}
- /**
- * Returns the current country.
- */
- public static synchronized String getCurrentCountry(Context context) {
- if (sCountry != null) {
- return sCountry;
- }
- if (sCountry == null) {
- sCountry = context.getResources().getConfiguration().locale.getCountry();
- }
- return sCountry;
- }
-
private static void updateAddress(Location location) {
if (DEBUG) Log.d(TAG, "Updating address with " + location);
if (location == null) {
@@ -85,14 +68,9 @@ public class LocationUtils {
try {
List<Address> addresses = geocoder.getFromLocation(
location.getLatitude(), location.getLongitude(), 1);
- if (addresses != null && !addresses.isEmpty()) {
+ if (addresses != null) {
sAddress = addresses.get(0);
if (DEBUG) Log.d(TAG, "Got " + sAddress);
- try {
- PostalCodeUtils.updatePostalCode(sApplicationContext);
- } catch (Exception e) {
- // Do nothing
- }
} else {
if (DEBUG) Log.d(TAG, "No address returned");
}
diff --git a/src/com/android/tv/util/Partner.java b/src/com/android/tv/util/Partner.java
deleted file mode 100644
index e3688392..00000000
--- a/src/com/android/tv/util/Partner.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.util;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.media.tv.TvInputInfo;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * This file refers to Partner.java in LeanbackLauncher. Interact with partner customizations. There
- * can only be one set of customizations on a device, and it must be bundled with the system.
- */
-public class Partner {
- private static final String TAG = "Partner";
- /** Marker action used to discover partner */
- private static final String ACTION_PARTNER_CUSTOMIZATION =
- "com.google.android.leanbacklauncher.action.PARTNER_CUSTOMIZATION";
-
- /** ID tags for device input types */
- public static final String INPUT_TYPE_BUNDLED_TUNER = "input_type_combined_tuners";
- public static final String INPUT_TYPE_TUNER = "input_type_tuner";
- public static final String INPUT_TYPE_CEC_LOGICAL = "input_type_cec_logical";
- public static final String INPUT_TYPE_CEC_RECORDER = "input_type_cec_recorder";
- public static final String INPUT_TYPE_CEC_PLAYBACK = "input_type_cec_playback";
- public static final String INPUT_TYPE_MHL_MOBILE = "input_type_mhl_mobile";
- public static final String INPUT_TYPE_HDMI = "input_type_hdmi";
- public static final String INPUT_TYPE_DVI = "input_type_dvi";
- public static final String INPUT_TYPE_COMPONENT = "input_type_component";
- public static final String INPUT_TYPE_SVIDEO = "input_type_svideo";
- public static final String INPUT_TYPE_COMPOSITE = "input_type_composite";
- public static final String INPUT_TYPE_DISPLAY_PORT = "input_type_displayport";
- public static final String INPUT_TYPE_VGA = "input_type_vga";
- public static final String INPUT_TYPE_SCART = "input_type_scart";
- public static final String INPUT_TYPE_OTHER = "input_type_other";
-
- private static final String INPUTS_ORDER = "home_screen_inputs_ordering";
- private static final String TYPE_ARRAY = "array";
-
- private static Partner sPartner;
- private static final Object sLock = new Object();
-
- private final String mPackageName;
- private final String mReceiverName;
- private final Resources mResources;
-
- private static final Map<String, Integer> INPUT_TYPE_MAP = new HashMap<>();
- static {
- INPUT_TYPE_MAP.put(INPUT_TYPE_BUNDLED_TUNER, TvInputManagerHelper.TYPE_BUNDLED_TUNER);
- INPUT_TYPE_MAP.put(INPUT_TYPE_TUNER, TvInputInfo.TYPE_TUNER);
- INPUT_TYPE_MAP.put(INPUT_TYPE_CEC_LOGICAL, TvInputManagerHelper.TYPE_CEC_DEVICE);
- INPUT_TYPE_MAP.put(INPUT_TYPE_CEC_RECORDER, TvInputManagerHelper.TYPE_CEC_DEVICE_RECORDER);
- INPUT_TYPE_MAP.put(INPUT_TYPE_CEC_PLAYBACK, TvInputManagerHelper.TYPE_CEC_DEVICE_PLAYBACK);
- INPUT_TYPE_MAP.put(INPUT_TYPE_MHL_MOBILE, TvInputManagerHelper.TYPE_MHL_MOBILE);
- INPUT_TYPE_MAP.put(INPUT_TYPE_HDMI, TvInputInfo.TYPE_HDMI);
- INPUT_TYPE_MAP.put(INPUT_TYPE_DVI, TvInputInfo.TYPE_DVI);
- INPUT_TYPE_MAP.put(INPUT_TYPE_COMPONENT, TvInputInfo.TYPE_COMPONENT);
- INPUT_TYPE_MAP.put(INPUT_TYPE_SVIDEO, TvInputInfo.TYPE_SVIDEO);
- INPUT_TYPE_MAP.put(INPUT_TYPE_COMPOSITE, TvInputInfo.TYPE_COMPOSITE);
- INPUT_TYPE_MAP.put(INPUT_TYPE_DISPLAY_PORT, TvInputInfo.TYPE_DISPLAY_PORT);
- INPUT_TYPE_MAP.put(INPUT_TYPE_VGA, TvInputInfo.TYPE_VGA);
- INPUT_TYPE_MAP.put(INPUT_TYPE_SCART, TvInputInfo.TYPE_SCART);
- INPUT_TYPE_MAP.put(INPUT_TYPE_OTHER, TvInputInfo.TYPE_OTHER);
- }
-
- private Partner(String packageName, String receiverName, Resources res) {
- mPackageName = packageName;
- mReceiverName = receiverName;
- mResources = res;
- }
-
- /** Returns partner instance. */
- public static Partner getInstance(Context context) {
- PackageManager pm = context.getPackageManager();
- synchronized (sLock) {
- ResolveInfo info = getPartnerResolveInfo(pm);
- if (info != null) {
- final String packageName = info.activityInfo.packageName;
- final String receiverName = info.activityInfo.name;
- try {
- final Resources res = pm.getResourcesForApplication(packageName);
- sPartner = new Partner(packageName, receiverName, res);
- sPartner.sendInitBroadcast(context);
- } catch (PackageManager.NameNotFoundException e) {
- Log.w(TAG, "Failed to find resources for " + packageName);
- }
- }
- if (sPartner == null) {
- sPartner = new Partner(null, null, null);
- }
- }
- return sPartner;
- }
-
- /** Resets the Partner instance to handle the partner package has changed. */
- public static void reset(Context context, String packageName) {
- synchronized (sLock) {
- if (sPartner != null && !TextUtils.isEmpty(packageName)) {
- if (packageName.equals(sPartner.mPackageName)) {
- // Force a refresh, so we send an Init to the updated package
- sPartner = null;
- getInstance(context);
- }
- }
- }
- }
-
- /** This method is used to send init broadcast to the new/changed partner package. */
- private void sendInitBroadcast(Context context) {
- if (!TextUtils.isEmpty(mPackageName) && !TextUtils.isEmpty(mReceiverName)) {
- Intent intent = new Intent(ACTION_PARTNER_CUSTOMIZATION);
- final ComponentName componentName = new ComponentName(mPackageName, mReceiverName);
- intent.setComponent(componentName);
- intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- context.sendBroadcast(intent);
- }
- }
-
- /** Returns the order of inputs. */
- public Map<Integer, Integer> getInputsOrderMap() {
- HashMap<Integer, Integer> map = new HashMap<>();
- if (mResources != null && !TextUtils.isEmpty(mPackageName)) {
- String[] inputsArray = null;
- final int resId = mResources.getIdentifier(INPUTS_ORDER, TYPE_ARRAY, mPackageName);
- if (resId != 0) {
- inputsArray = mResources.getStringArray(resId);
- }
- if (inputsArray != null) {
- int priority = 0;
- for (String input : inputsArray) {
- Integer type = INPUT_TYPE_MAP.get(input);
- if (type != null) {
- map.put(type, priority++);
- }
- }
- }
- }
- return map;
- }
-
- private static ResolveInfo getPartnerResolveInfo(PackageManager pm) {
- final Intent intent = new Intent(ACTION_PARTNER_CUSTOMIZATION);
- ResolveInfo partnerInfo = null;
- for (ResolveInfo info : pm.queryBroadcastReceivers(intent, 0)) {
- if (isSystemApp(info)) {
- partnerInfo = info;
- break;
- }
- }
- return partnerInfo;
- }
-
- protected static boolean isSystemApp(ResolveInfo info) {
- return (info.activityInfo != null
- && info.activityInfo.applicationInfo != null
- && (info.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
- }
-}
diff --git a/src/com/android/tv/util/PipInputManager.java b/src/com/android/tv/util/PipInputManager.java
new file mode 100644
index 00000000..2c51d5a0
--- /dev/null
+++ b/src/com/android/tv/util/PipInputManager.java
@@ -0,0 +1,432 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tv.util;
+
+import android.content.Context;
+import android.media.tv.TvInputInfo;
+import android.media.tv.TvInputManager;
+import android.media.tv.TvInputManager.TvInputCallback;
+import android.util.ArraySet;
+import android.util.Log;
+
+import com.android.tv.ChannelTuner;
+import com.android.tv.R;
+import com.android.tv.data.Channel;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A class that manages inputs for PIP. All tuner inputs are represented to one tuner input for PIP.
+ * Hidden inputs should not be visible to the users.
+ */
+public class PipInputManager {
+ private static final String TAG = "PipInputManager";
+
+ // Tuner inputs aren't distinguished each other in PipInput. They are handled as one input.
+ // Therefore, we define a fake input id for the unified input.
+ private static final String TUNER_INPUT_ID = "tuner_input_id";
+
+ private final Context mContext;
+ private final TvInputManagerHelper mInputManager;
+ private final ChannelTuner mChannelTuner;
+ private boolean mStarted;
+ private final Map<String, PipInput> mPipInputMap = new HashMap<>(); // inputId -> PipInput
+ private final Set<Listener> mListeners = new ArraySet<>();
+
+ private final TvInputCallback mTvInputCallback = new TvInputCallback() {
+ @Override
+ public void onInputAdded(String inputId) {
+ TvInputInfo input = mInputManager.getTvInputInfo(inputId);
+ if (input.isPassthroughInput()) {
+ boolean available = mInputManager.getInputState(input)
+ == TvInputManager.INPUT_STATE_CONNECTED;
+ mPipInputMap.put(inputId, new PipInput(inputId, available));
+ } else if (!mPipInputMap.containsKey(TUNER_INPUT_ID)) {
+ boolean available = mChannelTuner.getBrowsableChannelCount() != 0;
+ mPipInputMap.put(TUNER_INPUT_ID, new PipInput(TUNER_INPUT_ID, available));
+ } else {
+ return;
+ }
+ for (Listener l : mListeners) {
+ l.onPipInputListUpdated();
+ }
+ }
+
+ @Override
+ public void onInputRemoved(String inputId) {
+ PipInput pipInput = mPipInputMap.remove(inputId);
+ if (pipInput == null) {
+ if (!mPipInputMap.containsKey(TUNER_INPUT_ID)) {
+ Log.w(TAG, "A TV input (" + inputId + ") isn't tracked in PipInputManager");
+ return;
+ }
+ if (mInputManager.getTunerTvInputSize() > 0) {
+ return;
+ }
+ mPipInputMap.remove(TUNER_INPUT_ID);
+ }
+ for (Listener l : mListeners) {
+ l.onPipInputListUpdated();
+ }
+ }
+
+ @Override
+ public void onInputStateChanged(String inputId, int state) {
+ PipInput pipInput = mPipInputMap.get(inputId);
+ if (pipInput == null) {
+ // For tuner input, state change is handled in mChannelTunerListener.
+ return;
+ }
+ pipInput.updateAvailability();
+ }
+ };
+
+ private final ChannelTuner.Listener mChannelTunerListener = new ChannelTuner.Listener() {
+ @Override
+ public void onLoadFinished() { }
+
+ @Override
+ public void onCurrentChannelUnavailable(Channel channel) { }
+
+ @Override
+ public void onBrowsableChannelListChanged() {
+ PipInput tunerInput = mPipInputMap.get(TUNER_INPUT_ID);
+ if (tunerInput == null) {
+ return;
+ }
+ tunerInput.updateAvailability();
+ }
+
+ @Override
+ public void onChannelChanged(Channel previousChannel, Channel currentChannel) {
+ if (previousChannel != null && currentChannel != null
+ && !previousChannel.isPassthrough() && !currentChannel.isPassthrough()) {
+ // Channel change between channels for tuner inputs.
+ return;
+ }
+ PipInput previousMainInput = getPipInput(previousChannel);
+ if (previousMainInput != null) {
+ previousMainInput.updateAvailability();
+ }
+ PipInput currentMainInput = getPipInput(currentChannel);
+ if (currentMainInput != null) {
+ currentMainInput.updateAvailability();
+ }
+ }
+ };
+
+ public PipInputManager(Context context, TvInputManagerHelper inputManager,
+ ChannelTuner channelTuner) {
+ mContext = context;
+ mInputManager = inputManager;
+ mChannelTuner = channelTuner;
+ }
+
+ /**
+ * Starts {@link PipInputManager}.
+ */
+ public void start() {
+ if (mStarted) {
+ return;
+ }
+ mStarted = true;
+ mInputManager.addCallback(mTvInputCallback);
+ mChannelTuner.addListener(mChannelTunerListener);
+ initializePipInputList();
+ }
+
+ /**
+ * Stops {@link PipInputManager}.
+ */
+ public void stop() {
+ if (!mStarted) {
+ return;
+ }
+ mStarted = false;
+ mInputManager.removeCallback(mTvInputCallback);
+ mChannelTuner.removeListener(mChannelTunerListener);
+ mPipInputMap.clear();
+ }
+
+ /**
+ * Adds a {@link PipInputManager.Listener}.
+ */
+ public void addListener(Listener listener) {
+ mListeners.add(listener);
+ }
+
+ /**
+ * Removes a {@link PipInputManager.Listener}.
+ */
+ public void removeListener(Listener listener) {
+ mListeners.remove(listener);
+ }
+
+ /**
+ * Gets the size of inputs for PIP.
+ *
+ * <p>The hidden inputs are not counted.
+ *
+ * @param availableOnly If {@code true}, it counts only available PIP inputs. Please see {@link
+ * PipInput#isAvailable()} for the details of availability.
+ */
+ public int getPipInputSize(boolean availableOnly) {
+ int count = 0;
+ for (PipInput pipInput : mPipInputMap.values()) {
+ if (!pipInput.isHidden() && (!availableOnly || pipInput.mAvailable)) {
+ ++count;
+ }
+ if (pipInput.isPassthrough()) {
+ TvInputInfo info = pipInput.getInputInfo();
+ // Do not count HDMI ports if a CEC device is directly connected to the port.
+ if (info.getParentId() != null && !info.isConnectedToHdmiSwitch()) {
+ --count;
+ }
+ }
+ }
+ return count;
+ }
+
+ /**
+ * Gets the list of inputs for PIP..
+ *
+ * <p>The hidden inputs are excluded.
+ *
+ * @param availableOnly If true, it returns only available PIP inputs. Please see {@link
+ * PipInput#isAvailable()} for the details of availability.
+ */
+ public List<PipInput> getPipInputList(boolean availableOnly) {
+ List<PipInput> pipInputs = new ArrayList<>();
+ List<PipInput> removeInputs = new ArrayList<>();
+ for (PipInput pipInput : mPipInputMap.values()) {
+ if (!pipInput.isHidden() && (!availableOnly || pipInput.mAvailable)) {
+ pipInputs.add(pipInput);
+ }
+ if (pipInput.isPassthrough()) {
+ TvInputInfo info = pipInput.getInputInfo();
+ // Do not show HDMI ports if a CEC device is directly connected to the port.
+ if (info.getParentId() != null && !info.isConnectedToHdmiSwitch()) {
+ removeInputs.add(mPipInputMap.get(info.getParentId()));
+ }
+ }
+ }
+ if (!removeInputs.isEmpty()) {
+ pipInputs.removeAll(removeInputs);
+ }
+ Collections.sort(pipInputs, new Comparator<PipInput>() {
+ @Override
+ public int compare(PipInput lhs, PipInput rhs) {
+ if (!lhs.mIsPassthrough) {
+ return -1;
+ }
+ if (!rhs.mIsPassthrough) {
+ return 1;
+ }
+ String a = lhs.getLabel();
+ String b = rhs.getLabel();
+ return a.compareTo(b);
+ }
+ });
+ return pipInputs;
+ }
+
+ /**
+ * Returns an PIP input corresponding to {@code channel}.
+ */
+ public PipInput getPipInput(Channel channel) {
+ if (channel == null) {
+ return null;
+ }
+ if (channel.isPassthrough()) {
+ return mPipInputMap.get(channel.getInputId());
+ } else {
+ return mPipInputMap.get(TUNER_INPUT_ID);
+ }
+ }
+
+ /**
+ * Returns true, if {@code channel1} and {@code channel2} belong to the same input. For example,
+ * two channels from different tuner inputs are also in the same input "Tuner" from PIP
+ * point of view.
+ */
+ public boolean areInSamePipInput(Channel channel1, Channel channel2) {
+ PipInput input1 = getPipInput(channel1);
+ PipInput input2 = getPipInput(channel2);
+ return input1 != null && input2 != null
+ && getPipInput(channel1).equals(getPipInput(channel2));
+ }
+
+ private void initializePipInputList() {
+ boolean hasTunerInput = false;
+ for (TvInputInfo input : mInputManager.getTvInputInfos(false, false)) {
+ if (input.isPassthroughInput()) {
+ boolean available = mInputManager.getInputState(input)
+ == TvInputManager.INPUT_STATE_CONNECTED;
+ mPipInputMap.put(input.getId(), new PipInput(input.getId(), available));
+ } else if (!hasTunerInput) {
+ hasTunerInput = true;
+ boolean available = mChannelTuner.getBrowsableChannelCount() != 0;
+ mPipInputMap.put(TUNER_INPUT_ID, new PipInput(TUNER_INPUT_ID, available));
+ }
+ }
+ PipInput input = getPipInput(mChannelTuner.getCurrentChannel());
+ if (input != null) {
+ input.updateAvailability();
+ }
+ for (Listener l : mListeners) {
+ l.onPipInputListUpdated();
+ }
+ }
+
+ /**
+ * Listeners to notify PIP input state changes.
+ */
+ public interface Listener {
+ /**
+ * Called when the state (availability) of PIP inputs is changed.
+ */
+ void onPipInputStateUpdated();
+
+ /**
+ * Called when the list of PIP inputs is changed.
+ */
+ void onPipInputListUpdated();
+ }
+
+ /**
+ * Input class for PIP. It has useful methods for PIP handling.
+ */
+ public class PipInput {
+ private final String mInputId;
+ private final boolean mIsPassthrough;
+ private final TvInputInfo mInputInfo;
+ private boolean mAvailable;
+
+ private PipInput(String inputId, boolean available) {
+ mInputId = inputId;
+ mIsPassthrough = !mInputId.equals(TUNER_INPUT_ID);
+ if (mIsPassthrough) {
+ mInputInfo = mInputManager.getTvInputInfo(mInputId);
+ } else {
+ mInputInfo = null;
+ }
+ mAvailable = available;
+ }
+
+ /**
+ * Returns the {@link TvInputInfo} object that matches to this PIP input.
+ */
+ public TvInputInfo getInputInfo() {
+ return mInputInfo;
+ }
+
+ /**
+ * Returns {@code true}, if the input is available for PIP. If a channel of an input is
+ * already played or an input is not connected state or there is no browsable channel, the
+ * input is unavailable.
+ */
+ public boolean isAvailable() {
+ return mAvailable;
+ }
+
+ /**
+ * Returns true, if the input is a passthrough TV input.
+ */
+ public boolean isPassthrough() {
+ return mIsPassthrough;
+ }
+
+ /**
+ * Gets a channel to play in a PIP view.
+ */
+ public Channel getChannel() {
+ if (mIsPassthrough) {
+ return Channel.createPassthroughChannel(mInputId);
+ } else {
+ return mChannelTuner.findNearestBrowsableChannel(
+ Utils.getLastWatchedChannelId(mContext));
+ }
+ }
+
+ /**
+ * Gets a label of the input.
+ */
+ public String getLabel() {
+ if (mIsPassthrough) {
+ return mInputInfo.loadLabel(mContext).toString();
+ } else {
+ return mContext.getString(R.string.input_selector_tuner_label);
+ }
+ }
+
+ /**
+ * Gets a long label including a customized label.
+ */
+ public String getLongLabel() {
+ if (mIsPassthrough) {
+ String customizedLabel = Utils.loadLabel(mContext, mInputInfo);
+ String label = getLabel();
+ if (label.equals(customizedLabel)) {
+ return customizedLabel;
+ }
+ return customizedLabel + " (" + label + ")";
+ } else {
+ return mContext.getString(R.string.input_long_label_for_tuner);
+ }
+ }
+
+ /**
+ * Updates availability. It returns true, if availability is changed.
+ */
+ private void updateAvailability() {
+ boolean available;
+ // current playing input cannot be available for PIP.
+ Channel currentChannel = mChannelTuner.getCurrentChannel();
+ if (mIsPassthrough) {
+ if (currentChannel != null && currentChannel.getInputId().equals(mInputId)) {
+ available = false;
+ } else {
+ available = mInputManager.getInputState(mInputId)
+ == TvInputManager.INPUT_STATE_CONNECTED;
+ }
+ } else {
+ if (currentChannel != null && !currentChannel.isPassthrough()) {
+ available = false;
+ } else {
+ available = mChannelTuner.getBrowsableChannelCount() > 0;
+ }
+ }
+ if (mAvailable != available) {
+ mAvailable = available;
+ for (Listener l : mListeners) {
+ l.onPipInputStateUpdated();
+ }
+ }
+ }
+
+ private boolean isHidden() {
+ // mInputInfo is null for the tuner input and it's always visible.
+ return mInputInfo != null && mInputInfo.isHidden(mContext);
+ }
+ }
+}
diff --git a/src/com/android/tv/util/RecurringRunner.java b/src/com/android/tv/util/RecurringRunner.java
index 324afe73..4135bd4e 100644
--- a/src/com/android/tv/util/RecurringRunner.java
+++ b/src/com/android/tv/util/RecurringRunner.java
@@ -57,15 +57,12 @@ public final class RecurringRunner {
mHandler = new Handler(mContext.getMainLooper());
}
- public void start(boolean restNextRunTime) {
+ public void start() {
SoftPreconditions.checkState(!mRunning, TAG, mName + " start is called twice.");
if (mRunning) {
return;
}
mRunning = true;
- if (restNextRunTime) {
- resetNextRunTime();
- }
new AsyncTask<Void, Void, Long>() {
@Override
protected Long doInBackground(Void... params) {
@@ -79,10 +76,6 @@ public final class RecurringRunner {
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
- public void start() {
- start(false);
- }
-
public void stop() {
mRunning = false;
mHandler.removeCallbacksAndMessages(null);
diff --git a/src/com/android/tv/util/SearchManagerHelper.java b/src/com/android/tv/util/SearchManagerHelper.java
new file mode 100644
index 00000000..b6e34d7a
--- /dev/null
+++ b/src/com/android/tv/util/SearchManagerHelper.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tv.util;
+
+import android.app.SearchManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.util.Log;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * A convenience class for calling methods in android.app.SearchManager.
+ */
+public final class SearchManagerHelper {
+ private static final String TAG = "SearchManagerHelper";
+
+ private static final Object sLock = new Object();
+ private static SearchManagerHelper sInstance;
+
+ private final SearchManager mSearchManager;
+
+ private SearchManagerHelper(Context context) {
+ mSearchManager = ((android.app.SearchManager) context.getSystemService(
+ Context.SEARCH_SERVICE));
+ }
+
+ public static SearchManagerHelper getInstance(Context context) {
+ synchronized (sLock) {
+ if (sInstance == null) {
+ sInstance = new SearchManagerHelper(context.getApplicationContext());
+ }
+ return sInstance;
+ }
+ }
+
+ public void launchAssistAction() {
+ try {
+ SearchManager.class.getDeclaredMethod("launchLegacyAssist", String.class, Integer.TYPE,
+ Bundle.class).invoke(mSearchManager, null, UserHandle.myUserId(), null);
+ } catch (NoSuchMethodException | IllegalArgumentException | IllegalAccessException
+ | InvocationTargetException e) {
+ Log.e(TAG, "Fail to call SearchManager.launchAssistAction", e);
+ }
+ }
+}
diff --git a/src/com/android/tv/util/SetupUtils.java b/src/com/android/tv/util/SetupUtils.java
index 0dabe7c0..8223a81c 100644
--- a/src/com/android/tv/util/SetupUtils.java
+++ b/src/com/android/tv/util/SetupUtils.java
@@ -114,7 +114,7 @@ public class SetupUtils {
@Override
public void onLoadFinished() {
manager.removeListener(this);
- updateChannelsAfterSetup(mTvApplication, inputId, postRunnable);
+ updateChannelBrowsable(mTvApplication, inputId, postRunnable);
}
@Override
@@ -124,18 +124,17 @@ public class SetupUtils {
public void onChannelBrowsableChanged() { }
});
} else {
- updateChannelsAfterSetup(mTvApplication, inputId, postRunnable);
+ updateChannelBrowsable(mTvApplication, inputId, postRunnable);
}
}
- private static void updateChannelsAfterSetup(Context context, final String inputId,
+ private static void updateChannelBrowsable(Context context, final String inputId,
final Runnable postRunnable) {
ApplicationSingletons appSingletons = TvApplication.getSingletons(context);
final ChannelDataManager manager = appSingletons.getChannelDataManager();
manager.updateChannels(new Runnable() {
@Override
public void run() {
- Channel firstChannelForInput = null;
boolean browsableChanged = false;
for (Channel channel : manager.getChannelList()) {
if (channel.getInputId().equals(inputId)) {
@@ -143,14 +142,8 @@ public class SetupUtils {
manager.updateBrowsable(channel.getId(), true, true);
browsableChanged = true;
}
- if (firstChannelForInput == null) {
- firstChannelForInput = channel;
- }
}
}
- if (firstChannelForInput != null) {
- Utils.setLastWatchedChannel(context, firstChannelForInput);
- }
if (browsableChanged) {
manager.notifyChannelBrowsableChanged();
manager.applyUpdatedValuesToDb();
@@ -392,7 +385,10 @@ public class SetupUtils {
// Start fetching program guide data for internal tuners.
Context context = mTvApplication.getApplicationContext();
if (Utils.isInternalTvInput(context, inputId)) {
- EpgFetcher.getInstance(context).startImmediately(true);
+ if (context.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
+ == PackageManager.PERMISSION_GRANTED && Experiments.CLOUD_EPG.get()) {
+ EpgFetcher.getInstance(context).startImmediately();
+ }
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/util/TvInputManagerHelper.java b/src/com/android/tv/util/TvInputManagerHelper.java
index 67970ed6..121f56ed 100644
--- a/src/com/android/tv/util/TvInputManagerHelper.java
+++ b/src/com/android/tv/util/TvInputManagerHelper.java
@@ -18,26 +18,20 @@ package com.android.tv.util;
import android.content.Context;
import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.hardware.hdmi.HdmiDeviceInfo;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager;
import android.media.tv.TvInputManager.TvInputCallback;
import android.os.Handler;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.Log;
import com.android.tv.Features;
import com.android.tv.common.SoftPreconditions;
-import com.android.tv.common.TvCommonUtils;
import com.android.tv.parental.ContentRatingsManager;
import com.android.tv.parental.ParentalControlSettings;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -48,64 +42,14 @@ import java.util.Map;
public class TvInputManagerHelper {
private static final String TAG = "TvInputManagerHelper";
private static final boolean DEBUG = false;
-
- /**
- * Types of HDMI device and bundled tuner.
- */
- public static final int TYPE_CEC_DEVICE = -2;
- public static final int TYPE_BUNDLED_TUNER = -3;
- public static final int TYPE_CEC_DEVICE_RECORDER = -4;
- public static final int TYPE_CEC_DEVICE_PLAYBACK = -5;
- public static final int TYPE_MHL_MOBILE = -6;
-
- private static final String PERMISSION_ACCESS_ALL_EPG_DATA =
- "com.android.providers.tv.permission.ACCESS_ALL_EPG_DATA";
- private static final String [] mPhysicalTunerBlackList = {
- };
- private static final String META_LABEL_SORT_KEY = "input_sort_key";
-
- /**
- * The default tv input priority to show.
- */
- private static final ArrayList<Integer> DEFAULT_TV_INPUT_PRIORITY = new ArrayList<>();
- static {
- DEFAULT_TV_INPUT_PRIORITY.add(TYPE_BUNDLED_TUNER);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_TUNER);
- DEFAULT_TV_INPUT_PRIORITY.add(TYPE_CEC_DEVICE);
- DEFAULT_TV_INPUT_PRIORITY.add(TYPE_CEC_DEVICE_RECORDER);
- DEFAULT_TV_INPUT_PRIORITY.add(TYPE_CEC_DEVICE_PLAYBACK);
- DEFAULT_TV_INPUT_PRIORITY.add(TYPE_MHL_MOBILE);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_HDMI);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_DVI);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_COMPONENT);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_SVIDEO);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_COMPOSITE);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_DISPLAY_PORT);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_VGA);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_SCART);
- DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_OTHER);
- }
-
private static final String[] PARTNER_TUNER_INPUT_PREFIX_BLACKLIST = {
};
- private static final String[] TESTABLE_INPUTS = {
- "com.android.tv.testinput/.TestTvInputService"
- };
-
private final Context mContext;
- private final PackageManager mPackageManager;
private final TvInputManager mTvInputManager;
private final Map<String, Integer> mInputStateMap = new HashMap<>();
private final Map<String, TvInputInfo> mInputMap = new HashMap<>();
- private final Map<String, String> mTvInputLabels = new ArrayMap<>();
- private final Map<String, String> mTvInputCustomLabels = new ArrayMap<>();
private final Map<String, Boolean> mInputIdToPartnerInputMap = new HashMap<>();
-
- private final Map<String, CharSequence> mTvInputApplicationLabels = new ArrayMap<>();
- private final Map<String, Drawable> mTvInputApplicationIcons = new ArrayMap<>();
- private final Map<String, Drawable> mTvInputAppliactionBanners = new ArrayMap<>();
-
private final TvInputCallback mInternalCallback = new TvInputCallback() {
@Override
public void onInputStateChanged(String inputId, int state) {
@@ -128,11 +72,6 @@ public class TvInputManagerHelper {
TvInputInfo info = mTvInputManager.getTvInputInfo(inputId);
if (info != null) {
mInputMap.put(inputId, info);
- mTvInputLabels.put(inputId, info.loadLabel(mContext).toString());
- CharSequence inputCustomLabel = info.loadCustomLabel(mContext);
- if (inputCustomLabel != null) {
- mTvInputCustomLabels.put(inputId, inputCustomLabel.toString());
- }
mInputStateMap.put(inputId, mTvInputManager.getInputState(inputId));
mInputIdToPartnerInputMap.put(inputId, isPartnerInput(info));
}
@@ -146,11 +85,6 @@ public class TvInputManagerHelper {
public void onInputRemoved(String inputId) {
if (DEBUG) Log.d(TAG, "onInputRemoved " + inputId);
mInputMap.remove(inputId);
- mTvInputLabels.remove(inputId);
- mTvInputCustomLabels.remove(inputId);
- mTvInputApplicationLabels.remove(inputId);
- mTvInputApplicationIcons.remove(inputId);
- mTvInputAppliactionBanners.remove(inputId);
mInputStateMap.remove(inputId);
mInputIdToPartnerInputMap.remove(inputId);
mContentRatingsManager.update();
@@ -169,14 +103,6 @@ public class TvInputManagerHelper {
}
TvInputInfo info = mTvInputManager.getTvInputInfo(inputId);
mInputMap.put(inputId, info);
- mTvInputLabels.put(inputId, info.loadLabel(mContext).toString());
- CharSequence inputCustomLabel = info.loadCustomLabel(mContext);
- if (inputCustomLabel != null) {
- mTvInputCustomLabels.put(inputId, inputCustomLabel.toString());
- }
- mTvInputApplicationLabels.remove(inputId);
- mTvInputApplicationIcons.remove(inputId);
- mTvInputAppliactionBanners.remove(inputId);
for (TvInputCallback callback : mCallbacks) {
callback.onInputUpdated(inputId);
}
@@ -188,11 +114,6 @@ public class TvInputManagerHelper {
public void onTvInputInfoUpdated(TvInputInfo inputInfo) {
if (DEBUG) Log.d(TAG, "onTvInputInfoUpdated " + inputInfo);
mInputMap.put(inputInfo.getId(), inputInfo);
- mTvInputLabels.put(inputInfo.getId(), inputInfo.loadLabel(mContext).toString());
- CharSequence inputCustomLabel = inputInfo.loadCustomLabel(mContext);
- if (inputCustomLabel != null) {
- mTvInputCustomLabels.put(inputInfo.getId(), inputCustomLabel.toString());
- }
for (TvInputCallback callback : mCallbacks) {
callback.onTvInputInfoUpdated(inputInfo);
}
@@ -210,7 +131,6 @@ public class TvInputManagerHelper {
public TvInputManagerHelper(Context context) {
mContext = context.getApplicationContext();
- mPackageManager = context.getPackageManager();
mTvInputManager = (TvInputManager) context.getSystemService(Context.TV_INPUT_SERVICE);
mContentRatingsManager = new ContentRatingsManager(context);
mParentalControlSettings = new ParentalControlSettings(context);
@@ -225,11 +145,6 @@ public class TvInputManagerHelper {
mStarted = true;
mTvInputManager.registerCallback(mInternalCallback, mHandler);
mInputMap.clear();
- mTvInputLabels.clear();
- mTvInputCustomLabels.clear();
- mTvInputApplicationLabels.clear();
- mTvInputApplicationIcons.clear();
- mTvInputAppliactionBanners.clear();
mInputStateMap.clear();
mInputIdToPartnerInputMap.clear();
for (TvInputInfo input : mTvInputManager.getTvInputList()) {
@@ -256,23 +171,9 @@ public class TvInputManagerHelper {
mStarted = false;
mInputStateMap.clear();
mInputMap.clear();
- mTvInputLabels.clear();
- mTvInputCustomLabels.clear();
- mTvInputApplicationLabels.clear();
- mTvInputApplicationIcons.clear();
- mTvInputAppliactionBanners.clear();;
mInputIdToPartnerInputMap.clear();
}
- /**
- * Clears the TvInput labels map.
- */
- public void clearTvInputLabels() {
- mTvInputLabels.clear();
- mTvInputCustomLabels.clear();
- mTvInputApplicationLabels.clear();
- }
-
public List<TvInputInfo> getTvInputInfos(boolean availableOnly, boolean tunerOnly) {
ArrayList<TvInputInfo> list = new ArrayList<>();
for (Map.Entry<String, Integer> pair : mInputStateMap.entrySet()) {
@@ -344,69 +245,7 @@ public class TvInputManagerHelper {
*/
@VisibleForTesting
public String loadLabel(TvInputInfo info) {
- String label = mTvInputLabels.get(info.getId());
- if (label == null) {
- label = info.loadLabel(mContext).toString();
- mTvInputLabels.put(info.getId(), label);
- }
- return label;
- }
-
- /**
- * Loads custom label of {@code info}
- */
- public String loadCustomLabel(TvInputInfo info) {
- String customLabel = mTvInputCustomLabels.get(info.getId());
- if (customLabel == null) {
- CharSequence customLabelCharSequence = info.loadCustomLabel(mContext);
- if (customLabelCharSequence != null) {
- customLabel = customLabelCharSequence.toString();
- mTvInputCustomLabels.put(info.getId(), customLabel);
- }
- }
- return customLabel;
- }
-
- /**
- * Gets the tv input application's label.
- */
- public CharSequence getTvInputApplicationLabel(CharSequence inputId) {
- return mTvInputApplicationLabels.get(inputId);
- }
-
- /**
- * Stores the tv input application's label.
- */
- public void setTvInputApplicationLabel(String inputId, CharSequence label) {
- mTvInputApplicationLabels.put(inputId, label);
- }
-
- /**
- * Gets the tv input application's icon.
- */
- public Drawable getTvInputApplicationIcon(String inputId) {
- return mTvInputApplicationIcons.get(inputId);
- }
-
- /**
- * Stores the tv input application's icon.
- */
- public void setTvInputApplicationIcon(String inputId, Drawable icon) {
- mTvInputApplicationIcons.put(inputId, icon);
- }
-
- /**
- * Gets the tv input application's banner.
- */
- public Drawable getTvInputApplicationBanner(String inputId) {
- return mTvInputAppliactionBanners.get(inputId);
- }
-
- /**
- * Stores the tv input application's banner.
- */
- public void setTvInputApplicationBanner(String inputId, Drawable banner) {
- mTvInputAppliactionBanners.put(inputId, banner);
+ return info.loadLabel(mContext).toString();
}
/**
@@ -482,54 +321,14 @@ public class TvInputManagerHelper {
return mContentRatingsManager;
}
- private int getInputSortKey(TvInputInfo input) {
- return input.getServiceInfo().metaData.getInt(META_LABEL_SORT_KEY,
- Integer.MAX_VALUE);
- }
-
- private boolean isInputPhysicalTuner(TvInputInfo input) {
- String packageName = input.getServiceInfo().packageName;
- if (Arrays.asList(mPhysicalTunerBlackList).contains(packageName)) {
- return false;
- }
-
- if (input.createSetupIntent() == null) {
- return false;
- } else {
- boolean mayBeTunerInput = mPackageManager.checkPermission(
- PERMISSION_ACCESS_ALL_EPG_DATA, input.getServiceInfo().packageName)
- == PackageManager.PERMISSION_GRANTED;
- if (!mayBeTunerInput) {
- try {
- ApplicationInfo ai = mPackageManager.getApplicationInfo(
- input.getServiceInfo().packageName, 0);
- if ((ai.flags & (ApplicationInfo.FLAG_SYSTEM
- | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) == 0) {
- return false;
- }
- } catch (PackageManager.NameNotFoundException e) {
- return false;
- }
- }
- }
- return true;
- }
-
private boolean isInBlackList(String inputId) {
- if (Features.USE_PARTNER_INPUT_BLACKLIST.isEnabled(mContext)) {
- for (String disabledTunerInputPrefix : PARTNER_TUNER_INPUT_PREFIX_BLACKLIST) {
- if (inputId.contains(disabledTunerInputPrefix)) {
- return true;
- }
- }
+ if (!Features.USE_PARTNER_INPUT_BLACKLIST.isEnabled(mContext)) {
+ return false;
}
- if (TvCommonUtils.isRunningInTest()) {
- for (String testableInput : TESTABLE_INPUTS) {
- if (testableInput.equals(inputId)) {
- return false;
- }
+ for (String disabledTunerInputPrefix : PARTNER_TUNER_INPUT_PREFIX_BLACKLIST) {
+ if (inputId.contains(disabledTunerInputPrefix)) {
+ return true;
}
- return true;
}
return false;
}
@@ -558,123 +357,4 @@ public class TvInputManagerHelper {
return mInputManager.loadLabel(lhs).compareTo(mInputManager.loadLabel(rhs));
}
}
-
- /**
- * A comparator used for {@link com.android.tv.ui.SelectInputView} to show the list of
- * TV inputs.
- */
- public static class InputComparator implements Comparator<TvInputInfo> {
- private Map<Integer, Integer> mTypePriorities = new HashMap<>();
- private final TvInputManagerHelper mTvInputManagerHelper;
- private final Context mContext;
-
- public InputComparator(Context context, TvInputManagerHelper tvInputManagerHelper) {
- mContext = context;
- mTvInputManagerHelper = tvInputManagerHelper;
- setupDeviceTypePriorities();
- }
-
- @Override
- public int compare(TvInputInfo lhs, TvInputInfo rhs) {
- if (lhs == null) {
- return (rhs == null) ? 0 : 1;
- }
- if (rhs == null) {
- return -1;
- }
-
- boolean enabledL = (mTvInputManagerHelper.getInputState(lhs)
- != TvInputManager.INPUT_STATE_DISCONNECTED);
- boolean enabledR = (mTvInputManagerHelper.getInputState(rhs)
- != TvInputManager.INPUT_STATE_DISCONNECTED);
- if (enabledL != enabledR) {
- return enabledL ? -1 : 1;
- }
-
- int priorityL = getPriority(lhs);
- int priorityR = getPriority(rhs);
- if (priorityL != priorityR) {
- return priorityL - priorityR;
- }
-
- if (lhs.getType() == TvInputInfo.TYPE_TUNER
- && rhs.getType() == TvInputInfo.TYPE_TUNER) {
- boolean isPhysicalL = mTvInputManagerHelper.isInputPhysicalTuner(lhs);
- boolean isPhysicalR = mTvInputManagerHelper.isInputPhysicalTuner(rhs);
- if (isPhysicalL != isPhysicalR) {
- return isPhysicalL ? -1 : 1;
- }
- }
-
- int sortKeyL = mTvInputManagerHelper.getInputSortKey(lhs);
- int sortKeyR = mTvInputManagerHelper.getInputSortKey(rhs);
- if (sortKeyL != sortKeyR) {
- return sortKeyR - sortKeyL;
- }
-
- String parentLabelL = lhs.getParentId() != null
- ? getLabel(mTvInputManagerHelper.getTvInputInfo(lhs.getParentId()))
- : getLabel(mTvInputManagerHelper.getTvInputInfo(lhs.getId()));
- String parentLabelR = rhs.getParentId() != null
- ? getLabel(mTvInputManagerHelper.getTvInputInfo(rhs.getParentId()))
- : getLabel(mTvInputManagerHelper.getTvInputInfo(rhs.getId()));
-
- if (!TextUtils.equals(parentLabelL, parentLabelR)) {
- return parentLabelL.compareToIgnoreCase(parentLabelR);
- }
- return getLabel(lhs).compareToIgnoreCase(getLabel(rhs));
- }
-
- private String getLabel(TvInputInfo input) {
- if (input == null) {
- return "";
- }
- String label = mTvInputManagerHelper.loadCustomLabel(input);
- if (TextUtils.isEmpty(label)) {
- label = mTvInputManagerHelper.loadLabel(input);
- }
- return label;
- }
-
- private int getPriority(TvInputInfo info) {
- Integer priority = null;
- if (mTypePriorities != null) {
- priority = mTypePriorities.get(getTvInputTypeForPriority(info));
- }
- if (priority != null) {
- return priority;
- }
- return Integer.MAX_VALUE;
- }
-
- private void setupDeviceTypePriorities() {
- mTypePriorities = Partner.getInstance(mContext).getInputsOrderMap();
-
- // Fill in any missing priorities in the map we got from the OEM
- int priority = mTypePriorities.size();
- for (int type : DEFAULT_TV_INPUT_PRIORITY) {
- if (!mTypePriorities.containsKey(type)) {
- mTypePriorities.put(type, priority++);
- }
- }
- }
-
- private int getTvInputTypeForPriority(TvInputInfo info) {
- if (info.getHdmiDeviceInfo() != null) {
- if (info.getHdmiDeviceInfo().isCecDevice()) {
- switch (info.getHdmiDeviceInfo().getDeviceType()) {
- case HdmiDeviceInfo.DEVICE_RECORDER:
- return TYPE_CEC_DEVICE_RECORDER;
- case HdmiDeviceInfo.DEVICE_PLAYBACK:
- return TYPE_CEC_DEVICE_PLAYBACK;
- default:
- return TYPE_CEC_DEVICE;
- }
- } else if (info.getHdmiDeviceInfo().isMhlDevice()) {
- return TYPE_MHL_MOBILE;
- }
- }
- return info.getType();
- }
- }
}
diff --git a/src/com/android/tv/util/TvSettings.java b/src/com/android/tv/util/TvSettings.java
index 970cd055..97ff59d6 100644
--- a/src/com/android/tv/util/TvSettings.java
+++ b/src/com/android/tv/util/TvSettings.java
@@ -17,8 +17,6 @@
package com.android.tv.util;
import android.content.Context;
-import android.content.SharedPreferences;
-import android.media.tv.TvTrackInfo;
import android.preference.PreferenceManager;
import android.support.annotation.IntDef;
@@ -28,6 +26,7 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
+
/**
* A class about the constants for TV settings.
* Objects that are returned from the various {@code get} methods must be treated as immutable.
@@ -36,21 +35,44 @@ public final class TvSettings {
private TvSettings() {}
public static final String PREF_DISPLAY_MODE = "display_mode"; // int value
+ public static final String PREF_PIP_LAYOUT = "pip_layout"; // int value
+ public static final String PREF_PIP_SIZE = "pip_size"; // int value
public static final String PREF_PIN = "pin"; // 4-digit string value. Otherwise, it's not set.
+ // PIP sounds
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ PIP_SOUND_MAIN, PIP_SOUND_PIP_WINDOW })
+ public @interface PipSound {}
+ public static final int PIP_SOUND_MAIN = 0;
+ public static final int PIP_SOUND_PIP_WINDOW = PIP_SOUND_MAIN + 1;
+
+ // PIP layouts
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ PIP_LAYOUT_BOTTOM_RIGHT, PIP_LAYOUT_TOP_RIGHT, PIP_LAYOUT_TOP_LEFT,
+ PIP_LAYOUT_BOTTOM_LEFT, PIP_LAYOUT_SIDE_BY_SIDE })
+ public @interface PipLayout {}
+ public static final int PIP_LAYOUT_BOTTOM_RIGHT = 0;
+ public static final int PIP_LAYOUT_TOP_RIGHT = PIP_LAYOUT_BOTTOM_RIGHT + 1;
+ public static final int PIP_LAYOUT_TOP_LEFT = PIP_LAYOUT_TOP_RIGHT + 1;
+ public static final int PIP_LAYOUT_BOTTOM_LEFT = PIP_LAYOUT_TOP_LEFT + 1;
+ public static final int PIP_LAYOUT_SIDE_BY_SIDE = PIP_LAYOUT_BOTTOM_LEFT + 1;
+ public static final int PIP_LAYOUT_LAST = PIP_LAYOUT_SIDE_BY_SIDE;
+
+ // PIP sizes
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({ PIP_SIZE_SMALL, PIP_SIZE_BIG })
+ public @interface PipSize {}
+ public static final int PIP_SIZE_SMALL = 0;
+ public static final int PIP_SIZE_BIG = PIP_SIZE_SMALL + 1;
+ public static final int PIP_SIZE_LAST = PIP_SIZE_BIG;
+
// Multi-track audio settings
private static final String PREF_MULTI_AUDIO_ID = "pref.multi_audio_id";
private static final String PREF_MULTI_AUDIO_LANGUAGE = "pref.multi_audio_language";
private static final String PREF_MULTI_AUDIO_CHANNEL_COUNT = "pref.multi_audio_channel_count";
- // DVR Multi-audio and subtitle settings
- private static final String PREF_DVR_MULTI_AUDIO_ID = "pref.dvr_multi_audio_id";
- private static final String PREF_DVR_MULTI_AUDIO_LANGUAGE = "pref.dvr_multi_audio_language";
- private static final String PREF_DVR_MULTI_AUDIO_CHANNEL_COUNT =
- "pref.dvr_multi_audio_channel_count";
- private static final String PREF_DVR_SUBTITLE_ID = "pref.dvr_subtitle_id";
- private static final String PREF_DVR_SUBTITLE_LANGUAGE = "pref.dvr_subtitle_language";
-
// Parental Control settings
private static final String PREF_CONTENT_RATING_SYSTEMS = "pref.content_rating_systems";
private static final String PREF_CONTENT_RATING_LEVEL = "pref.content_rating_level";
@@ -67,6 +89,59 @@ public final class TvSettings {
public static final int CONTENT_RATING_LEVEL_LOW = 3;
public static final int CONTENT_RATING_LEVEL_CUSTOM = 4;
+ // PIP settings
+ /**
+ * Returns the layout of the PIP window stored in the shared preferences.
+ *
+ * @return the saved layout of the PIP window. This value is one of
+ * {@link #PIP_LAYOUT_TOP_LEFT}, {@link #PIP_LAYOUT_TOP_RIGHT},
+ * {@link #PIP_LAYOUT_BOTTOM_LEFT}, {@link #PIP_LAYOUT_BOTTOM_RIGHT} and
+ * {@link #PIP_LAYOUT_SIDE_BY_SIDE}. If the preference value does not exist,
+ * {@link #PIP_LAYOUT_BOTTOM_RIGHT} is returned.
+ */
+ @SuppressWarnings("ResourceType")
+ @PipLayout
+ public static int getPipLayout(Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context).getInt(
+ PREF_PIP_LAYOUT, PIP_LAYOUT_BOTTOM_RIGHT);
+ }
+
+ /**
+ * Stores the layout of PIP window to the shared preferences.
+ *
+ * @param pipLayout This value should be one of {@link #PIP_LAYOUT_TOP_LEFT},
+ * {@link #PIP_LAYOUT_TOP_RIGHT}, {@link #PIP_LAYOUT_BOTTOM_LEFT},
+ * {@link #PIP_LAYOUT_BOTTOM_RIGHT} and {@link #PIP_LAYOUT_SIDE_BY_SIDE}.
+ */
+ public static void setPipLayout(Context context, @PipLayout int pipLayout) {
+ PreferenceManager.getDefaultSharedPreferences(context).edit().putInt(
+ PREF_PIP_LAYOUT, pipLayout).apply();
+ }
+
+ /**
+ * Returns the size of the PIP view stored in the shared preferences.
+ *
+ * @return the saved size of the PIP view. This value is one of
+ * {@link #PIP_SIZE_SMALL} and {@link #PIP_SIZE_BIG}. If the preference value does not
+ * exist, {@link #PIP_SIZE_SMALL} is returned.
+ */
+ @SuppressWarnings("ResourceType")
+ @PipSize
+ public static int getPipSize(Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context).getInt(
+ PREF_PIP_SIZE, PIP_SIZE_SMALL);
+ }
+
+ /**
+ * Stores the size of PIP view to the shared preferences.
+ *
+ * @param pipSize This value should be one of {@link #PIP_SIZE_SMALL} and {@link #PIP_SIZE_BIG}.
+ */
+ public static void setPipSize(Context context, @PipSize int pipSize) {
+ PreferenceManager.getDefaultSharedPreferences(context).edit().putInt(
+ PREF_PIP_SIZE, pipSize).apply();
+ }
+
// Multi-track audio settings
public static String getMultiAudioId(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString(
@@ -98,57 +173,6 @@ public final class TvSettings {
PREF_MULTI_AUDIO_CHANNEL_COUNT, channelCount).apply();
}
- public static void setDvrPlaybackTrackSettings(Context context, int trackType,
- TvTrackInfo info) {
- if (trackType == TvTrackInfo.TYPE_AUDIO) {
- if (info == null) {
- PreferenceManager.getDefaultSharedPreferences(context).edit()
- .remove(PREF_DVR_MULTI_AUDIO_ID).apply();
- } else {
- PreferenceManager.getDefaultSharedPreferences(context).edit()
- .putString(PREF_DVR_MULTI_AUDIO_LANGUAGE, info.getLanguage())
- .putInt(PREF_DVR_MULTI_AUDIO_CHANNEL_COUNT, info.getAudioChannelCount())
- .putString(PREF_DVR_MULTI_AUDIO_ID, info.getId()).apply();
- }
- } else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
- if (info == null) {
- PreferenceManager.getDefaultSharedPreferences(context).edit()
- .remove(PREF_DVR_SUBTITLE_ID).apply();
- } else {
- PreferenceManager.getDefaultSharedPreferences(context).edit()
- .putString(PREF_DVR_SUBTITLE_LANGUAGE, info.getLanguage())
- .putString(PREF_DVR_SUBTITLE_ID, info.getId()).apply();
- }
- }
- }
-
- public static TvTrackInfo getDvrPlaybackTrackSettings(Context context,
- int trackType) {
- String language;
- String trackId;
- int channelCount;
- SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
- if (trackType == TvTrackInfo.TYPE_AUDIO) {
- trackId = pref.getString(PREF_DVR_MULTI_AUDIO_ID, null);
- if (trackId == null) {
- return null;
- }
- language = pref.getString(PREF_DVR_MULTI_AUDIO_LANGUAGE, null);
- channelCount = pref.getInt(PREF_DVR_MULTI_AUDIO_CHANNEL_COUNT, 0);
- return new TvTrackInfo.Builder(trackType, trackId)
- .setLanguage(language).setAudioChannelCount(channelCount).build();
- } else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
- trackId = pref.getString(PREF_DVR_SUBTITLE_ID, null);
- if (trackId == null) {
- return null;
- }
- language = pref.getString(PREF_DVR_SUBTITLE_LANGUAGE, null);
- return new TvTrackInfo.Builder(trackType, trackId).setLanguage(language).build();
- } else {
- return null;
- }
- }
-
// Parental Control settings
public static void addContentRatingSystems(Context context, Set<String> ids) {
Set<String> contentRatingSystemSet = getContentRatingSystemSet(context);
@@ -230,4 +254,4 @@ public final class TvSettings {
PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(
PREF_DISABLE_PIN_UNTIL, timeMillis).apply();
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/util/TvTrackInfoUtils.java b/src/com/android/tv/util/TvTrackInfoUtils.java
index 667cc9bf..c004f001 100644
--- a/src/com/android/tv/util/TvTrackInfoUtils.java
+++ b/src/com/android/tv/util/TvTrackInfoUtils.java
@@ -52,22 +52,35 @@ public class TvTrackInfoUtils {
}
// Assumes {@code null} language matches to any language since it means user hasn't
// selected any track before or selected a track without language information.
- boolean lhsLangMatch = language == null || Utils.isEqualLanguage(lhs.getLanguage(),
- language);
boolean rhsLangMatch = language == null || Utils.isEqualLanguage(rhs.getLanguage(),
language);
- if (lhsLangMatch && rhsLangMatch) {
- boolean lhsCountMatch = lhs.getType() != TvTrackInfo.TYPE_AUDIO
- || lhs.getAudioChannelCount() == channelCount;
- boolean rhsCountMatch = rhs.getType() != TvTrackInfo.TYPE_AUDIO
- || rhs.getAudioChannelCount() == channelCount;
- if (lhsCountMatch && rhsCountMatch) {
- return Boolean.compare(lhs.getId().equals(id), rhs.getId().equals(id));
+ boolean lhsLangMatch = language == null || Utils.isEqualLanguage(lhs.getLanguage(),
+ language);
+ if (rhsLangMatch) {
+ if (lhsLangMatch) {
+ boolean rhsCountMatch = rhs.getAudioChannelCount() == channelCount;
+ boolean lhsCountMatch = lhs.getAudioChannelCount() == channelCount;
+ if (rhsCountMatch) {
+ if (lhsCountMatch) {
+ boolean rhsIdMatch = rhs.getId().equals(id);
+ boolean lhsIdMatch = lhs.getId().equals(id);
+ if (rhsIdMatch) {
+ return lhsIdMatch ? 0 : -1;
+ } else {
+ return lhsIdMatch ? 1 : 0;
+ }
+
+ } else {
+ return -1;
+ }
+ } else {
+ return lhsCountMatch ? 1 : 0;
+ }
} else {
- return Boolean.compare(lhsCountMatch, rhsCountMatch);
+ return -1;
}
} else {
- return Boolean.compare(lhsLangMatch, rhsLangMatch);
+ return lhsLangMatch ? 1 : 0;
}
}
};
@@ -99,4 +112,4 @@ public class TvTrackInfoUtils {
private TvTrackInfoUtils() {
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/tv/util/Utils.java b/src/com/android/tv/util/Utils.java
index 3fe2ec3d..99d34431 100644
--- a/src/com/android/tv/util/Utils.java
+++ b/src/com/android/tv/util/Utils.java
@@ -44,13 +44,11 @@ import android.view.View;
import com.android.tv.ApplicationSingletons;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.common.BuildConfig;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
import com.android.tv.data.GenreItems;
import com.android.tv.data.Program;
import com.android.tv.data.StreamInfo;
-import com.android.tv.experiments.Experiments;
import java.io.File;
import java.text.SimpleDateFormat;
@@ -85,6 +83,9 @@ public class Utils {
public static final String EXTRA_KEY_RECORDED_PROGRAM_PIN_CHECKED =
"recorded_program_pin_checked";
+ // Query parameter in the intent of starting MainActivity.
+ public static final String PARAM_SOURCE = "source";
+
private static final String PATH_CHANNEL = "channel";
private static final String PATH_PROGRAM = "program";
@@ -96,8 +97,6 @@ public class Utils {
"last_watched_tuner_input_id";
private static final String PREF_KEY_RECORDING_FAILED_REASONS =
"recording_failed_reasons";
- private static final String PREF_KEY_FAILED_SCHEDULED_RECORDING_INFO_SET =
- "failed_scheduled_recording_info_set";
private static final int VIDEO_SD_WIDTH = 704;
private static final int VIDEO_SD_HEIGHT = 480;
@@ -115,7 +114,6 @@ public class Utils {
private static final int AUDIO_CHANNEL_SURROUND_8 = 8;
private static final long RECORDING_FAILED_REASON_NONE = 0;
- private static final long HALF_MINUTE_MS = TimeUnit.SECONDS.toMillis(30);
private static final long ONE_DAY_MS = TimeUnit.DAYS.toMillis(1);
// Hardcoded list for known bundled inputs not written by OEM/SOCs.
@@ -209,28 +207,6 @@ public class Utils {
}
/**
- * Adds the info of failed scheduled recording.
- */
- public static void addFailedScheduledRecordingInfo(Context context,
- String scheduledRecordingInfo) {
- Set<String> failedScheduledRecordingInfoSet = getFailedScheduledRecordingInfoSet(context);
- failedScheduledRecordingInfoSet.add(scheduledRecordingInfo);
- PreferenceManager.getDefaultSharedPreferences(context).edit()
- .putStringSet(PREF_KEY_FAILED_SCHEDULED_RECORDING_INFO_SET,
- failedScheduledRecordingInfoSet)
- .apply();
- }
-
- /**
- * Clears the failed scheduled recording info set.
- */
- public static void clearFailedScheduledRecordingInfoSet(Context context) {
- PreferenceManager.getDefaultSharedPreferences(context).edit()
- .remove(PREF_KEY_FAILED_SCHEDULED_RECORDING_INFO_SET)
- .apply();
- }
-
- /**
* Clears recording failed reason.
*/
public static void clearRecordingFailedReason(Context context, int reason) {
@@ -270,14 +246,6 @@ public class Utils {
}
/**
- * Returns the failed scheduled recordings info set.
- */
- public static Set<String> getFailedScheduledRecordingInfoSet(Context context) {
- return PreferenceManager.getDefaultSharedPreferences(context)
- .getStringSet(PREF_KEY_FAILED_SCHEDULED_RECORDING_INFO_SET, new HashSet<>());
- }
-
- /**
* Checks do recording failed reason exist.
*/
public static boolean hasRecordingFailedReason(Context context, int reason) {
@@ -365,14 +333,6 @@ public class Utils {
}
/**
- * Returns the round off minutes when convert milliseconds to minutes.
- */
- public static int getRoundOffMinsFromMs(long millis) {
- // Round off the result by adding half minute to the original ms.
- return (int) TimeUnit.MILLISECONDS.toMinutes(millis + HALF_MINUTE_MS);
- }
-
- /**
* Returns duration string according to the date & time format.
* If {@code startUtcMillis} and {@code endUtcMills} are equal,
* formatted time will be returned instead.
@@ -432,18 +392,16 @@ public class Utils {
: DateUtils.formatDateRange(context, startUtcMillis, endUtcMillis + 1, flag);
}
- /**
- * Checks if two given time (in milliseconds) are in the same day with regard to the
- * locale timezone.
- */
+ @VisibleForTesting
public static boolean isInGivenDay(long dayToMatchInMillis, long subjectTimeInMillis) {
+ final long DAY_IN_MS = TimeUnit.DAYS.toMillis(1);
TimeZone timeZone = Calendar.getInstance().getTimeZone();
long offset = timeZone.getRawOffset();
if (timeZone.inDaylightTime(new Date(dayToMatchInMillis))) {
offset += timeZone.getDSTSavings();
}
- return Utils.floorTime(dayToMatchInMillis + offset, ONE_DAY_MS)
- == Utils.floorTime(subjectTimeInMillis + offset, ONE_DAY_MS);
+ return Utils.floorTime(dayToMatchInMillis + offset, DAY_IN_MS)
+ == Utils.floorTime(subjectTimeInMillis + offset, DAY_IN_MS);
}
/**
@@ -565,7 +523,7 @@ public class Utils {
if (track.getType() != TvTrackInfo.TYPE_AUDIO) {
throw new IllegalArgumentException("Not an audio track: " + track);
}
- String language = context.getString(R.string.multi_audio_unknown_language);
+ String language = context.getString(R.string.default_language);
if (!TextUtils.isEmpty(track.getLanguage())) {
language = new Locale(track.getLanguage()).getDisplayName();
} else {
@@ -902,11 +860,4 @@ public class Utils {
}
return Genres.encode(genres);
}
-
- /**
- * Returns true if the current user is a developer.
- */
- public static boolean isDeveloper() {
- return BuildConfig.ENG || Experiments.ENABLE_DEVELOPER_FEATURES.get();
- }
}
diff --git a/src/com/android/tv/util/ViewCache.java b/src/com/android/tv/util/ViewCache.java
deleted file mode 100644
index 113bda27..00000000
--- a/src/com/android/tv/util/ViewCache.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.android.tv.util;
-
-import android.util.SparseArray;
-import android.view.View;
-
-import java.util.ArrayList;
-
-/**
- * A cache for the views.
- */
-public class ViewCache {
- private final static SparseArray<ArrayList<View>> mViews = new SparseArray();
-
- private static ViewCache sViewCache;
-
- private ViewCache() { }
-
- /**
- * Returns an instance of the view cache.
- */
- public static ViewCache getInstance() {
- if (sViewCache == null) {
- return new ViewCache();
- } else {
- return sViewCache;
- }
- }
-
- /**
- * Returns if the view cache is empty.
- */
- public boolean isEmpty() {
- return mViews.size() == 0;
- }
-
- /**
- * Stores a view into this view cache.
- */
- public void putView(int resId, View view) {
- ArrayList<View> views = mViews.get(resId);
- if (views == null) {
- views = new ArrayList();
- mViews.put(resId, views);
- }
- views.add(view);
- }
-
- /**
- * Returns the view for specific resource id.
- */
- public View getView(int resId) {
- ArrayList<View> views = mViews.get(resId);
- if (views != null && !views.isEmpty()) {
- View view = views.remove(views.size() - 1);
- if (views.isEmpty()) {
- mViews.remove(resId);
- }
- return view;
- } else {
- return null;
- }
- }
-
- /**
- * Clears the view cache.
- */
- public void clear() {
- mViews.clear();
- }
-}
diff --git a/tests/common/src/com/android/tv/testing/dvr/RecordingTestUtils.java b/tests/common/src/com/android/tv/testing/dvr/RecordingTestUtils.java
index a9bfa97a..b9def95e 100644
--- a/tests/common/src/com/android/tv/testing/dvr/RecordingTestUtils.java
+++ b/tests/common/src/com/android/tv/testing/dvr/RecordingTestUtils.java
@@ -16,7 +16,7 @@
package com.android.tv.testing.dvr;
-import com.android.tv.dvr.data.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording;
import junit.framework.Assert;
diff --git a/tests/func/src/com/android/tv/tests/ui/LiveChannelsTestCase.java b/tests/func/src/com/android/tv/tests/ui/LiveChannelsTestCase.java
index e306e6c6..25c7909b 100644
--- a/tests/func/src/com/android/tv/tests/ui/LiveChannelsTestCase.java
+++ b/tests/func/src/com/android/tv/tests/ui/LiveChannelsTestCase.java
@@ -73,8 +73,6 @@ public abstract class LiveChannelsTestCase extends InstrumentationTestCase {
.hasObject(Constants.PROGRAM_GUIDE)) {
mDevice.pressBack();
}
- // To destroy the activity to make sure next test case's activity launch check works well.
- mDevice.pressBack();
super.tearDown();
}
diff --git a/tests/func/src/com/android/tv/tests/ui/PlayControlsRowViewTest.java b/tests/func/src/com/android/tv/tests/ui/PlayControlsRowViewTest.java
index 82c6a810..bbc7aa81 100644
--- a/tests/func/src/com/android/tv/tests/ui/PlayControlsRowViewTest.java
+++ b/tests/func/src/com/android/tv/tests/ui/PlayControlsRowViewTest.java
@@ -16,11 +16,11 @@
package com.android.tv.tests.ui;
-import static com.android.tv.testing.uihelper.Constants.CHANNEL_BANNER;
import static com.android.tv.testing.uihelper.Constants.FOCUSED_VIEW;
import static com.android.tv.testing.uihelper.Constants.MENU;
import static com.android.tv.testing.uihelper.UiDeviceAsserts.assertWaitForCondition;
+import android.support.test.filters.SdkSuppress;
import android.support.test.filters.SmallTest;
import android.support.test.uiautomator.BySelector;
import android.support.test.uiautomator.UiObject2;
@@ -32,8 +32,9 @@ import com.android.tv.testing.testinput.TvTestInputConstants;
import com.android.tv.testing.uihelper.DialogHelper;
@SmallTest
+@SdkSuppress(minSdkVersion = 23)
public class PlayControlsRowViewTest extends LiveChannelsTestCase {
- private static final String BUTTON_ID_PLAY_PAUSE = "com.android.tv:id/play_pause";
+ private static final int BUTTON_INDEX_PLAY_PAUSE = 2;
private BySelector mBySettingsSidePanel;
@@ -41,9 +42,7 @@ public class PlayControlsRowViewTest extends LiveChannelsTestCase {
protected void setUp() throws Exception {
super.setUp();
mLiveChannelsHelper.assertAppStarted();
- pressKeysForChannel(TvTestInputConstants.CH_2);
- // Wait until KeypadChannelSwitchView closes.
- assertWaitForCondition(mDevice, Until.hasObject(CHANNEL_BANNER));
+ pressKeysForChannel(TvTestInputConstants.CH_1_DEFAULT_DONT_MODIFY);
// Tune to a new channel to ensure that the channel is changed.
mDevice.pressDPadUp();
getInstrumentation().waitForIdleSync();
@@ -57,7 +56,7 @@ public class PlayControlsRowViewTest extends LiveChannelsTestCase {
public void testFocusedViewInNormalCase() {
mMenuHelper.showMenu();
mMenuHelper.assertNavigateToPlayControlsRow();
- assertButtonHasFocus(BUTTON_ID_PLAY_PAUSE);
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
mDevice.pressBack();
}
@@ -70,30 +69,49 @@ public class PlayControlsRowViewTest extends LiveChannelsTestCase {
// Fast forward button
mDevice.pressKeyCode(KeyEvent.KEYCODE_MEDIA_FAST_FORWARD);
mMenuHelper.assertWaitForMenu();
- assertButtonHasFocus(BUTTON_ID_PLAY_PAUSE);
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
mDevice.pressBack();
// Next button
mDevice.pressKeyCode(KeyEvent.KEYCODE_MEDIA_NEXT);
mMenuHelper.assertWaitForMenu();
- assertButtonHasFocus(BUTTON_ID_PLAY_PAUSE);
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
+ mDevice.pressBack();
+ }
+
+ /**
+ * Tests the case when the rewinding action is disabled.
+ * In this case, the button corresponding to the action is disabled, so play/pause button should
+ * have the focus.
+ */
+ public void testFocusedViewWithDisabledActionBackward() {
+ // Previous button
+ mDevice.pressKeyCode(KeyEvent.KEYCODE_MEDIA_PREVIOUS);
+ mMenuHelper.assertWaitForMenu();
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
+ mDevice.pressBack();
+
+ // Rewind button
+ mDevice.pressKeyCode(KeyEvent.KEYCODE_MEDIA_REWIND);
+ mMenuHelper.assertWaitForMenu();
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
mDevice.pressBack();
}
public void testFocusedViewInMenu() {
mMenuHelper.showMenu();
mDevice.pressKeyCode(KeyEvent.KEYCODE_MEDIA_PLAY);
- assertButtonHasFocus(BUTTON_ID_PLAY_PAUSE);
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
mMenuHelper.assertNavigateToRow(R.string.menu_title_channels);
mDevice.pressKeyCode(KeyEvent.KEYCODE_MEDIA_NEXT);
- assertButtonHasFocus(BUTTON_ID_PLAY_PAUSE);
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
}
public void testKeepPausedWhileParentalControlChange() {
// Pause the playback.
mDevice.pressKeyCode(KeyEvent.KEYCODE_MEDIA_PAUSE);
mMenuHelper.assertWaitForMenu();
- assertButtonHasFocus(BUTTON_ID_PLAY_PAUSE);
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
// Show parental controls fragment.
mMenuHelper.assertPressOptionsSettings();
assertWaitForCondition(mDevice, Until.hasObject(mBySettingsSidePanel));
@@ -112,14 +130,14 @@ public class PlayControlsRowViewTest extends LiveChannelsTestCase {
mDevice.pressBack();
// Return to the main menu.
mMenuHelper.assertWaitForMenu();
- assertButtonHasFocus(BUTTON_ID_PLAY_PAUSE);
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
}
public void testKeepPausedAfterVisitingHome() {
// Pause the playback.
mDevice.pressKeyCode(KeyEvent.KEYCODE_MEDIA_PAUSE);
mMenuHelper.assertWaitForMenu();
- assertButtonHasFocus(BUTTON_ID_PLAY_PAUSE);
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
// Press HOME twice to visit the home screen and return to Live TV.
mDevice.pressHome();
// Wait until home screen is shown.
@@ -129,15 +147,19 @@ public class PlayControlsRowViewTest extends LiveChannelsTestCase {
mDevice.waitForIdle();
// Return to the main menu.
mMenuHelper.assertWaitForMenu();
- assertButtonHasFocus(BUTTON_ID_PLAY_PAUSE);
+ assertButtonHasFocus(BUTTON_INDEX_PLAY_PAUSE);
}
- private void assertButtonHasFocus(String buttonId) {
+ private void assertButtonHasFocus(int expectedButtonIndex) {
UiObject2 menu = mDevice.findObject(MENU);
UiObject2 focusedView = menu.findObject(FOCUSED_VIEW);
assertNotNull("Play controls row doesn't have a focused child.", focusedView);
UiObject2 focusedButtonGroup = focusedView.getParent();
assertNotNull("The focused item should have parent", focusedButtonGroup);
- assertEquals(buttonId, focusedButtonGroup.getResourceName());
+ UiObject2 controlBar = focusedButtonGroup.getParent();
+ assertNotNull("The focused item should have grandparent", controlBar);
+ assertTrue("The grandparent should have more than five children",
+ controlBar.getChildCount() >= 5);
+ assertEquals(controlBar.getChildren().get(expectedButtonIndex), focusedButtonGroup);
}
}
diff --git a/tests/input/res/values/strings.xml b/tests/input/res/values/strings.xml
index 4ef43955..3f2ab3f7 100644
--- a/tests/input/res/values/strings.xml
+++ b/tests/input/res/values/strings.xml
@@ -15,6 +15,7 @@
-->
<resources>
<string name="app_name" translatable="false">Test TV Inputs</string>
+ <string name="about_app" translatable="false">About TV Test Inputs</string>
<string name="version" translatable="false">Version: %1$s</string>
<string name="sample_tv_input" translatable="false">Test TV Input</string>
<string name="simple_input_label" translatable="false">Test Input</string>
diff --git a/tests/jank/src/com/android/tv/tests/jank/ProgramGuideJankTest.java b/tests/jank/src/com/android/tv/tests/jank/ProgramGuideJankTest.java
index 03796cfa..7d751c4c 100644
--- a/tests/jank/src/com/android/tv/tests/jank/ProgramGuideJankTest.java
+++ b/tests/jank/src/com/android/tv/tests/jank/ProgramGuideJankTest.java
@@ -30,6 +30,7 @@ import com.android.tv.testing.uihelper.ByResource;
import com.android.tv.testing.uihelper.Constants;
import com.android.tv.testing.uihelper.LiveChannelsUiDeviceHelper;
import com.android.tv.testing.uihelper.MenuHelper;
+import com.android.tv.testing.uihelper.UiDeviceUtils;
/**
* Jank tests for the program guide.
@@ -82,7 +83,7 @@ public class ProgramGuideJankTest extends JankTestBase {
}
@JankTest(expectedFrames = EXPECTED_FRAMES,
- beforeLoop = "showAndFocusProgramGuide",
+ beforeLoop = "showProgramGuide",
afterLoop = "clearProgramGuide")
@GfxMonitor(processName = Utils.LIVE_CHANNELS_PROCESS_NAME)
public void testScrollDown() {
@@ -94,7 +95,7 @@ public class ProgramGuideJankTest extends JankTestBase {
}
@JankTest(expectedFrames = EXPECTED_FRAMES,
- beforeLoop = "showAndFocusProgramGuide",
+ beforeLoop = "showProgramGuide",
afterLoop = "clearProgramGuide")
@GfxMonitor(processName = Utils.LIVE_CHANNELS_PROCESS_NAME)
public void testScrollRight() {
@@ -127,14 +128,8 @@ public class ProgramGuideJankTest extends JankTestBase {
assertWaitForCondition(mDevice, Until.gone(Constants.PROGRAM_GUIDE));
}
- public void showProgramGuide() {
- selectProgramGuideMenuItem();
- mDevice.pressDPadCenter();
- assertWaitForCondition(mDevice, Until.hasObject(Constants.PROGRAM_GUIDE));
- }
-
// It's public to be used with @JankTest annotation.
- public void showAndFocusProgramGuide() {
+ public void showProgramGuide() {
selectProgramGuideMenuItem();
mDevice.pressDPadCenter();
assertWaitForCondition(mDevice, Until.hasObject(Constants.PROGRAM_GUIDE));
diff --git a/tests/unit/src/com/android/tv/MainActivityTest.java b/tests/unit/src/com/android/tv/MainActivityTest.java
index 8425597f..b2fe6745 100644
--- a/tests/unit/src/com/android/tv/MainActivityTest.java
+++ b/tests/unit/src/com/android/tv/MainActivityTest.java
@@ -39,6 +39,7 @@ public class MainActivityTest extends BaseMainActivityTestCase {
waitUntilChannelLoadingFinish();
List<Channel> channelList = mActivity.getChannelDataManager().getChannelList();
assertTrue("Expected at least one channel", channelList.size() > 0);
+ assertFalse("PIP disabled", mActivity.isPipEnabled());
}
public void testTuneToChannel() throws Throwable {
diff --git a/tests/unit/src/com/android/tv/data/ChannelNumberTest.java b/tests/unit/src/com/android/tv/data/ChannelNumberTest.java
index d074baae..4e6e9f3c 100644
--- a/tests/unit/src/com/android/tv/data/ChannelNumberTest.java
+++ b/tests/unit/src/com/android/tv/data/ChannelNumberTest.java
@@ -42,14 +42,14 @@ public class ChannelNumberTest extends TestCase {
*/
public void testParseChannelNumber() {
assertNull(parseChannelNumber(""));
- assertNull(parseChannelNumber("-"));
+ assertNull(parseChannelNumber(" "));
assertNull(parseChannelNumber("abcd12"));
assertNull(parseChannelNumber("12abcd"));
assertNull(parseChannelNumber("-12"));
assertChannelEquals(parseChannelNumber("1"), "1", false, "");
- assertChannelEquals(parseChannelNumber("1234-4321"), "1234", true, "4321");
+ assertChannelEquals(parseChannelNumber("1234 4321"), "1234", true, "4321");
assertChannelEquals(parseChannelNumber("3-4"), "3", true, "4");
- assertChannelEquals(parseChannelNumber("5-6"), "5", true, "6");
+ assertChannelEquals(parseChannelNumber("5.6"), "5", true, "6");
}
/**
@@ -59,11 +59,13 @@ public class ChannelNumberTest extends TestCase {
new ComparableTester<ChannelNumber>()
.addEquivalentGroup(parseChannelNumber("1"), parseChannelNumber("1"))
.addEquivalentGroup(parseChannelNumber("2"))
- .addEquivalentGroup(parseChannelNumber("2-1"))
+ .addEquivalentGroup(parseChannelNumber("2 1"), parseChannelNumber("2.1"),
+ parseChannelNumber("2-1"))
.addEquivalentGroup(parseChannelNumber("2-2"))
.addEquivalentGroup(parseChannelNumber("2-10"))
.addEquivalentGroup(parseChannelNumber("3"))
- .addEquivalentGroup(parseChannelNumber("4"), parseChannelNumber("4-0"))
+ .addEquivalentGroup(parseChannelNumber("4"), parseChannelNumber("4 0"),
+ parseChannelNumber("4.0"), parseChannelNumber("4-0"))
.addEquivalentGroup(parseChannelNumber("10"))
.addEquivalentGroup(parseChannelNumber("100"))
.test();
diff --git a/tests/unit/src/com/android/tv/data/ChannelTest.java b/tests/unit/src/com/android/tv/data/ChannelTest.java
index f3d80cbe..95e3ee90 100644
--- a/tests/unit/src/com/android/tv/data/ChannelTest.java
+++ b/tests/unit/src/com/android/tv/data/ChannelTest.java
@@ -226,6 +226,7 @@ public class ChannelTest extends AndroidTestCase {
* See <a href="http://b/23031603">b/23031603</a>.
*/
public void testComparatorLabel() {
+
TvInputManagerHelper manager = Mockito.mock(TvInputManagerHelper.class);
Mockito.when(manager.isPartnerInput(Matchers.anyString())).thenAnswer(
new Answer<Boolean>() {
@@ -253,29 +254,6 @@ public class ChannelTest extends AndroidTestCase {
comparatorTester.test();
}
- public void testNormalizeChannelNumber() {
- assertNormalizedDisplayNumber(null, null);
- assertNormalizedDisplayNumber("", "");
- assertNormalizedDisplayNumber("1", "1");
- assertNormalizedDisplayNumber("abcde", "abcde");
- assertNormalizedDisplayNumber("1-1", "1-1");
- assertNormalizedDisplayNumber("1.1", "1-1");
- assertNormalizedDisplayNumber("1 1", "1-1");
- assertNormalizedDisplayNumber("1\u058a1", "1-1");
- assertNormalizedDisplayNumber("1\u05be1", "1-1");
- assertNormalizedDisplayNumber("1\u14001", "1-1");
- assertNormalizedDisplayNumber("1\u18061", "1-1");
- assertNormalizedDisplayNumber("1\u20101", "1-1");
- assertNormalizedDisplayNumber("1\u20111", "1-1");
- assertNormalizedDisplayNumber("1\u20121", "1-1");
- assertNormalizedDisplayNumber("1\u20131", "1-1");
- assertNormalizedDisplayNumber("1\u20141", "1-1");
- }
-
- private void assertNormalizedDisplayNumber(String displayNumber, String normalized) {
- assertEquals(normalized, Channel.normalizeDisplayNumber(displayNumber));
- }
-
private class TestChannelComparator extends Channel.DefaultComparator {
public TestChannelComparator(TvInputManagerHelper manager) {
super(null, manager);
diff --git a/tests/unit/src/com/android/tv/data/ProgramTest.java b/tests/unit/src/com/android/tv/data/ProgramTest.java
index 08dd17f3..7e474cd6 100644
--- a/tests/unit/src/com/android/tv/data/ProgramTest.java
+++ b/tests/unit/src/com/android/tv/data/ProgramTest.java
@@ -19,11 +19,13 @@ import static android.media.tv.TvContract.Programs.Genres.COMEDY;
import static android.media.tv.TvContract.Programs.Genres.FAMILY_KIDS;
import com.android.tv.data.Program.CriticScore;
+import com.android.tv.dvr.SeriesRecording;
import android.media.tv.TvContentRating;
import android.media.tv.TvContract.Programs.Genres;
import android.os.Parcel;
import android.support.test.filters.SmallTest;
+import android.util.Log;
import junit.framework.TestCase;
diff --git a/tests/unit/src/com/android/tv/dvr/BaseDvrDataManagerTest.java b/tests/unit/src/com/android/tv/dvr/BaseDvrDataManagerTest.java
index 6c1b1976..1292759e 100644
--- a/tests/unit/src/com/android/tv/dvr/BaseDvrDataManagerTest.java
+++ b/tests/unit/src/com/android/tv/dvr/BaseDvrDataManagerTest.java
@@ -21,7 +21,6 @@ import android.support.test.filters.SmallTest;
import android.test.AndroidTestCase;
import android.test.MoreAsserts;
-import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.testing.FakeClock;
import com.android.tv.testing.dvr.RecordingTestUtils;
diff --git a/tests/unit/src/com/android/tv/dvr/DvrDataManagerImplTest.java b/tests/unit/src/com/android/tv/dvr/DvrDataManagerImplTest.java
index d142f432..b822f164 100644
--- a/tests/unit/src/com/android/tv/dvr/DvrDataManagerImplTest.java
+++ b/tests/unit/src/com/android/tv/dvr/DvrDataManagerImplTest.java
@@ -18,7 +18,6 @@ package com.android.tv.dvr;
import android.support.test.filters.SmallTest;
-import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.testing.dvr.RecordingTestUtils;
import junit.framework.TestCase;
diff --git a/tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java b/tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java
index b2164dec..85e35c4d 100644
--- a/tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java
+++ b/tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java
@@ -24,10 +24,7 @@ import android.util.Log;
import android.util.Range;
import com.android.tv.common.SoftPreconditions;
-import com.android.tv.dvr.data.RecordedProgram;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.ScheduledRecording.RecordingState;
-import com.android.tv.dvr.data.SeriesRecording;
+import com.android.tv.dvr.ScheduledRecording.RecordingState;
import com.android.tv.util.Clock;
import java.util.ArrayList;
@@ -40,7 +37,7 @@ import java.util.concurrent.atomic.AtomicLong;
/**
* A DVR Data manager that stores values in memory suitable for testing.
*/
-public final class DvrDataManagerInMemoryImpl extends BaseDvrDataManager {
+final class DvrDataManagerInMemoryImpl extends BaseDvrDataManager {
private final static String TAG = "DvrDataManagerInMemory";
private final AtomicLong mNextId = new AtomicLong(1);
private final Map<Long, ScheduledRecording> mScheduledRecordings = new HashMap<>();
diff --git a/tests/unit/src/com/android/tv/dvr/provider/DvrDbSyncTest.java b/tests/unit/src/com/android/tv/dvr/DvrDbSyncTest.java
index 9e96a7b8..7cb3721c 100644
--- a/tests/unit/src/com/android/tv/dvr/provider/DvrDbSyncTest.java
+++ b/tests/unit/src/com/android/tv/dvr/DvrDbSyncTest.java
@@ -14,9 +14,8 @@
* limitations under the License
*/
-package com.android.tv.dvr.provider;
+package com.android.tv.dvr;
-import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
@@ -30,11 +29,6 @@ import android.test.AndroidTestCase;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.Program;
-import com.android.tv.dvr.DvrDataManagerImpl;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.data.SeriesRecording;
-import com.android.tv.dvr.recorder.SeriesRecordingScheduler;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -53,30 +47,20 @@ public class DvrDbSyncTest extends AndroidTestCase {
private static final String BASE_EPISODE_NUMBER = "3";
private static final Program BASE_PROGRAM = new Program.Builder().setId(BASE_PROGRAM_ID)
.setStartTimeUtcMillis(BASE_START_TIME_MS).setEndTimeUtcMillis(BASE_END_TIME_MS)
- .build();
- private static final Program BASE_SERIES_PROGRAM = new Program.Builder().setId(BASE_PROGRAM_ID)
- .setStartTimeUtcMillis(BASE_START_TIME_MS).setEndTimeUtcMillis(BASE_END_TIME_MS)
.setSeasonNumber(BASE_SEASON_NUMBER).setEpisodeNumber(BASE_EPISODE_NUMBER).build();
private static final ScheduledRecording BASE_SCHEDULE =
ScheduledRecording.builder(INPUT_ID, BASE_PROGRAM).build();
- private static final ScheduledRecording BASE_SERIES_SCHEDULE =
- ScheduledRecording.builder(INPUT_ID, BASE_SERIES_PROGRAM).build();
private DvrDbSync mDbSync;
- @Mock private DvrManager mDvrManager;
@Mock private DvrDataManagerImpl mDataManager;
@Mock private ChannelDataManager mChannelDataManager;
- @Mock private SeriesRecordingScheduler mSeriesRecordingScheduler;
@Override
protected void setUp() throws Exception {
super.setUp();
MockitoAnnotations.initMocks(this);
when(mChannelDataManager.isDbLoadFinished()).thenReturn(true);
- when(mDvrManager.addSeriesRecording(anyObject(), anyObject(), anyInt()))
- .thenReturn(SeriesRecording.builder(INPUT_ID, BASE_PROGRAM).build());
- mDbSync = new DvrDbSync(getContext(), mDataManager, mChannelDataManager,
- mDvrManager, mSeriesRecordingScheduler);
+ mDbSync = new DvrDbSync(getContext(), mDataManager, mChannelDataManager);
}
public void testHandleUpdateProgram_null() {
@@ -106,21 +90,21 @@ public class DvrDbSyncTest extends AndroidTestCase {
}
public void testHandleUpdateProgram_changeSeason() {
- addSchedule(BASE_PROGRAM_ID, BASE_SERIES_SCHEDULE);
+ addSchedule(BASE_PROGRAM_ID, BASE_SCHEDULE);
String seasonNumber = BASE_SEASON_NUMBER + "1";
String episodeNumber = BASE_EPISODE_NUMBER + "1";
- Program program = new Program.Builder(BASE_SERIES_PROGRAM).setSeasonNumber(seasonNumber)
+ Program program = new Program.Builder(BASE_PROGRAM).setSeasonNumber(seasonNumber)
.setEpisodeNumber(episodeNumber).build();
mDbSync.handleUpdateProgram(program, BASE_PROGRAM_ID);
assertUpdateScheduleCalled(program);
}
public void testHandleUpdateProgram_finished() {
- addSchedule(BASE_PROGRAM_ID, ScheduledRecording.buildFrom(BASE_SERIES_SCHEDULE)
+ addSchedule(BASE_PROGRAM_ID, ScheduledRecording.buildFrom(BASE_SCHEDULE)
.setState(ScheduledRecording.STATE_RECORDING_FINISHED).build());
String seasonNumber = BASE_SEASON_NUMBER + "1";
String episodeNumber = BASE_EPISODE_NUMBER + "1";
- Program program = new Program.Builder(BASE_SERIES_PROGRAM).setSeasonNumber(seasonNumber)
+ Program program = new Program.Builder(BASE_PROGRAM).setSeasonNumber(seasonNumber)
.setEpisodeNumber(episodeNumber).build();
mDbSync.handleUpdateProgram(program, BASE_PROGRAM_ID);
verify(mDataManager, never()).updateScheduledRecording(anyObject());
diff --git a/tests/unit/src/com/android/tv/dvr/recorder/DvrRecordingServiceTest.java b/tests/unit/src/com/android/tv/dvr/DvrRecordingServiceTest.java
index 7ad8d55d..0a203ede 100644
--- a/tests/unit/src/com/android/tv/dvr/recorder/DvrRecordingServiceTest.java
+++ b/tests/unit/src/com/android/tv/dvr/DvrRecordingServiceTest.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import static org.mockito.Mockito.verify;
diff --git a/tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java b/tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java
index cfb27211..2850a5f7 100644
--- a/tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java
+++ b/tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java
@@ -20,8 +20,6 @@ import android.support.test.filters.SmallTest;
import android.test.MoreAsserts;
import android.util.Range;
-import com.android.tv.dvr.DvrScheduleManager.ConflictInfo;
-import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.testing.dvr.RecordingTestUtils;
import junit.framework.TestCase;
@@ -30,6 +28,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
/**
* Tests for {@link DvrScheduleManager}
@@ -587,80 +586,49 @@ public class DvrScheduleManagerTest extends TestCase {
RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
--priority, 50L, 900L)
));
- List<ConflictInfo> conflicts = DvrScheduleManager.getConflictingSchedulesInfo(schedules, 1);
-
- assertNotInList(schedules.get(0), conflicts);
- assertFullConflict(schedules.get(1), conflicts);
- assertPartialConflict(schedules.get(2), conflicts);
- assertPartialConflict(schedules.get(3), conflicts);
- assertNotInList(schedules.get(4), conflicts);
- assertPartialConflict(schedules.get(5), conflicts);
- assertNotInList(schedules.get(6), conflicts);
- assertFullConflict(schedules.get(7), conflicts);
- assertFullConflict(schedules.get(8), conflicts);
- assertFullConflict(schedules.get(9), conflicts);
- assertFullConflict(schedules.get(10), conflicts);
-
- conflicts = DvrScheduleManager.getConflictingSchedulesInfo(schedules, 2);
-
- assertNotInList(schedules.get(0), conflicts);
- assertNotInList(schedules.get(1), conflicts);
- assertNotInList(schedules.get(2), conflicts);
- assertNotInList(schedules.get(3), conflicts);
- assertNotInList(schedules.get(4), conflicts);
- assertNotInList(schedules.get(5), conflicts);
- assertNotInList(schedules.get(6), conflicts);
- assertFullConflict(schedules.get(7), conflicts);
- assertFullConflict(schedules.get(8), conflicts);
- assertFullConflict(schedules.get(9), conflicts);
- assertPartialConflict(schedules.get(10), conflicts);
-
- conflicts = DvrScheduleManager.getConflictingSchedulesInfo(schedules, 3);
-
- assertNotInList(schedules.get(0), conflicts);
- assertNotInList(schedules.get(1), conflicts);
- assertNotInList(schedules.get(2), conflicts);
- assertNotInList(schedules.get(3), conflicts);
- assertNotInList(schedules.get(4), conflicts);
- assertNotInList(schedules.get(5), conflicts);
- assertNotInList(schedules.get(6), conflicts);
- assertNotInList(schedules.get(7), conflicts);
- assertPartialConflict(schedules.get(8), conflicts);
- assertNotInList(schedules.get(9), conflicts);
- assertPartialConflict(schedules.get(10), conflicts);
- }
-
- private void assertNotInList(ScheduledRecording schedule, List<ConflictInfo> conflicts) {
- for (ConflictInfo conflictInfo : conflicts) {
- if (conflictInfo.schedule.equals(schedule)) {
- fail(schedule + " conflicts with others.");
- }
- }
- }
-
- private void assertPartialConflict(ScheduledRecording schedule, List<ConflictInfo> conflicts) {
- for (ConflictInfo conflictInfo : conflicts) {
- if (conflictInfo.schedule.equals(schedule)) {
- if (conflictInfo.partialConflict) {
- return;
- } else {
- fail(schedule + " fully conflicts with others.");
- }
- }
- }
- fail(schedule + " doesn't conflict");
- }
-
- private void assertFullConflict(ScheduledRecording schedule, List<ConflictInfo> conflicts) {
- for (ConflictInfo conflictInfo : conflicts) {
- if (conflictInfo.schedule.equals(schedule)) {
- if (!conflictInfo.partialConflict) {
- return;
- } else {
- fail(schedule + " partially conflicts with others.");
- }
- }
- }
- fail(schedule + " doesn't conflict");
+ Map<ScheduledRecording, Boolean> conflictsInfo = DvrScheduleManager
+ .getConflictingSchedulesInfo(schedules, 1);
+
+ assertNull(conflictsInfo.get(schedules.get(0)));
+ assertFalse(conflictsInfo.get(schedules.get(1)));
+ assertTrue(conflictsInfo.get(schedules.get(2)));
+ assertTrue(conflictsInfo.get(schedules.get(3)));
+ assertNull(conflictsInfo.get(schedules.get(4)));
+ assertTrue(conflictsInfo.get(schedules.get(5)));
+ assertNull(conflictsInfo.get(schedules.get(6)));
+ assertFalse(conflictsInfo.get(schedules.get(7)));
+ assertFalse(conflictsInfo.get(schedules.get(8)));
+ assertFalse(conflictsInfo.get(schedules.get(9)));
+ assertFalse(conflictsInfo.get(schedules.get(10)));
+
+ conflictsInfo = DvrScheduleManager
+ .getConflictingSchedulesInfo(schedules, 2);
+
+ assertNull(conflictsInfo.get(schedules.get(0)));
+ assertNull(conflictsInfo.get(schedules.get(1)));
+ assertNull(conflictsInfo.get(schedules.get(2)));
+ assertNull(conflictsInfo.get(schedules.get(3)));
+ assertNull(conflictsInfo.get(schedules.get(4)));
+ assertNull(conflictsInfo.get(schedules.get(5)));
+ assertNull(conflictsInfo.get(schedules.get(6)));
+ assertFalse(conflictsInfo.get(schedules.get(7)));
+ assertFalse(conflictsInfo.get(schedules.get(8)));
+ assertFalse(conflictsInfo.get(schedules.get(9)));
+ assertTrue(conflictsInfo.get(schedules.get(10)));
+
+ conflictsInfo = DvrScheduleManager
+ .getConflictingSchedulesInfo(schedules, 3);
+
+ assertNull(conflictsInfo.get(schedules.get(0)));
+ assertNull(conflictsInfo.get(schedules.get(1)));
+ assertNull(conflictsInfo.get(schedules.get(2)));
+ assertNull(conflictsInfo.get(schedules.get(3)));
+ assertNull(conflictsInfo.get(schedules.get(4)));
+ assertNull(conflictsInfo.get(schedules.get(5)));
+ assertNull(conflictsInfo.get(schedules.get(6)));
+ assertNull(conflictsInfo.get(schedules.get(7)));
+ assertTrue(conflictsInfo.get(schedules.get(8)));
+ assertNull(conflictsInfo.get(schedules.get(9)));
+ assertTrue(conflictsInfo.get(schedules.get(10)));
}
} \ No newline at end of file
diff --git a/tests/unit/src/com/android/tv/dvr/EpisodicProgramLoadTaskTest.java b/tests/unit/src/com/android/tv/dvr/EpisodicProgramLoadTaskTest.java
new file mode 100644
index 00000000..2172d488
--- /dev/null
+++ b/tests/unit/src/com/android/tv/dvr/EpisodicProgramLoadTaskTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tv.dvr;
+
+import android.os.Build;
+import android.support.test.filters.SdkSuppress;
+import android.support.test.filters.SmallTest;
+import android.test.AndroidTestCase;
+
+import com.android.tv.dvr.EpisodicProgramLoadTask.ScheduledEpisode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link EpisodicProgramLoadTask}
+ */
+@SmallTest
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
+public class EpisodicProgramLoadTaskTest extends AndroidTestCase {
+ private static final long SERIES_RECORDING_ID1 = 1;
+ private static final long SERIES_RECORDING_ID2 = 2;
+ private static final String SEASON_NUMBER1 = "SEASON NUMBER1";
+ private static final String SEASON_NUMBER2 = "SEASON NUMBER2";
+ private static final String EPISODE_NUMBER1 = "EPISODE NUMBER1";
+ private static final String EPISODE_NUMBER2 = "EPISODE NUMBER2";
+
+ public void testEpisodeAlreadyScheduled_true() {
+ List<ScheduledEpisode> episodes = new ArrayList<>();
+ ScheduledEpisode episode = new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER1,
+ EPISODE_NUMBER1);
+ episodes.add(episode);
+ assertTrue(EpisodicProgramLoadTask.isEpisodeScheduled(episodes,
+ new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER1, EPISODE_NUMBER1)));
+ }
+
+ public void testEpisodeAlreadyScheduled_false() {
+ List<ScheduledEpisode> episodes = new ArrayList<>();
+ ScheduledEpisode episode = new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER1,
+ EPISODE_NUMBER1);
+ episodes.add(episode);
+ assertFalse(EpisodicProgramLoadTask.isEpisodeScheduled(episodes,
+ new ScheduledEpisode(SERIES_RECORDING_ID2, SEASON_NUMBER1, EPISODE_NUMBER1)));
+ assertFalse(EpisodicProgramLoadTask.isEpisodeScheduled(episodes,
+ new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER2, EPISODE_NUMBER1)));
+ assertFalse(EpisodicProgramLoadTask.isEpisodeScheduled(episodes,
+ new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER1, EPISODE_NUMBER2)));
+ }
+
+ public void testEpisodeAlreadyScheduled_null() {
+ List<ScheduledEpisode> episodes = new ArrayList<>();
+ ScheduledEpisode episode = new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER1,
+ EPISODE_NUMBER1);
+ episodes.add(episode);
+ assertFalse(EpisodicProgramLoadTask.isEpisodeScheduled(episodes,
+ new ScheduledEpisode(SERIES_RECORDING_ID1, null, EPISODE_NUMBER1)));
+ assertFalse(EpisodicProgramLoadTask.isEpisodeScheduled(episodes,
+ new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER1, null)));
+ assertFalse(EpisodicProgramLoadTask.isEpisodeScheduled(episodes,
+ new ScheduledEpisode(SERIES_RECORDING_ID1, null, null)));
+ }
+}
diff --git a/tests/unit/src/com/android/tv/dvr/recorder/InputTaskSchedulerTest.java b/tests/unit/src/com/android/tv/dvr/InputTaskSchedulerTest.java
index ef0d5fab..85c78ce2 100644
--- a/tests/unit/src/com/android/tv/dvr/recorder/InputTaskSchedulerTest.java
+++ b/tests/unit/src/com/android/tv/dvr/InputTaskSchedulerTest.java
@@ -14,11 +14,12 @@
* limitations under the License
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.after;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
@@ -36,10 +37,7 @@ import android.test.AndroidTestCase;
import com.android.tv.InputSessionManager;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.WritableDvrDataManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.recorder.InputTaskScheduler.RecordingTaskFactory;
+import com.android.tv.dvr.InputTaskScheduler.RecordingTaskFactory;
import com.android.tv.testing.FakeClock;
import com.android.tv.testing.dvr.RecordingTestUtils;
import com.android.tv.util.Clock;
@@ -145,7 +143,7 @@ public class InputTaskSchedulerTest extends AndroidTestCase {
verify(mRecordingTasks.get(0), timeout((int) LISTENER_TIMEOUT_MS).times(1)).start();
// The first schedule should not be stopped because the second one should wait for the end
// of the first schedule.
- verify(mRecordingTasks.get(0), timeout((int) LISTENER_TIMEOUT_MS).never()).stop();
+ verify(mRecordingTasks.get(0), after((int) LISTENER_TIMEOUT_MS).never()).stop();
}
public void testAddSchedule_consecutiveNoFail() throws Exception {
@@ -165,9 +163,9 @@ public class InputTaskSchedulerTest extends AndroidTestCase {
LOW_PRIORITY, startTimeMs, endTimeMs));
mScheduler.handleBuildSchedule();
verify(mRecordingTasks.get(0), timeout((int) LISTENER_TIMEOUT_MS).times(1)).start();
- verify(mRecordingTasks.get(0), timeout((int) LISTENER_TIMEOUT_MS).never()).stop();
+ verify(mRecordingTasks.get(0), after((int) LISTENER_TIMEOUT_MS).never()).stop();
// The second schedule should not fail because it can starts after the first one finishes.
- verify(mDataManager, timeout((int) LISTENER_TIMEOUT_MS).never())
+ verify(mDataManager, after((int) LISTENER_TIMEOUT_MS).never())
.changeState(any(ScheduledRecording.class),
eq(ScheduledRecording.STATE_RECORDING_FAILED));
}
@@ -189,7 +187,7 @@ public class InputTaskSchedulerTest extends AndroidTestCase {
HIGH_PRIORITY, startTimeMs, endTimeMs));
mScheduler.handleBuildSchedule();
verify(mRecordingTasks.get(0), timeout((int) LISTENER_TIMEOUT_MS).times(1)).start();
- verify(mRecordingTasks.get(0), timeout((int) LISTENER_TIMEOUT_MS).never()).stop();
+ verify(mRecordingTasks.get(0), after((int) LISTENER_TIMEOUT_MS).never()).stop();
// The second schedule should wait until the first one finishes rather than creating a new
// session even though there are available tuners.
assertTrue(mRecordingTasks.size() == 1);
@@ -202,7 +200,7 @@ public class InputTaskSchedulerTest extends AndroidTestCase {
mScheduler.handleAddSchedule(r);
mScheduler.handleBuildSchedule();
mScheduler.handleUpdateSchedule(r);
- verify(mRecordingTasks.get(0), timeout((int) LISTENER_TIMEOUT_MS).never()).cancel();
+ verify(mRecordingTasks.get(0), after((int) LISTENER_TIMEOUT_MS).never()).cancel();
}
public void testUpdateSchedule_cancel() throws Exception {
diff --git a/tests/unit/src/com/android/tv/dvr/recorder/RecordingTaskTest.java b/tests/unit/src/com/android/tv/dvr/RecordingTaskTest.java
index 076773e7..7404a554 100644
--- a/tests/unit/src/com/android/tv/dvr/recorder/RecordingTaskTest.java
+++ b/tests/unit/src/com/android/tv/dvr/RecordingTaskTest.java
@@ -14,17 +14,17 @@
* limitations under the License
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.longThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
+import static org.mockito.hamcrest.MockitoHamcrest.longThat;
import android.os.Build;
import android.os.Handler;
@@ -37,18 +37,15 @@ import android.test.AndroidTestCase;
import com.android.tv.InputSessionManager;
import com.android.tv.InputSessionManager.RecordingSession;
import com.android.tv.data.Channel;
-import com.android.tv.dvr.DvrDataManagerInMemoryImpl;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
-import com.android.tv.dvr.recorder.RecordingTask.State;
+import com.android.tv.dvr.RecordingTask.State;
import com.android.tv.testing.FakeClock;
import com.android.tv.testing.dvr.RecordingTestUtils;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
-import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.compat.ArgumentMatcher;
import java.util.concurrent.TimeUnit;
@@ -160,10 +157,10 @@ public class RecordingTaskTest extends AndroidTestCase {
private static ArgumentMatcher<Message> messageMatchesWhat(final int what) {
return new ArgumentMatcher<Message>() {
@Override
- public boolean matches(Object argument) {
+ public boolean matchesObject(Object argument) {
Message message = (Message) argument;
return message.what == what;
}
};
}
-} \ No newline at end of file
+}
diff --git a/tests/unit/src/com/android/tv/dvr/recorder/ScheduledProgramReaperTest.java b/tests/unit/src/com/android/tv/dvr/ScheduledProgramReaperTest.java
index d434a34e..847540c2 100644
--- a/tests/unit/src/com/android/tv/dvr/recorder/ScheduledProgramReaperTest.java
+++ b/tests/unit/src/com/android/tv/dvr/ScheduledProgramReaperTest.java
@@ -14,20 +14,15 @@
* limitations under the License.
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
-import android.os.Build;
-import android.support.test.filters.SdkSuppress;
-import android.support.test.filters.SmallTest;
-import android.test.AndroidTestCase;
import android.test.MoreAsserts;
-import com.android.tv.dvr.DvrDataManagerInMemoryImpl;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.testing.FakeClock;
import com.android.tv.testing.dvr.RecordingTestUtils;
+import junit.framework.TestCase;
+
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -36,9 +31,7 @@ import java.util.concurrent.TimeUnit;
/**
* Tests for {@link ScheduledProgramReaper}.
*/
-@SmallTest
-@SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
-public class ScheduledProgramReaperTest extends AndroidTestCase {
+public class ScheduledProgramReaperTest extends TestCase {
private static final String INPUT_ID = "input_id";
private static final int CHANNEL_ID = 273;
private static final long DURATION = TimeUnit.HOURS.toMillis(1);
@@ -48,12 +41,13 @@ public class ScheduledProgramReaperTest extends AndroidTestCase {
private DvrDataManagerInMemoryImpl mDvrDataManager;
@Mock private DvrManager mDvrManager;
+
@Override
protected void setUp() throws Exception {
super.setUp();
MockitoAnnotations.initMocks(this);
mFakeClock = FakeClock.createWithTimeOne();
- mDvrDataManager = new DvrDataManagerInMemoryImpl(getContext(), mFakeClock);
+ mDvrDataManager = new DvrDataManagerInMemoryImpl(null, mFakeClock);
mReaper = new ScheduledProgramReaper(mDvrDataManager, mFakeClock);
}
diff --git a/tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java b/tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java
index 426e60ba..96036418 100644
--- a/tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java
+++ b/tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java
@@ -26,7 +26,6 @@ import android.util.Range;
import com.android.tv.data.Channel;
import com.android.tv.data.Program;
-import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.testing.dvr.RecordingTestUtils;
import junit.framework.TestCase;
diff --git a/tests/unit/src/com/android/tv/dvr/recorder/SchedulerTest.java b/tests/unit/src/com/android/tv/dvr/SchedulerTest.java
index 94cfaac1..30ac1ff1 100644
--- a/tests/unit/src/com/android/tv/dvr/recorder/SchedulerTest.java
+++ b/tests/unit/src/com/android/tv/dvr/SchedulerTest.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
@@ -31,9 +31,6 @@ import android.test.AndroidTestCase;
import com.android.tv.InputSessionManager;
import com.android.tv.data.ChannelDataManager;
-import com.android.tv.dvr.DvrDataManagerInMemoryImpl;
-import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.testing.FakeClock;
import com.android.tv.testing.dvr.RecordingTestUtils;
import com.android.tv.util.TvInputManagerHelper;
@@ -87,13 +84,13 @@ public class SchedulerTest extends AndroidTestCase {
startTime + TimeUnit.HOURS.toMillis(1));
mDataManager.addScheduledRecording(r);
mScheduler.start();
- verify(mMockAlarmManager).setExactAndAllowWhileIdle(
+ verify(mMockAlarmManager).set(
eq(AlarmManager.RTC_WAKEUP),
eq(startTime - Scheduler.MS_TO_WAKE_BEFORE_START),
any(PendingIntent.class));
Mockito.reset(mMockAlarmManager);
mScheduler.update();
- verify(mMockAlarmManager).setExactAndAllowWhileIdle(
+ verify(mMockAlarmManager).set(
eq(AlarmManager.RTC_WAKEUP),
eq(startTime - Scheduler.MS_TO_WAKE_BEFORE_START),
any(PendingIntent.class));
diff --git a/tests/unit/src/com/android/tv/dvr/recorder/SeriesRecordingSchedulerTest.java b/tests/unit/src/com/android/tv/dvr/SeriesRecordingSchedulerTest.java
index afb9c042..efefb93c 100644
--- a/tests/unit/src/com/android/tv/dvr/recorder/SeriesRecordingSchedulerTest.java
+++ b/tests/unit/src/com/android/tv/dvr/SeriesRecordingSchedulerTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.dvr.recorder;
+package com.android.tv.dvr;
import android.os.Build;
import android.support.test.filters.SdkSuppress;
@@ -24,8 +24,6 @@ import android.test.MoreAsserts;
import android.util.LongSparseArray;
import com.android.tv.data.Program;
-import com.android.tv.dvr.DvrDataManagerInMemoryImpl;
-import com.android.tv.dvr.data.SeriesRecording;
import com.android.tv.testing.FakeClock;
import java.util.ArrayList;
diff --git a/tests/unit/src/com/android/tv/dvr/data/SeriesRecordingTest.java b/tests/unit/src/com/android/tv/dvr/SeriesRecordingTest.java
index 7512ed0e..c48fec02 100644
--- a/tests/unit/src/com/android/tv/dvr/data/SeriesRecordingTest.java
+++ b/tests/unit/src/com/android/tv/dvr/SeriesRecordingTest.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.tv.dvr.data;
+package com.android.tv.dvr;
import android.os.Build;
import android.os.Parcel;
diff --git a/tests/unit/src/com/android/tv/dvr/provider/EpisodicProgramLoadTaskTest.java b/tests/unit/src/com/android/tv/dvr/provider/EpisodicProgramLoadTaskTest.java
deleted file mode 100644
index 301c453d..00000000
--- a/tests/unit/src/com/android/tv/dvr/provider/EpisodicProgramLoadTaskTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.dvr.provider;
-
-import android.os.Build;
-import android.support.test.filters.SdkSuppress;
-import android.support.test.filters.SmallTest;
-import android.test.AndroidTestCase;
-
-import com.android.tv.dvr.data.SeasonEpisodeNumber;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Tests for {@link EpisodicProgramLoadTask}
- */
-@SmallTest
-@SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
-public class EpisodicProgramLoadTaskTest extends AndroidTestCase {
- private static final long SERIES_RECORDING_ID1 = 1;
- private static final long SERIES_RECORDING_ID2 = 2;
- private static final String SEASON_NUMBER1 = "SEASON NUMBER1";
- private static final String SEASON_NUMBER2 = "SEASON NUMBER2";
- private static final String EPISODE_NUMBER1 = "EPISODE NUMBER1";
- private static final String EPISODE_NUMBER2 = "EPISODE NUMBER2";
-
- public void testEpisodeAlreadyScheduled_true() {
- List<SeasonEpisodeNumber> seasonEpisodeNumbers = new ArrayList<>();
- SeasonEpisodeNumber seasonEpisodeNumber = new SeasonEpisodeNumber(
- SERIES_RECORDING_ID1, SEASON_NUMBER1, EPISODE_NUMBER1);
- seasonEpisodeNumbers.add(seasonEpisodeNumber);
- assertTrue(seasonEpisodeNumbers.contains(
- new SeasonEpisodeNumber(SERIES_RECORDING_ID1, SEASON_NUMBER1, EPISODE_NUMBER1)));
- }
-
- public void testEpisodeAlreadyScheduled_false() {
- List<SeasonEpisodeNumber> seasonEpisodeNumbers = new ArrayList<>();
- SeasonEpisodeNumber seasonEpisodeNumber = new SeasonEpisodeNumber(
- SERIES_RECORDING_ID1, SEASON_NUMBER1, EPISODE_NUMBER1);
- seasonEpisodeNumbers.add(seasonEpisodeNumber);
- assertFalse(seasonEpisodeNumbers.contains(
- new SeasonEpisodeNumber(SERIES_RECORDING_ID2, SEASON_NUMBER1, EPISODE_NUMBER1)));
- assertFalse(seasonEpisodeNumbers.contains(
- new SeasonEpisodeNumber(SERIES_RECORDING_ID1, SEASON_NUMBER2, EPISODE_NUMBER1)));
- assertFalse(seasonEpisodeNumbers.contains(
- new SeasonEpisodeNumber(SERIES_RECORDING_ID1, SEASON_NUMBER1, EPISODE_NUMBER2)));
- }
-
- public void testEpisodeAlreadyScheduled_null() {
- List<SeasonEpisodeNumber> seasonEpisodeNumbers = new ArrayList<>();
- SeasonEpisodeNumber seasonEpisodeNumber = new SeasonEpisodeNumber(
- SERIES_RECORDING_ID1, SEASON_NUMBER1, EPISODE_NUMBER1);
- seasonEpisodeNumbers.add(seasonEpisodeNumber);
- assertFalse(seasonEpisodeNumbers.contains(
- new SeasonEpisodeNumber(SERIES_RECORDING_ID1, null, EPISODE_NUMBER1)));
- assertFalse(seasonEpisodeNumbers.contains(
- new SeasonEpisodeNumber(SERIES_RECORDING_ID1, SEASON_NUMBER1, null)));
- assertFalse(seasonEpisodeNumbers.contains(
- new SeasonEpisodeNumber(SERIES_RECORDING_ID1, null, null)));
- }
-} \ No newline at end of file
diff --git a/tests/unit/src/com/android/tv/dvr/ui/SortedArrayAdapterTest.java b/tests/unit/src/com/android/tv/dvr/ui/SortedArrayAdapterTest.java
index 8fc8270f..a571e626 100644
--- a/tests/unit/src/com/android/tv/dvr/ui/SortedArrayAdapterTest.java
+++ b/tests/unit/src/com/android/tv/dvr/ui/SortedArrayAdapterTest.java
@@ -32,10 +32,10 @@ import java.util.Objects;
@SmallTest
public class SortedArrayAdapterTest extends TestCase {
- public static final TestData P1 = TestData.create(1, "c");
- public static final TestData P2 = TestData.create(2, "b");
- public static final TestData P3 = TestData.create(3, "a");
- public static final TestData EXTRA = TestData.create(4, "k");
+ public static final TestData P1 = TestData.create(1, "one");
+ public static final TestData P2 = TestData.create(2, "before");
+ public static final TestData P3 = TestData.create(3, "other");
+ public static final TestData EXTRA = TestData.create(4, "extra");
private TestSortedArrayAdapter mAdapter;
@Override
@@ -111,43 +111,6 @@ public class SortedArrayAdapterTest extends TestCase {
assertContentsInOrder(mAdapter, P1);
mAdapter.remove(P1);
assertEmpty();
- mAdapter.add(P1);
- mAdapter.add(P2);
- mAdapter.add(P3);
- assertContentsInOrder(mAdapter, P3, P2, P1);
- mAdapter.removeItems(0, 2);
- assertContentsInOrder(mAdapter, P1);
- mAdapter.add(P2);
- mAdapter.add(P3);
- mAdapter.addExtraItem(EXTRA);
- assertContentsInOrder(mAdapter, P3, P2, P1, EXTRA);
- mAdapter.removeItems(1, 1);
- assertContentsInOrder(mAdapter, P3, P1, EXTRA);
- mAdapter.removeItems(1, 2);
- assertContentsInOrder(mAdapter, P3);
- mAdapter.addExtraItem(EXTRA);
- mAdapter.addExtraItem(P2);
- mAdapter.add(P1);
- assertContentsInOrder(mAdapter, P3, P1, EXTRA, P2);
- mAdapter.removeItems(1, 2);
- assertContentsInOrder(mAdapter, P3, P2);
- mAdapter.add(P1);
- assertContentsInOrder(mAdapter, P3, P1, P2);
- }
-
- public void testReplace() {
- mAdapter.add(P1);
- mAdapter.add(P2);
- assertNotEmpty();
- assertContentsInOrder(mAdapter, P2, P1);
- mAdapter.replace(1, P3);
- assertContentsInOrder(mAdapter, P3, P2);
- mAdapter.replace(0, P1);
- assertContentsInOrder(mAdapter, P2, P1);
- mAdapter.addExtraItem(EXTRA);
- assertContentsInOrder(mAdapter, P2, P1, EXTRA);
- mAdapter.replace(2, P3);
- assertContentsInOrder(mAdapter, P2, P1, P3);
}
public void testChange_sorting() {
@@ -231,7 +194,7 @@ public class SortedArrayAdapterTest extends TestCase {
}
@Override
- protected long getId(TestData item) {
+ long getId(TestData item) {
return item.mId;
}
}
diff --git a/tests/unit/src/com/android/tv/experiments/ExperimentsTest.java b/tests/unit/src/com/android/tv/experiments/ExperimentsTest.java
deleted file mode 100644
index ab709e39..00000000
--- a/tests/unit/src/com/android/tv/experiments/ExperimentsTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.tv.experiments;
-
-import android.support.test.filters.SmallTest;
-
-import com.android.tv.common.BuildConfig;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Tests for {@link Experiments}.
- */
-@SmallTest
-public class ExperimentsTest extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- ExperimentFlag.initForTest();
- }
-
-
- public void testEngOnlyDefault() {
- assertEquals("ENABLE_DEVELOPER_FEATURES", Boolean.valueOf(BuildConfig.ENG),
- Experiments.ENABLE_DEVELOPER_FEATURES.get());
- }
-
-
-}
diff --git a/usbtuner-res/animator/setup_before_entry.xml b/usbtuner-res/animator/setup_before_entry.xml
new file mode 100644
index 00000000..82ed7992
--- /dev/null
+++ b/usbtuner-res/animator/setup_before_entry.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:ordering="together" >
+ <objectAnimator
+ android:duration="@android:integer/config_longAnimTime"
+ android:propertyName="translationX"
+ android:valueFrom="@dimen/ut_guidedstep_entry_slide_from"
+ android:valueTo="@dimen/ut_guidedstep_entry_slide_from"
+ android:valueType="floatType" />
+
+ <objectAnimator
+ android:duration="@android:integer/config_longAnimTime"
+ android:propertyName="alpha"
+ android:valueFrom="0.0"
+ android:valueTo="0.0"
+ android:valueType="floatType" />
+</set>
diff --git a/usbtuner-res/animator/setup_before_exit.xml b/usbtuner-res/animator/setup_before_exit.xml
new file mode 100644
index 00000000..5c00064c
--- /dev/null
+++ b/usbtuner-res/animator/setup_before_exit.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:ordering="together" >
+
+ <objectAnimator
+ android:duration="@android:integer/config_longAnimTime"
+ android:propertyName="translationX"
+ android:valueFrom="0.0"
+ android:valueTo="0.0"
+ android:valueType="floatType" />
+
+ <objectAnimator
+ android:duration="@android:integer/config_longAnimTime"
+ android:propertyName="alpha"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType" />
+
+</set>
diff --git a/usbtuner-res/animator/setup_entry.xml b/usbtuner-res/animator/setup_entry.xml
new file mode 100644
index 00000000..35fcd4a3
--- /dev/null
+++ b/usbtuner-res/animator/setup_entry.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:interpolator/linear_out_slow_in"
+ android:ordering="together" >
+
+ <objectAnimator
+ android:duration="@integer/ut_entry_anim_duration"
+ android:propertyName="translationX"
+ android:valueFrom="@dimen/ut_guidedstep_entry_slide_from"
+ android:valueTo="0.0"
+ android:valueType="floatType" />
+
+ <objectAnimator
+ android:duration="@integer/ut_entry_anim_duration"
+ android:propertyName="alpha"
+ android:valueFrom="0.0"
+ android:valueTo="1.0"
+ android:valueType="floatType" />
+
+</set>
diff --git a/usbtuner-res/animator/setup_exit.xml b/usbtuner-res/animator/setup_exit.xml
new file mode 100644
index 00000000..4ce89cd6
--- /dev/null
+++ b/usbtuner-res/animator/setup_exit.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:interpolator/fast_out_linear_in"
+ android:ordering="together" >
+
+ <objectAnimator
+ android:duration="@integer/ut_exit_anim_duration"
+ android:propertyName="translationX"
+ android:valueFrom="0.0"
+ android:valueTo="@dimen/ut_guidedstep_exit_slide_to"
+ android:valueType="floatType" />
+
+ <objectAnimator
+ android:duration="@integer/ut_exit_anim_duration"
+ android:propertyName="alpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.0"
+ android:valueType="floatType" />
+
+</set>
diff --git a/usbtuner-res/drawable-xhdpi/ic_setup_antenna.png b/usbtuner-res/drawable-xhdpi/ic_setup_antenna.png
new file mode 100644
index 00000000..bb6d416e
--- /dev/null
+++ b/usbtuner-res/drawable-xhdpi/ic_setup_antenna.png
Binary files differ
diff --git a/usbtuner-res/drawable/ut_selector_background.xml b/usbtuner-res/drawable/ut_selector_background.xml
new file mode 100644
index 00000000..fb3899aa
--- /dev/null
+++ b/usbtuner-res/drawable/ut_selector_background.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:enterFadeDuration="@android:integer/config_shortAnimTime"
+ android:exitFadeDuration="@android:integer/config_shortAnimTime"
+ android:color="?android:attr/colorControlHighlight">
+ <item android:id="@android:id/mask">
+ <shape android:shape="rectangle" >
+ <solid android:color="@android:color/white" />
+ <corners android:radius="2dp" />
+ </shape>
+ </item>
+</ripple>
diff --git a/res/layout/tuning_block.xml b/usbtuner-res/layout/ut_activity_playback.xml
index a7604f0c..b640e6d5 100644
--- a/res/layout/tuning_block.xml
+++ b/usbtuner-res/layout/ut_activity_playback.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2016 The Android Open Source Project
+ ~ Copyright (C) 2015 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
@@ -15,16 +15,17 @@
~ limitations under the License.
-->
-<com.android.tv.ui.TuningBlockView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/tuning_block"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keepScreenOn="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@android:color/black">
- <ImageView
- android:id="@+id/image"
- android:visibility="gone"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scaleType="fitCenter"/>
+ android:orientation="vertical" >
-</com.android.tv.ui.TuningBlockView> \ No newline at end of file
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ <SurfaceView
+ android:id="@+id/surface1"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+</LinearLayout>
diff --git a/usbtuner-res/layout/ut_guidance.xml b/usbtuner-res/layout/ut_guidance.xml
new file mode 100644
index 00000000..4f7d3f7a
--- /dev/null
+++ b/usbtuner-res/layout/ut_guidance.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT 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"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@null"
+ android:paddingStart="@dimen/ut_guidance_padding_start"
+ android:paddingEnd="@dimen/ut_guidance_padding_end"
+ android:paddingTop="@dimen/ut_guidance_padding_top"
+ android:clipToPadding="false"
+ android:clipChildren="false" >
+ <ImageView
+ android:id="@+id/guidance_icon"
+ android:visibility="gone"
+ style="?attr/guidanceIconStyle"
+ tools:ignore="ContentDescription" />
+ <RelativeLayout
+ style="?attr/guidanceContainerStyle" >
+ <Space
+ android:id="@+id/guidance_anchor_space"
+ style="@style/ut_guidance_anchor" />
+ <TextView
+ android:id="@+id/guidance_title"
+ style="?attr/guidanceTitleStyle" />
+ <TextView
+ android:id="@+id/guidance_breadcrumb"
+ style="?attr/guidanceBreadcrumbStyle" />
+ <TextView
+ android:id="@+id/guidance_description"
+ style="?attr/guidanceDescriptionStyle" />
+ </RelativeLayout>
+</FrameLayout>
diff --git a/usbtuner-res/layout/ut_guidedactions.xml b/usbtuner-res/layout/ut_guidedactions.xml
new file mode 100644
index 00000000..ae7efc0d
--- /dev/null
+++ b/usbtuner-res/layout/ut_guidedactions.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!-- Layout for the settings list fragment -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@null"
+ android:paddingStart="@dimen/ut_guidedactions_padding_start"
+ android:paddingEnd="@dimen/ut_guidedactions_padding_end"
+ android:paddingTop="@dimen/ut_guidedactions_padding_top"
+ android:paddingBottom="@dimen/ut_guidedactions_padding_bottom"
+ android:clipToPadding="false"
+ android:clipChildren="false" >
+ <RelativeLayout
+ style="?attr/guidedActionsContainerStyle" >
+ <Space
+ android:id="@+id/guidedactions_anchor_space"
+ style="@style/ut_guidedactions_anchor" />
+ <FrameLayout
+ android:id="@+id/guidedactions_selector"
+ style="@style/ut_guidedactions_null_selector" />
+ <android.support.v17.leanback.widget.VerticalGridView
+ android:id="@+id/guidedactions_list"
+ style="?attr/guidedActionsListStyle" />
+ </RelativeLayout>
+</FrameLayout> \ No newline at end of file
diff --git a/usbtuner-res/values-af/strings.xml b/usbtuner-res/values-af/strings.xml
index 2154fd9e..4337a696 100644
--- a/usbtuner-res/values-af/strings.xml
+++ b/usbtuner-res/values-af/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV-ontvanger"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-TV-ontvanger"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Netwerk-TV-ontvanger (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Aan"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Af"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Wag asseblief dat verwerking voltooi word"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Kies jou kanaalbron"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Geen sein nie"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Kon nie op <xliff:g id="CHANNEL_NAME">%s</xliff:g> inskakel nie"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Kon nie inskakel nie"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Ontvangersagteware is onlangs opgedateer. Herskandeer die kanale asseblief."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Aktiveer omringklank in stelselklankinstellings om oudio te aktiveer"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Kan nie oudio speel nie. Probeer asseblief \'n ander TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Opstelling van kanaalontvanger"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Opstelling van TV-ontvanger"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Opstelling van USB-kanaalontvanger"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Opstelling van netwerkontvanger"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Maak seker dat jou TV aan \'n TV-seinbron gekoppel is.\n\nAs jy \'n oor-die-lug-antenna gebruik, sal jy dalk sy plasing of rigting moet verander om die meeste kanale te ontvang. Plaas dit vir die beste resultate hoog en naby \'n venster."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Maak seker dat die USB-ontvanger ingeprop en aan \'n TV-seinbron gekoppel is.\n\nAs jy \'n oor-die-lug-antenna gebruik, sal jy dalk sy posisie of rigting moet verander om die meeste kanale te ontvang. Plaas dit vir die beste resultate hoog en naby \'n venster."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Maak seker dat die netwerkontvanger aangeskakel is en aan \'n TV-seinbron gekoppel is.\n\nAs jy \'n oor-die-lug-antenna gebruik, sal jy dalk sy plasing of rigting waarin hy wys, moet verstel om die meeste kanale te ontvang. Plaas dit vir die beste resultate hoog en naby \'n venster."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Gaan voort"</item>
<item msgid="727245208787621142">"Nie nou nie"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Doen kanaalopstelling weer?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Dit sal die kanale wat ontvang is, uit die TV-ontvanger verwyder en weer nuwe kanale soek.\n\nMaak seker dat jou TV aan \'n TV-seinbron gekoppel is.\n\nAs jy \'n oor-die-lug-antenna gebruik, sal jy dalk sy plasing of rigting moet verander om die meeste kanale te ontvang. Plaas dit vir die beste resultate hoog en naby \'n venster."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Dit sal die kanale wat gevind is, uit die USB-ontvanger verwyder en weer nuwe kanale soek.\n\nMaak seker dat die USB-ontvanger ingeprop en aan \'n TV-seinbron gekoppel is.\n\nAs jy \'n oor-die-lug-antenna gebruik, sal jy dalk sy posisie of rigting moet verander om die meeste kanale te ontvang. Plaas dit vir die beste resultate hoog en naby \'n venster."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Dit sal die kanale wat gevind is van die netwerkontvanger af verwyder en weer na nuwe kanale soek.\n\nMaak seker dat die netwerkontvanger aangeskakel is en aan \'n TV-seinbron gekoppel is.\n\nAs jy \'n oor-die-lug-antenna gebruik, sal jy dalk sy plasing of rigting waarin hy wys, moet verstel om die meeste kanale te ontvang. Plaas dit vir die beste resultate hoog en naby \'n venster."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Gaan voort"</item>
<item msgid="235450158666155406">"Kanselleer"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Opstelling van TV-ontvanger"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Opstelling van USB-kanaalontvanger"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Opstelling van netwerkkanaalontvanger"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Dit kan \'n paar minute neem"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Seinontvanger is tydelik nie beskikbaar nie of word reeds deur opname gebruik."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Geen kanale gevind nie"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Geen kanale is in die soektog gevind nie. Maak seker dat jou TV aan \'n TV-seinbron gekoppel is.\n\nAs jy \'n oor-die-lug-antenna gebruik, verander sy plasing of rigting. Plaas dit vir die beste resultate hoog en naby \'n venster en soek weer."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Geen kanale is in die soektog gevind nie. Maak seker dat die USB-ontvanger ingeprop en aan \'n TV-seinbron gekoppel is.\n\nAs jy \'n oor-die-lug-antenna gebruik, verander sy posisie of rigting. Plaas dit vir die beste resultate hoog en naby \'n venster en soek weer."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Geen kanale is in die soektog gevind nie. Maak seker dat die netwerkontvanger aangeskakel is en aan \'n TV-seinbron gekoppel is.\n\nAs jy \'n oor-die-lug-antenna gebruik, verstel sy plasing of rigting waarin hy wys. Plaas dit vir die beste resultate hoog en naby \'n venster en soek weer."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Soek weer"</item>
<item msgid="2092797862490235174">"Klaar"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Soek TV-kanale"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Opstelling van TV-ontvanger"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Opstelling van USB-TV-ontvanger"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Opstelling van netwerk-TV-ontvanger"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-TV-ontvanger is ontkoppel."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Netwerkontvanger is ontkoppel."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-TV-ontvanger is ontkoppel."</string>
</resources>
diff --git a/usbtuner-res/values-am/strings.xml b/usbtuner-res/values-am/strings.xml
index 9ae0dc44..a903ee76 100644
--- a/usbtuner-res/values-am/strings.xml
+++ b/usbtuner-res/values-am/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"የቴሌቪዥን መቃኛ"</string>
<string name="ut_app_name" msgid="8557698013780762454">"የዩኤስቢ ቴሌቪዥን መቃኛ"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"የአውታረ መረብ ቴሌቪዥን መቃኛ (ቅድመ-ይሁንታ)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"በርቷል"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"ጠፍቷል"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"ማስኬድን ለማጠናቀቅ እባክዎ ይጠብቁ"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"የጣቢያ ምንጭዎን ይምረጡ"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"ምንም ሲግናል የለም"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"ወደ <xliff:g id="CHANNEL_NAME">%s</xliff:g> መቃኘት አልተሳካም"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"መቃኘት አልተሳካም"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"የቴሌቪዥን መቃኛ ሶፍትዌር በቅርብ ጊዜ ተዘምኗል። እባክዎ ሰርጦቹን እንደገና ይቃኟቸው።"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ኦዲዮን ለማንቃት በስርዓት ድምጽ ቅንብሮች ውስጥ የዙሪያ ድምጽን ያንቁ"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"ኦዲዮ ማጫወት አይቻልም። እባክዎ ሌላ ቲቪ ይሞክሩ።"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"የጣቢያ መቃኛ ማዋቀር"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"የቴሌቪዥን መቃኛ ማዋቀር"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"የዩኤስቢ ጣቢያ መቃኛ ማዋቀር"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"የአውታረ መረብ መቃኛ ማዋቀር"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"የእርስዎ ቴሌቪዥን ከቴሌቪዥን ሲግናል ምልክት ምንጭ ጋር መገናኘቱን ያረጋግጡ።\n\nየአየር ላይ አንቴና የሚጠቀሙ ከሆነ አብዛኛዎቹን ጣቢያዎች ለመቀበል አቀማመጡን ወይም አቅጣጫውን ማስተካከል ሊኖርብዎት ይችላል። ለተሻሉ ውጤቶች ከፍ አድርገው ከመስኮት አጠገብ ያስቀምጡት።"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"የዩኤስቢ መቃኛው መሰካቱን እና ከቴሌቪዥን ምልክት ምንጭ ጋር መገናኘቱን ያረጋግጡ።\n\nየአየር ላይ አንቴና የሚጠቀሙ ከሆነ አቀማመጡን ወይም አቅጣጫውን ያስተካክሉ። ለተሻሉ ውጤቶች ከፍ አድርገው ከመስኮት አጠገብ ያስቀምጡት።"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"የአውታረ መረብ መቃኛው እና ከቴሌቪዥን ምልክት ምንጭ ጋር መገናኘቱን ያረጋግጡ።\n\nየአየር ላይ አንቴና የሚጠቀሙ ከሆነ አቀማመጡን ወይም አቅጣጫውን ያስተካክሉ። ለተሻሉ ውጤቶች ከፍ አድርገው ከመስኮት አጠገብ ያስቀምጡት።"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"ቀጥል"</item>
<item msgid="727245208787621142">"አሁን አይደለም"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"የጣቢያ ቅንብር እንደገና እንዲሄድ ይደረግ?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"ይሄ ከቴሌቪዥን መቃኛ የተገኙ ጣቢያዎችን አስወግዶ አዲስ ጣቢያዎችን እንደገና ይቃኛል።\n\nየእርስዎ ቴሌቪዥን ከቴሌቪዥን ሲግናል ምልክት ምንጭ ጋር መገናኘቱን ያረጋግጡ።\n\nየአየር ላይ አንቴና የሚጠቀሙ ከሆነ አብዛኛዎቹን ጣቢያዎች ለመቀበል አቀማመጡን ወይም አቅጣጫውን ማስተካከል ሊኖርብዎት ይችላል። ለተሻሉ ውጤቶች ከፍ አድርገው ከመስኮት አጠገብ ያስቀምጡት።"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"ይሄ ከዩኤስቢ መቃኛ የተገኙ ጣቢያዎችን አስወግዶ አዲስ ጣቢያዎችን እንደገና ይቃኛል።\n\nየዩኤስቢ መቃኛው መሰካቱን እና ከቴሌቪዥን ምልክት ምንጭ ጋር መገናኘቱን ያረጋግጡ።\n\nየአየር ላይ አንቴና የሚጠቀሙ ከሆነ አቀማመጡን ወይም አቅጣጫውን ያስተካክሉ። ለተሻሉ ውጤቶች ከፍ አድርገው ከመስኮት አጠገብ ያስቀምጡት።"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"ይሄ ከአውታረ መረብ መቃኛ የተገኙ ጣቢያዎችን አስወግዶ አዲስ ጣቢያዎችን እንደገና ይቃኛል።\n\nየአውታረ መረብ መቃኛው እና ከቴሌቪዥን ምልክት ምንጩ መገናኘቱን ያረጋግጡ።\n\nየአየር ላይ አንቴና የሚጠቀሙ ከሆነ አቀማመጡን ወይም አቅጣጫውን ያስተካክሉ። ለተሻሉ ውጤቶች ከፍ አድርገው ከመስኮት አጠገብ ያስቀምጡት።"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"ቀጥል"</item>
<item msgid="235450158666155406">"ይቅር"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"የቴሌቪዥን መቃኛ ማዋቀር"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"የዩኤስቢ ጣቢያ መቃኛ ማዋቀር"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"የአውታረ መረብ ጣቢያ መቃኛ ማዋቀር"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"ይሄ በርካታ ደቂቃዎችን ሊወስድ ይችላል"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"መቃኛው ለጊዜው አይገኝም ወይም አስቀድሞ በቀረጻው ጥቅም ላይ ውሏል።"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"ምንም ጣቢያዎች አልተገኙም"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"ቅኝቱ ምንም አዲስ ጣቢያዎችን አላገኘም። የእርስዎ ቴሌቪዥን ከቴሌቪዥን ሲግናል ምንጭ ጋር መገናኘቱን ያረጋግጡ።\n\nየአየር ላይ አንቴና ከሆነ የሚጠቀሙት አቀማመጡን ወይም አቅጣጫውን ያስተካክሉት። ለተሻሉ ውጤቶች ከፍ አድርገው ከመስኮት አጠገብ ያስቀምጡትና እንደገና ይቃኙ።"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"ቅኝቱ ምንም ጣቢያዎችን አላገኘም። የዩኤስቢ መቃኛው መሰካቱን እና ከቴሌቪዥን ሲግናል ምንጩ ጋር መገናኘቱን ያረጋግጡ።\n\nየአየር ላይ አንቴና የሚጠቀሙ ከሆነ አቀማመጡን ወይም አቅጣጫውን ያስተካክሉ። ለተሻሉ ውጤቶች ከፍ አድርገው ከመስኮት አጠገብ ያስቀምጡት እና እንደገና ይቃኙ።"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"ቅኝቱ ምንም ጣቢያዎችን አላገኘም። የአውታረ መረብ መቃኛው እንደበራ እና ከቴሌቪዥን ሲግናል ምንጩ ጋር መገናኘቱን ያረጋግጡ።\n\nየአየር ላይ አንቴና የሚጠቀሙ ከሆነ አቀማመጡን ወይም አቅጣጫውን ያስተካክሉ። ለተሻሉ ውጤቶች ከፍ አድርገው ከመስኮት አጠገብ ያስቀምጡት እና እንደገና ይቃኙ።"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"እንደገና ቃኝ"</item>
<item msgid="2092797862490235174">"ተከናውኗል"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"የቲቪ ጣቢያዎችን ቃኝ"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"የቴሌቪዥን መቃኛ ማዋቀር"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"የዩኤስቢ ቴሌቪዥን መቃኛ ማዋቀር"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"የአውታረ መረብ ቴሌቪዥን መቃኛ ማዋቀር"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"የዩኤስቢ ቴሌቪዥን መቃኛው ግንኙነት ተቋርጧል።"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"የአውታረ መረብ መቃኛ ግንኙነት ተቋርጧል።"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"የUSB TV መቃኛ ግንኙነቱ ተቋርጧል።"</string>
</resources>
diff --git a/usbtuner-res/values-ar/strings.xml b/usbtuner-res/values-ar/strings.xml
index 748425f4..ecfde3e8 100644
--- a/usbtuner-res/values-ar/strings.xml
+++ b/usbtuner-res/values-ar/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"موالف التلفزيون"</string>
<string name="ut_app_name" msgid="8557698013780762454">"‏موالف التلفزيون عبر USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"موالف التلفزيون على الشبكة (تجريبي)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"تشغيل"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"إيقاف"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"الرجاء الانتظار لحين انتهاء المعالجة"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"تحديد مصدر القنوات"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"لا توجد إشارة"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"أخفق الضبط على <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"أخفق الضبط"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"تم تحديث برنامج الموالف مؤخرًا. الرجاء إعادة البحث عن القنوات."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"يمكنك تشغيل الصوت المحيطي في إعدادات صوت النظام لتفعيل الصوت"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"لا يمكن تشغيل الصوت. الرجاء تجربة تلفزيون آخر."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"إعداد موالف القنوات"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"إعداد موالف التلفزيون"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"‏إعداد موالف قنوات USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"إعداد موالف الشبكة"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"تحقق من توصيل التلفزيون بمصدر إشارة البث التلفزيوني.\n\nإذا كنت تستخدم هوائيًا للتحديث عبر الهواء، فقد تحتاج إلى ضبط موضعه أو اتجاهه لاستقبال معظم القنوات، وللحصول على أفضل النتائج، ضعه عاليًا بالقرب من النافذة."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"‏تحقق من توصيل الموالف عبر USB بمصدر إشارة البث التلفزيوني.\n\nإذا كنت تستخدم هوائيًا للتحديث عبر الهواء، فقد تحتاج إلى ضبط موضعه أو اتجاهه لاستقبال معظم القنوات، وللحصول على أفضل النتائج، ضعه عاليًا بالقرب من النافذة."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"تحقق من تشغيل موالف الشبكة وتوصيله بمصدر إشارة التلفزيون.\n\nفي حالة استخدام هوائي للتحديث عبر الهواء، قد تحتاج إلى ضبط موضعه أو تجاهه لاستقبال معظم القنوات. وللحصول على أفضل النتائج، يمكنك وضعه في مكان مرتفع أو بالقرب من النافذة."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"متابعة"</item>
<item msgid="727245208787621142">"ليس الآن"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"هل تريد إعادة تشغيل إعداد القنوات؟"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"سيؤدي هذا إلى إزالة القنوات التي تم العثور عليها من موالف التلفزيون والبحث مرة أخرى عن قنوات جديدة.\n\nتحقق من توصيل التلفزيون بمصدر إشارة البث التلفزيوني.\n\nإذا كنت تستخدم هوائيًا للتحديث عبر الهواء، فقد تحتاج إلى ضبط موضعه أو اتجاهه لاستقبال معظم القنوات، وللحصول على أفضل النتائج، ضعه عاليًا بالقرب من النافذة."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"‏سيؤدي هذا إلى إزالة القنوات التي تم العثور عليها من الموالف عبر USB والبحث مرة أخرى عن قنوات جديدة.\n\nتحقق من توصيل الموالف عبر USB بمصدر إشارة البث التلفزيوني.\n\nإذا كنت تستخدم هوائيًا للتحديث عبر الهواء، فقد تحتاج إلى ضبط موضعه أو اتجاهه لاستقبال معظم القنوات، وللحصول على أفضل النتائج، ضعه عاليًا بالقرب من النافذة."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"سيؤدي هذا إلى إزالة القنوات الموجودة من موالف الشبكة وإعادة المسح بحثًا عن القنوات الجديدة.\n\nتحقق من تشغيل موالف الشبكة وتوصيله بمصدر إشارة التلفزيون.\n\nفي حالة استخدام هوائي للتحديث عبر الهواء، قد تحتاج إلى ضبط موضعه أو تجاهه لاستقبال معظم القنوات. وللحصول على أفضل النتائج، يمكنك وضعه في مكان مرتفع أو بالقرب من النافذة."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"متابعة"</item>
<item msgid="235450158666155406">"إلغاء"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"إعداد موالف التلفزيون"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"‏إعداد موالف قنوات USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"إعداد موالف قناة الشبكة"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"قد يستغرق هذا عدة دقائق"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"لا يتوفر الموالف مؤقتًا أو سبق استخدامه بواسطة التسجيل."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -88,7 +88,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"لم يتم العثور على قنوات"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"لم يتم العثور على أي قنوات أثناء البحث، لذا عليك التحقق من توصيل التلفزيون بمصدر إشارة البث التلفزيوني.\n\nإذا كنت تستخدم هوائيًا للتحديث عبر الهواء، فاضبط موضعه أو اتجاهه، وللحصول على أفضل النتائج، ضعه عاليًا بالقرب من النافذة ثم أعد البحث."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"‏لم يتم العثور على أي قنوات أثناء البحث، تحقق من توصيل الموالف عبر USB بمصدر إشارة البث التلفزيوني.\n\nإذا كنت تستخدم هوائيًا للتحديث عبر الهواء، فاضبط موضعه أو اتجاهه، وللحصول على أفضل النتائج، ضعه عاليًا بالقرب من النافذة ثم أعد البحث."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"لم يتم العثور على أي قنوات خلال المسح. تحقق من تشغيل موالف الشبكة وتوصيله بمصدر إشارة التلفزيون.\n\nفي حالة استخدام هوائي للتحديث عبر الهواء، يجب ضبط موضعه أو تجاهه. وللحصول على أفضل النتائج، يمكنك وضعه في مكان مرتفع أو بالقرب من النافذة وإعادة المسح."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"بحث مرة أخرى"</item>
<item msgid="2092797862490235174">"تم"</item>
@@ -96,7 +95,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"البحث عن قنوات تلفزيونية"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"إعداد موالف التلفزيون"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"‏إعداد موالف التلفزيون عبر USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"إعداد موالف التلفزيون على الشبكة"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"‏تم فصل موالف التلفزيون عبر USB."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"تم فصل موالف الشبكة."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"‏تم فصل موالف التلفزيون عبر USB."</string>
</resources>
diff --git a/usbtuner-res/values-az-rAZ/strings.xml b/usbtuner-res/values-az/strings.xml
index 40cc2557..f5305817 100644
--- a/usbtuner-res/values-az-rAZ/strings.xml
+++ b/usbtuner-res/values-az/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV Kökləyici"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV Kökləyici"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Network TV Tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Aktiv"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Deaktiv"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Lütfən, prosesi başa çatdırmaq üçün gözləyin"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Kanal mənbəyinizi seçin"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Siqnal Yoxdur"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> kanalına sazlamaq mümkün olmadı"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Sazlamaq uğursuz oldu"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Sazlayıcı proqram təminatı yenicə güncəllənib. Kanalları yenidən skan edin."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Audionu aktiv etmək üçün sistem səs ayarlarında əhatəli səsi aktiv edin"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Audio oxuna bilmir. Digər TV-dən istifadə edin"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Kanal kökləyici quraşdırması"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV Kökləyici quraşdırması"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB Kanal kökləyici quraşdırması"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Şəbəkə kökləyici quraşdırması"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"TV-nizin TV siqnal mənbəyinə qoşulu olduğunu doğrulayın.\n\nHava antenası istifadə etdikdə, daha çox kanal üçün onun yerini və istiqamətini tənzimləməlisiniz. Daha yaxşı nəticələr üçün hündür yerə və pəncərəyə yaxın yerləşdirin."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB kökləyicinin taxılı olduğunu və TV siqnal mənbəyinə qoşulu olduğunu doğrulayın.\n\nHava antenası istifadə etdikdə, daha çox kanal üçün onun yerini və istiqamətini tənzimləməlisiniz. Daha yaxşı nəticələr üçün hündür yerə və pəncərəyə yaxın yerləşdirin."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Şəbəkə kökləyicinin yanılı olduğunu və TV siqnal mənbəyinə qoşulu olduğunu doğrulayın.\n\nHava antenası istifadə etdikdə, daha çox kanal üçün onun yerini və istiqamətini tənzimləməlisiniz. Daha yaxşı nəticələr üçün hündür yerə və pəncərəyə yaxın yerləşdirin."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Davam edin"</item>
<item msgid="727245208787621142">"İndi yox"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Kanal quraşdırması yenidən işə salınsın?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Bu, TV kökləyici ilə tapılmış kanalları siləcək və yeni kanalları yenidən skan edəcək.\n\nTV-nizin TV siqnal mənbəyinə qoşulu olduğunu doğrulayın.\n\nHava antenası istifadə etdikdə, daha çox kanal üçün onun yerini və istiqamətini tənzimləməlisiniz. Daha yaxşı nəticələr üçün hündür yerə və pəncərəyə yaxın yerləşdirin."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Bu USB kökləyici ilə tapılmış kanalları siləcək və yeni kanalları yenidən skan edəcək.\n\nUSB kökləyicinin taxılı olduğunu və TV siqnal mənbəyinə qoşulu olduğunu doğrulayın.\n\nHava antenası istifadə etdikdə, daha çox kanal üçün onun yerini və istiqamətini tənzimləməlisiniz. Daha yaxşı nəticələr üçün hündür yerə və pəncərəyə yaxın yerləşdirin."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Bu Şəbəkə kökləyici ilə tapılmış kanalları siləcək və yeni kanalları yenidən skan edəcək.\n\nŞəbəkə kökləyicinin yanılı olduğunu və TV siqnal mənbəyinə qoşulu olduğunu doğrulayın.\n\nHava antenası istifadə etdikdə, daha çox kanal üçün onun yerini və istiqamətini tənzimləməlisiniz. Daha yaxşı nəticələr üçün hündür yerə və pəncərəyə yaxın yerləşdirin."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Davam edin"</item>
<item msgid="235450158666155406">"Ləğv edin"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV kökləyici quraşdırması"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB Kanal kökləyici quraşdırması"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Şəbəkə kanalı kökləyici quraşdırması"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Bu bir neçə dəqiqə çəkə bilər"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Kökləyici müvəqqəti əlçatan deyil və qeydə alma tərəfindən istifadə olunub."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Kanal tapılmadı"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Skan ilə heç bir kanal tapılmadı. TV-nizin TV siqnal mənbəyinə qoşulu olduğunu doğrulayın.\n\nHava antenası istifadə etdikdə, daha çox kanal üçün onun yerini və istiqamətini tənzimləməlisiniz. Daha yaxşı nəticələr üçün hündür yerə və pəncərəyə yaxın yerləşdirin."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Skan ilə heç bir kanal tapılmadı. USB kökləyicinin taxılı olduğunu və TV siqnal mənbəyinə qoşulu olduğunu doğrulayın.\n\nHava antenası istifadə etdikdə, daha çox kanal üçün onun yerini və istiqamətini tənzimləməlisiniz. Daha yaxşı nəticələr üçün hündür yerə və pəncərəyə yaxın yerləşdirin."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Skan ilə heç bir kanal tapılmadı. Şəbəkə kökləyicinin yanılı olduğunu və TV siqnal mənbəyinə qoşulu olduğunu doğrulayın.\n\nHava antenası istifadə etdikdə, daha çox kanal üçün onun yerini və istiqamətini tənzimləməlisiniz. Daha yaxşı nəticələr üçün hündür yerə və pəncərəyə yaxın yerləşdirin."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Yenidən skan edin"</item>
<item msgid="2092797862490235174">"Hazırdır"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"TV kanalları üçün skan"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV Kökləyici quraşdırması"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV Kökləyici quraşdırması"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Şəbəkə TV Kökləyici quraşdırması"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV kökləyicisinin bağlantısı kəsildi."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Şəbəkə kökləyicisinin bağlantısı kəsildi."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV kökləyicisinin bağlantısı kəsildi."</string>
</resources>
diff --git a/usbtuner-res/values-bg/strings.xml b/usbtuner-res/values-bg/strings.xml
index bb4d4292..0854c09e 100644
--- a/usbtuner-res/values-bg/strings.xml
+++ b/usbtuner-res/values-bg/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Телевизионен тунер"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Телевизионен USB тунер"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Network TV Tuner (БЕТА)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Включване"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Изключване"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Моля, изчакайте обработването да завърши"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Изберете източник на канали"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Няма сигнал"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Превключването към „<xliff:g id="CHANNEL_NAME">%s</xliff:g>“ не бе успешно"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Превключването не бе успешно"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Софтуерът на тунера е актуализиран наскоро. Моля, сканирайте отново каналите."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Активирайте обемния звук от настройките за системния, за да включите аудиото"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Звукът не може да се възпроизведе. Моля, опитайте на друг телевизор"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Настройване на тунера за канали"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Настройване на телевизионния тунер"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Настройване на USB тунера за канали"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Настройване на мрежовия тунер"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Уверете се, че телевизорът ви е свързан с източник на телевизионен сигнал.\n\nАко използвате безжична антена, може да се наложи да коригирате разположението или посоката й, за да получите оптимален брой канали. За най-добри резултати я поставете високо и близо до прозорец."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Уверете се, че USB тунерът е включен и свързан с източник на телевизионен сигнал.\n\nАко използвате безжична антена, може да се наложи да коригирате разположението или посоката й, за да получите оптимален брой канали. За най-добри резултати я поставете високо и близо до прозорец."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Уверете се, че мрежовият тунер е включен и свързан с източник на телевизионен сигнал.\n\nАко използвате безжична антена, може да се наложи да коригирате разположението или посоката й, за да уловите най-много канали. За най-добри резултати я поставете високо и близо до прозорец."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Напред"</item>
<item msgid="727245208787621142">"Не сега"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Да се стартира ли отново настройването на каналите?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Така ще премахнете намерените от телевизионния тунер канали и ще сканирате за нови.\n\nУверете се, че телевизорът ви е свързан с източник на телевизионен сигнал.\n\nАко използвате безжична антена, може да се наложи да коригирате разположението или посоката й, за да получите оптимален брой канали. За най-добри резултати я поставете високо и близо до прозорец."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Така ще премахнете намерените от USB тунера канали и ще сканирате за нови.\n\nУверете се, че USB тунерът е включен и свързан с източник на телевизионен сигнал.\n\nАко използвате безжична антена, може да се наложи да коригирате разположението или посоката й, за да получите оптимален брой канали. За най-добри резултати я поставете високо и близо до прозорец."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Така ще премахнете намерените от мрежовия тунер канали и ще сканирате за нови.\n\nУверете се, че мрежовият тунер е включен и свързан с източник на телевизионен сигнал.\n\nАко използвате безжична антена, може да се наложи да коригирате разположението или посоката й, за да уловите най-много канали. За най-добри резултати я поставете високо и близо до прозорец."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Напред"</item>
<item msgid="235450158666155406">"Отказ"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Настройване на телевизионния тунер"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Настройване на USB тунера за канали"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Настройване на мрежовия тунер за канали"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Това може да отнеме няколко минути"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Временно няма достъп до тунера или той вече се използва за запис."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Няма намерени канали"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"При сканирането не бяха открити канали. Уверете се, че телевизорът ви е свързан с източник на телевизионен сигнал.\n\nАко използвате безжична антена, коригирайте разположението или посоката й. За най-добри резултати я поставете високо и близо до прозорец и сканирайте отново."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"При сканирането не бяха открити канали. Уверете се, че USB тунерът е включен и свързан с източник на телевизионен сигнал.\n\nАко използвате безжична антена, коригирайте разположението или посоката й. За най-добри резултати я поставете високо и близо до прозорец и сканирайте отново."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"При сканирането не бяха открити канали. Уверете се, че мрежовият тунер е включен и свързан с източник на телевизионен сигнал.\n\nАко използвате безжична антена, коригирайте разположението или посоката й. За най-добри резултати я поставете високо и близо до прозорец и сканирайте отново."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Повторно сканиране"</item>
<item msgid="2092797862490235174">"Готово"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Сканиране за телевизионни канали"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Настройване на телевизионния тунер"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Настройване на телевизионния USB тунер"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Настройване на Network TV Tuner"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Връзката с телевизионния USB тунер е прекратена."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Връзката с мрежовия тунер е прекратена."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Връзката с телевизионния USB тунер е прекратена."</string>
</resources>
diff --git a/usbtuner-res/values-bn-rBD/strings.xml b/usbtuner-res/values-bn/strings.xml
index de24ef93..236e2d96 100644
--- a/usbtuner-res/values-bn-rBD/strings.xml
+++ b/usbtuner-res/values-bn/strings.xml
@@ -19,26 +19,27 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV টিউনার"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV টিউনার"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"নেটওয়ার্ক TV টিউনার (বিটা)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"চালু আছে"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"বন্ধ করুন"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"প্রক্রিয়াকরণ সম্পূর্ণ না হওয়া পর্যন্ত অনুগ্রহ করে অপেক্ষা করুন"</string>
- <string name="ut_rescan_needed" msgid="2273655435759849436">"টিউনার সফ্টওয়্যার সম্প্রতি আপডেট করা হয়েছে৷ অনুগ্রহ করে চ্যানেলগুলি আবার স্ক্যান করুন৷"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"আপনার চ্যানেলের উৎস নির্বাচন করুন"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"কোনো সংকেত নেই"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> এ টিউন করতে ব্যর্থ হয়েছে"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"টিউন করতে ব্যর্থ হয়েছে"</string>
+ <string name="ut_rescan_needed" msgid="2273655435759849436">"টিউনার সফ্টওয়্যার সম্প্রতি আপডেট করা হয়েছে৷ অনুগ্রহ করে চ্যানেলগুলি পুনরায় স্ক্যান করুন৷"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"অডিও সক্ষম করতে সিস্টেম সাউন্ড সেটিংসে সারাউন্ড সাউন্ড সক্ষম করুন"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"অডিও প্লে করা যাবে না৷ অনুগ্রহ করে অন্য টিভি ব্যবহার করার চেষ্ট করুন"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"চ্যানেল টিউনার সেট আপ"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV টিউনার সেট আপ"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB চ্যানেল টিউনার সেটআপ"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"নেটওয়ার্ক টিউনার সেট আপ"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"আপনার TV একটি TV সিগন্যাল উৎসের সাথে সংযুক্ত রয়েছে কিনা যাচাই করুন৷\n\nযদি কোনো ওভার-দ্য-এয়ার অ্যান্টেনা ব্যবহার করা হয় তাহলে অধিকাংশ চ্যানেল পাওয়ার জন্য আপনাকে সেটির অবস্থান এবং দিক ঠিক করতে হতে পারে৷ আরো ভাল ফলাফলের জন্য, এটিকে উচুঁতে কোনো জানলার সামনে রাখুন এবং আবার স্ক্যান করুন৷"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB টিউনার প্ল্যাগ ইন রয়েছে এবং একটি TV সিগন্যাল উৎসের সাথে সংযুক্ত রয়েছে তা যাচাই করুন৷\n\nযদি কোনো ওভার-দ্য-এয়ার অ্যান্টেনা ব্যবহার করা হয় তাহলে অধিকাংশ চ্যানেল পাওয়ার জন্য আপনাকে সেটির অবস্থান এবং দিক ঠিক করতে হতে পারে৷ আরো ভাল ফলাফলের জন্য, এটিকে উচুঁতে কোনো জানলার সামনে রাখুন এবং আবার স্ক্যান করুন৷"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"নেটওয়ার্ক টিউনার চালু রয়েছে এবং কোনো TV সিগন্যাল উৎসের সাথে সংযুক্ত রয়েছে কিনা যাচাই করুন৷\n\nযদি কোনো ওভার-দ্য-এয়ার অ্যান্টেনা ব্যবহার করা হয় তাহলে অধিকাংশ চ্যানেল পাওয়ার জন্য আপনাকে সেটির অবস্থান এবং দিক ঠিক করতে হতে পারে৷ আরো ভাল ফলাফলের জন্য, এটিকে উঁচুতে কোনো জানলার সামনে রেখে আবার স্ক্যান করুন৷"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"চালিয়ে যান"</item>
<item msgid="727245208787621142">"এখনই নয়"</item>
</string-array>
- <string name="bt_setup_again_title" msgid="884713873101099572">"আবার চ্যানেল সেট আপ করবেন?"</string>
+ <string name="bt_setup_again_title" msgid="884713873101099572">"পুনরায় চ্যানেল সেট আপ করবেন?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"এটি TV টিউনার থেকে পাওয়া চ্যানেলগুলিকে মুছবে এবং নতুন চ্যানেলগুলির জন্য আবার স্ক্যান করবে৷\n\nআপনার TV একটি TV সিগন্যাল উৎসের সাথে সংযুক্ত রয়েছে কিনা যাচাই করুন৷\n\nযদি কোনো ওভার-দ্য-এয়ার অ্যান্টেনা ব্যবহার করা হয় তাহলে অধিকাংশ চ্যানেল পাওয়ার জন্য আপনাকে সেটির অবস্থান এবং দিক ঠিক করতে হতে পারে৷ আরো ভাল ফলাফলের জন্য, এটিকে উচুঁতে কোনো জানলার সামনে রাখুন এবং আবার স্ক্যান করুন৷"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"এটি USB টিউনার থেকে পাওয়া চ্যানেলগুলিকে মুছবে এবং নতুন চ্যানেলগুলির জন্য আবার স্ক্যান করবে৷\n\nUSB টিউনার প্ল্যাগ ইন রয়েছে এবং একটি TV সিগন্যাল উৎসের সাথে সংযুক্ত রয়েছে তা যাচাই করুন৷\n\nযদি কোনো ওভার-দ্য-এয়ার অ্যান্টেনা ব্যবহার করা হয় তাহলে অধিকাংশ চ্যানেল পাওয়ার জন্য আপনাকে সেটির অবস্থান এবং দিক ঠিক করতে হতে পারে৷ আরো ভাল ফলাফলের জন্য, এটিকে উচুঁতে কোনো জানলার সামনে রাখুন এবং আবার স্ক্যান করুন৷"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"এটি নেটওয়ার্ক টিউনার থেকে পাওয়া চ্যানেলগুলি মুছবে এবং নতুন চ্যানেলগুলিকে আবার স্ক্যান করবে৷\n\nনেটওয়ার্ক টিউনার চালু রয়েছে এবং কোনো TV সিগন্যাল উৎসের সাথে সংযুক্ত রয়েছে কিনা যাচাই করুন৷\n\nযদি কোনো ওভার-দ্য-এয়ার অ্যান্টেনা ব্যবহার করা হয় তাহলে অধিকাংশ চ্যানেল পাওয়ার জন্য আপনাকে সেটির অবস্থান এবং দিক ঠিক করতে হতে পারে৷ আরো ভাল ফলাফলের জন্য, এটিকে উঁচুতে কোনো জানলার সামনে রেখে আবার স্ক্যান করুন৷"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"চালিয়ে যান"</item>
<item msgid="235450158666155406">"বাতিল করুন"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV টিউনার সেট আপ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB চ্যানেল টিউনার সেটআপ"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"নেটওয়ার্ক চ্যানেল টিউনার সেটআপ"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"এটি কয়েক মিনিট সময় নিতে পারে"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"টিউনার অস্থায়ীভাবে অনুপলব্ধ বা রেকডিংয়ে ইতিমধ্যেই ব্যবহৃত হয়েছে৷"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"কোনো চ্যানেল খুঁজে পাওয়া যায়নি"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"স্ক্যান করে কোনো চ্যানেল খুঁজে পাওয়া যায়নি৷ আপনার TV একটি TV সিগন্যাল উৎসের সাথে সংযুক্ত রয়েছে কিনা যাচাই করুন৷\n\nযদি কোনো ওভার-দ্য-এয়ার অ্যান্টেনা ব্যবহার করা হয় তাহলে সেটির অবস্থান এবং দিক ঠিক করুন৷ আরো ভাল ফলাফলের জন্য, এটিকে উচুঁতে কোনো জানলার সামনে রাখুন এবং আবার স্ক্যান করুন৷"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"স্ক্যান করে কোনো চ্যানেল খুঁজে পাওয়া যায়নি৷ USB টিউনার প্ল্যাগ ইন রয়েছে এবং একটি TV সিগন্যাল উৎসের সাথে সংযুক্ত রয়েছে তা যাচাই করুন৷\n\nযদি কোনো ওভার-দ্য-এয়ার অ্যান্টেনা ব্যবহার করা হয় তাহলে সেটির অবস্থান এবং দিক ঠিক করুন৷ আরো ভাল ফলাফলের জন্য, এটিকে উচুঁতে কোনো জানলার সামনে রাখুন এবং আবার স্ক্যান করুন৷"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"স্ক্যান করে কোনো চ্যানেল খুঁজে পাওয়া যায়নি৷ নেটওয়ার্ক টিউনার চালু এবং কোনো TV সিগন্যাল উৎসের সাথে সংযুক্ত রয়েছে কিনা যাচাই করুন৷\n\nযদি কোনো ওভার-দ্য-এয়ার অ্যান্টেনা ব্যবহার করা হয় তাহলে সেটির অবস্থান এবং দিক ঠিক করুন৷ আরো ভাল ফলাফলের জন্য, এটিকে উঁচুতে কোনো জানলার সামনে রেখে আবার স্ক্যান করুন৷"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"আবার স্ক্যান করুন"</item>
<item msgid="2092797862490235174">"সম্পন্ন"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"টিভি চ্যানেলগুলি স্ক্যান করুন"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV টিউনার সেট আপ"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB টিভি টিউনার সেট আপ"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"নেটওয়ার্ক TV টিউনার সেট আপ"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB টিভি টিউনারের সংযোগ বিচ্ছিন্ন হয়েছে।"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"নেটওয়ার্ক টিউনারের সংযোগ বিচ্ছিন্ন হয়েছে।"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB টিভি টিউনারের সংযোগ বিচ্ছিন্ন হয়েছে।"</string>
</resources>
diff --git a/usbtuner-res/values-ca/strings.xml b/usbtuner-res/values-ca/strings.xml
index ac857f2e..af90c3d6 100644
--- a/usbtuner-res/values-ca/strings.xml
+++ b/usbtuner-res/values-ca/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sintonitzador de televisió"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Sintonitzador de televisió USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Sintonitzador de televisió en xarxa (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Activa"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Desactiva"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Espera per finalitzar el processament"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Selecciona la font del canal"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Sense senyal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"No s\'ha pogut sintonitzar <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"No s\'ha pogut sintonitzar"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"El programari del sintonitzador s\'ha actualitzat fa poc. Torna a cercar els canals."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Activa el so envoltant a la configuració de so del sistema per activar l\'àudio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"No es pot reproduir l\'àudio. Prova-ho amb un altre televisor."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configuració del sintonitzador de canals"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configuració del sintonitzador de televisió"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configuració del sintonitzador de canals USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configuració del sintonitzador en xarxa"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Verifica que el teu televisor estigui connectat a una font de senyal de televisió.\n\nSi fas servir una antena aèria, pot ser que calgui ajustar-ne la ubicació o la direcció per rebre el màxim de canals. Per obtenir els millors resultats, col·loca-la en un lloc elevat i a prop d\'una finestra."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Verifica que el sintonitzador USB estigui endollat i connectat a una font de senyal de televisió.\n\nSi fas servir una antena aèria, pot ser que calgui ajustar-ne la ubicació o la direcció per rebre el màxim de canals. Per obtenir els millors resultats, col·loca-la en un lloc elevat i a prop d\'una finestra."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Comprova que el sintonitzador en xarxa estigui engegat i connectat a una font de senyal de televisió.\n\nSi fas servir una antena aèria, pot ser que calgui ajustar-ne la ubicació o la direcció per rebre el màxim de canals. Per obtenir uns resultats millors, col·loca-la en un lloc elevat i a prop d\'una finestra."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continua"</item>
<item msgid="727245208787621142">"Ara no"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Vols tornar a executar la configuració de canals?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Això farà que se suprimeixin del sintonitzador de televisió els canals que s\'han trobat i que es tornin a cercar canals nous.\n\nVerifica que el teu televisor estigui connectat a una font de senyal de televisió.\n\nSi fas servir una antena aèria, pot ser que calgui ajustar-ne la ubicació o la direcció per rebre el màxim de canals. Per obtenir els millors resultats, col·loca-la en un lloc elevat i a prop d\'una finestra."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Això farà que se suprimeixin del sintonitzador USB els canals que s\'han trobat i que es tornin a cercar canals nous.\n\nVerifica que el sintonitzador USB estigui endollat i connectat a una font de senyal de televisió.\n\nSi fas servir una antena aèria, pot ser que calgui ajustar-ne la ubicació o la direcció per rebre el màxim de canals. Per obtenir els millors resultats, col·loca-la en un lloc elevat i a prop d\'una finestra."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Això farà que se suprimeixin del sintonitzador en xarxa els canals trobats i que se\'n tornin a cercar de nous.\n\nComprova que el sintonitzador en xarxa estigui engegat i connectat a una font de senyal de televisió.\n\nSi fas servir una antena aèria, pot ser que calgui ajustar-ne la ubicació o la direcció per rebre el màxim de canals. Per obtenir uns resultats millors, col·loca-la en un lloc elevat i a prop d\'una finestra."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continua"</item>
<item msgid="235450158666155406">"Cancel·la"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configuració del sintonitzador de televisió"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configuració del sintonitzador de canals USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configuració del sintonitzador de canals en xarxa"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Aquesta acció pot tardar uns quants minuts"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"El sintonitzador no està disponible en aquest moment o bé ja s\'està utilitzant en un enregistrament."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"No s\'ha trobat cap canal"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"No s\'ha trobat cap canal. Verifica que el teu televisor estigui connectat a una font de senyal de televisió.\n\nSi fas servir una antena aèria, ajusta\'n la ubicació o la direcció. Per obtenir els millors resultats, col·loca-la en un lloc elevat i a prop d\'una finestra i torna a cercar canals."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"La cerca no ha trobat cap canal. Verifica que el sintonitzador USB estigui endollat i connectat a una font de senyal de televisió.\n\nSi fas servir una antena aèria, ajusta\'n la ubicació o la direcció. Per obtenir els millors resultats, col·loca-la en un lloc elevat i a prop d\'una finestra i torna a cercar."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"No s\'ha trobat cap canal. Comprova que el sintonitzador en xarxa estigui engegat i connectat a una font de senyal de televisió.\n\nSi fas servir una antena aèria, ajusta\'n la ubicació o la direcció. Per obtenir uns resultats millors, col·loca-la en un lloc elevat i a prop d\'una finestra i torna a cercar."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Torna a cercar"</item>
<item msgid="2092797862490235174">"Fet"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Cerca canals de televisió"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configuració del sintonitzador de televisió"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configuració del sintonitzador de televisió USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configuració del sintonitzador de televisió en xarxa"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"El sintonitzador de televisió USB no està connectat."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"El sintonitzador de la xarxa no està connectat."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"El sintonitzador de televisió USB no està connectat."</string>
</resources>
diff --git a/usbtuner-res/values-cs/strings.xml b/usbtuner-res/values-cs/strings.xml
index bee1e47c..151083c6 100644
--- a/usbtuner-res/values-cs/strings.xml
+++ b/usbtuner-res/values-cs/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Televizní tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Televizní tuner USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Síťový televizní tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Zapnout"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Vypnout"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Vyčkejte prosím, než bude zpracování dokončeno"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Vyberte zdroj kanálu"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Žádný signál"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Kanál <xliff:g id="CHANNEL_NAME">%s</xliff:g> se nepodařilo naladit"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Nelze naladit"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Software tuneru byl nedávno aktualizován. Vyhledejte prosím kanály znovu."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Chcete-li zapnout zvuk, v nastavení systémového zvuku povolte prostorový zvuk"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Zvuk nelze přehrát. Zkuste použít jinou televizi."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Nastavení tuneru kanálů"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Nastavení televizního tuneru"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Nastavení tuneru kanálů USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Nastavení síťového tuneru"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Zkontrolujte, zda je televize připojena ke zdroji televizního signálu.\n\nPokud používáte bezdrátovou anténu, možná budete muset za účelem příjmu co největšího počtu kanálů upravit její umístění nebo nasměrování. Nejlepších výsledků dosáhnete, pokud ji umístíte vysoko a blízko okna."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Zkontrolujte, zda je tuner USB připojen k zařízení a ke zdroji televizního signálu.\n\nPokud používáte bezdrátovou anténu, možná budete muset za účelem příjmu co největšího počtu kanálů upravit její umístění nebo nasměrování. Nejlepších výsledků dosáhnete, pokud ji umístíte vysoko a blízko okna."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Zkontrolujte, zda je síťový tuner zapnut a připojen ke zdroji televizního signálu.\n\nPokud používáte bezdrátovou anténu, možná budete muset za účelem příjmu co největšího počtu kanálů upravit její umístění nebo nasměrování. Nejlepších výsledků dosáhnete, pokud ji umístíte vysoko a blízko okna."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Pokračovat"</item>
<item msgid="727245208787621142">"Teď ne"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Znovu spustit nastavení kanálů?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Tímto odstraníte kanály nalezené pomocí televizního tuneru a znovu vyhledáte nové kanály.\n\nZkontrolujte, zda je televize připojena ke zdroji televizního signálu.\n\nPokud používáte bezdrátovou anténu, možná budete muset za účelem příjmu co největšího počtu kanálů upravit její umístění nebo nasměrování. Nejlepších výsledků dosáhnete, pokud ji umístíte vysoko a blízko okna."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Tímto odstraníte kanály nalezené pomocí tuneru USB a znovu vyhledáte nové kanály.\n\nZkontrolujte, zda je tuner USB připojen k zařízení a ke zdroji televizního signálu.\n\nPokud používáte bezdrátovou anténu, možná budete muset za účelem příjmu co největšího počtu kanálů upravit její umístění nebo nasměrování. Nejlepších výsledků dosáhnete, pokud ji umístíte vysoko a blízko okna."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Tímto odstraníte kanály nalezené pomocí síťového tuneru a znovu vyhledáte nové kanály.\n\nZkontrolujte, zda je síťový tuner zapnut a připojen ke zdroji televizního signálu.\n\nPokud používáte bezdrátovou anténu, možná budete muset za účelem příjmu co největšího počtu kanálů upravit její umístění nebo nasměrování. Nejlepších výsledků dosáhnete, pokud ji umístíte vysoko a blízko okna."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Pokračovat"</item>
<item msgid="235450158666155406">"Zrušit"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Nastavení televizního tuneru"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Nastavení tuneru kanálů USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Nastavení kanálů síťového tuneru"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Tato akce může trvat několik minut."</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuner dočasně není k dispozici, případně je právě používán k nahrávání."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -82,7 +82,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Nebyly nalezeny žádné kanály"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Při vyhledávání nebyly nalezeny žádné kanály. Zkontrolujte, zda je televize připojena ke zdroji televizního signálu.\n\nPokud používáte bezdrátovou anténu, upravte její umístění nebo nasměrování. Nejlepších výsledků dosáhnete, pokud ji umístíte vysoko a blízko okna. Poté spusťte vyhledávání znovu."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Při vyhledávání nebyly nalezeny žádné kanály. Zkontrolujte, zda je tuner USB připojen k zařízení a ke zdroji televizního signálu.\n\nPokud používáte bezdrátovou anténu, upravte její umístění nebo nasměrování. Nejlepších výsledků dosáhnete, pokud ji umístíte vysoko a blízko okna. Poté spusťte vyhledávání znovu."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Při vyhledávání nebyly nalezeny žádné kanály. Zkontrolujte, zda je síťový tuner zapnut a připojen ke zdroji televizního signálu.\n\nPokud používáte bezdrátovou anténu, upravte její umístění nebo nasměrování. Nejlepších výsledků dosáhnete, pokud ji umístíte vysoko a blízko okna. Poté spusťte vyhledávání znovu."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Znovu vyhledat"</item>
<item msgid="2092797862490235174">"Hotovo"</item>
@@ -90,7 +89,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Vyhledejte televizní kanály"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Nastavení televizního tuneru"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Nastavení televizního tuneru USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Nastavení síťového televizního tuneru"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Televizní tuner USB byl odpojen."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Síťový tuner byl odpojen."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Televizní tuner USB byl odpojen."</string>
</resources>
diff --git a/usbtuner-res/values-da/strings.xml b/usbtuner-res/values-da/strings.xml
index 7434c481..cea5d3c3 100644
--- a/usbtuner-res/values-da/strings.xml
+++ b/usbtuner-res/values-da/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV Tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-tuner til fjernsynet"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Netværkstuner til tv (beta)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Til"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Fra"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Vent, mens behandlingen afsluttes"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Vælg din kanalkilde"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Intet signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> kunne ikke indlæses"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Indlæsningen lykkedes ikke"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Tunerens software er blevet opdateret for nylig. Scan efter kanalerne igen."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Aktivér surroundsound i systemets lydindstillinger for at aktivere lyd"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Der kan ikke afspilles lyd. Prøv på et andet fjernsyn"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Konfiguration af kanaltuneren"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Konfiguration med TV Tuner"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Konfiguration af USB-kanaltuneren"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Konfiguration af netværkstuner"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Kontrollér, at dit fjernsyn er forbundet til en tv-signalkilde.\n\nHvis du bruger en luftantenne, kan det være nødvendigt at justere dens position eller retning for at modtage flest muligt kanaler. Du opnår det bedste resultat ved at placere den højt oppe og i nærheden af et vindue."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Kontrollér, at USB-tuneren er tilsluttet og forbundet til en tv-signalkilde.\n\nHvis du bruger en luftantenne, kan det være nødvendigt at justere dens position eller retning for at modtage flest muligt kanaler. Du opnår det bedste resultat ved at placere den højt oppe og i nærheden af et vindue."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Kontrollér, at netværkstuneren er tændt og sluttet til en tv-signalkilde.\n\nHvis du bruger en luftantenne, kan det være nødvendigt at justere dens position eller retning for at modtage flest muligt kanaler. Du opnår det bedste resultat ved at placere den højt oppe og i nærheden af et vindue."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Fortsæt"</item>
<item msgid="727245208787621142">"Ikke nu"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Vil du gentage kanalkonfigurationen?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Dette fjerner de kanaler, som blev fundet, fra fjernsynets tuner og scanner efter nye kanaler igen.\n\nKontrollér, at dit fjernsyn er forbundet til en tv-signalkilde.\n\nHvis du bruger en luftantenne, kan det være nødvendigt at justere dens position eller retning for at modtage flest muligt kanaler. Du opnår det bedste resultat ved at placere den højt oppe og i nærheden af et vindue."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Denne handling fjerner de kanaler, der blev fundet af USB-tuneren, og starter en ny scanning efter kanaler.\n\nKontrollér, at USB-tuneren er tilsluttet og forbundet til en tv-signalkilde.\n\nHvis du bruger en luftantenne, kan det være nødvendigt at justere dens position eller retning for at modtage flest muligt kanaler. Du opnår det bedste resultat ved at placere den højt oppe og i nærheden af et vindue."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Denne handling fjerner de kanaler, der blev fundet af netværkstuneren, og starter en ny kanalsøgning.\n\nKontrollér, at netværkstuneren er tændt og sluttet til en tv-signalkilde.\n\nHvis du bruger en luftantenne, kan det være nødvendigt at justere dens position eller retning for at modtage flest muligt kanaler. Du opnår det bedste resultat ved at placere den højt oppe og i nærheden af et vindue."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Fortsæt"</item>
<item msgid="235450158666155406">"Annuller"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Konfiguration med fjernsynets tuner"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Konfiguration af USB-kanaltuneren"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Konfiguration af netværkstuner til kanalsøgning"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Dette kan tage flere minutter"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuneren er midlertidigt utilgængelig eller benyttes allerede til en optagelse."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Der blev ikke fundet nogen kanaler"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Der blev ikke fundet nogen kanaler under scanningen. Kontrollér, at dit fjernsyn er forbundet til en tv-signalkilde.\n\nHvis du bruger en luftantenne, skal du justere dens position eller retning. Du opnår det bedste resultat ved at placere den højt oppe og i nærheden af et vindue. Scan igen."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Der blev ikke fundet nogen kanaler under scanningen. Kontrollér, at USB-tuneren er tilsluttet og forbundet til en tv-signalkilde.\n\nHvis du bruger en luftantenne, skal du justere dens position eller retning. Du opnår det bedste resultat ved at placere den højt oppe og i nærheden af et vindue. Scan igen."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Der blev ikke fundet nogen kanaler under søgningen. Kontrollér, at netværkstuneren er tændt og sluttet til en tv-signalkilde.\n\nHvis du bruger en luftantenne, skal du justere dens position eller retning. Du opnår det bedste resultat ved at placere den højt oppe og i nærheden af et vindue. Søg igen."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Scan igen"</item>
<item msgid="2092797862490235174">"Udført"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Scan efter tv-kanaler"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Konfiguration med TV Tuner"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Konfiguration af USB-TV Tuner"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Konfiguration af netværkstuner til tv"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-tuneren til fjernsynet er ikke tilsluttet."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Netværkstuneren er ikke tilsluttet."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-tuneren til fjernsynet af frakoblet."</string>
</resources>
diff --git a/usbtuner-res/values-de/strings.xml b/usbtuner-res/values-de/strings.xml
index 8f5d84ac..eab5fb1d 100644
--- a/usbtuner-res/values-de/strings.xml
+++ b/usbtuner-res/values-de/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV-Tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-TV-Tuner"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Netzwerk-TV-Tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"An"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Aus"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Bitte warten Sie, bis die Verarbeitung abgeschlossen ist"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Kanalquelle auswählen"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Kein Signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"\"<xliff:g id="CHANNEL_NAME">%s</xliff:g>\" konnte nicht eingestellt werden"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Fehler beim Einstellen"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Die Tunersoftware wurde kürzlich aktualisiert. Bitte führen Sie die Kanalsuche noch einmal durch."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Aktivieren Sie in den Systemeinstellungen Surround-Sound, um Audio einschalten zu können"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Audio kann nicht wiedergegeben werden. Bitte versuch es mit einem anderen Fernseher."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Kanaleinrichtung über den Tuner"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV-Tuner einrichten"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Kanaleinrichtung über den USB-Tuner"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Einrichtung des Netzwerk-Tuners"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Vergewissern Sie sich, dass Ihr Fernseher mit einer TV-Signalquelle verbunden ist.\n\nWenn Sie eine terrestrische Antenne verwenden, ändern Sie die Position oder Ausrichtung, um mehr Kanäle zu finden. Die besten Ergebnisse erhalten Sie, wenn Sie sie an eine erhöhte Position in Fensternähe stellen."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Vergewissern Sie sich, dass der USB-Tuner angeschlossen und mit einer TV-Signalquelle verbunden ist.\n\nWenn Sie eine terrestrische Antenne verwenden, ändern Sie die Position oder Ausrichtung, um mehr Kanäle zu finden. Die besten Ergebnisse erhalten Sie, wenn Sie sie an einer erhöhten Position in Fensternähe stellen."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Vergewissere dich, dass der Netzwerk-Tuner eingeschaltet und mit einer TV-Signalquelle verbunden ist.\n\nWenn du eine terrestrische Antenne verwendest, ändere die Position oder Ausrichtung, um mehr Kanäle zu empfangen. Die besten Ergebnisse erhältst du, wenn du die Antenne an eine erhöhte Position in Fensternähe stellst."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Weiter"</item>
<item msgid="727245208787621142">"Jetzt nicht"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Kanaleinrichtung erneut durchführen?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Dies entfernt die vom TV-Tuner gefundenen Kanäle und sucht noch einmal nach neuen Kanälen.\n\nVergewissern Sie sich, dass Ihr Fernseher mit einer TV-Signalquelle verbunden ist.\n\nWenn Sie eine terrestrische Antenne verwenden, ändern Sie die Position oder Ausrichtung, um mehr Kanäle zu finden. Die besten Ergebnisse erhalten Sie, wenn Sie sie an eine erhöhte Position in Fensternähe stellen."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Durch diese Aktion werden die gefundenen Kanäle vom USB-Tuner entfernt und die Kanalsuche wird erneut gestartet.\n\nVergewissern Sie sich, dass der USB-Tuner angeschlossen und mit einer TV-Signalquelle verbunden ist.\n\nWenn Sie eine terrestrische Antenne verwenden, ändern Sie die Position oder Ausrichtung, um mehr Kanäle zu finden. Die besten Ergebnisse erhalten Sie, wenn Sie sie an einer erhöhten Position in Fensternähe stellen."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Durch diese Aktion werden die vom Netzwerk-Tuner gefundenen Kanäle entfernt und die Kanalsuche wird neu gestartet.\n\nVergewissere dich, dass der Netzwerk-Tuner eingeschaltet und mit einer TV-Signalquelle verbunden ist.\n\nWenn du eine terrestrische Antenne verwendest, ändere die Position oder Ausrichtung, um mehr Kanäle zu empfangen. Die besten Ergebnisse erhältst du, wenn du die Antenne an eine erhöhte Position in Fensternähe stellst."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Weiter"</item>
<item msgid="235450158666155406">"Abbrechen"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV-Tuner einrichten"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Kanaleinrichtung über den USB-Tuner"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Kanaleinrichtung über den Netzwerk-Tuner"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Dies kann einige Minuten dauern"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Der Tuner ist vorübergehend nicht verfügbar oder wird schon für eine Aufnahme verwendet."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Keine Kanäle gefunden"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Bei der Suche wurden keine Kanäle gefunden. Vergewissern Sie sich, dass Ihr Fernseher mit einer TV-Signalquelle verbunden ist.\n\nWenn Sie eine terrestrische Antenne verwenden, ändern Sie die Position oder Ausrichtung. Um die besten Ergebnisse zu erhalten, stellen Sie sie an eine erhöhte Position in Fensternähe und führen Sie die Suche noch einmal durch."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Bei der Suche wurden keine Kanäle gefunden. Vergewissern Sie sich, dass der USB-Tuner angeschlossen und mit einer TV-Signalquelle verbunden ist.\n\nWenn Sie eine terrestrische Antenne verwenden, ändern Sie die Position oder Ausrichtung. Die besten Ergebnisse erhalten Sie, wenn Sie sie an einer erhöhten Position in Fensternähe stellen. Führen Sie dann die Suche erneut durch."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Bei der Suche wurden keine Kanäle gefunden. Vergewissere dich, dass der Netzwerk-Tuner eingeschaltet und mit einer TV-Signalquelle verbunden ist.\n\nWenn du eine terrestrische Antenne verwendest, ändere die Position oder Ausrichtung. Die besten Ergebnisse erhältst du, wenn du sie an eine erhöhte Position in Fensternähe stellst und die Suche noch einmal durchführst."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Noch einmal suchen"</item>
<item msgid="2092797862490235174">"Fertig"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Nach TV-Kanälen suchen"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV-Tuner einrichten"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB-TV-Tuner einrichten"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Einrichtung des Netzwerk-TV-Tuners"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Verbindung zum USB-TV-Tuner wurde aufgehoben."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Verbindung zum Netzwerk-Tuner wurde aufgehoben."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Verbindung zum USB-TV-Empfänger wurde aufgehoben."</string>
</resources>
diff --git a/usbtuner-res/values-el/strings.xml b/usbtuner-res/values-el/strings.xml
index 86f4cb85..6a033e3c 100644
--- a/usbtuner-res/values-el/strings.xml
+++ b/usbtuner-res/values-el/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Δέκτης τηλεόρασης"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Δέκτης τηλεόρασης USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Δέκτης τηλεόρασης δικτύου (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Ενεργό"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Ανενεργό"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Περιμένετε να ολοκληρωθεί η επεξεργασία"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Επιλέξτε την πηγή του καναλιού σας"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Χωρίς σήμα"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Αποτυχία συντονισμού <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Αποτυχία συντονισμού"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Το λογισμικό δέκτη ενημερώθηκε πρόσφατα. Επαναλάβετε τη σάρωση των καναλιών."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Ενεργοποιήστε τον περιφερειακό ήχο στις ρυθμίσεις ήχου συστήματος για να ενεργοποιήσετε τον ήχο"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Δεν είναι δυνατή η αναπαραγωγή ήχου. Δοκιμάστε μια άλλη τηλεόραση."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Ρύθμιση δέκτη καναλιών"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Ρύθμιση δέκτη τηλεόρασης"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Ρύθμιση δέκτη καναλιών USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Ρύθμιση δέκτη δικτύου"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Βεβαιωθείτε ότι η τηλεόρασή σας είναι συνδεδεμένη σε μια πηγή τηλεοπτικού σήματος.\n\nΕάν χρησιμοποιείτε ασύρματη κεραία, ίσως χρειαστεί να προσαρμόσετε την τοποθέτηση ή την κατεύθυνσή της για να λάβετε περισσότερα κανάλια. Για καλύτερα αποτελέσματα, τοποθετήστε την ψηλά και κοντά σε ένα παράθυρο."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Βεβαιωθείτε ότι ο δέκτης USB είναι συνδεδεμένος στην πρίζα και σε μια πηγή τηλεοπτικού σήματος.\n\nΕάν χρησιμοποιείτε ασύρματη κεραία, ίσως χρειαστεί να προσαρμόσετε την τοποθέτηση ή την κατεύθυνσή της για να λάβετε περισσότερα κανάλια. Για καλύτερα αποτελέσματα, τοποθετήστε την ψηλά και κοντά σε ένα παράθυρο."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Βεβαιωθείτε ότι ο δέκτης του δικτύου είναι ενεργοποιημένος και συνδεδεμένος σε μια πηγή τηλεοπτικού σήματος.\n\nΕάν χρησιμοποιείτε ασύρματη κεραία, ίσως χρειαστεί να προσαρμόσετε την τοποθέτηση ή την κατεύθυνσή της για να λάβετε περισσότερα κανάλια. Για καλύτερα αποτελέσματα, τοποθετήστε την ψηλά και κοντά σε ένα παράθυρο."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Συνέχεια"</item>
<item msgid="727245208787621142">"Όχι τώρα"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Επανάληψη ρύθμισης καναλιών;"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Με αυτόν τον τρόπο θα καταργηθούν τα κανάλια που βρέθηκαν από τον δέκτη τηλεόρασης και θα γίνει ξανά σάρωση για νέα κανάλια.\n\nΒεβαιωθείτε ότι η τηλεόρασή σας είναι συνδεδεμένη σε μια πηγή τηλεοπτικού σήματος.\n\nΕάν χρησιμοποιείτε ασύρματη κεραία, ίσως χρειαστεί να προσαρμόσετε την τοποθέτηση ή την κατεύθυνσή της για να λάβετε περισσότερα κανάλια. Για καλύτερα αποτελέσματα, τοποθετήστε την ψηλά και κοντά σε ένα παράθυρο."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Με αυτόν τον τρόπο θα καταργηθούν τα κανάλια που βρέθηκαν από τον δέκτη USB και θα γίνει ξανά σάρωση για νέα κανάλια.\n\nΒεβαιωθείτε ότι ο δέκτης USB είναι συνδεδεμένος στην πρίζα και σε μια πηγή τηλεοπτικού σήματος.\n\nΕάν χρησιμοποιείτε ασύρματη κεραία, ίσως χρειαστεί να προσαρμόσετε την τοποθέτηση ή την κατεύθυνσή της για να λάβετε περισσότερα κανάλια. Για καλύτερα αποτελέσματα, τοποθετήστε την ψηλά και κοντά σε ένα παράθυρο."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Με αυτόν τον τρόπο, τα κανάλια που βρέθηκαν από τον δέκτη του δικτύου θα καταργηθούν και θα γίνει ξανά σάρωση για νέα κανάλια.\n\nΒεβαιωθείτε ότι ο δέκτης του δικτύου είναι ενεργοποιημένος και συνδεδεμένος σε μια πηγή τηλεοπτικού σήματος.\n\nΕάν χρησιμοποιείτε ασύρματη κεραία, ίσως χρειαστεί να προσαρμόσετε την τοποθέτηση ή την κατεύθυνσή της για να λάβετε περισσότερα κανάλια. Για καλύτερα αποτελέσματα, τοποθετήστε την ψηλά και κοντά σε ένα παράθυρο."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Συνέχεια"</item>
<item msgid="235450158666155406">"Ακύρωση"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Ρύθμιση δέκτη τηλεόρασης"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Ρύθμιση δέκτη καναλιών USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Ρύθμιση δέκτη καναλιών δικτύου"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Αυτό μπορεί να διαρκέσει αρκετά λεπτά"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Ο δέκτης δεν είναι διαθέσιμος προσωρινά ή χρησιμοποιείται ήδη από την εγγραφή."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Δεν βρέθηκαν κανάλια"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Δεν βρέθηκαν κανάλια κατά τη σάρωση. Βεβαιωθείτε ότι η τηλεόρασή σας είναι συνδεδεμένη σε μια πηγή τηλεοπτικού σήματος.\n\nΕάν χρησιμοποιείτε ασύρματη κεραία, προσαρμόστε την τοποθέτηση ή την κατεύθυνσή της. Για καλύτερα αποτελέσματα, τοποθετήστε την ψηλά και κοντά σε ένα παράθυρο και επαναλάβετε τη σάρωση."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Δεν βρέθηκαν κανάλια κατά τη σάρωση. Βεβαιωθείτε ότι ο δέκτης USB είναι συνδεδεμένος στην πρίζα και σε μια πηγή τηλεοπτικού σήματος.\n\nΕάν χρησιμοποιείτε ασύρματη κεραία, προσαρμόστε την τοποθέτηση ή την κατεύθυνσή της. Για καλύτερα αποτελέσματα, τοποθετήστε την ψηλά και κοντά σε ένα παράθυρο και επαναλάβετε τη σάρωση."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Δεν εντοπίστηκε κανένα κανάλι κατά τη σάρωση. Βεβαιωθείτε ότι ο δέκτης του δικτύου είναι ενεργοποιημένος και συνδεδεμένος σε μια πηγή τηλεοπτικού σήματος.\n\nΕάν χρησιμοποιείτε ασύρματη κεραία, προσαρμόστε την τοποθέτηση ή την κατεύθυνσή της. Για καλύτερα αποτελέσματα, τοποθετήστε την ψηλά και κοντά σε κάποιο παράθυρο και επαναλάβετε τη σάρωση."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Εκ νέου σάρωση"</item>
<item msgid="2092797862490235174">"Ολοκληρώθηκε"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Σάρωση για τηλεοπτικά κανάλια"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Ρύθμιση δέκτη τηλεόρασης"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Ρύθμιση δέκτη τηλεόρασης USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Ρύθμιση δέκτη τηλεόρασης δικτύου"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Ο δέκτης τηλεόρασης USB έχει αποσυνδεθεί."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Ο δέκτης δικτύου έχει αποσυνδεθεί."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Ο δέκτης τηλεόρασης USB έχει αποσυνδεθεί."</string>
</resources>
diff --git a/usbtuner-res/values-en-rAU/strings.xml b/usbtuner-res/values-en-rAU/strings.xml
index 3e3d8d3c..11e639fd 100644
--- a/usbtuner-res/values-en-rAU/strings.xml
+++ b/usbtuner-res/values-en-rAU/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV Tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV Tuner"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Network TV Tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"On"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Off"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Please wait to finish processing"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Select your channel source"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"No Signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Failed to tune to <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Failed to tune"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Tuner software has been recently updated. Please re-scan the channels."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"To enable audio, enable surround sound in system sound settings"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Cannot play audio. Please try another TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Channel tuner setup"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV Tuner setup"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB channel tuner setup"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Network Tuner Setup"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Check that your TV is connected to a TV signal source.\n\nIf using an over-the-air aerial, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Check that the USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air aerial, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Verify the network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continue"</item>
<item msgid="727245208787621142">"Not now"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Re-run channel setup?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"This will remove the channels found from the TV tuner and scan for new channels again.\n\nCheck that your TV is connected to a TV signal source.\n\nIf using an over-the-air aerial, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"This will remove the channels found from the USB tuner and scan for new channels again.\n\nCheck that the USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"This will remove the channels found from the network tuner and scan for new channels again.\n\nVerify the network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continue"</item>
<item msgid="235450158666155406">"Cancel"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV tuner setup"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB channel tuner setup"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Network channel tuner setup"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"This may take several minutes"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuner is temporarily unavailable or already used by recording."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"No channels found"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"The scan did not find any channels. Check that your TV is connected to a TV signal source.\n\nIf using an over-the-air aerial, adjust its placement or direction. For best results, place it high and near a window and scan again."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"The scan did not find any channels. Check that the USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air aerial, adjust its placement or direction. For best results, place it high and near a window and scan again."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"The scan did not find any channels. Verify the network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air antenna, adjust its placement or direction. For best results, place it high and near a window and scan again."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Scan again"</item>
<item msgid="2092797862490235174">"Finished"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Scan for TV channels"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV Tuner setup"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV Tuner setup"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Network TV Tuner setup"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV tuner disconnected."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Network tuner disconnected."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV tuner disconnected."</string>
</resources>
diff --git a/usbtuner-res/values-en-rGB/strings.xml b/usbtuner-res/values-en-rGB/strings.xml
index 3e3d8d3c..11e639fd 100644
--- a/usbtuner-res/values-en-rGB/strings.xml
+++ b/usbtuner-res/values-en-rGB/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV Tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV Tuner"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Network TV Tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"On"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Off"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Please wait to finish processing"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Select your channel source"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"No Signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Failed to tune to <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Failed to tune"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Tuner software has been recently updated. Please re-scan the channels."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"To enable audio, enable surround sound in system sound settings"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Cannot play audio. Please try another TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Channel tuner setup"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV Tuner setup"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB channel tuner setup"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Network Tuner Setup"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Check that your TV is connected to a TV signal source.\n\nIf using an over-the-air aerial, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Check that the USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air aerial, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Verify the network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continue"</item>
<item msgid="727245208787621142">"Not now"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Re-run channel setup?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"This will remove the channels found from the TV tuner and scan for new channels again.\n\nCheck that your TV is connected to a TV signal source.\n\nIf using an over-the-air aerial, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"This will remove the channels found from the USB tuner and scan for new channels again.\n\nCheck that the USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"This will remove the channels found from the network tuner and scan for new channels again.\n\nVerify the network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continue"</item>
<item msgid="235450158666155406">"Cancel"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV tuner setup"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB channel tuner setup"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Network channel tuner setup"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"This may take several minutes"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuner is temporarily unavailable or already used by recording."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"No channels found"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"The scan did not find any channels. Check that your TV is connected to a TV signal source.\n\nIf using an over-the-air aerial, adjust its placement or direction. For best results, place it high and near a window and scan again."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"The scan did not find any channels. Check that the USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air aerial, adjust its placement or direction. For best results, place it high and near a window and scan again."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"The scan did not find any channels. Verify the network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air antenna, adjust its placement or direction. For best results, place it high and near a window and scan again."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Scan again"</item>
<item msgid="2092797862490235174">"Finished"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Scan for TV channels"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV Tuner setup"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV Tuner setup"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Network TV Tuner setup"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV tuner disconnected."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Network tuner disconnected."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV tuner disconnected."</string>
</resources>
diff --git a/usbtuner-res/values-en-rIN/strings.xml b/usbtuner-res/values-en-rIN/strings.xml
index 3e3d8d3c..11e639fd 100644
--- a/usbtuner-res/values-en-rIN/strings.xml
+++ b/usbtuner-res/values-en-rIN/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV Tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV Tuner"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Network TV Tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"On"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Off"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Please wait to finish processing"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Select your channel source"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"No Signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Failed to tune to <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Failed to tune"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Tuner software has been recently updated. Please re-scan the channels."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"To enable audio, enable surround sound in system sound settings"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Cannot play audio. Please try another TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Channel tuner setup"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV Tuner setup"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB channel tuner setup"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Network Tuner Setup"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Check that your TV is connected to a TV signal source.\n\nIf using an over-the-air aerial, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Check that the USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air aerial, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Verify the network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continue"</item>
<item msgid="727245208787621142">"Not now"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Re-run channel setup?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"This will remove the channels found from the TV tuner and scan for new channels again.\n\nCheck that your TV is connected to a TV signal source.\n\nIf using an over-the-air aerial, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"This will remove the channels found from the USB tuner and scan for new channels again.\n\nCheck that the USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"This will remove the channels found from the network tuner and scan for new channels again.\n\nVerify the network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or direction to receive the most channels. For best results, place it high and near a window."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continue"</item>
<item msgid="235450158666155406">"Cancel"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV tuner setup"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB channel tuner setup"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Network channel tuner setup"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"This may take several minutes"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuner is temporarily unavailable or already used by recording."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"No channels found"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"The scan did not find any channels. Check that your TV is connected to a TV signal source.\n\nIf using an over-the-air aerial, adjust its placement or direction. For best results, place it high and near a window and scan again."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"The scan did not find any channels. Check that the USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air aerial, adjust its placement or direction. For best results, place it high and near a window and scan again."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"The scan did not find any channels. Verify the network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air antenna, adjust its placement or direction. For best results, place it high and near a window and scan again."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Scan again"</item>
<item msgid="2092797862490235174">"Finished"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Scan for TV channels"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV Tuner setup"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV Tuner setup"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Network TV Tuner setup"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV tuner disconnected."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Network tuner disconnected."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV tuner disconnected."</string>
</resources>
diff --git a/usbtuner-res/values-es-rUS/strings.xml b/usbtuner-res/values-es-rUS/strings.xml
index 23fda60a..da7ec699 100644
--- a/usbtuner-res/values-es-rUS/strings.xml
+++ b/usbtuner-res/values-es-rUS/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sintonizador de TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Sintonizador de TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Sintonizador de TV de red (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Activar"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Desactivar"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Espera a que finalice el procesamiento"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Seleccionar la fuente del canal"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Sin señal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"No se pudo sintonizar el canal <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"No se pudo sintonizar el canal"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"El software del sintonizador se actualizó recientemente. Vuelve a buscar los canales."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Para habilitar el audio, deberás activar el sonido envolvente en la configuración del sistema de sonido"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"No se puede reproducir el audio. Intenta usar otra TV."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configuración del sintonizador de canales"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configuración del sintonizador de TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configuración del sintonizador de canales USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configuración del sintonizador de red"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Verifica que tu TV esté conectada a una fuente de señal de TV.\n\nSi usas una antena inalámbrica, es posible que tengas que ajustar su posición o dirección para recibir la mayor cantidad de canales posible. Para obtener mejores resultados, ubica la antena en un lugar alto y cerca de una ventana."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Verifica que el sintonizador USB esté enchufado y conectado a una fuente de señal de TV.\n\nSi usas una antena inalámbrica, es posible que necesites ajustar su ubicación y dirección para recibir la mayor cantidad de canales. Para obtener mejores resultados, ubica la antena en un lugar alto y cerca de una ventana."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Comprueba que el sintonizador de red esté encendido y conectado a una fuente de señal de TV.\n\nSi estás usando una antena inalámbrica, es posible que debas ajustar su ubicación o dirección para recibir la mayoría de los canales. Si deseas obtener mejores resultados, colócala en un lugar alto y cerca de una ventana."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continuar"</item>
<item msgid="727245208787621142">"Ahora no"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"¿Quieres volver a configurar los canales?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Esta acción quitará los canales encontrados desde el sintonizador de TV y se volverán a buscar canales nuevos.\n\nVerifica que tu TV esté conectada a una fuente de señal de TV.\n\nSi usas una antena inalámbrica, es posible que tengas que ajustar su posición o dirección para recibir la mayor cantidad de canales posible. Para obtener mejores resultados, ubica la antena en un lugar alto y cerca de una ventana."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Esta acción quitará los canales encontrados desde el sintonizador de TV y se volverán a buscar canales nuevos.\n\nVerifica que el sintonizador USB esté enchufado y conectado a una fuente de señal de TV.\n\nSi usas una antena inalámbrica, es posible que necesites ajustar su ubicación y dirección para recibir la mayor cantidad de canales. Para obtener mejores resultados, ubica la antena en un lugar alto y cerca de una ventana."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"De esta manera, se quitarán los canales encontrados desde el sintonizador de red y se buscarán canales nuevos.\n\nComprueba que el sintonizador de red esté encendido y conectado a una fuente de señal de TV.\n\nSi estás usando una antena inalámbrica, es posible que debas ajustar su ubicación o dirección para recibir la mayor cantidad de canales. Para obtener mejores resultados, colócala en un lugar alto y cerca de una ventana."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continuar"</item>
<item msgid="235450158666155406">"Cancelar"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configuración del sintonizador de TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configuración del sintonizador de canales USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configuración del sintonizador de canales de red"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Este proceso podría demorar varios minutos"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"El sintonizador no está disponible en este momento o está grabando."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"No se encontraron canales"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"No se encontró ningún canal. Verifica que tu TV esté conectada a una fuente de señal de TV.\n\nSi usas una antena inalámbrica, ajusta su posición o dirección. Para obtener mejores resultados, ubícala en un lugar alto y cerca de una ventana. Luego, vuelve a hacer la búsqueda."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"No se encontraron canales en la búsqueda. Verifica que el sintonizador USB esté enchufado y conectado a una fuente de señal de TV.\n\nSi usas una antena inalámbrica, ajusta su ubicación o dirección. Para obtener mejores resultados, ubícala en un lugar alto y cerca de una ventana. Luego, vuelve a hacer la búsqueda."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"No se encontró ningún canal durante la búsqueda. Comprueba que el sintonizador de red esté encendido y conectado a una fuente de señal de TV.\n\nSi estás usando una antena inalámbrica, ajusta su ubicación o dirección. Para obtener mejores resultados, colócala en un lugar alto y cerca de una ventana, y repite la búsqueda."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Volver a buscar"</item>
<item msgid="2092797862490235174">"Listo"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Busca canales de TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configuración del sintonizador de TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configuración del sintonizador de TV USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configuración del sintonizador de TV de red"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Se desconectó el sintonizador de TV USB."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Se desconectó el sintonizador de red."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Se desconectó el sintonizador de TV USB."</string>
</resources>
diff --git a/usbtuner-res/values-es/strings.xml b/usbtuner-res/values-es/strings.xml
index b10d02b8..e8e34cb2 100644
--- a/usbtuner-res/values-es/strings.xml
+++ b/usbtuner-res/values-es/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sintonizador de canales"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Sintonizador de canales USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Sintonizador de TV en red (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Activar"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Desactivar"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Espera hasta que finalice el procesamiento"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Selecciona la fuente de canales"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Sin señal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"No se ha podido sintonizar <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"No se podido sintonizar"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"El software del sintonizador se ha actualizado recientemente. Vuelve a buscar los canales."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Habilita el sonido envolvente en los ajustes del sistema de sonido para activar el audio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"No se puede reproducir el audio. Prueba con otra TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configuración del sintonizador de canales"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configuración del sintonizador de canales"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configuración del sintonizador de canales USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configuración del sintonizador en red"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Comprueba que la TV esté conectada a una fuente de señal de TV.\n\n Si utilizas una antena inalámbrica, puede que tengas que cambiar su posición o dirección para recibir la mayor cantidad posible de canales. Para conseguir los mejores resultados, colócala en alto y cerca de una ventana."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Comprueba que el sintonizador USB esté enchufado y conectado a una fuente de señal de TV.\n\nSi utilizas una antena inalámbrica, puede que tengas que cambiar su ubicación o dirección para recibir la mayor cantidad posible de canales. Para conseguir los mejores resultados, colócala en alto y cerca de una ventana."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Comprueba que el sintonizador en red esté encendido y conectado a una fuente de señal de TV.\n\nSi utilizas una antena inalámbrica, es posible que tengas que cambiar su ubicación o su orientación para ver la mayoría de los canales. Para obtener los mejores resultados, colócala en un lugar alto cerca de una ventana."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continuar"</item>
<item msgid="727245208787621142">"Ahora no"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"¿Quieres volver a ejecutar la configuración de canales?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Se quitarán los canales encontrados del sintonizador de canales y se volverán a buscar nuevos canales.\n\nComprueba que la TV esté conectada a una fuente de señal de TV.\n\nSi utilizas una antena inalámbrica, puede que tengas que cambiar su posición o dirección para recibir la mayor cantidad posible de canales. Para conseguir los mejores resultados, colócala en alto y cerca de una ventana."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Se quitarán los canales encontrados con el sintonizador USB y se volverán a buscar nuevos canales.\n\nComprueba que el sintonizador USB esté enchufado y conectado a una fuente de señal de TV.\n\nSi utilizas una antena inalámbrica, puede que tengas que cambiar su ubicación o dirección para recibir la mayor cantidad posible de canales. Para conseguir los mejores resultados, colócala en alto y cerca de una ventana."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Se quitarán los canales encontrados del sintonizador en red y se repetirá la búsqueda de canales.\n\nComprueba que el sintonizador en red esté encendido y conectado a una fuente de señal de TV.\n\nSi utilizas una antena inalámbrica, es posible que tengas que cambiar su ubicación o su orientación para ver la mayoría de los canales. Para obtener los mejores resultados, colócala en un lugar alto cerca de una ventana."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continuar"</item>
<item msgid="235450158666155406">"Cancelar"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configuración del sintonizador de canales"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configuración del sintonizador de canales USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configuración del sintonizador de canales en red"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Este proceso puede tardar varios minutos"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"El sintonizador no está disponible temporalmente o se está utilizando en otra grabación."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"No se han encontrado canales"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"No se ha encontrado ningún canal. Comprueba que la TV esté conectada a una fuente de señal de TV.\n\nSi utilizas una antena inalámbrica, cambia su posición o dirección. Para conseguir los mejores resultados, colócala en alto y cerca de una ventana. A continuación, vuelve a realizar la búsqueda."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"No se ha encontrado ningún canal. Comprueba que el sintonizador USB esté enchufado y conectado a una fuente de señal de TV.\n\nSi utilizas una antena inalámbrica, cambia su ubicación o dirección. Para conseguir los mejores resultados, colócala en alto y cerca de una ventana. A continuación, vuelve a realizar la búsqueda."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"El análisis no ha encontrado ningún canal. Comprueba que el sintonizador en red esté encendido y conectado a una fuente de señal de TV.\n\nSi utilizas una antena inalámbrica, cambia su ubicación u orientación. Para obtener los mejores resultados, colócala en un lugar alto cerca de una ventana y repite el análisis."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Volver a buscar"</item>
<item msgid="2092797862490235174">"Listo"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Busca canales de TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configuración del sintonizador de canales"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configuración de sintonizador de canales USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configuración del sintonizador de TV en red"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"El sintonizador de canales USB está desconectado."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"El sintonizador en red está desconectado."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Sintonizador de canales USB desconectado."</string>
</resources>
diff --git a/usbtuner-res/values-et-rEE/strings.xml b/usbtuner-res/values-et/strings.xml
index a3fbba35..70cb238a 100644
--- a/usbtuner-res/values-et-rEE/strings.xml
+++ b/usbtuner-res/values-et/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Telerituuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-telerituuner"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Teleri võrgutuuner (BEETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Sees"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Väljas"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Oodake, kuni töötlemine on lõppenud"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Valige kanali allikas"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Pole signaali"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Kanalile <xliff:g id="CHANNEL_NAME">%s</xliff:g> häälestamine ebaõnnestus"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Häälestamine ebaõnnestus"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Tuuneri tarkvara värskendati hiljuti. Otsige kanaleid uuesti."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Heli lubamiseks lubage ruumiline heli süsteemi heliseadetes"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Heli ei saa esitada. Proovige teist telerit"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Kanalituuneri seadistus"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Telerituuneri seadistus"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB-kanalituuneri seadistus"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Võrgutuuneri seadistus"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Veenduge, et teler oleks ühendatud teleri signaaliallikaga.\n\nKui kasutate õhuantenni, peate võimalikult paljude kanalite nägemiseks võib-olla kohandama selle asendit või suunda. Parimate tulemuste saavutamiseks asetage see kõrgele ja akna lähedale."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Veenduge, et USB-tuuner oleks pistikus ja ühendatud teleri signaaliallikaga.\n\nKui kasutate õhuantenni, peate enamiku kanalite nägemiseks võib-olla kohandama selle asendit või suunda. Parimate tulemuste saavutamiseks asetage see kõrgele ja akna lähedale."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Veenduge, et võrgutuuner oleks sisse lülitatud ja teleri signaaliallikaga ühendatud.\n\nKui kasutate õhuantenni, peate võib-olla muutma selle asendit või suunda, et rohkem kanaleid leida. Parimate tulemuste saavutamiseks asetage see kõrgesse kohta akna lähedale."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Jätka"</item>
<item msgid="727245208787621142">"Mitte praegu"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Kas käitada kanali seadistust uuesti?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"See eemaldab telerituuneri leitud kanalid ja otsib uuesti uusi kanaleid.\n\nVeenduge, et teler oleks ühendatud teleri signaaliallikaga.\n\nKui kasutate õhuantenni, peate võimalikult paljude kanalite nägemiseks võib-olla kohandama selle asendit või suunda. Parimate tulemuste saavutamiseks asetage see kõrgele ja akna lähedale."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"See eemaldab USB-tuuneri leitud kanalid ja otsib uuesti uusi kanaleid.\n\nVeenduge, et USB-tuuner oleks pistikus ja ühendatud teleri signaaliallikaga.\n\nKui kasutate õhuantenni, peate enamiku kanalite nägemiseks võib-olla kohandama selle asendit või suunda. Parimate tulemuste saavutamiseks asetage see kõrgele ja akna lähedale."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"See eemaldab võrgutuunerist leitud kanalid ja skannib uuesti uusi kanaleid.\n\nVeenduge, et võrgutuuner oleks sisse lülitatud ja teleri signaaliallikaga ühendatud.\n\nKui kasutate õhuantenni, peate võib-olla muutma selle asendit või suunda, et rohkem kanaleid leida. Parimate tulemuste saavutamiseks asetage see kõrgesse kohta akna lähedale."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Jätka"</item>
<item msgid="235450158666155406">"Tühista"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Telerituuneri seadistus"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB-kanalituuneri seadistus"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Võrgutuuneri kanalite seadistus"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"See võib võtta mitu minutit"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuuner pole ajutiselt saadaval või seda kasutatakse juba salvestamiseks."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Ühtegi kanalit ei leitud"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Otsimisel ei leitud ühtegi kanalit. Veenduge, et teler oleks ühendatud teleri signaaliallikaga.\n\nKui kasutate õhuantenni, kohandage selle asendit või suunda. Parimate tulemuste saavutamiseks asetage see kõrgele ja akna lähedale ning otsige uuesti."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Otsimisel ei leitud ühtegi kanalit. Veenduge, et USB-tuuner oleks pistikus ja ühendatud teleri signaaliallikaga.\n\nKui kasutate õhuantenni, kohandage selle asendit või suunda. Parimate tulemuste saavutamiseks asetage see kõrgele ja akna lähedale ning otsige uuesti."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Skannimisel ei leitud ühtegi kanalit. Veenduge, et võrgutuuner oleks sisse lülitatud ja teleri signaaliallikaga ühendatud.\n\nKui kasutate õhuantenni, muutke selle asendit või suunda. Parimate tulemuste saavutamiseks asetage see kõrgesse kohta akna lähedale ja skannige uuesti."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Otsi uuesti"</item>
<item msgid="2092797862490235174">"Valmis"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Otsige telekanaleid"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Telerituuneri seadistus"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB-telerituuneri seadistus"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Teleri võrgutuuneri seadistus"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-telerituuner eemaldati."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Võrgutuuner eemaldati."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-telerituuner eemaldati."</string>
</resources>
diff --git a/usbtuner-res/values-eu-rES/strings.xml b/usbtuner-res/values-eu/strings.xml
index a1a5d395..a0d456eb 100644
--- a/usbtuner-res/values-eu-rES/strings.xml
+++ b/usbtuner-res/values-eu/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sintonizadorea"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB bidezko sintonizadorea"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Sareko sintonizadorea (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Aktibatuta"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Desaktibatuta"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Itxaron prozesatzen amaitu arte"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Hautatu kanalaren iturburua"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Ez dago seinalerik"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Ezin izan da sintonizatu <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Ezin izan da sintonizatu"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Sintonizadorearen softwarea berriki eguneratu da. Bilatu kanalak berriro."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Audioa gaitzeko, joan sistemaren soinuaren ezarpenetara eta gaitu soinu inguratzailea"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Ezin da erreproduzitu audioa. Saiatu beste telebista batean."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Kanal-sintonizadorearen konfigurazioa"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Sintonizadorearen konfigurazioa"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB kanal-sintonizadorearen konfigurazioa"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Sareko sintonizadorearen konfigurazioa"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Egiaztatu telebista-seinalearen iturburu batera konektatuta dagoela telebista.\n\nAntena analogiko bat badarabilzu, agian bere kokapena edo norabidea doitu beharko dituzu kanal gehienak eskuratzeko. Emaitzarik onenak lortzeko, ezarri toki altu batean edo leiho baten ondoan."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Egiaztatu USB sintonizadorea entxufatuta eta telebistako seinale-iturburu batera konektatuta dagoela.\n\nHari gabeko antena badarabilzu, doitu bere kokapena edo norabidea. Emaitzarik onenak lortzeko, ezarri toki altu batean edo leiho baten ondoan eta gauzatu bilaketa berriro."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Egiaztatu sintonizadorea piztuta dagoela eta telebista-seinalea igortzen duen iturburu batera konektatu duzula.\n\nHari-gabeko antena bat erabiltzen ari bazara, doi ezazu haren kokapena edo norabidea ahal bezain beste kanal aurkitzeko. Emaitzarik onenak lortzeko, ezar ezazu ahal bezain altu eta leiho batetik gertu."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Jarraitu"</item>
<item msgid="727245208787621142">"Orain ez"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Berriro konfiguratu nahi dituzu kanalak?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Sintonizadoreak aurkitutako kanalak kenduko dira eta berriro bilatuko dira kanalak.\n\nEgiaztatu telebista-seinalearen iturburu batera konektatuta dagoela telebista.\n\nAntena analogiko bat badarabilzu, agian bere kokapena edo norabidea doitu beharko dituzu kanal gehienak eskuratzeko. Emaitzarik onenak lortzeko, ezarri toki altu batean edo leiho baten ondoan."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"USB sintonizadoreak aurkitutako kanalak kenduko dira eta berriro bilatuko dira kanalak.\n\nEgiaztatu USB sintonizadorea entxufatuta eta telebistako seinale-iturburu batera konektatuta dagoela.\n\nAntena analogiko bat badarabilzu, agian bere kokapena edo norabidea doitu beharko dituzu kanal gehienak eskuratzeko. Emaitzarik onenak lortzeko, ezarri toki altu batean edo leiho baten ondoan."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Hori eginez gero, kendu egingo dira sareko sintonizadoreak aurkitutako kanalak eta zerotik hasiko da berriro kanalak bilatzen.\n\n Egiaztatu sintonizadorea piztuta dagoela eta telebista-seinalea igortzen duen iturburu batera konektatu duzula.\n\nHari-gabeko antena bat erabiltzen ari bazara, doi ezazu haren kokapena edo norabidea ahal bezain beste kanal aurkitzeko. Emaitzarik onenak lortzeko, ezar ezazu ahal bezain altu eta leiho batetik gertu."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Jarraitu"</item>
<item msgid="235450158666155406">"Utzi"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Sintonizadorearen konfigurazioa"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB kanal-sintonizadorearen konfigurazioa"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Sareko kanalen sintonizadorearen konfigurazioa"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Zenbait minutu beharko dira"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Sintonizadorea ez dago erabilgarri edo beste zerbait ari da grabatzen."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Ez da aurkitu kanalik"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Bilaketak ez du aurkitu kanalik. Egiaztatu telebista-seinalearen iturburu batera konektatuta dagoela telebista.\n\nAntena analogiko bat badarabilzu, doitu bere kokapena edo norabidea. Emaitzarik onenak lortzeko, ezarri toki altu batean edo leiho baten ondoan eta gauzatu bilaketa berriro."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Bilaketak ez du aurkitu kanalik. Egiaztatu USB sintonizadorea entxufatuta eta telebistako seinale-iturburu batera konektatuta dagoela.\n\nAntena analogiko bat badarabilzu, doitu bere kokapena edo norabidea. Emaitzarik onenak lortzeko, ezarri toki altu batean edo leiho baten ondoan eta gauzatu bilaketa berriro."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Ez da aurkitu kanalik. Egiaztatu sintonizadorea piztuta dagoela eta telebista-seinalea igortzen duen iturburu batera konektatu duzula.\n\nHari-gabeko antena bat erabiltzen ari bazara, doi ezazu haren kokapena edo norabidea. Emaitzarik onenak lortzeko, ezar ezazu ahal bezain altu eta leiho batetik gertu. Ondoren, bila itzazu kanalak berriro."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Bilatu berriro"</item>
<item msgid="2092797862490235174">"Eginda"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Bilatu telebista-kanalak"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Sintonizadorearen konfigurazioa"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB bidezko sintonizadorearen konfigurazioa"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Sareko sintonizadorearen konfigurazioa"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Deskonektatu da USB bidezko sintonizadorea."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Deskonektatu da sareko sintonizadorea."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB bidezko sintonizadorea deskonektatu da."</string>
</resources>
diff --git a/usbtuner-res/values-fa/strings.xml b/usbtuner-res/values-fa/strings.xml
index 3ae44d10..8a51a4fc 100644
--- a/usbtuner-res/values-fa/strings.xml
+++ b/usbtuner-res/values-fa/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"تنظیم‌کننده تلویزیون"</string>
<string name="ut_app_name" msgid="8557698013780762454">"‏تنظیم‌کننده تلویزیون USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"تنظیم‌کننده تلویزیون شبکه (بتا)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"روشن"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"خاموش"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"لطفاً تا پایان پردازش صبر کنید"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"منبع کانال را انتخاب کنید"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"بدون سیگنال"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"تنظیم به <xliff:g id="CHANNEL_NAME">%s</xliff:g> انجام نشد"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"تنظیم ناموفق بود"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"نرم‌افزار تنظیم‌کننده اخیراً به‌روزرسانی شده است. لطفاً کانال‌ها را دوباره اسکن کنید."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"برای فعال کردن صدا، صدای فراگیر را در تنظیمات صدای سیستم فعال کنید"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"صوت پخش نمی‌شود. لطفاً تلویزیون دیگری را امتحان کنید."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"راه‌اندازی تنظیم‌کننده کانال"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"راه‌اندازی تنظیم‌کننده تلویزیون"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"‏راه‌اندازی تنظیم‌کننده کانال USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"راه‌اندازی تنظیم‌کننده شبکه‌ای"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"مطمئن شوید تلویزیونتان به منبع سیگنال تلویزیونی متصل است.\n\nدر صورت استفاده از آنتن بی‌سیم شاید لازم باشد برای دریافت کانال‌های بیشتر، موقعیت یا جهت آن را تنظیم کنید. برای بهترین نتایج، آن را در جای بلند و نزدیک پنجره قرار دهید."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"‏مطمئن شوید تنظیم‌کننده USB به منبع نیرو و منبع سیگنال تلویزیونی متصل است.\n\nدر صورت استفاده از آنتن بی‌سیم، موقعیت یا جهت آن را تنظیم کنید. برای بهترین نتایج، آن را در جای بلند و نزدیک پنجره قرار دهید."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"مطمئن شوید تنظیم‌کننده شبکه‌ای به برق و منبع سیگنال تلویزیونی وصل است.\n\nاگر از آنتن هوایی استفاده می‌کنید، ممکن است لازم باشد برای دریافت بیشترین تعداد کانال مکان و موقعیت آن را تنظیم کنید. برای بهترین نتایج، آن را در جای بلند و نزدیک پنجره قرار دهید."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"ادامه"</item>
<item msgid="727245208787621142">"فعلاً نه"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"تنظیم کانال دوباره اجرا شود؟"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"با این کار کانال‌های پیداشده از تنظیم‌کننده تلویزیون حذف می‌شوند و دوباره برای کانال‌های جدید اسکن می‌کند.\n\nمطمئن شوید تلویزیونتان به منبع سیگنال تلویزیونی متصل است.\n\nدر صورت استفاده از آنتن بی‌سیم، شاید لازم باشد برای دریافت کانال‌های بیشتر، موقعیت یا جهت آن را تنظیم کنید. برای بهترین نتایج، آن را در جای بلند و نزدیک پنجره قرار دهید."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"‏این کار کانال‌های پیداشده از تنظیم‌کننده USB را حذف می‌کند و دوباره کانال‌های جدید را اسکن می‌کند.\n\nمطمئن شوید تنظیم‌کننده USB به منبع نیرو و منبع سیگنال تلویزیونی متصل است.\n\nدر صورت استفاده از آنتن بی‌سیم، برای دریافت کانال‌های بیشتر، موقعیت یا جهت آن را تنظیم کنید. برای بهترین نتایج، آن را در جای بلند و نزدیک پنجره قرار دهید و دوباره اسکن کنید."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"این کار کانال‌های پیداشده را از تنظیم‌کننده شبکه‌ای حذف می‌کند و دوباره کانال‌های جدید را اسکن می‌کند.\n\nمطمئن شوید تنظیم‌کننده شبکه‌ای به برق و منبع سیگنال تلویزیونی وصل است.\n\nاگر از آنتن هوایی استفاده می‌کنید، ممکن است لازم باشد برای دریافت بیشترین تعداد کانال مکان و موقعیت آن را تنظیم کنید. برای بهترین نتایج، آن را در جای بلند و نزدیک پنجره قرار دهید."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"ادامه"</item>
<item msgid="235450158666155406">"لغو"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"راه‌اندازی تنظیم‌کننده تلویزیون"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"‏راه‌اندازی تنظیم‌کننده کانال USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"راه‌اندازی تنظیم‌کننده کانال شبکه‌ای"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"ممکن است چند دقیقه طول بکشد"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"تنظیم‌کننده موقتاً دردسترس نیست یا در این لحظه در ضبط شدن استفاده می‌شود."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"کانالی پیدا نشد"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"اسکن هیچ کانالی پیدا نکرد. مطمئن شوید تلویزیونتان به یک منبع سیگنال تلویزیونی متصل است. \n\nدر صورت استفاده از آنتن بی‌سیم، موقعیت یا جهت آن را تنظیم کنید. برای بهترین نتایج، آن را در جای بلند و نزدیک پنجره قرار دهید و دوباره اسکن کنید."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"‏اسکن هیچ کانالی پیدا نکرد. مطمئن شوید تنظیم‌کننده USB به منبع نیرو و منبع سیگنال تلویزیونی متصل است.\n\nدر صورت استفاده از آنتن بی‌سیم، موقعیت یا جهت آن را تنظیم کنید. برای بهترین نتایج، آن را در جای بلند و نزدیک پنجره قرار دهید و دوباره اسکن کنید."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"اسکن، کانالی پیدا نکرد. مطمئن شوید تنظیم‌کننده شبکه‌ای به برق و منبع سیگنال تلویزیونی وصل است.\n\nاگر از آنتن هوایی استفاده می‌کنید، موقعیت یا جهت آن را تنظیم کنید. برای بهترین نتایج، آن را در جای بلند و نزدیک پنجره قرار دهید و دوباره اسکن کنید."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"اسکن دوباره"</item>
<item msgid="2092797862490235174">"تمام"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"اسکن کانال‌های تلویزیون"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"راه‌اندازی تنظیم‌کننده تلویزیون"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"‏راه‌اندازی تنظیم‌کننده تلویزیون USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"راه‌اندازی تنظیم‌کننده تلویزیون شبکه‌ای"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"‏ارتباط تیونر USB تلویزیون قطع شد."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"ارتباط تیونر شبکه قطع شد."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"‏تیونر تلویزیون USB قطع شد."</string>
</resources>
diff --git a/usbtuner-res/values-fi/strings.xml b/usbtuner-res/values-fi/strings.xml
index 1b646750..79d0c7f5 100644
--- a/usbtuner-res/values-fi/strings.xml
+++ b/usbtuner-res/values-fi/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV-viritin"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-TV-viritin"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Antenni-TV-viritin (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Ota käyttöön"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Poista käytöstä"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Odota, että käsittely on valmis."</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Valitse kanavalähde."</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Ei signaalia"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Kanavan <xliff:g id="CHANNEL_NAME">%s</xliff:g> virittäminen epäonnistui."</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Virittäminen epäonnistui."</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Viritinohjelmisto on päivitetty äskettäin. Hae kanavat uudelleen."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Ota ääni käyttöön kytkemällä tilaääni päälle järjestelmän ääniasetuksissa."</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Äänen toistaminen ei onnistu. Yritä käyttää toista TV:tä."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Kanavavirittimen määritys"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV-virittimen määritys"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB-kanavavirittimen määritys"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Antennivirittimen määritys"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Tarkista, että TV on liitetty TV-signaalilähteeseen.\n\nJos käytät antennia, useampien kanavien löytäminen saattaa edellyttää sen paikan tai suuntauksen säätämistä. Saat parhaan tuloksen asettamalla antennin korkealle ja lähelle ikkunaa."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Tarkista, että USB-viritin on kytketty oikein ja liitetty TV-signaalilähteeseen.\n\nJos käytät antennia, useampien kanavien löytäminen saattaa edellyttää sen paikan ja suuntauksen säätämistä. Saat parhaan tuloksen asettamalla antennin korkealle ja lähelle ikkunaa."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Tarkista, että viritin on päällä ja liitetty TV-signaalilähteeseen.\n\nJos käytät antennia, säädä sen paikkaa tai suuntausta. Aseta antenni korkealle ja lähelle ikkunaa, jotta saat parhaat tulokset, ja tee uusi haku."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Jatka"</item>
<item msgid="727245208787621142">"Ei nyt"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Haetaanko kanavia uudelleen?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Tämä poistaa TV-virittimen löytämät kanavat ja tekee kanavahaun uudelleen.\n\nTarkista, että TV on liitetty TV-signaalilähteeseen.\n\nJos käytät antennia, useampien kanavien löytäminen saattaa edellyttää sen paikan tai suuntauksen säätämistä. Saat parhaan tuloksen asettamalla antennin korkealle ja lähelle ikkunaa."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Tämä poistaa USB-virittimen löytämät kanavat ja tekee kanavahaun uudelleen.\n\nTarkista, että USB-viritin on kytketty oikein ja liitetty TV-signaalilähteeseen.\n\nJos käytät antennia, useampien kanavien löytäminen saattaa edellyttää sen paikan tai suuntauksen säätämistä. Saat parhaan tuloksen asettamalla antennin korkealle ja lähelle ikkunaa."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Tämä poistaa virittimen löytämät kanavat ja etsii kanavia uudestaan.\n\nTarkista, että viritin on päällä ja liitetty TV-signaalilähteeseen.\n\nJos käytät antennia, säädä sen paikkaa tai suuntausta. Aseta antenni korkealle ja lähelle ikkunaa, jotta saat parhaat tulokset, ja tee uusi haku."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Jatka"</item>
<item msgid="235450158666155406">"Peruuta"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV-virittimen määritys"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB-kanavavirittimen määritys"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Antennikanavavirittimen määritys"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Tämä voi kestää useita minuutteja."</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Viritin ei ole toistaiseksi käytettävissä tai se on nauhoitteen käytössä."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Kanavia ei löytynyt"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Haku ei löytänyt yhtään kanavaa. Tarkista, että TV on liitetty TV-signaalilähteeseen.\n\nJos käytät antennia, säädä sen paikkaa tai suuntausta. Saat parhaan tuloksen asettamalla antennin korkealle ja lähelle ikkunaa. Tee haku sitten uudelleen."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Haku ei löytänyt yhtään kanavaa. Tarkista, että USB-viritin on kytketty oikein ja liitetty TV-signaalilähteeseen.\n\nJos käytät antennia, säädä sen paikkaa tai suuntausta. Saat parhaan tuloksen asettamalla antennin korkealle ja lähelle ikkunaa. Tee haku sitten uudelleen."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Haussa ei löytynyt kanavia. Tarkista, että viritin on päällä ja liitetty TV-signaalilähteeseen.\n\nJos käytät antennia, säädä sen paikkaa tai suuntausta. Aseta antenni korkealle ja lähelle ikkunaa, jotta saat parhaat tulokset, ja tee uusi haku."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Hae uudelleen"</item>
<item msgid="2092797862490235174">"Valmis"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Hae TV-kanavia"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV-virittimen määritys"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB-TV-virittimen määritys"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Antenni-TV-virittimen määritys"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-TV-viritin ei ole kytketty."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Verkkoviritin ei ole kytketty."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-TV-viritin ei ole kytketty"</string>
</resources>
diff --git a/usbtuner-res/values-fr-rCA/strings.xml b/usbtuner-res/values-fr-rCA/strings.xml
index 795ae859..54e8759e 100644
--- a/usbtuner-res/values-fr-rCA/strings.xml
+++ b/usbtuner-res/values-fr-rCA/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Syntoniseur télé"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Syntoniseur télé USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Syntoniseur télé réseau (BÊTA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Activer"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Désactivé"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Veuillez patienter jusqu\'à la fin du traitement"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Sélectionnez votre source de chaînes"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Aucun signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Impossible de syntoniser <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Échec de syntonisation"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Le logiciel du syntoniseur a été mis à jour récemment. Veuillez rechercher les chaînes à nouveau."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Pour activer l\'audio, vous devez activer le son ambiophonique dans les paramètres sonores du système"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Impossible de lire l\'audio. Veuillez essayer sur un autre téléviseur."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configuration du syntoniseur de chaînes"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configuration du syntoniseur télé"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configurer les chaînes du syntoniseur USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configuration du syntoniseur réseau"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Vérifiez que le téléviseur est connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne, vous devrez peut-être ajuster sa position ou son orientation pour recevoir le plus de chaînes possible. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Vérifiez que le syntoniseur USB est branché et connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne, ajustez sa position ou son orientation. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre, puis relancez la recherche."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Assurez-vous que le syntoniseur réseau est allumé et connecté à une source de signal télé.\n\nSi vous utilisez une antenne, il se peut que vous deviez ajuster sa position ou sa direction pour capter un maximum de chaînes. Pour obtenir des résultats optimaux, placez-la en hauteur et près d\'une fenêtre."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continuer"</item>
<item msgid="727245208787621142">"Pas maintenant"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Relancer la configuration de la chaîne?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Cette opération permet de supprimer les chaînes détectées du syntoniseur télé et d\'en rechercher de nouvelles.\n\nVérifiez que le téléviseur est connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne, vous devrez peut-être ajuster sa position ou son orientation pour recevoir le plus de chaînes possible. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Cette opération permet de supprimer les chaînes détectées du syntoniseur USB et d\'en rechercher de nouvelles.\n\nVérifiez que le syntoniseur USB est branché et connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne, vous devrez peut-être ajuster sa position ou son orientation pour recevoir le plus de chaînes possible. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Cela supprimera les chaînes trouvées du syntoniseur réseau et lancera une nouvelle recherche.\n\nAssurez-vous que le syntoniseur réseau est allumé et connecté à une source de signal télé.\n\nSi vous utilisez une antenne, il se peut que vous deviez ajuster sa position ou sa direction pour capter un maximum de chaînes. Pour obtenir des résultats optimaux, placez-la en hauteur et près d\'une fenêtre."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continuer"</item>
<item msgid="235450158666155406">"Annuler"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configuration du syntoniseur télé"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configurer les chaînes du syntoniseur USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configuration du syntoniseur de chaînes réseau"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Cela peut prendre plusieurs minutes"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Le syntoniseur n\'est pas accessible ou bien il est en cours d\'utilisation par l\'enregistreur."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Aucune chaîne"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"La recherche n\'a détecté aucune chaîne. Vérifiez que le téléviseur est connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne, ajustez sa position ou son orientation. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre, puis relancez la recherche."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"La recherche n\'a détecté aucune chaîne. Vérifiez que le syntoniseur USB est branché et connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne, ajustez sa position ou son orientation. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre, puis relancez la recherche."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"La recherche n\'a détecté aucune chaîne. Assurez-vous que le syntoniseur réseau est allumé et connecté à une source de signal télé.\n\nSi vous utilisez une antenne, ajustez sa position ou sa direction. Pour obtenir des résultats optimaux, placez-la en hauteur et près d\'une fenêtre, puis relancez la recherche."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Rechercher à nouveau"</item>
<item msgid="2092797862490235174">"Terminé"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Rechercher les chaînes de télévision"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configuration du syntoniseur télé"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configurer le syntoniseur télé USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configuration du syntoniseur télé réseau"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Le syntoniseur télé USB est déconnecté."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Le syntoniseur réseau est déconnecté."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Le syntoniseur télé USB est débranché."</string>
</resources>
diff --git a/usbtuner-res/values-fr/strings.xml b/usbtuner-res/values-fr/strings.xml
index f25bf9c1..4cb551f7 100644
--- a/usbtuner-res/values-fr/strings.xml
+++ b/usbtuner-res/values-fr/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Tuner TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Tuner TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Tuner TV réseau (VERSION BÊTA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Activé"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Désactivé"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Veuillez patienter jusqu\'à la fin du traitement."</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Sélectionnez la source de la chaîne."</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Aucun signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Échec de sélection de la chaîne <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Échec de la sélection de la chaîne"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Le logiciel du tuner a été mis à jour récemment. Veuillez lancer une nouvelle recherche des chaînes."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Activer le son surround dans les paramètres sonores du système pour activer l\'audio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Impossible de lire le fichier audio. Veuillez utiliser un autre téléviseur"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configuration du tuner de chaînes"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configuration du tuner TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configuration du tuner de chaînes USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configuration du tuner réseau"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Vérifiez que le téléviseur est connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne Over The Air, vous devrez peut-être ajuster sa position ou son orientation pour recevoir le plus de chaînes possible. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Vérifiez que le tuner USB est branché et connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne Over The Air, ajustez sa position ou son orientation. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre, puis relancez la recherche."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Vérifiez que le tuner réseau est allumé et connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne Over The Air, vous devrez peut-être ajuster sa position ou son orientation pour recevoir le plus de chaînes possible. Pour de meilleurs résultats, placez-la en hauteur et près d\'une fenêtre."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continuer"</item>
<item msgid="727245208787621142">"Pas maintenant"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Relancer la configuration de la chaîne ?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Cette opération permet de supprimer les chaînes détectées du tuner TV et d\'en rechercher de nouvelles.\n\nVérifiez que le téléviseur est connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne Over The Air, vous devrez peut-être ajuster sa position ou son orientation pour recevoir le plus de chaînes possible. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Cette opération permet de supprimer les chaînes détectées du tuner USB et d\'en rechercher de nouvelles.\n\nVérifiez que le tuner USB est branché et connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne Over The Air, vous devrez peut-être ajuster sa position ou son orientation pour recevoir le plus de chaînes possible. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Cette opération permet de supprimer les chaînes détectées du tuner réseau et d\'en rechercher de nouvelles.\n\nVérifiez que le tuner réseau est allumé et connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne Over The Air, vous devrez peut-être ajuster sa position ou son orientation pour recevoir le plus de chaînes possible. Pour de meilleurs résultats, placez-la en hauteur et près d\'une fenêtre."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continuer"</item>
<item msgid="235450158666155406">"Annuler"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configuration du tuner TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configuration du tuner de chaînes USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configuration du tuner de chaînes réseau"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Cette opération peut prendre plusieurs minutes."</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Le tuner est temporairement indisponible ou est déjà utilisé pour l\'enregistrement."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Aucune chaîne n\'a été détectée"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"La recherche n\'a détecté aucune chaîne. Vérifiez que le téléviseur est connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne Over The Air, ajustez sa position ou son orientation. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre, puis relancez la recherche."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"La recherche n\'a détecté aucune chaîne. Vérifiez que le tuner USB est branché et connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne Over The Air, ajustez sa position ou son orientation. Pour obtenir les meilleurs résultats, placez-la dans une position élevée et près d\'une fenêtre, puis relancez la recherche."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"La recherche n\'a détecté aucune chaîne. Vérifiez que le tuner réseau est allumé et connecté à la source d\'un signal de télévision.\n\nSi vous utilisez une antenne Over The Air, ajustez sa position ou son orientation. Pour de meilleurs résultats, placez-la en hauteur et près d\'une fenêtre, puis relancez la recherche."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Rechercher à nouveau"</item>
<item msgid="2092797862490235174">"OK"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Rechercher les chaînes de télévision"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configuration du tuner TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configuration du tuner TV USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configuration du tuner TV réseau"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Le tuner TV USB est déconnecté."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Tuner réseau déconnecté."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Le tuner TV USB est déconnecté."</string>
</resources>
diff --git a/usbtuner-res/values-gl-rES/strings.xml b/usbtuner-res/values-gl/strings.xml
index 48e4828c..58c14605 100644
--- a/usbtuner-res/values-gl-rES/strings.xml
+++ b/usbtuner-res/values-gl/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sintonizador de televisión"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Sintonizador USB de televisión"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Sintonizador de televisión de rede (beta)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Activar"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Desactivar"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Espera a que finalice o procesamento"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Selecciona a fonte da túa canle"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Sen sinal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Produciuse un erro ao sintonizar <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Produciuse un erro ao sintonizar"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"O software do sintonizador actualizouse recentemente. Volve buscar canles."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Activa o son envolvente na configuración de son do sistema para activar o audio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Non se pode reproducir o audio. Proba con outra televisión"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configuración do sintonizador de canles"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configuración do sintonizador de televisión"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configuración do sintonizador de canles USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configuración do sintonizador de rede"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Comproba que a televisión está conectada a unha fonte de sinal de televisión.\n\nSe usas unha antena sen fíos, é posible que teñas que axustar a súa posición ou dirección para recibir a maioría das canles. Para conseguir os mellores resultados, colócaa nun lugar alto e preto dunha ventá."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Comproba que o sintonizador USB está enchufado e conectado a unha fonte de sinal de televisión.\n\nSe usas unha antena sen fíos, é posible que teñas que axustar a súa posición ou dirección para recibir a maioría das canles. Para conseguir os mellores resultados, colócaa nun lugar alto e preto dunha ventá."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Verifica que o sintonizador de rede estea acendido e conectado a unha fonte de sinal de televisión.\n\nSe usas unha antena sen fíos, é posible que teñas que axustar a súa posición ou dirección para recibir a maioría das canles. Para conseguir os mellores resultados, colócaa nun lugar alto e preto dunha ventá."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continuar"</item>
<item msgid="727245208787621142">"Agora non"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Queres volver executar a configuración da canle?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Esta acción eliminará as canles que atopaches co sintonizador de televisión e buscará outras novas.\n\nComproba que a televisión está conectada a unha fonte de sinal de televisión.\n\nSe usas unha antena sen fíos, é posible que teñas que axustar a súa posición ou dirección para recibir a maioría das canles. Para conseguir os mellores resultados, colócaa nun lugar alto e preto dunha ventá."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Esta acción eliminará as canles que atopaches co sintonizador USB e buscará outras novas.\n\nComproba que o sintonizador USB está enchufado e conectado a unha fonte de sinal de televisión.\n\nSe usas unha antena sen fíos, é posible que teñas que axustar a súa posición ou dirección para recibir a maioría das canles. Para conseguir os mellores resultados, colócaa nun lugar alto e preto dunha ventá."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Con esta acción quitaranse as canles atopadas do teu sintonizador de rede e buscaranse novas canles outra vez.\n\nVerifica que o sintonizador de rede estea acendido e conectado a unha fonte de sinal de televisión.\n\n}Se usas unha antena sen fíos, é posible que teñas que axustar a súa posición ou dirección para recibir a maioría das canles. Para conseguir os mellores resultados, colócaa nun lugar alto e preto dunha ventá."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continuar"</item>
<item msgid="235450158666155406">"Cancelar"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configuración do sintonizador de televisión"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configuración do sintonizador de canles USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configuración do sintonizador de canles de rede"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Esta acción pode tardar varios minutos"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"O sintonizador non está dispoñible temporalmente ou xa se utiliza para unha gravación."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Non se atopou ningunha canle"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Durante a busca non se atopou ningunha canle. Comproba que a televisión está conectada a unha fonte de sinal de televisión.\n\nSe usas unha antena sen fíos, axusta a súa posición ou dirección. Para conseguir os mellores resultados, colócaa nun lugar alto, preto dunha ventá e realiza a fai a busca de novo."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"A busca non atopou ningunha canle. Comproba que o sintonizador USB está enchufado e conectado a unha fonte de sinal de televisión.\n\nSe usas unha antena sen fíos, axusta a súa posición ou dirección. Para conseguir os mellores resultados, colócaa nun lugar alto, preto dunha ventá e realiza a busca de novo."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"A busca de canles non obtivo resultados. Verifica que o sintonizador de rede estea acendido e conectado a unha fonte de sinal de televisión.\n\nSe usas unha antena sen fíos, axusta a súa posición ou dirección. Para conseguir os mellores resultados, colócaa nun lugar alto, preto dunha ventá, e realiza a busca de novo."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Buscar de novo"</item>
<item msgid="2092797862490235174">"Feito"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Busca canles de televisión"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configuración do sintonizador de televisión"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configuración do sintonizador USB de televisión"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configuración do sintonizador de televisión de rede"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Desconectouse o sintonizador de televisión USB."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Desconectouse o sintonizador de rede."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Desconectouse o sintonizador de televisión USB."</string>
</resources>
diff --git a/usbtuner-res/values-hi/strings.xml b/usbtuner-res/values-hi/strings.xml
index d95199bb..ea0d51c1 100644
--- a/usbtuner-res/values-hi/strings.xml
+++ b/usbtuner-res/values-hi/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"टीवी ट्यूनर"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB टीवी ट्यूनर"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"नेटवर्क टीवी ट्यूनर (बीटा)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"चालू करें"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"बंद करें"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"कृपया प्रक्रिया पूरी होने का इंतज़ार करें"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"अपना चैनल स्रोत चुनें"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"कोई सिग्नल नहीं"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> को ट्यून करने में विफल रहा"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ट्यून करने में विफल रहा"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ट्यूनर सॉफ़्टवेयर को हाल ही में अपडेट किया गया है. कृपया चैनलों के लिए दोबारा स्कैन करें."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ऑडियो सक्षम करने के लिए सिस्टम साउंड सेटिंग में सराउंड साउंड सक्षम करें"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"ऑडियो नहीं चल पा रहा है. कृपया कोई दूसरा टीवी आज़माएं"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"चैनल ट्यूनर सेटअप"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"टीवी ट्यूनर सेटअप"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB चैनल ट्यूनर सेटअप"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"नेटवर्क ट्यूनर सेटअप"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"पुष्टि करें कि आपका टीवी किसी टीवी सिग्नल स्रोत से कनेक्ट किया हुआ है.\n\nयदि ओवर द एयर एंटेना का उपयोग कर रहे हैं, तो अधिकांश चैनल पाने के लिए आपको उसकी स्थिति या दिशा समायोजित करने की आवश्यकता हो सकती है. सबसे अच्छे परिणामों के लिए, उसे ऊंचाई पर और किसी खिड़की के पास लगाएं."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"पुष्टि करें कि USB ट्यूनर प्लग इन है और टीवी सिग्नल स्रोत से कनेक्ट किया हुआ है.\n\nयदि आप ओवर द एयर एंटेना का उपयोग कर रहे हैं, तो अधिकांश चैनल पाने के लिए आपको उसकी स्थिति या दिशा समायोजित करने की आवश्यकता हो सकती है. अच्छे परिणामों के लिए, उसे ऊंचाई पर और किसी खिड़की के पास लगाएं."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"सत्यापित करें कि नेटवर्क ट्यूनर चालू है और किसी टीवी सिग्नल स्रोत से कनेक्ट है.\n\nयदि किसी ओवर-द-एयर एंटेना का उपयोग कर रहे हैं, तो अधिकांश चैनल प्राप्त करने के लिए आपको एंटेना का स्थान या दिशा समायोजित करनी पड़ सकती है. सर्वश्रेष्ठ परिणामों के लिए, उसे ऊंचाई पर और किसी खिड़की के पास रखें."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"जारी रखें"</item>
<item msgid="727245208787621142">"अभी नहीं"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"चैनल सेटअप फिर से चलाएं?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"इससे टीवी ट्यूनर से मिले चैनल निकल जाएंगे और नए चैनल दोबारा स्कैन किए जाएंगे.\n\nपुष्टि करें कि आपका टीवी किसी टीवी सिग्नल स्रोत से कनेक्ट किया हुआ है.\n\nयदि ओवर द एयर एंटेना का उपयोग कर रहे हैं, तो अधिकांश चैनल पाने के लिए आपको उसकी स्थिति या दिशा समायोजित करने की आवश्यकता हो सकती है. सबसे अच्छे परिणामों के लिए, उसे ऊंचाई पर और किसी खिड़की के पास लगाएं."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"इससे USB ट्यूनर से मिले चैनल निकल जाएंगे और नए चैनलों के लिए फिर से स्कैन किया जाएगा.\n\nपुष्टि करें कि USB ट्यूनर प्लग इन है और टीवी सिग्नल स्रोत से कनेक्ट किया हुआ है.\n\nयदि आप ओवर द एयर एंटेना का उपयोग कर रहे हैं, तो अधिकांश चैनल पाने के लिए आपको उसकी स्थिति या दिशा समायोजित करने की आवश्यकता हो सकती है. अच्छे परिणामों के लिए, उसे ऊंचाई पर और किसी खिड़की के पास लगाएं."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"ऐसा करने से नेटवर्क ट्यूनर से मिले चैनल निकाल दिए जाएंगे और नए चैनल के लिए फिर से स्कैन किया जाएगा.\n\nसत्यापित करें कि नेटवर्क ट्यूनर चालू है और किसी टीवी सिग्नल स्रोत से कनेक्ट है.\n\nयदि किसी ओवर-द-एयर एंटेना का उपयोग कर रहे हैं, तो अधिकांश चैनल प्राप्त करने के लिए आपको एंटेना का स्थान या दिशा समायोजित करनी पड़ सकती है. सर्वश्रेष्ठ परिणामों के लिए, उसे ऊंचाई पर और किसी खिड़की के पास रखें."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"जारी रखें"</item>
<item msgid="235450158666155406">"रद्द करें"</item>
@@ -53,9 +54,8 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"टीवी ट्यूनर सेटअप"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB चैनल ट्यूनर सेटअप"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"नेटवर्क चैनल ट्यूनर सेटअप"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"इसमें कुछ मिनट लग सकते हैं"</string>
- <string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ट्यूनर अस्थायी रूप से उपलब्ध नहीं है या रिकॉर्डिंग में उसका उपयोग पहले ही हो रहा है."</string>
+ <string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ट्यूनर अस्थायी रूप से उपलब्ध नहीं है या रिकॉर्डिंग में उसका उपयोग पहले ही कर लिया गया है."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
<item quantity="one">%1$d चैनल मिले</item>
<item quantity="other">%1$d चैनल मिले</item>
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"कोई चैनल नहीं मिला"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"स्कैन करने से कोई भी चैनल नहीं मिला. पुष्टि करें कि आपका टीवी किसी टीवी सिग्नल स्रोत से कनेक्ट किया हुआ है.\n\nयदि ओवर द एयर एंटेना का उपयोग कर रहे हैं, तो उसकी स्थिति या दिशा समायोजित करें. सबसे अच्छे परिणामों के लिए, उसे ऊंचाई पर और किसी खिड़की के पास लगाएं और दोबारा स्कैन करें."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"स्कैन करने से कोई चैनल नहीं मिला. पुष्टि करें कि USB ट्यूनर प्लग इन है और टीवी सिग्नल स्रोत से कनेक्ट किया हुआ है.\n\nयदि आप ओवर द एयर एंटेना का उपयोग कर रहे हैं, तो उसकी स्थिति या दिशा समायोजित करें. अच्छे परिणामों के लिए, उसे ऊंचाई पर और किसी खिड़की के पास लगाएं और दोबारा स्कैन करें."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"स्कैन में कोई चैनल नहीं मिला. सत्यापित करें कि नेटवर्क ट्यूनर चालू है और किसी टीवी संकेत स्रोत से कनेक्ट है.\n\nयदि किसी ओवर-द-एयर एंटेना का उपयोग कर रहे हैं, तो उसका स्थान या दिशा समायोजित करें. सर्वश्रेष्ठ परिणामों के लिए, उसे ऊंचाई पर और किसी खिड़की के पास रखें और फिर से स्कैन करें."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"दोबारा स्‍कैन करें"</item>
<item msgid="2092797862490235174">"हो गया"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"टीवी चैनलों के लिए स्‍कैन करें"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"टीवी ट्यूनर सेटअप"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB टीवी ट्यूनर सेटअप"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"नेटवर्क टीवी ट्यूनर सेटअप"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB टीवी ट्यूनर डिसकनेक्ट किया गया."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"नेटवर्क ट्यूनर डिसकनेक्ट किया गया."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB टीवी ट्यूनर डिस्कनेक्ट किया गया."</string>
</resources>
diff --git a/usbtuner-res/values-hr/strings.xml b/usbtuner-res/values-hr/strings.xml
index 7d0733ec..4a00deaf 100644
--- a/usbtuner-res/values-hr/strings.xml
+++ b/usbtuner-res/values-hr/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV prijemnik"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV prijemnik"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Mrežni TV prijemnik (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Uključeno"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Isključeno"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Pričekajte da obrada završi"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Odaberite izvor kanala"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Nema signala"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Namještanje na kanal <xliff:g id="CHANNEL_NAME">%s</xliff:g> nije uspjelo"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Namještanje nije uspjelo"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Softver prijemnika nedavno je ažuriran. Ponovite traženje kanala."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Omogućite okružujući zvuk u postavkama zvuka na razini sustava da biste omogućili audio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Zvuk se ne može reproducirati. Pokušajte s drugim televizorom"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Postavljanje prijemnika kanala"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Postavljanje TV prijemnika"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Postavljanje USB prijemnika za kanale"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Postavljanje mrežnog prijemnika"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Provjerite je li televizor povezan s izvorom televizijskog signala.\n\nAko upotrebljavate antenu zemaljske televizije, možda ćete joj morati promijeniti položaj ili smjer da biste pronašli najviše kanala. Za najbolje rezultate postavite je visoko i u blizini prozora."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Provjerite je li USB prijemnik priključen i povezan s izvorom TV signala.\n\nAko upotrebljavate antenu zemaljske televizije, možda trebate prilagoditi njezin položaj ili smjer da biste primali najviše kanala. Za najbolje rezultate postavite je visoko i u blizini prozora."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Provjerite je li mrežni prijemnik uključen i povezan s izvorom TV signala.\n\nAko upotrebljavate bežičnu antenu, možda ćete trebati prilagoditi položaj ili smjer da biste pronašli najviše kanala. Za najbolje rezultate postavite je visoko i blizu prozora."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Nastavi"</item>
<item msgid="727245208787621142">"Ne sada"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Želite li ponovo pokrenuti postavljanje kanala?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Time će se ukloniti kanali pronađeni pomoću TV prijemnika i ponovo pokrenuti pretraživanje kanala.\n\nProvjerite je li televizor povezan s izvorom televizijskog signala.\n\nAko upotrebljavate antenu zemaljske televizije, možda ćete joj morati promijeniti položaj ili smjer da biste pronašli najviše kanala. Za najbolje rezultate postavite je visoko i u blizini prozora."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Time će se ukloniti kanali pronađeni putem USB prijemnika i ponoviti pretraživanje kanala.\n\nProvjerite je li USB prijemnik priključen i povezan s izvorom televizijskog signala.\n\nAko upotrebljavate antenu zemaljske televizije, možda trebate prilagoditi njezin položaj ili smjer da biste primali najviše kanala. Za najbolje rezultate postavite je visoko i u blizini prozora."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Time će se ukloniti kanali pronađeni mrežnim prijemnikom i pokrenuti pretraživanje novih kanala.\n\nProvjerite je li mrežni prijemnik uključen i povezan s izvorom TV signala.\n\nAko upotrebljavate bežičnu antenu, možda ćete trebati prilagoditi položaj ili smjer da biste pronašli najviše kanala. Za najbolje rezultate postavite je visoko i blizu prozora."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Nastavi"</item>
<item msgid="235450158666155406">"Odustani"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Postavljanje TV prijemnika"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Postavljanje USB prijemnika za kanale"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Postavljanje prijemnika za mrežne kanale"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"To može potrajati nekoliko minuta"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Prijemnik trenutačno nije dostupan ili se već upotrebljava za snimanje."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -79,7 +79,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Nije pronađen nijedan kanal"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Tijekom pretraživanja nije pronađen nijedan kanal. Provjerite je li televizor povezan s izvorom televizijskog signala.\n\nAko upotrebljavate antenu zemaljske televizije, promijenite joj položaj ili smjer. Za najbolje rezultate postavite je visoko i u blizini prozora, a zatim pretražite ponovo."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Pretraživanjem nije pronađen nijedan kanal. Provjerite je li USB prijemnik priključen i povezan s izvorom televizijskog signala.\n\nAko upotrebljavate antenu zemaljske televizije, prilagodite joj položaj ili smjer. Za najbolje rezultate postavite je visoko i u blizini prozora i pretražite ponovo."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Nije pronađen nijedan kanal. Provjerite je li mrežni prijemnik uključen i povezan s izvorom TV signala.\n\nAko upotrebljavate bežičnu antenu, prilagodite položaj ili smjer. Za najbolje rezultate postavite je visoko i blizu prozora i pretražite ponovo."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Pretraži ponovo"</item>
<item msgid="2092797862490235174">"Gotovo"</item>
@@ -87,7 +86,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Pretražite TV kanale"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Postavljanje TV prijemnika"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Postavljanje USB TV prijemnika"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Postavljanje mrežnog TV prijemnika"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV prijemnik isključen."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Mrežni prijemnik isključen."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV prijemnik isključen."</string>
</resources>
diff --git a/usbtuner-res/values-hu/strings.xml b/usbtuner-res/values-hu/strings.xml
index fc25f636..e2bca51c 100644
--- a/usbtuner-res/values-hu/strings.xml
+++ b/usbtuner-res/values-hu/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Tévétuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-s tévétuner"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Hálózati tévétuner (BÉTA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Be"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Ki"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Kérjük, várja meg a folyamat befejezését"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Válassza ki a csatornaforrást"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Nincs jel"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Nem sikerült behangolni a(z) <xliff:g id="CHANNEL_NAME">%s</xliff:g> csatornát"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Nem sikerült a hangolás"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"A tuner szoftverét nemrég frissítették. Kérjük, ismételje meg a csatornakeresést."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"A hang aktiválásához engedélyezze a térhatású hangot a rendszerszintű hangbeállításokban"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"A hangot nem lehet lejátszani. Kérjük, próbálkozzon másik tévén"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Csatornatuner beállítása"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Tévétuner beállítása"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB-s csatornatuner beállítása"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Hálózati tuner beállítása"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Ellenőrizze, hogy tévéje csatlakoztatva van-e a televíziós jelforráshoz.\n\nAntenna használata esetén szükség lehet az elhelyezés, illetve az irány módosítására a lehető legtöbb csatorna befogásához. A legjobb eredmény érdekében helyezze magasra és ablak közelébe."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Győződjön meg arról, hogy az USB-tuner be van dugva, és csatlakoztatva van a televíziós jelforráshoz.\n\nAntenna használata esetén szükség lehet az elhelyezés, illetve irány módosítására a lehető legtöbb csatorna befogásához. A legjobb eredmény érdekében helyezze magasra és ablak közelébe."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Ellenőrizze, hogy a hálózati tuner be van-e kapcsolva, és csatlakozik-e televíziós jelforráshoz.\n\nHa antennát használ, módosítsa az elhelyezkedését, illetve irányát, hogy minél több csatornát fogjon. A legjobb eredmény érdekében helyezze magasra és ablak közelébe."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Folytatás"</item>
<item msgid="727245208787621142">"Most nem"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Újra végrehajtja a csatornabeállítást?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Ezzel eltávolítja a tévétuner segítségével megtalált csatornákat, és új csatornakeresést indít.\n\nEllenőrizze, hogy tévéje csatlakoztatva van-e a televíziós jelforráshoz.\n\nAntenna használata esetén szükség lehet az elhelyezés, illetve az irány módosítására a lehető legtöbb csatorna befogásához. A legjobb eredmény érdekében helyezze magasra és ablak közelébe."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Ezzel eltávolítja a már megtalált csatornákat az USB-tunerről, és újból elvégzi a csatornakeresést.\n\nGyőződjön meg arról, hogy az USB-tuner be van dugva, és csatlakoztatva van a televíziós jelforráshoz.\n\nAntenna használata esetén szükség lehet az elhelyezés, illetve irány módosítására a lehető legtöbb csatorna befogásához. A legjobb eredmény érdekében helyezze magasra és ablak közelébe."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Ezzel eltávolítja a hálózati tuner által talált csatornákat, és újabb csatornakeresést indít el.\n\nEllenőrizze, hogy a hálózati tuner be van-e kapcsolva, és csatlakozik-e televíziós jelforráshoz.\n\nHa antennát használ, módosítsa az elhelyezkedését, illetve irányát, hogy minél több csatornát fogjon. A legjobb eredmény érdekében helyezze magasra és ablak közelébe."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Folytatás"</item>
<item msgid="235450158666155406">"Mégse"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Tévétuner beállítása"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB-s csatornatuner beállítása"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Hálózati csatornatuner beállítása"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Ez néhány percet is igénybe vehet"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"A tuner átmenetileg nem áll rendelkezésre, vagy már fel lett használva a felvétel során."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Nem található csatorna"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"A keresés nem talált csatornát. Ellenőrizze, hogy tévéje csatlakoztatva van-e a televíziós jelforráshoz.\n\nAntenna használata esetén módosítsa annak elhelyezését, illetve irányát. A legjobb eredmény érdekében helyezze magasra és ablak közelébe, majd ismételje meg a keresést."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"A keresés nem talált csatornát. Győződjön meg arról, hogy az USB-tuner be van dugva, és csatlakoztatva van a televíziós jelforráshoz.\n\nHa antennát használ, állítson annak helyzetén, illetve irányán. A legjobb eredmény érdekében helyezze magasra és ablak közelébe, majd ismételje meg a keresést."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"A rendszer nem talált egyetlen csatornát sem. Ellenőrizze, hogy a hálózati tuner be van-e kapcsolva, és csatlakozik-e televíziós jelforráshoz.\n\nHa antennát használ, módosítsa az elhelyezkedését, illetve irányát. A legjobb eredmény érdekében helyezze magasra és ablak közelébe, majd ismételje meg a keresést."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Keresés újra"</item>
<item msgid="2092797862490235174">"Kész"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Tévécsatornák keresése"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Tévétuner beállítása"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB-s tévétuner beállítása"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Hálózati tévétuner beállítása"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Megszakadt a kapcsolat az USB-s tévétunerrel."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Megszakadt a kapcsolat a hálózati tunerrel."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Megszakadt a kapcsolat az USB-s tévétunerrel."</string>
</resources>
diff --git a/usbtuner-res/values-hy-rAM/strings.xml b/usbtuner-res/values-hy/strings.xml
index 6f4c3aac..a8e33eac 100644
--- a/usbtuner-res/values-hy-rAM/strings.xml
+++ b/usbtuner-res/values-hy/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Հեռուստակարգավորիչ"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB հեռուստակարգավորիչ"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Ցանցային հեռուստաընդունիչ (ԲԵՏԱ)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Միացնել"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Անջատել"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Սպասեք՝ մինչ որոնումը ավարտվի"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Ընտրեք ալիքի աղբյուրը"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Ազդանշան չկա"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Չհաջողվեց անցնել <xliff:g id="CHANNEL_NAME">%s</xliff:g> ալիքին"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Չհաջողվեց անցնել ալիքին"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Ընդունիչի ծրագրակազմը վերջերս թարմացվել է: Նորից որոնեք ալիքները:"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Ձայնը միացնելու համար համակարգի ձայնի կարգավորումներում ակտիվացրեք ծավալային ձայնը"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Հնարավոր չէ վերարտադրել ձայնը: Փորձեք մեկ այլ հեռուստացույց:"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Ալիքների կարգավորիչի տեղադրում"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Հեռուստակարգավորիչի տեղադրում"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Ալիքների USB կարգավորիչի տեղադրում"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Ցանցային ընդունիչի կարգավորում"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Համոզվեք, որ հեռուստացույցը միացված է հեռուստատեսային ազդանշանի աղբյուրին:\n\nԵթերային ալեհավաք օգտագործելիս հնարավոր է՝ անհրաժեշտ լինի կարգավորել դրա դիրքն ու ուղղությունը՝ ավելի շատ ալիքներ գտնելու համար: Լավագույն արդյունքներն ապահովելու համար այն դրեք բարձր տեղում՝ պատուհանի մոտ:"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Համոզվեք, որ USB կարգավորիչը միացված է ցանցին և հեռուստատեսային ազդանշանի աղբյուրին:\n\nԵթերային ալեհավաք օգտագործելիս հնարավոր է՝ անհրաժեշտ լինի կարգավորել դրա դիրքն ու ուղղությունը՝ ավելի շատ ալիքներ գտնելու համար: Լավագույն արդյունքներն ապահովելու համար այն դրեք բարձր տեղում՝ պատուհանի մոտ:"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Համոզվեք, որ ցանցային ընդունիրչը միացված է և կապակցված հեռուստատեսային ազդանշանի աղբյուրին:\n\nԵթերային ալեհավաք օգտագործելիս հնարավոր է՝ անհրաժեշտ լինի կարգավորել դրա դիրքն ու ուղղությունը՝ ավելի շատ ալիքներ գտնելու համար: Լավագույն արդյունքներն ապահովելու համար այն դրեք բարձր տեղում՝ պատուհանի մոտ:"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Շարունակել"</item>
<item msgid="727245208787621142">"Ոչ հիմա"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Կրկի՞ն կարգավորել ալիքները:"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Այս գործողության արդյունքում կհեռացվեն հեռուստակարգավորիչից ստացված ալիքները և կկատարվի ալիքների նոր որոնում:\n\nՀամոզվեք, որ հեռուստացույցը միացված է հեռուստատեսային ազդանշանի աղբյուրին:\n\nԵթերային ալեհավաք օգտագործելիս հնարավոր է՝ անհրաժեշտ լինի կարգավորել դրա դիրքն ու ուղղությունը՝ ավելի շատ ալիքներ գտնելու համար: Լավագույն արդյունքներն ապահովելու համար այն դրեք բարձր տեղում՝ պատուհանի մոտ:"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Այս գործողության արդյունքում կհեռացվեն USB կարգավորիչից ստացված ալիքները և կկատարվի ալիքների նոր որոնում:\n\nՀամոզվեք, որ USB կարգավորիչը միացված է ցանցին և հեռուստատեսային ազդանշանի աղբյուրին:\n\nԵթերային ալեհավաք օգտագործելիս հնարավոր է՝ անհրաժեշտ լինի կարգավորել դրա դիրքն ու ուղղությունը՝ ավելի շատ ալիքներ գտնելու համար: Լավագույն արդյունքներն ապահովելու համար այն դրեք բարձր տեղում՝ պատուհանի մոտ:"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Այս գործողության արդյունքում կհեռացվեն ցանցային ընդունիչից ստացված ալիքները և կկատարվի ալիքների նոր որոնում:\n\nՀամոզվեք, որ ցանցային ընդունիչը միացված է և կապակցված հեռուստատեսային ազդանշանի աղբյուրին:\n\nԵթերային ալեհավաք օգտագործելիս հնարավոր է՝ անհրաժեշտ լինի կարգավորել դրա դիրքն ու ուղղությունը՝ ավելի շատ ալիքներ գտնելու համար: Լավագույն արդյունքներն ապահովելու համար այն դրեք բարձր տեղում՝ պատուհանի մոտ:"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Շարունակել"</item>
<item msgid="235450158666155406">"Չեղարկել"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Հեռուստակարգավորիչի տեղադրում"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Ալիքների USB կարգավորիչի տեղադրում"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Ցանցային ալիքների ընդունիչի տեղադրում"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Դա կարող է տևել մի քանի րոպե"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Ընդունիչը ժամանակավորապես անհասանելի է կամ արդեն օգտագործվում է տեսագրելու համար:"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Ալիքներ չեն գտնվել"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Որոնման արդյունքում ալիքներ չեն գտնվել: Համոզվեք, որ հեռուստացույցը միացված է հեռուստատեսային ազդանշանի աղբյուրին:\n\nԵթերային ալեհավաք օգտագործելիս կարգավորեք դրա դիրքն ու ուղղությունը: Լավագույն արդյունքներն ապահովելու համար այն դրեք բարձր տեղում՝ պատուհանի մոտ, ապա որոնեք նորից:"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Որոնման արդյունքում ալիքներ չեն գտնվել: Համոզվեք, որ USB կարգավորիչը միացված է ցանցին և հեռուստատեսային ազդանշանի աղբյուրին:\n\nԵթերային ալեհավաք օգտագործելիս կարգավորեք դրա դիրքն ու ուղղությունը: Լավագույն արդյունքներն ապահովելու համար այն դրեք բարձր տեղում՝ պատուհանի մոտ, ապա որոնեք նորից:"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Որոնման արդյունքում ալիքներ չեն գտնվել: Համոզվեք, որ ցանցային ընդունիչը միացված է և կապակցված հեռուստատեսային ազդանշանի աղբյուրին:\n\nԵթերային ալեհավաք օգտագործելիս կարգավորեք դրա դիրքն ու ուղղությունը: Լավագույն արդյունքներն ապահովելու համար այն դրեք բարձր տեղում՝ պատուհանի մոտ, ապա որոնեք նորից:"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Կրկին որոնել"</item>
<item msgid="2092797862490235174">"Պատրաստ է"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Հեռուստաալիքների որոնում"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Հեռուստակարգավորիչի տեղադրում"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB հեռուստակարգավորիչի տեղադրում"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Ցանցային հեռուստաընդունիչի կարգավորում"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB հեռուստաընդունիչն անջատված է:"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Ցանցային ընդունիչն անջատված է։"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB հեռուստակարգավորիչն անջատված է:"</string>
</resources>
diff --git a/usbtuner-res/values-in/strings.xml b/usbtuner-res/values-in/strings.xml
index 7fe7eea7..e534c9c6 100644
--- a/usbtuner-res/values-in/strings.xml
+++ b/usbtuner-res/values-in/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Tuner TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Tuner TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Tuner TV Jaringan (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Aktif"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Nonaktif"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Harap tunggu sampai pemrosesan selesai"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Pilih sumber saluran Anda"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Tidak Ada Sinyal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Gagal menyetel ke <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Gagal menyetel"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Perangkat lunak tuner ini baru saja diperbarui. Pindai ulang saluran Anda."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Aktifkan suara surround di setelan suara sistem untuk mengaktifkan audio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Tidak dapat memutar audio. Coba TV lainnya"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Penyiapan penyetel saluran"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Penyiapan Tuner TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Penyiapan tuner saluran USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Penyiapan tuner jaringan"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Pastikan TV terhubung ke sumber sinyal TV.\n\nJika menggunakan antena udara, Anda mungkin perlu menyesuaikan tempat atau arahnya untuk menerima sebagian besar saluran. Untuk hasil terbaik, tempatkan di lokasi yang tinggi dan dekat dengan jendela."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Pastikan tuner USB dicolokkan dan tersambung ke sumber sinyal TV.\n\nJika menggunakan antena udara, Anda mungkin perlu menyesuaikan tempat atau arahnya untuk menerima jumlah saluran paling banyak. Untuk hasil terbaik, letakkan di tempat yang tinggi dan dekat jendela."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Pastikan tuner jaringan aktif dan terhubung ke sumber sinyal TV.\n\nJika menggunakan antena udara, Anda mungkin perlu menyesuaikan tempat dan arahnya agar dapat menerima sebagian besar saluran. Untuk hasil terbaik, tempatkan antena di lokasi yang tinggi dan dekat jendela."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Lanjutkan"</item>
<item msgid="727245208787621142">"Jangan sekarang"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Jalankan lagi penyiapan saluran?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Tindakan ini akan menghapus saluran yang ditemukan dari tuner TV dan memindai saluran baru lagi.\n\nPastikan TV terhubung ke sumber sinyal TV.\n\nJika menggunakan antena udara, mungkin Anda perlu menyesuaikan tempat atau arahnya untuk menerima sebagian besar saluran. Untuk hasil terbaik, tempatkan di lokasi yang tinggi dan dekat dengan jendela."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Tindakan ini akan menghapus saluran yang ditemukan dari tuner USB dan memindai saluran baru lagi.\n\nPastikan tuner USB dicolokkan dan tersambung ke sumber sinyal TV.\n\nJika menggunakan antena udara, Anda mungkin perlu menyesuaikan tempat atau arahnya untuk menerima jumlah saluran paling banyak. Untuk hasil terbaik, letakkan di tempat yang tinggi dan dekat jendela."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Hal ini akan menghapus saluran yang ditemukan dari tuner jaringan dan memindai saluran baru lagi.\n\nPastikan tuner jaringan aktif dan terhubung ke sumber sinyal TV.\n\nJika menggunakan antena udara, Anda mungkin perlu menyesuaikan penempatan atau arahnya agar dapat menerima sebagian besar saluran. Untuk hasil terbaik, tempatkan antena di lokasi yang tinggi dan dekat dengan jendela."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Lanjutkan"</item>
<item msgid="235450158666155406">"Batal"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Penyiapan tuner TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Penyiapan tuner saluran USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Penyiapan tuner saluran jaringan"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Proses ini dapat memakan waktu beberapa menit"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuner sementara tidak tersedia atau sudah digunakan oleh rekaman."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Tidak ditemukan Saluran"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Pemindaian tidak menemukan saluran apa pun. Pastikan TV terhubung ke sumber sinyal TV.\n\nJika menggunakan antena udara, sesuaikan tempat atau arahnya. Untuk hasil terbaik, tempatkan di lokasi yang tinggi dan dekat dengan jendela kemudian pindai lagi."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Pemindaian tidak menemukan saluran apa pun. Pastikan tuner USB dicolokkan dan tersambung ke sumber sinyal TV.\n\nJika menggunakan antena udara, sesuaikan tempat atau arahnya. Untuk hasil terbaik, letakkan di tempat yang tinggi dan dekat jendela lalu pindai lagi."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Tidak menemukan saluran apa pun saat memindai. Pastikan tuner jaringan aktif dan terhubung ke sumber sinyal TV.\n\nJika Anda menggunakan antena udara, sesuaikan penempatan atau arahnya. Untuk hasil terbaik, tempatkan di lokasi yang tinggi dan dekat jendela, lalu pindai lagi."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Pindai lagi"</item>
<item msgid="2092797862490235174">"Selesai"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Pindai saluran TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Penyiapan Tuner TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Penyiapan Tuner TV USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Penyiapan Tuner TV Jaringan"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Koneksi tuner TV USB terputus."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Koneksi tuner jaringan terputus."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Koneksi tuner TV USB terputus."</string>
</resources>
diff --git a/usbtuner-res/values-is-rIS/strings.xml b/usbtuner-res/values-is/strings.xml
index f9d1188b..f63d9810 100644
--- a/usbtuner-res/values-is-rIS/strings.xml
+++ b/usbtuner-res/values-is/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sjónvarpsmóttakari"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-sjónvarpsmóttakari"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Netsjónvarpsmóttakari (TILRAUNAÚTGÁFA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Kveikja"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Slökkva"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Bíddu þar til vinnslu lýkur"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Veldu inntak rása"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Ekkert merki"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Mistókst að stilla á <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Mistókst að stilla"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Hugbúnaður sjónvarpsmóttakarans var uppfærður nýlega. Leitaðu aftur að rásum."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Kveikja á víðómastillingu í hljóðstillingum kerfisins til að kveikja á hljóði"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Ekki er hægt að spila hljóð. Prófaðu annað sjónvarp"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Uppsetning sjónvarpskorts"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Uppsetning sjónvarpsmóttakara"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Uppsetning USB-sjónvarpsrásakorts"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Uppsetning netsjónvarpsmóttakara"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Gakktu úr skugga um að sjónvarpið sé tengt við sjónvarpstengi.\n\nEf þú ert að nota loftnet skaltu færa það á annan stað eða snúa því í aðra átt. Best er að hafa það hátt uppi og nálægt glugga þegar leitað er."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Gakktu úr skugga um að USB-sjónvarpskortið sé í sambandi og tengt við sjónvarpstengi.\n\nEf þú ert að nota loftnet skaltu færa það á annan stað eða snúa því í aðra átt til að ná fleiri rásum. Best er að hafa það hátt uppi og nálægt glugga."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Gakktu úr skugga um að kveikt sé á netsjónvarpsmóttakaranum og að hann sé tengdur við sjónvarpstengi.\n\nEf þú ert að nota loftnet skaltu færa það á annan stað eða snúa því í aðra átt. Best er að hafa það hátt uppi og nálægt glugga þegar leitað er."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Halda áfram"</item>
<item msgid="727245208787621142">"Ekki núna"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Viltu keyra rásauppsetningu aftur?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Þetta fjarlægir stöðvar sem sjónvarpsmóttakarinn fann og leitar aftur að nýjum stöðvum.\n\nGakktu úr skugga um að sjónvarpið sé tengt við sjónvarpstengi.\n\nEf þú ert að nota loftnet skaltu færa það á annan stað eða snúa því í aðra átt. Best er að hafa það hátt uppi og nálægt glugga þegar leitað er."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Þetta fjarlægir rásir sem skráðar eru á USB-sjónvarpskortinu og leitar að nýjum stöðvum.\n\nGakktu úr skugga um að USB-sjónvarpskortið sé í sambandi og tengt við sjónvarpstengi.\n\nEf þú ert að nota loftnet skaltu færa það á annan stað eða snúa því í aðra átt til að ná fleiri rásum. Best er að hafa það hátt uppi og nálægt glugga."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Þetta fjarlægir rásirnar sem sjónvarpsmóttakarinn þinn fann og leitar aftur að nýjum rásum.\n\nGakktu úr skugga um að kveikt sé á netsjónvarpsmóttakaranum og að hann sé tengdur við sjónvarpstengi.\n\nEf þú ert að nota loftnet skaltu færa það á annan stað eða snúa því í aðra átt. Best er að hafa það hátt uppi og nálægt glugga þegar leitað er."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Halda áfram"</item>
<item msgid="235450158666155406">"Hætta við"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Uppsetning sjónvarpsmóttakara"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Uppsetning USB-sjónvarpsrásakorts"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Uppsetning netsjónvarpsmóttakara"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Þetta getur tekið nokkrar mínútur"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Móttakari er tímabundið ekki í boði eða er þegar að taka upp."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Engar rásir fundust"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Engar rásir fundust. Gakktu úr skugga um að sjónvarpið sé tengt við sjónvarpstengi.\n\nEf þú ert að nota loftnet skaltu færa það á annan stað eða snúa því í aðra átt. Best er að hafa það hátt uppi og nálægt glugga þegar leitað er."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Engar rásir fundust. Gakktu úr skugga um að USB-sjónvarpskortið sé í sambandi og tengt við sjónvarpstengi.\n\nEf þú ert að nota loftnet skaltu færa það á annan stað eða snúa því í aðra átt. Best er að hafa það hátt uppi og nálægt glugga þegar leitað er."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Leitin fann engar stöðvar. Gakktu úr skugga um að kveikt sé á netsjónvarpsmóttakaranum og hann sé tengdur við sjónvarpstengi.\n\nEf þú ert að nota loftnet skaltu færa það á annan stað eða snúa því í aðra átt. Best er að hafa það hátt uppi og nálægt glugga þegar leitað er."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Leita aftur"</item>
<item msgid="2092797862490235174">"Lokið"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Skanna eftir sjónvarpsstöðvum"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Uppsetning sjónvarpsmóttakara"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Uppsetning USB-sjónvarpsmóttakara"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Uppsetning netsjónvarpsmóttakara"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-sjónvarpsmóttakari tekinn úr sambandi."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Netmóttakari tekinn úr sambandi."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-sjónvarpsmóttakari tekinn úr sambandi."</string>
</resources>
diff --git a/usbtuner-res/values-it/strings.xml b/usbtuner-res/values-it/strings.xml
index fdefdeb1..7787d019 100644
--- a/usbtuner-res/values-it/strings.xml
+++ b/usbtuner-res/values-it/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sintonizzatore TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Sintonizzatore TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Network TV Tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Attiva"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Disattiva"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Attendi il completamento dell\'elaborazione"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Seleziona la tua fonte canale"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Nessun segnale"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Sintonizzazione su <xliff:g id="CHANNEL_NAME">%s</xliff:g> non riuscita"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Sintonizzazione non riuscita"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Il software del sintonizzatore è stato aggiornato di recente. Esegui nuovamente la scansione dei canali."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Per attivare l\'audio, attiva l\'audio surround nelle impostazioni del sistema"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Impossibile riprodurre l\'audio. Prova con un\'altra TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configurazione del sintonizzatore di canali"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configurazione del sintonizzatore TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configurazione del sintonizzatore di canali USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configurazione del sintonizzatore di rete"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Verifica che la TV sia connessa a un\'origine del segnale TV.\n\nSe utilizzi un\'antenna OTA, regolane la posizione o la direzione per ricevere la maggior parte dei canali. Per ottenere risultati ottimali, posizionala in alto e vicino a una finestra."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Verifica che il sintonizzatore USB sia collegato e connesso a un\'origine del segnale TV.\n\nSe utilizzi un\'antenna OTA, potresti dover regolare la sua posizione o direzione per ricevere la maggior parte dei canali. Per risultati ottimali, posizionala in alto e vicino a una finestra."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Verifica che il sintonizzatore di rete sia acceso e connesso a un\'origine del segnale TV.\n\nSe utilizzi un\'antenna OTA (over-the-air), potresti doverne regolare la posizione o la direzione per ricevere il maggior numero di canali. Per ottenere risultati ottimali, posizionala in alto, vicino a una finestra."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continua"</item>
<item msgid="727245208787621142">"Non ora"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Eseguire nuovamente la configurazione dei canali?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Questa operazione rimuoverà i canali trovati dal sintonizzatore TV ed eseguirà la ricerca di nuovi canali.\n\nVerifica che la TV sia connessa a un\'origine del segnale TV.\n\nSe utilizzi un\'antenna OTA, regolane la posizione o la direzione per ricevere la maggior parte dei canali. Per ottenere risultati ottimali, posizionala in alto e vicino a una finestra."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Questa operazione rimuoverà i canali trovati dal sintonizzatore USB ed eseguirà la ricerca di nuovi canali.\n\nVerifica che il sintonizzatore USB sia collegato e connesso a un\'origine del segnale TV.\n\nSe utilizzi un\'antenna OTA, potresti dover regolare la sua posizione o direzione per ricevere il maggior numero di canali. Per ottenere risultati ottimali, posizionala in alto e vicino a una finestra."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"I canali trovati dal sintonizzatore di rete verranno rimossi e verrà eseguita nuovamente la ricerca di nuovi canali.\n\nVerifica che il sintonizzatore di rete sia acceso e connesso a un\'origine del segnale TV.\n\nSe utilizzi un\'antenna OTA (over-the-air), potresti doverne regolare la posizione o la direzione per ricevere il maggior numero di canali. Per ottenere risultati ottimali, posizionala in alto, vicino a una finestra."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continua"</item>
<item msgid="235450158666155406">"Annulla"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configurazione del sintonizzatore TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configurazione del sintonizzatore di canali USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configurazione del sintonizzatore di canali della rete"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"L\'operazione potrebbe richiedere alcuni minuti"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Il sintonizzatore è temporaneamente non disponibile o già utilizzato dal registratore."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Nessun canale trovato"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Nessun canale trovato durante la ricerca. Verifica che la TV sia connessa a un\'origine del segnale TV.\n\nSe utilizzi un\'antenna OTA, regolane la posizione o la direzione. Per ottenere risultati ottimali, posizionala in alto, vicino a una finestra ed esegui nuovamente la ricerca."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Nessun canale trovato durante la ricerca. Verifica che il sintonizzatore USB sia collegato e connesso a un\'origine del segnale TV.\n\nSe utilizzi un\'antenna OTA (over-the-air), regolane la posizione o la direzione. Per ottenere risultati ottimali, posizionala in alto, vicino a una finestra ed esegui nuovamente la ricerca."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Nessun canale trovato durante la ricerca. Verifica che il sintonizzatore di rete sia acceso e connesso a un\'origine del segnale TV.\n\nSe utilizzi un\'antenna OTA (over-the-air), regolane la posizione o la direzione. Per ottenere risultati ottimali, posizionala in alto, vicino a una finestra ed esegui nuovamente la ricerca."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Cerca di nuovo"</item>
<item msgid="2092797862490235174">"Fine"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Cerca canali TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configurazione del sintonizzatore TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configurazione del sintonizzatore TV USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configurazione di Network TV Tuner"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Sintonizzatore TV USB disconnesso."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Sintonizzatore di rete disconnesso."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Sintonizzatore TV USB disconnesso."</string>
</resources>
diff --git a/usbtuner-res/values-iw/strings.xml b/usbtuner-res/values-iw/strings.xml
index 631110e8..5dab5f15 100644
--- a/usbtuner-res/values-iw/strings.xml
+++ b/usbtuner-res/values-iw/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"טיונר טלוויזיה"</string>
<string name="ut_app_name" msgid="8557698013780762454">"‏טיונר ה-USB בטלוויזיה"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"טיונר טלוויזיה לרשת (ביטא)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"מופעל"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"כבוי"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"המתן לסיום העיבוד"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"בחר את מקור הערוצים"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"אין אות"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"לא ניתן היה לכוון לערוץ <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"הכוונון נכשל"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"תוכנת הטיונר עודכנה לאחרונה. סרוק מחדש את הערוצים."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"הפעל סראונד בהגדרות צלילי מערכת כדי להפעיל אודיו"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"אין אפשרות להשמיע אודיו. נסה ערוץ טלוויזיה אחר."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"הגדרת טיונר ערוצים"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"הגדרת טיונר טלוויזיה"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"‏הגדרת טיונר ערוצים בחיבור USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"הגדרת מקלט הרשת"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"ודא שהטלוויזיה מחוברת למקור אות טלוויזיה.\n\nאם אתה משתמש באנטנה אלחוטית, ייתכן שיהיה עליך לשנות את המיקום או את הכיוון שלה כדי לקלוט כמה שיותר ערוצים. לקבלת התוצאות הטובות ביותר, הצב אותה במקום גבוה ליד חלון."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"‏ודא שטיונר USB מחובר למקור אות בטלוויזיה. \n\n אם אתה משתמש באנטנה אלחוטית, ייתכן שיהיה עליך לכוון את מיקומה או את כיוונה כדי לקלוט כמה שיותר ערוצים. לתוצאות מיטביות, הצב אותה במקום גבוה ליד חלון וסרוק שוב."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"ודא שמקלט הרשת מופעל ומחובר למקור אות של טלוויזיה.\n\nאם אתה משתמש באנטנה לקליטת שידורים אלחוטיים, ייתכן שיהיה עליך לשנות את המיקום או את הכיוון שלה כדי לקלוט כמה שיותר ערוצים. לקבלת התוצאות הטובות ביותר, הצב אותה במקום גבוה ליד חלון."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"המשך"</item>
<item msgid="727245208787621142">"לא עכשיו"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"האם להפעיל מחדש את הגדרת הערוצים?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"פעולה זו תסיר את הערוצים שנמצאו בטיונר הטלוויזיה ותסרוק שוב ערוצים חדשים.\n\nודא שהטלוויזיה מחוברת למקור אות טלוויזיה.\n\nאם אתה משתמש באנטנה אלחוטית, ייתכן שיהיה עליך לשנות את המיקום או את הכיוון שלה כדי לקלוט כמה שיותר ערוצים. לקבלת התוצאות הטובות ביותר, הצב אותה במקום גבוה ליד חלון."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"‏פעולה זו תסיר את הערוצים שנמצאו מטיונר ה-USB ותתבצע סריקה נוספת לערוצים חדשים.\n\nודא שטיונר USB מחובר למקור אות בטלוויזיה.\n\nאם אתה משתמש באנטנה אלחוטית, ייתכן שיהיה עליך לשנות את מיקומה או את כיוונה כדי לקלוט כמה שיותר ערוצים. לתוצאות מיטביות, הצב אותה במקום גבוה ליד חלון וסרוק שוב."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"הפעולה תסיר את הערוצים שנמצאו ממקלט הרשת ותתבצע שוב סריקה לאיתור ערוצים חדשים.\n\nודא שמקלט הרשת מופעל ומחובר למקור אות של טלוויזיה.\n\nאם אתה משתמש באנטנה לקליטת שידורים אלחוטיים, ייתכן שיהיה עליך לשנות את המיקום או את הכיוון שלה כדי לקלוט כמה שיותר ערוצים. לקבלת התוצאות הטובות ביותר, הצב אותה במקום גבוה ליד חלון."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"המשך"</item>
<item msgid="235450158666155406">"ביטול"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"הגדרת טיונר טלוויזיה"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"‏הגדרת טיונר ערוצים בחיבור USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"הגדרת מקלט ערוצים לרשת"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"פעולה זו עשויה להימשך מספר דקות"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"הטיונר אינו זמין באופן זמני או שהוא כבר נמצא בשימוש של הקלטה."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -82,7 +82,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"לא נמצאו ערוצים"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"בסריקה לא נמצאו ערוצים. ודא שהטלוויזיה מחוברת למקור אות טלוויזיה.\n\nאם אתה משתמש באנטנה אלחוטית, שנה את המיקום או את הכיוון שלה. לקבלת התוצאות הטובות ביותר, הצב אותה במקום גבוה ליד חלון וסרוק שוב."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"‏לא נמצאו ערוצים בסריקה. ודא שטיונר USB מחובר למקור אות בטלוויזיה. \n\n אם אתה משתמש באנטנה אלחוטית, שנה את מיקומה או את כיוונה. לתוצאות מיטביות, הצב אותה במקום גבוה ליד חלון וסרוק שוב."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"בסריקה לא נמצאו ערוצים. ודא שמקלט הרשת מופעל ומחובר למקור אות של טלוויזיה.\n\nאם אתה משתמש באנטנה לקליטת שידורים אלחוטיים, שנה את המיקום או את הכיוון שלה. לקבלת התוצאות הטובות ביותר, הצב אותה במקום גבוה ליד חלון וסרוק שוב."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"סרוק שוב"</item>
<item msgid="2092797862490235174">"סיום"</item>
@@ -90,7 +89,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"סריקה לאיתור ערוצי טלוויזיה"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"הגדרת טיונר טלוויזיה"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"‏הגדרת טיונר ה-USB בטלוויזיה"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"הגדרת מקלט טלוויזיה לרשת"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"‏טיונר ה-USB שבטלוויזיה מנותק."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"טיונר הרשת מנותק."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"‏טיונר ה-USB שבטלוויזיה מנותק."</string>
</resources>
diff --git a/usbtuner-res/values-ja/strings.xml b/usbtuner-res/values-ja/strings.xml
index d850d4ce..88af255a 100644
--- a/usbtuner-res/values-ja/strings.xml
+++ b/usbtuner-res/values-ja/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"テレビ チューナー"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB テレビ チューナー"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"ネットワーク テレビ チューナー(ベータ版)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"ON"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"OFF"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"処理が完了するまでこのままお待ちください"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"チャンネル ソースを選択してください"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"信号がありません"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"「<xliff:g id="CHANNEL_NAME">%s</xliff:g>」に合わせることができませんでした"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"合わせることができませんでした"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"最近チューナー ソフトウェアが更新されています。チャンネルをもう一度スキャンしてください。"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"音声を有効にするには、システムのサウンド設定でサラウンド サウンドをオンにしてください"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"音声を再生できません。別のテレビをお試しください"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"チャンネル チューナーのセットアップ"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"テレビ チューナーのセットアップ"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB チャンネル チューナーのセットアップ"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"ネットワーク チューナーのセットアップ"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"テレビがテレビの信号源に接続されていることを確認してください。\n\n無線アンテナを使用している場合は、チャンネルの多くを受信するためにアンテナの場所や方向の調節が必要になる場合があります。最良の結果を得るには、アンテナを窓際の高い位置に設置します。"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB チューナーが電源に接続され、テレビの信号源に接続されていることを確認してください。\n\n無線アンテナを使用している場合は、チャンネルの多くを受信するためにアンテナの場所や方向の調節が必要になる場合があります。最良の結果を得るには、アンテナを窓際の高い位置に設置します。"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"ネットワーク チューナーの電源がオンになっていて、テレビの信号源に接続されていることを確認してください。\n\n無線アンテナを使用している場合は、チャンネルの多くを受信するためにアンテナの場所や方向の調節が必要になる場合があります。最良の結果を得るには、アンテナを窓際の高い位置に設置します。"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"次へ"</item>
<item msgid="727245208787621142">"後で"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"もう一度チャンネルを設定しますか?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"テレビ チューナーで見つかったチャンネルを削除して新しいチャンネルをもう一度スキャンします。\n\nテレビがテレビの信号源に接続されていることを確認してください。\n\n無線アンテナを使用している場合は、チャンネルの多くを受信するためにアンテナの場所や方向の調節が必要になる場合があります。最良の結果を得るには、アンテナを窓際の高い位置に設置します。"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"USB チューナーで見つかったチャンネルを削除して新しいチャンネルをもう一度スキャンします。\n\nUSB チューナーが電源に接続され、テレビの信号源に接続されていることを確認してください。\n\n無線アンテナを使用している場合は、チャンネルの多くを受信するためにアンテナの場所や方向の調節が必要になる場合があります。最良の結果を得るには、アンテナを窓際の高い位置に設置します。"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"ネットワーク チューナーで見つかったチャンネルを削除して新しいチャンネルをもう一度スキャンします。\n\nネットワーク チューナーの電源がオンになっていて、テレビの信号源に接続されていることを確認してください。\n\n無線アンテナを使用している場合は、チャンネルの多くを受信するためにアンテナの場所や方向の調節が必要になる場合があります。最良の結果を得るには、アンテナを窓際の高い位置に設置します。"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"次へ"</item>
<item msgid="235450158666155406">"キャンセル"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"テレビ チューナーのセットアップ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB チャンネル チューナーのセットアップ"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"ネットワーク チャンネル チューナーのセットアップ"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"この処理には数分かかることがあります"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"チューナーを一時的に使用できないか、すでに録画に使用しています。"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"チャンネルが見つかりませんでした"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"スキャンの結果、チャンネルは見つかりませんでした。テレビがテレビの信号源に接続されていることを確認してください。\n\n無線アンテナを使用している場合は、アンテナの場所や方向を調節してください。最良の結果を得るには、アンテナを窓際の高い位置に設置してから、もう一度スキャンします。"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"スキャンの結果、チャンネルは見つかりませんでした。USB チューナーが電源に接続され、テレビの信号源に接続されていることを確認してください。\n\n無線アンテナを使用している場合は、アンテナの場所や方向を調節してください。最良の結果を得るには、アンテナを窓際の高い位置に設置してから、もう一度スキャンします。"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"スキャンの結果、チャンネルは見つかりませんでした。ネットワーク チューナーの電源がオンになっていて、テレビの信号源に接続されていることを確認してください。\n\n無線アンテナを使用している場合は、アンテナの場所や方向を調節してください。最良の結果を得るには、アンテナを窓際の高い位置に設置してから、もう一度スキャンします。"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"再スキャン"</item>
<item msgid="2092797862490235174">"完了"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"テレビのチャンネルをスキャン"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"テレビ チューナーのセットアップ"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB テレビ チューナーのセットアップ"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"ネットワーク テレビ チューナーのセットアップ"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB テレビ チューナーの接続が解除されています。"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"ネットワーク チューナーの接続が解除されています。"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV チューナーの接続が解除されています。"</string>
</resources>
diff --git a/usbtuner-res/values-ka-rGE/strings.xml b/usbtuner-res/values-ka/strings.xml
index c2e3e846..e09428d7 100644
--- a/usbtuner-res/values-ka-rGE/strings.xml
+++ b/usbtuner-res/values-ka/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV-ტუნერი"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV-ტუნერი"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"ქსელის TV-ტუნერი (Beta)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"ჩართვა"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"გამორთვა"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"გთხოვთ, მოითმინოთ დამუშავების დასრულებამდე"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"აირჩიეთ არხების წყარო"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"სიგნალი არ არის"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g>-ზე გადართვა ვერ მოხერხდა"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"არხზე გადართვა ვერ მოხერხდა"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ტუნერის პროგრამული უზრუნველყოფა ახლახან განახლდა. გთხოვთ, ხელახლა დაასკანიროთ არხები."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"აუდიოს ჩასართავად, სისტემის ხმის პარამეტრებში ჩართეთ მოცულობითი ხმა"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"აუდიოს დაკვრა ვერ ხერხდება. გთხოვთ, ცადოთ სხვა არხი"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"არხების ტუნერის დაყენება"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV-ტუნერის დაყენება"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"არხების USB ტუნერის დაყენება"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"ქსელის ტუნერის დაყენება"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"დარწმუნდით, რომ თქვენი ტელევიზორი მიერთებულია სატელევიზიო სიგნალის წყაროსთან..\n\nტერესტრიული ანტენის გამოყენების შემთხვევაში, არხების უმეტესობის მისაღებად, მისი განლაგების ან მიმართულების დარეგულება მოგიწევთ. საუკეთესო შედეგის მისაღებად, განათავსეთ ის სიმაღლეზე, ფანჯარასთან ახლოს."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"დარწმუნდით, რომ USB ტუნერი ბუდეშია და მიერთებულია სატელევიზიო სიგნალის წყაროსთან.\n\nტერესტრიული ანტენის გამოყენების შემთხვევაში, არხების უმეტესობის მისაღებად, მისი განლაგების ან მიმართულების დარეგულება მოგიწევთ. საუკეთესო შედეგის მისაღებად, განათავსეთ ის სიმაღლეზე, ფანჯარასთან ახლოს."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"დარწმუნდით, რომ ქსელის ტუნერი ჩართულია და მიერთებულია სატელევიზიო სიგნალის წყაროსთან.\n\nტერესტრიული ანტენის გამოყენების შემთხვევაში, არხების უმეტესობის მისაღებად, მისი განლაგების ან მიმართულების დარეგულირება მოგიწევთ. საუკეთესო შედეგის მისაღებად, განათავსეთ ის სიმაღლეზე, ფანჯარასთან ახლოს."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"გაგრძელება"</item>
<item msgid="727245208787621142">"ახლა არა"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"გსურთ არხების ხელახლა დაყენება?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"ეს მოქმედება ამოშლის TV ტუნერით ნაპოვნ არხებს და ახალი არხების სკანირება ხელახლა მოხდება.\n\nდარწმუნდით, რომ თქვენი ტელევიზორი მიერთებულია სატელევიზიო სიგნალის წყაროსთან.\n\nტერესტრიული ანტენის გამოყენების შემთხვევაში, არხების უმეტესობის მისაღებად, მისი განლაგების ან მიმართულების დარეგულება მოგიწევთ. საუკეთესო შედეგის მისაღებად, განათავსეთ ის სიმაღლეზე, ფანჯარასთან ახლოს."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"ეს მოქმედება ამოშლის USB ტუნერით ნაპოვნ არხებს და ხელახლა მოხდება ახალი არხების სკანირება.\n\nდარწმუნდით, რომ USB ტუნერი ბუდეშია და მიერთებულია სატელევიზიო სიგნალის წყაროსთან.\n\nტერესტრიული ანტენის გამოყენების შემთხვევაში, არხების უმეტესობის მისაღებად, მისი განლაგების ან მიმართულების დარეგულება მოგიწევთ. საუკეთესო შედეგის მისაღებად, განათავსეთ ის სიმაღლეზე, ფანჯარასთან ახლოს."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"ეს მოქმედება ამოშლის ქსელის ტუნერით ნაპოვნ არხებს და ახალი არხების სკანირება ხელახლა მოხდება.\n\nდარწმუნდით, რომ ქსელის ტუნერი ჩართულია და მიერთებულია სატელევიზიო სიგნალის წყაროსთან.\n\nტერესტრიული ანტენის გამოყენების შემთხვევაში, არხების უმეტესობის მისაღებად, მისი განლაგების ან მიმართულების დარეგულირება მოგიწევთ. საუკეთესო შედეგის მისაღებად, განათავსეთ ის სიმაღლეზე, ფანჯარასთან ახლოს."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"გაგრძელება"</item>
<item msgid="235450158666155406">"გაუქმება"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV-ტუნერის დაყენება"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"არხების USB ტუნერის დაყენება"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"არხების ქსელის ტუნერის დაყენება"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"ამას შეიძლება რამდენიმე წუთი დასჭირდეს"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ტუნერი დროებით მიუწვდომელია, ან უკვე გამოიყენება ჩასაწერად."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"არხები ვერ მოიძებნა"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"სკანირებისას არხები ვერ მოიძებნა. დარწმუნდით, რომ თქვენი ტელევიზორი მიერთებულია სატელევიზიო სიგნალის წყაროსთან.\n\nტერესტრიული ანტენის გამოყენების შემთხვევაში, დაარეგულირეთ მისი განლაგება ან მიმართულება. საუკეთესო შედეგის მისაღებად, განათავსეთ ის სიმაღლეზე, ფანჯარასთან ახლოს და ხელახლა დაასკანირეთ."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"სკანირებისას არხები ვერ მოიძებნა. დარწმუნდით, რომ USB ტუნერი ბუდეშია და მიერთებულია სატელევიზიო სიგნალის წყაროსთან. \n\nტერესტრიული ანტენის გამოყენების შემთხვევაში, დაარეგულირეთ მისი განლაგება ან მიმართულება. საუკეთესო შედეგის მისაღებად, განათავსეთ ის სიმაღლეზე, ფანჯარასთან ახლოს და ხელახლა დაასკანირეთ."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"სკანირებისას არხები ვერ მოიძებნა. დარწმუნდით, რომ ქსელის ტუნერი ჩართულია და მიერთებულია სატელევიზიო სიგნალის წყაროსთან. \n\nტერესტრიული ანტენის გამოყენების შემთხვევაში, დაარეგულირეთ მისი განლაგება ან მიმართულება. საუკეთესო შედეგის მისაღებად, განათავსეთ ის სიმაღლეზე, ფანჯარასთან ახლოს და ხელახლა დაასკანირეთ."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"ხელახლა სკანირება"</item>
<item msgid="2092797862490235174">"მზადაა"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"სატელევიზიო არხების სკანირება"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV-ტუნერის დაყენება"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV-ტუნერის დაყენება"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"ქსელის TV-ტუნერის დაყენება"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV-ტუნერი გაითიშა."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"ქსელის ტუნერი გაითიშა."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV-ტუნერი გაითიშა."</string>
</resources>
diff --git a/usbtuner-res/values-kk-rKZ/strings.xml b/usbtuner-res/values-kk/strings.xml
index 7b9fced0..3c2ba4f3 100644
--- a/usbtuner-res/values-kk-rKZ/strings.xml
+++ b/usbtuner-res/values-kk/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"ТД тюнері"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TД тюнері"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Желілік теледидар тюнері (БЕТА НҰСҚАСЫ)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Қосу"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Өшіру"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Өңдеу аяқталғанша күте тұрыңыз"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Арна көзін таңдаңыз"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Сигнал жоқ"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> арнасына реттелмеді"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Реттелмеді"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Тюнердің бағдарламалық құралы жақында жаңартылды. Арналарды қайта іздеңіз."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Аудиомазмұнды қосу үшін жүйенің параметрлерінде көлемдік дыбысты қосыңыз"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Аудиомазмұн ойнатылмайды. Басқа теледидар арнасын қосып көріңіз"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Арна тюнерін орнату"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"ТД тюнерін орнату"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB арна тюнерін орнату"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Желі тюнерін реттеу"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Теледидардың ТД сигнал көзіне қосылғанын тексеріңіз.\n\nСымсыз антеннаны пайдалансаңыз, көптеген арналарды қабылдау үшін оның орнын немесе бағытын реттеу қажет болады. Ең жақсы нәтижеге қол жеткізу үшін оны жоғарырақ және терезеге жақын орналастырыңыз."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB тюнерін жалғанғанын және ТД сигнал көзіне қосылғанын тексеріңіз.\n\nСымсыз антеннаны пайдалансаңыз, көптеген арналарды қабылдау үшін оның орнын немесе бағытын реттеу қажет болады. Ең жақсы нәтижеге қол жеткізу үшін оны жоғарырақ және терезеге жақын орналастырыңыз."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"USB тюнері қосылып, теледидардың сигнал көзіне жалғанғанын тексеріңіз.\n\nСымсыз антеннаны пайдалансаңыз, көптеген арналарды қабылдау үшін оның орнын ауыстырыңыз немесе бағытын реттеңіз. Ең жақсы нәтижеге қол жеткізу үшін оны жоғарырақ және терезеге жақын жерге орналастырыңыз."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Жалғастыру"</item>
<item msgid="727245208787621142">"Қазір емес"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Арналарды қайта орнату қажет пе?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"ТД тюнерінде табылған арналар жойылып, жаңа арналар ізделеді.\n\nТеледидардың ТД сигнал көзіне қосылғанын тексеріңіз.\n\nСымсыз антеннаны пайдалансаңыз, көптеген арналарды қабылдау үшін оның орнын немесе бағытын реттеу қажет болады. Ең жақсы нәтижеге қол жеткізу үшін оны жоғарырақ және терезеге жақын орналастырыңыз."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"USB тюнерінде табылған арналар жойылып, жаңа арналар ізделеді.\n\nUSB тюнері жалғанғанын және ТД сигнал көзіне қосылғанын тексеріңіз.\n\nСымсыз антеннаны пайдалансаңыз, көптеген арналарды қабылдау үшін оның орнын немесе бағытын реттеу қажет болады. Ең жақсы нәтижеге қол жеткізу үшін оны жоғарырақ және терезеге жақын орналастырыңыз."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Желі тюнерінде табылған арналар өшіріліп, жаңа арналар ізделеді.\n\nЖелі тюнері қосылып, теледидардың сигнал көзіне жалғанғанын тексеріңіз.\n\nСымсыз антеннаны пайдалансаңыз, көптеген арналарды қабылдау үшін оның орнын ауыстырыңыз немесе бағытын реттеңіз. Ең жақсы нәтижеге қол жеткізу үшін оны жоғарырақ және терезеге жақын жерге орналастырыңыз."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Жалғастыру"</item>
<item msgid="235450158666155406">"Бас тарту"</item>
@@ -53,9 +54,8 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"ТД тюнерін орнату"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB арна тюнерін орнату"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Желілік арна тюнерін реттеу"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Бұл бірнеше минутты алуы мүмкін"</string>
- <string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Тюнер қолжетімсіз немесе жазу барысында қолданылуда."</string>
+ <string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Тюнер қол жетімсіз немесе жазу барысында қолданылуда."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
<item quantity="other">%1$d арна табылды</item>
<item quantity="one">%1$d арна табылды</item>
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Арналар табылмады"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Іздеу нәтижесінде ешқандай арна табылмады. Теледидардың ТД сигнал көзіне қосылғанын тексеріңіз.\n\nСымсыз антеннаны пайдалансаңыз, орнын немесе бағытын реттеңіз. Ең жақсы нәтижеге қол жеткізу үшін оны жоғарырақ және терезеге жақын орналастырып, қайта іздеп көріңіз."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Іздеу нәтижесінде арналар табылмады. USB тюнері жалғанғанын және ТД сигнал көзіне қосылғанын тексеріңіз.\n\nСымсыз антеннаны пайдалансаңыз, орнын немесе бағытын реттеңіз. Ең жақсы нәтижеге қол жеткізу үшін оны жоғарырақ және терезеге жақын орналастырып, қайта іздеп көріңіз."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Іздеу нәтижесінде арналар табылмады. Желі тюнері қосылып, теледидардың сигнал көзіне жалғанғанын тексеріңіз.\n\nСымсыз антеннаны пайдалансаңыз, оның орнын ауыстырыңыз немесе бағытын реттеңіз. Ең жақсы нәтижеге қол жеткізу үшін оны жоғарырақ және терезеге жақын жерге орналастырып, қайта іздеп көріңіз."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Қайта іздеу"</item>
<item msgid="2092797862490235174">"Орындалды"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"ТД арналарын іздеу"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"ТД тюнерін орнату"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TД тюнерін орнату"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Желілік ТД тюнерін реттеу"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TД тюнері ажыратылды."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Желі тюнері ажыратылды."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TД тюнері ажыратылды."</string>
</resources>
diff --git a/usbtuner-res/values-km-rKH/strings.xml b/usbtuner-res/values-km/strings.xml
index e6a359ef..904f3e5d 100644
--- a/usbtuner-res/values-km-rKH/strings.xml
+++ b/usbtuner-res/values-km/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"អង្គរាវប៉ុស្តិ៍ទូរទស្សន៍"</string>
<string name="ut_app_name" msgid="8557698013780762454">"ឧបករណ៍ USB រាវប៉ុស្តិ៍ទូរទស្សន៍"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"កម្មវិធី​រាវ​បណ្តាញ​ទូរទស្សន៍ (បេតា)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"បើក"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"បិទ"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"សូមរង់ចាំដើម្បីបញ្ចប់ដំណើរការ"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"ជ្រើសប្រភពប៉ុស្តិ៍របស់អ្នក"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"គ្មានរលកសញ្ញាទេ"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"បានបរាជ័យក្នុងការបើកប៉ុស្តិ៍ <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"បរាជ័យក្នុងការរាវប៉ុស្តិ៍"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"កម្មវិធីអង្គរាវប៉ុស្តិ៍បានអាប់ដេតថ្មីៗនេះ។ សូមស្កេនរកប៉ុស្តិ៍ទាំងនេះម្តងទៀត។"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"បើកដំណើរការសំឡេងជុំវិញនៅក្នុងការកំណត់សំឡេងប្រព័ន្ធដើម្បីបើកដំណើរការអូឌីយ៉ូ"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"មិនអាចចាក់អូឌីយ៉ូបានទេ។ សូមសាកល្បងប្រើទូរទស្សន៍ផ្សេង"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"ការដំឡើងអង្គរាវប៉ុស្តិ៍"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"ការដំឡើងអង្គរាវប៉ុស្តិ៍ទូរទស្សន៍"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"ការដំឡើងឧបករណ៍ USB រាវប៉ុស្តិ៍"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"រៀបចំឧបករណ៍រាវបណ្តាញ"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"សូមផ្ទៀងផ្ទាត់ថាប៉ុស្តិ៍ទូរទស្សន៍របស់អ្នកត្រូវបានភ្ជាប់ទៅប្រភពរលកសញ្ញាទូរទស្សន៍។\n\nប្រសិនបើអ្នកប្រើអង់តែនឥតខ្សែ សូមសម្រួលទីតាំង ឬទិសដៅរបស់វាដើម្បីទទួលបានប៉ុស្តិ៍ច្រើនបំផុត។ ដើម្បីទទួលបានលទ្ធផលល្អបំផុត សូមដាក់វានៅកន្លែងខ្ពស់ និងនៅជិតបង្អួច។"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"ផ្ទៀងផ្ទាត់ថាអ្នកបានដោតឧបករណ៍ USB រាវប៉ុស្តិ៍ និងបានភ្ជាប់ទៅប្រភពសញ្ញាទូរទស្សន៍\n\nប្រសិនបើអ្នកប្រើអង់តែនឥតខ្សែ អ្នកប្រហែលជាត្រូវកែសម្រួលទីតាំង និងទិសដៅរបស់វាដើម្បីទទួលបានប៉ុស្តិ៍ច្រើនបំផុត។ ដើម្បីទទួលបានលទ្ធផលល្អបំផុត សូមដាក់វានៅកន្លែងដែលខ្ពស់ក្បែរបង្អួច។"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"ផ្ទៀងផ្ទាត់ថាអ្នកបានបើកឧបករណ៍រាវបណ្តាញនេះ និងបានភ្ជាប់ទៅប្រភពរលកសញ្ញាទូរទស្សន៍។\n\nប្រសិនបើអ្នកប្រើអង់តែនឥតខ្សែ អ្នកត្រូវកែសម្រួលទីតាំង និងទិសដៅរបស់វា ដើម្បីទទួលបានប៉ុស្តិ៍ច្រើនបំផុត។ ដើម្បីទទួលបានលទ្ធផលល្អបំផុត សូមដាក់វានៅកន្លែងដែលខ្ពស់ក្បែរបង្អួច។"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"បន្ត"</item>
<item msgid="727245208787621142">"មិនមែនឥឡូវនេះទេ"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"ដំណើរការដំឡើងប៉ុស្តិ៍ឡើងវិញឬទេ?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"វានឹងលុបប៉ុស្តិ៍ដែលបានរកឃើញដោយអង្គរាវប៉ុស្តិ៍ទូរទស្សន៍ចេញ ហើយស្កេនរកប៉ុស្តិ៍ថ្មីម្តងទៀត។\n\nផ្ទៀងផ្ទាត់ថាអ្នកបានដោតទូរទស្សន៍ទៅប្រភពរលកសញ្ញាទូរទស្សន៍\n\nប្រសិនបើអ្នកប្រើអង់តែនឥតខ្សែ អ្នកប្រហែលជាត្រូវសម្រួលទីតាំង និងទិសដៅរបស់វាដើម្បីទទួលបានប៉ុស្តិ៍ច្រើនបំផុត។ ដើម្បីទទួលបានលទ្ធផលល្អបំផុត សូមដាក់វានៅកន្លែងដែលខ្ពស់ក្បែរបង្អួច។"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"វានឹងលុបប៉ុស្តិ៍ដែលបានរកឃើញដោយឧបករណ៍ USB រាវប៉ុស្តិ៍ចេញ ហើយស្កេនរកប៉ុស្តិ៍ថ្មីម្តងទៀត។\n\nផ្ទៀងផ្ទាត់ថាអ្នកបានដោតឧបករណ៍ USB រាវប៉ុស្តិ៍ និងបានភ្ជាប់ទៅប្រភពសញ្ញាទូរទស្សន៍\n\nប្រសិនបើអ្នកប្រើអង់តែនឥតខ្សែ អ្នកប្រហែលជាត្រូវសម្រួលទីតាំង និងទិសដៅរបស់វាដើម្បីទទួលបានប៉ុស្តិ៍ច្រើនបំផុត។ ដើម្បីទទួលបានលទ្ធផលល្អបំផុត សូមដាក់វានៅកន្លែងដែលខ្ពស់ក្បែរបង្អួច។"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"វានឹងលុបប៉ុស្តិ៍ដែលបានរកឃើញដោយឧបករណ៍រាវបណ្តាញ ហើយបន្ទាប់មកស្កេនរកបណ្តាញថ្មី។\n\nផ្ទៀងផ្ទាត់ថាអ្នកបានបើកអង្គរាវបណ្តាញនេះ និងបានភ្ជាប់ទៅប្រភពរលកសញ្ញាទូរទស្សន៍។\n\nប្រសិនបើអ្នកប្រើអង់តែនឥតខ្សែ អ្នកត្រូវសម្រួលទីតាំង និងទិសដៅរបស់វា ដើម្បីទទួលបានប៉ុស្តិ៍ច្រើនបំផុត។ ដើម្បីទទួលបានលទ្ធផលល្អបំផុត សូមដាក់វានៅកន្លែងដែលខ្ពស់ក្បែរបង្អួច។"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"បន្ត"</item>
<item msgid="235450158666155406">"បោះបង់"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"ការដំឡើងអង្គរាវប៉ុស្តិ៍ទូរទស្សន៍"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"ការដំឡើងឧបករណ៍ USB រាវប៉ុស្តិ៍ទូរទស្សន៍"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"ការរៀបចំឧបករណ៍រាវបណ្តាញប៉ុស្តិ៍"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"វាអាចចំណាយពេលច្រើននាទី"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"អង្គរាវប៉ុស្តិ៍មិនអាចប្រើបានជាបណ្តោះអាសន្ន ឬបានប្រើសម្រាប់ការថតរួចទៅហើយ។"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"រកមិនឃើញប៉ុស្តិ៍ទេ"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"ការស្កេននេះរកមិនឃើញប៉ុស្តិ៍ណាមួយឡើយ។ សូមផ្ទៀងផ្ទាត់ថាប៉ុស្តិ៍ទូរទស្សន៍របស់អ្នកត្រូវបានភ្ជាប់ទៅប្រភពរលកសញ្ញាទូរទស្សន៍។\n\nប្រសិនបើអ្នកប្រើអង់តែនឥតខ្សែ សូមសម្រួលទីតាំង ឬទិសដៅរបស់វា។ ដើម្បីទទួលបានលទ្ធផលល្អបំផុត សូមដាក់វានៅកន្លែងខ្ពស់ និងនៅជិតបង្អួច បន្ទាប់មកធ្វើការស្កេនម្តងទៀត។"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"ការស្កេនរកមិនឃើញប៉ុស្តិ៍ទេ។ ផ្ទៀងផ្ទាត់ថាអ្នកបានដោតឧបករណ៍ USB រាវប៉ុស្តិ៍ និងបានភ្ជាប់ទៅប្រភពសញ្ញាទូរទស្សន៍។\n\nប្រសិនបើអ្នកប្រើអង់តែនឥតខ្សែ សូមសម្រួលទីតាំង និងទិសដៅរបស់វា។ ដើម្បីទទួលបានលទ្ធផលល្អបំផុត សូមដាក់វានៅកន្លែងដែលខ្ពស់ក្បែរបង្អួច ហើយបន្ទាប់មកស្កេនម្តងទៀត។"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"ការស្កេនរកមិនឃើញប៉ុស្តិ៍ណាមួយទេ។ ផ្ទៀងផ្ទាត់ថាអ្នកបានបើកឧបករណ៍រាវបណ្តាញនេះ និងបានភ្ជាប់ទៅប្រភពរលកសញ្ញាទូរទស្សន៍។\n\nប្រសិនបើអ្នកប្រើអង់តែនឥតខ្សែ សូមសម្រួលទីតាំង និងទិសដៅរបស់វា។ ដើម្បីទទួលបានលទ្ធផលល្អបំផុត សូមដាក់វានៅកន្លែងដែលខ្ពស់ក្បែរបង្អួច បន្ទាប់មកស្កេនម្តងទៀត។"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"ស្កេនម្តងទៀត"</item>
<item msgid="2092797862490235174">"រួចរាល់"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"ស្កេនរកប៉ុស្តិ៍ទូរទស្សន៍"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"ការដំឡើងអង្គរាវប៉ុស្តិ៍ទូរទស្សន៍"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"ការដំឡើងឧបករណ៍ USB រាវប៉ុស្តិ៍ទូរទស្សន៍"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"រៀបចំឧបករណ៍រាវបណ្តាញទូរទស្សន៍"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"អង្គរាវរកប៉ុស្តិ៍ USB សម្រាប់ទូរទស្សន៍ត្រូវបានផ្តាច់។"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"អង្គរាវរក​បណ្តាញ​ត្រូវ​បាន​ផ្ដាច់។"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"អង្គរាវប៉ុស្តិ៍ USB សម្រាប់ទូរទស្សន៍ត្រូវបានផ្តាច់"</string>
</resources>
diff --git a/usbtuner-res/values-kn-rIN/strings.xml b/usbtuner-res/values-kn/strings.xml
index 47cfc134..fb97ae2b 100644
--- a/usbtuner-res/values-kn-rIN/strings.xml
+++ b/usbtuner-res/values-kn/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"ಟಿವಿ ಟ್ಯೂನರ್"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB ಟಿವಿ ಟ್ಯೂನರ್"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"ನೆಟ್‌ವರ್ಕ್ ಟಿವಿ ಟ್ಯೂನರ್ (ಬೀಟಾ)‌‌"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"ಆನ್"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"ಆಫ್"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವುದನ್ನು ಪೂರೈಸಲು ದಯವಿಟ್ಟು ಕಾಯಿರಿ"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"ನಿಮ್ಮ ಚಾನಲ್ ಮೂಲವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"ಯಾವುದೇ ಸಂಕೇತವಿಲ್ಲ"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> ಗೆ ಟ್ಯೂನ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ಟ್ಯೂನ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ಟ್ಯೂನರ್ ಸಾಫ್ಟ್‌ವೇರ್‍ ಅನ್ನು ಇತ್ತೀಚಿಗೆ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಚಾನಲ್‌ಗಳನ್ನು ಮರು-ಸ್ಕ್ಯಾನ್‌ ಮಾಡಿ."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ಆಡಿಯೊ ಸಕ್ರಿಯಗೊಳಿಸಲು ಸಿಸ್ಟಂ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಸರೌಂಡ್ ಧ್ವನಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"ಆಡಿಯೊವನ್ನು ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ಟಿವಿಯಲ್ಲಿ ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"ಚಾನಲ್ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"ಟಿವಿ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB ಚಾನಲ್ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"ನೆಟ್‌ವರ್ಕ್ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"ನಿಮ್ಮ ಟಿವಿಯನ್ನು ಟಿವಿ ಸಿಗ್ನಲ್‌ ಮೂಲಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆಯೆ ಎಂದು ಪರಿಶೀಲಿಸಿ.\n\nನೀವು ಪ್ರಸಾರದ ಮೂಲಕ ಆಂಟೆನಾ ಬಳಸುತ್ತಿದ್ದರೆ, ಹೆಚ್ಚಿನ ಚಾನಲ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ನೀವು ಅದರ ಸ್ಥಾನ ಅಥವಾ ದಿಕ್ಕನ್ನು ಹೊಂದಿಸಬೇಕಾಗಬಹುದು. ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗೆ, ಇದನ್ನು ಎತ್ತರದಲ್ಲಿ ಮತ್ತು ಕಿಟಕಿಯ ಬಳಿ ಇರಿಸಿ."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB ಟ್ಯೂನಲ್ ಅನ್ನು ಪ್ಲಗ್ ಇನ್ ಮಾಡಲಾಗಿದೆಯೇ ಮತ್ತು ಟಿವಿ ಸಿಗ್ನಲ್ ಮೂಲಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆಯೆ ಎಂದು ಪರಿಶೀಲಿಸಿ.\n\nಪ್ರಸಾರದ ಮೂಲಕ ಆಂಟೆನಾ ಬಳಸುತ್ತಿದ್ದರೆ, ಹೆಚ್ಚಿನ ಚಾನಲ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ನೀವು ಅದರ ಸ್ಥಾನ ಅಥವಾ ದಿಕ್ಕನ್ನು ಹೊಂದಿಸಬೇಕಾಗಬಹುದು. ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗೆ, ಇದನ್ನು ಎತ್ತರದಲ್ಲಿ ಮತ್ತು ಕಿಟಕಿಯ ಬಳಿ ಇರಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"ನೆಟ್‌ವರ್ಕ್ ಟ್ಯೂನರ್ ಆನ್ ಮಾಡಲಾಗಿದೆಯೇ ಮತ್ತು ಟಿವಿ ಸಿಗ್ನಲ್ ಮೂಲಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.\n\nನೀವು ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕದ ಮೂಲಕ ಆಂಟೆನಾ ಬಳಸುತ್ತಿದ್ದರೆ, ಹೆಚ್ಚಿನ ಚಾನಲ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ನೀವು ಅದರ ಸ್ಥಾನ ಅಥವಾ ದಿಕ್ಕನ್ನು ಹೊಂದಿಸಬೇಕಾಗಬಹುದು. ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗೆ, ಅದನ್ನು ಎತ್ತರದಲ್ಲಿ ಮತ್ತು ಕಿಟಕಿಯ ಬಳಿ ಇರಿಸಿ."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"ಮುಂದುವರಿಸು"</item>
<item msgid="727245208787621142">"ಸದ್ಯಕ್ಕೆ ಬೇಡ"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"ಚಾನಲ್ ಸೆಟಪ್ ಅನ್ನು ಮರುರನ್ ಮಾಡುವುದೇ?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"ಟಿವಿ ಟ್ಯೂನರ್‌ನಿಂದ ಪತ್ತೆ ಮಾಡಲಾದ ಚಾನಲ್‌ಗಳನ್ನು ಇದು ತೆಗೆದುಹಾಕುತ್ತದೆ ಹಾಗೂ ಮತ್ತೆ ಹೊಸ ಚಾನಲ್‌ಗಳಿಗೆ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತದೆ.\n\nನಿಮ್ಮ ಟಿವಿಯನ್ನು ಟಿವಿ ಸಿಗ್ನಲ್‌ ಮೂಲಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆಯೆ ಎಂದು ಪರಿಶೀಲಿಸಿ.\n\nನೀವು ಪ್ರಸಾರದ ಮೂಲಕ ಆಂಟೆನಾ ಬಳಸುತ್ತಿದ್ದರೆ, ಹೆಚ್ಚಿನ ಚಾನಲ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ನೀವು ಅದರ ಸ್ಥಾನ ಅಥವಾ ದಿಕ್ಕನ್ನು ಹೊಂದಿಸಬೇಕಾಗಬಹುದು. ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗೆ, ಇದನ್ನು ಎತ್ತರದಲ್ಲಿ ಮತ್ತು ಕಿಟಕಿಯ ಬಳಿ ಇರಿಸಿ."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"USB ಟ್ಯೂನರ್‌ನಿಂದ ಪತ್ತೆ ಮಾಡಲಾದ ಚಾನಲ್‌ಗಳನ್ನು ಇದು ತೆಗೆದುಹಾಕುತ್ತದೆ ಹಾಗೂ ಮತ್ತೆ ಹೊಸ ಚಾನಲ್‌ಗಳಿಗೆ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತದೆ.\n\nUSB ಟ್ಯೂನಲ್ ಅನ್ನು ಪ್ಲಗ್ ಇನ್ ಮಾಡಲಾಗಿದೆಯೇ ಮತ್ತು ಟಿವಿ ಸಿಗ್ನಲ್ ಮೂಲಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆಯೆ ಎಂದು ಪರಿಶೀಲಿಸಿ.\n\nನೀವು ಪ್ರಸಾರದ ಮೂಲಕ ಆಂಟೆನಾ ಬಳಸುತ್ತಿದ್ದರೆ, ಹೆಚ್ಚಿನ ಚಾನಲ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ನೀವು ಅದರ ಸ್ಥಾನ ಅಥವಾ ದಿಕ್ಕನ್ನು ಹೊಂದಿಸಬೇಕಾಗಬಹುದು. ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗೆ, ಇದನ್ನು ಎತ್ತರದಲ್ಲಿ ಮತ್ತು ಕಿಟಕಿಯ ಬಳಿ ಇರಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"ನೆಟ್‌ವರ್ಕ್ ಟ್ಯೂನರ್‌ನಿಂದ ಪತ್ತೆ ಮಾಡಲಾದ ಚಾನಲ್‌ಗಳನ್ನು ಇದು ತೆಗೆದುಹಾಕುತ್ತದೆ ಹಾಗೂ ಮತ್ತೆ ಹೊಸ ಚಾನಲ್‌ಗಳಿಗೆ ಸ್ಕ್ಯಾನ್ ಮಾಡುತ್ತದೆ.\n\nನೆಟ್‌ವರ್ಕ್ ಟ್ಯೂನಲ್ ಅನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆಯೇ ಮತ್ತು ಟಿವಿ ಸಿಗ್ನಲ್ ಮೂಲಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.\n\nನೀವು ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕದ ಮೂಲಕ ಆಂಟೆನಾ ಬಳಸುತ್ತಿದ್ದರೆ, ಹೆಚ್ಚಿನ ಚಾನಲ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ನೀವು ಅದರ ಸ್ಥಾನ ಅಥವಾ ದಿಕ್ಕನ್ನು ಹೊಂದಿಸಬೇಕಾಗಬಹುದು. ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗೆ, ಅದನ್ನು ಎತ್ತರದಲ್ಲಿ ಮತ್ತು ಕಿಟಕಿಯ ಬಳಿ ಇರಿಸಿ."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"ಮುಂದುವರಿಸು"</item>
<item msgid="235450158666155406">"ರದ್ದುಮಾಡಿ"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"ಟಿವಿ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB ಚಾನಲ್ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"ನೆಟ್‌ವರ್ಕ್ ಚಾನಲ್ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"ಇದಕ್ಕೆ ಹಲವಾರು ನಿಮಿಷಗಳು ತೆಗೆದುಕೊಳ್ಳಬಹುದು"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ಟ್ಯೂನರ್ ತಾತ್ಕಾಲಿಕವಾಗಿ ಲಭ್ಯವಿಲ್ಲ ಅಥವಾ ಈಗಾಗಲೇ ರೆಕಾರ್ಡಿಂಗ್‌ಗೆ ಬಳಸಲಾಗಿದೆ."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"ಯಾವುದೇ ಚಾನಲ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"ಸ್ಕ್ಯಾನ್ ಯಾವುದೇ ಚಾನಲ್‌ಗಳನ್ನು ಪತ್ತೆ ಮಾಡಿಲ್ಲ. ನಿಮ್ಮ ಟಿವಿಯನ್ನು ಟಿವಿ ಸಿಗ್ನಲ್‌ ಮೂಲಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆಯೆ ಎಂದು ಪರಿಶೀಲಿಸಿ.\n\nನೀವು ಪ್ರಸಾರದ ಮೂಲಕ ಆಂಟೆನಾ ಬಳಸುತ್ತಿದ್ದರೆ, ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗೆ, ಇದನ್ನು ಎತ್ತರದಲ್ಲಿ ಮತ್ತು ಕಿಟಕಿಯ ಬಳಿ ಇರಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"ಸ್ಕ್ಯಾನ್ ಯಾವುದೇ ಚಾನಲ್‌ಗಳನ್ನು ಪತ್ತೆ ಮಾಡಿಲ್ಲ. USB ಟ್ಯೂನಲ್ ಅನ್ನು ಪ್ಲಗ್ ಇನ್ ಮಾಡಲಾಗಿದೆಯೇ ಮತ್ತು ಟಿವಿ ಸಿಗ್ನಲ್ ಮೂಲಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆಯೆ ಎಂದು ಪರಿಶೀಲಿಸಿ.\n\nಪ್ರಸಾರದ ಮೂಲಕ ಆಂಟೆನಾ ಬಳಸುತ್ತಿದ್ದರೆ, ಅದರ ಸ್ಥಾನ ಅಥವಾ ದಿಕ್ಕನ್ನು ಸರಿಹೊಂದಿಸಿ. ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗೆ, ಎತ್ತರದಲ್ಲಿ ಮತ್ತು ಕಿಟಕಿಯ ಬಳಿ ಇರಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"ಸ್ಕ್ಯಾನ್ ನಂತರ ಯಾವುದೇ ಚಾನಲ್ ಕಂಡುಬಂದಿಲ್ಲ. ನೆಟ್‌ವರ್ಕ್ ಟ್ಯೂನರ್ ಆನ್ ಮಾಡಲಾಗಿದೆಯೇ ಮತ್ತು ಟಿವಿ ಸಿಗ್ನಲ್ ಮೂಲಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.\n\nನೀವು ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕದ ಮೂಲಕ ಆಂಟೆನಾ ಬಳಸುತ್ತಿದ್ದರೆ, ಅದರ ಸ್ಥಾನ ಅಥವಾ ದಿಕ್ಕನ್ನು ಹೊಂದಿಸಿ. ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗೆ, ಅದನ್ನು ಎತ್ತರದಲ್ಲಿ ಮತ್ತು ಕಿಟಕಿಯ ಬಳಿ ಇರಿಸಿ ಹಾಗೂ ಮತ್ತೊಮ್ಮೆ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"ಮತ್ತೆ ಸ್ಕ್ಯಾನ್ ಮಾಡು"</item>
<item msgid="2092797862490235174">"ಮುಗಿದಿದೆ"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"ಟಿವಿ ಚಾನಲ್‌ಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"ಟಿವಿ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB ಟಿವಿ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"ನೆಟ್‌ವರ್ಕ್ ಟಿವಿ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB ಟಿವಿ ಟ್ಯೂನರ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"ನೆಟ್‌ವರ್ಕ್ ಟ್ಯೂನರ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB ಟಿವಿ ಟ್ಯೂನರ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ."</string>
</resources>
diff --git a/usbtuner-res/values-ko/strings.xml b/usbtuner-res/values-ko/strings.xml
index 0b354739..2c67ab6f 100644
--- a/usbtuner-res/values-ko/strings.xml
+++ b/usbtuner-res/values-ko/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV 튜너"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV 튜너"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"네트워크 TV 튜너(BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"사용"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"사용 안함"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"처리가 완료될 때까지 기다려 주세요."</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"채널 소스 선택"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"신호 없음"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g>에 맞추지 못함"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"조정 실패"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"튜너 소프트웨어가 최근 업데이트되었습니다. 채널을 다시 스캔하세요."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"오디오를 사용하려면 시스템 사운드 설정에서 서라운드 사운드를 사용 설정하세요."</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"오디오를 재생할 수 없습니다. 다른 TV를 사용해 보세요."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"채널 튜너 설정"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV 튜너 설정"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB 채널 튜너 설정"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"네트워크 튜너 설정"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"TV가 TV 신호 소스에 연결되어 있는지 확인하세요.\n\n무선 안테나를 사용하는 경우 대부분의 채널을 수신하려면 위치나 방향을 조정해야 할 수도 있습니다. 안테나를 창가 가까이에 높게 설치하면 가장 좋습니다."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB 튜너가 전원 및 TV 신호 소스에 연결되어 있는지 확인하세요.\n\n무선 안테나를 사용 중인 경우 안테나 위치나 방향을 조정하세요. 창가 가까이에 높게 설치하면 가장 좋습니다."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"네트워크 튜너의 전원이 켜져 있고 TV 신호 소스에 연결되어 있는지 확인하세요.\n\n무선 안테나를 사용하는 경우 안테나 위치나 방향을 조정하세요. 최상의 결과를 얻으려면 안테나를 창가 가까이에 높게 설치하세요."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"계속"</item>
<item msgid="727245208787621142">"나중에"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"채널 설정을 다시 실행하시겠습니까?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"이렇게 하면 TV 튜너에서 찾은 채널을 삭제하고 새로운 채널을 다시 스캔하게 됩니다.\n\nTV가 TV 신호 소스에 연결되어 있는지 확인하세요.\n\n무선 안테나를 사용하는 경우 대부분의 채널을 수신하려면 위치나 방향을 조정해야 할 수 있습니다. 안테나를 창가 가까이에 높게 설치하면 가장 좋습니다."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"이 작업을 수행하면 USB 튜너에서 찾은 채널이 삭제되며 새로운 채널을 다시 스캔합니다.\n\nUSB 튜너가 전원 및 TV 신호 소스에 연결되어 있는지 확인하세요.\n\n무선 안테나를 사용 중인 경우 안테나 위치나 방향을 조정하세요. 창가 가까이에 높게 설치하면 가장 좋습니다."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"네트워크 튜너에서 찾은 채널이 삭제되며 새로운 채널을 다시 스캔합니다.\n\n네트워크 튜너의 전원이 켜져 있고 TV 신호 소스에 연결되어 있는지 확인하세요.\n\n무선 안테나를 사용하는 경우 안테나 위치나 방향을 조정하세요. 최상의 결과를 얻으려면 안테나를 창가 가까이에 높게 설치하고 다시 스캔해보세요."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"계속"</item>
<item msgid="235450158666155406">"취소"</item>
@@ -53,9 +54,8 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV 튜너 설정"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB 채널 튜너 설정"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"네트워크 채널 튜너 설정"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"이 작업은 몇 분 정도 걸릴 수 있습니다."</string>
- <string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"일시적으로 튜너를 사용할 수 없거나 이미 녹화에 사용하고 있습니다."</string>
+ <string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"일시적으로 튜너를 사용할 수 없거나 녹화에서 이미 사용하고 있습니다."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
<item quantity="other">채널 %1$d개 발견</item>
<item quantity="one">채널 %1$d개 발견</item>
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"채널 없음"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"스캔 결과 채널을 찾지 못했습니다. TV가 TV 신호 소스에 연결되어 있는지 확인하세요.\n\n무선 안테나를 사용하는 경우 위치나 방향을 조정하세요. 안테나를 창가 가까이에 높게 설치하면 가장 좋습니다."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"스캔하여 채널을 찾을 수 없습니다. USB 튜너가 전원 및 TV 신호 소스에 연결되어 있는지 확인하세요.\n\n무선 안테나를 사용 중인 경우 안테나 위치나 방향을 조정하세요. 창가 가까이에 높게 설치하면 가장 좋습니다. 그런 다음 다시 스캔해 보세요."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"스캔 결과 채널을 찾지 못했습니다. 네트워크 튜너의 전원이 켜져 있고 TV 신호 소스에 연결되어 있는지 확인하세요.\n\n무선 안테나를 사용하는 경우 안테나 위치나 방향을 조정하세요. 최상의 결과를 얻으려면 안테나를 창가 가까이에 높게 설치하고 다시 스캔해보세요."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"다시 스캔"</item>
<item msgid="2092797862490235174">"완료"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"TV 채널 스캔"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV 튜너 설정"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV 튜너 설정"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"네트워크 TV 튜너 설정"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV 튜너의 연결이 끊겼습니다."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"네트워크 튜너의 연결이 끊겼습니다."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV 튜너 연결 끊어짐"</string>
</resources>
diff --git a/usbtuner-res/values-ky-rKG/strings.xml b/usbtuner-res/values-ky/strings.xml
index 3b33821d..39e9d1df 100644
--- a/usbtuner-res/values-ky-rKG/strings.xml
+++ b/usbtuner-res/values-ky/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Сыналгы күүлөгүчү"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB сыналгы күүлөгүчү"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Тармактык ТВ-тюнер (БЕТА)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Күйүк"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Өчүк"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Иштетүүнү бүтүрүү үчүн күтө туруңуз"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Каналыңыздын булагын тандаңыз"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Сигнал жок"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> каналы кармалган жок"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Канал кармалбай койду"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Күүлөгүчтүн программасы жакында жаңыртылды. Каналдарды кайрадан издеңиз."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Каналдын үнүн чыгаруу үчүн тутумдун үн жөндөөлөрүнө өтүп, көлөмдүү добушту иштетүү керек"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Аудио ойнотулбай жатат. Башка каналды байкап көрүңүз"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Канал күүлөгүчтү жөндөө"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Сыналгынын күүлөгүчүн жөндөө"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB канал күүлөгүчүнүн жөндөөсү"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Тармактык тюнерди жөндөө"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Сыналдыңыз сыналгынын сигнал булагына туташтырылганын текшериңиз. \n\nЭгер телеантенна колдонулуп жатса, анын ордун же багытын тууралаңыз. Мыкты кармашы үчүн аны бийик жана терезеге жакын жерге коюп, кайра издеңиз."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB күүлөгүч сайылып турганын жана сыналгынын сигнал булагына туташтырылганын текшериңиз.\n\nЭгер телеантенна колдонулуп жатса, көпчүлүк каналдарды табуу үчүн анын ордун же багытын тууралашыңыз керек болот. Мыкты кармашы үчүн аны бийик жана терезеге жакын жерге коюп, кайра издеңиз."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Тармактык тюнер сайылып турганын жана сыналгынын сигнал булагына туташтырылганын текшериңиз.\n\nЭгер телеантенна колдонулуп жатса, каналдарды табуу үчүн анын ордун же багытын тууралашыңыз керек болот. Антенна жакшы кармашы үчүн аны бийик жана терезеге жакын жерге коюп, кайра издеп көрүңүз."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Улантуу"</item>
<item msgid="727245208787621142">"Азыр эмес"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Канал кайра жөндөлсүнбү?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Ушуну менен сыналгынын күүлөгүчүнөн табылган каналдар алынып салынып, жаңы каналдар кайра изделет.\n\nСыналдыңыз сыналгынын сигнал булагына туташтырылганын текшериңиз.\n\nIЭгер телеантенна колдонулуп жатса, көпчүлүк каналдарды табуу үчүн анын ордун же багытын тууралашыңыз керек болот. Мыкты кармашы үчүн аны бийик жана терезеге жакын жерге коюп, кайра издеңиз."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Ушуну менен USB күүлөгүчтөн табылган каналдар алынып салынып, жаңы каналдар кайра изделет.\n\nUSB күүлөгүч сайылып турганын жана сыналгынын сигнал булагына туташтырылганын текшериңиз.\n\nЭгер телеантенна колдонулуп жатса, көпчүлүк каналдарды табуу үчүн анын ордун же багытын тууралашыңыз керек болот. Мыкты кармашы үчүн аны бийик жана терезеге жакын жерге коюп, кайра издеңиз."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Ушуну менен тармактык тюнер аркылуу табылган каналдар алынып салынып, жаңы каналдар кайра изделет.\n\nТармактык тюнер сайылып турганын жана сыналгынын сигнал булагына туташтырылганын текшериңиз.\n\nЭгер телеантенна колдонулуп жатса, каналдарды табуу үчүн анын ордун же багытын тууралашыңыз керек болот. Антенна жакшы кармашы үчүн аны бийик жана терезеге жакын жерге коюп, кайра издеп көрүңүз."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Улантуу"</item>
<item msgid="235450158666155406">"Токтотуу"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Сыналгы күүлөгүчүн жөндөө"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB канал күүлөгүчүн жөндөө"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Тармактык каналдын тюнерин жөндөө"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Бир нече мүнөт созулушу мүмкүн"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Тюнер убактылуу жеткиликсиз же жаздыруу үчүн колдонулууда."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Бир да канал табылган жок"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Издөөдөн эч бир канал табылган жок. Сыналдыңыз сыналгынын сигнал булагына туташтырылганын текшериңиз.\n\nЭгер телеантенна колдонулуп жатса, анын ордун же багытын тууралаңыз. Мыкты кармашы үчүн аны бийик жана терезеге жакын жерге коюп, кайра издеңиз."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Издөөдөн эч бир канал табылган жок. USB күүлөгүч сайылып турганын жана сыналгынын сигнал булагына туташтырылганын текшериңиз.\n\nЭгер телеантенна колдонулуп жатса, анын ордун же багытын тууралаңыз. Мыкты кармашы үчүн аны бийик жана терезеге жакын жерге коюп, кайра издеңиз."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Каналдар табылган жок. Тармактык тюнер сайылып турганын жана сыналгынын сигнал булагына туташтырылганын текшериңиз.\n\nЭгер телеантенна колдонулуп жатса, анын ордун же багытын тууралаңыз. Антенна жакшы кармашы үчүн аны бийик жана терезеге жакын жерге коюп, кайра издеп көрүңүз."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Кайра издөө"</item>
<item msgid="2092797862490235174">"Бүттү"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Сыналгы каналдарын издөө"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Сыналгы күүлөгүчүн жөндөө"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB күүлөгүчүнүн жөндөөсү"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Тармактык ТВ-тюнерди жөндөө"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV күүлөгүчү ажыратылды."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Тармак күүлөгүчү ажыратылды."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV күүлөгүчү ажыратылды."</string>
</resources>
diff --git a/usbtuner-res/values-lo-rLA/strings.xml b/usbtuner-res/values-lo/strings.xml
index a7f5ba61..954baabe 100644
--- a/usbtuner-res/values-lo-rLA/strings.xml
+++ b/usbtuner-res/values-lo/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"ຕົວຮັບສັນຍານໂທລະພາບ"</string>
<string name="ut_app_name" msgid="8557698013780762454">"ຕົວຮັບສັນຍານໂທລະພາບ USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Network TV Tuner (ເບຕ້າ)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"ເປີດ"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"ປິດ"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"ກະລຸນາລໍຖ້າເພື່ອປະມວນຜົນໃຫ້ສຳເລັດ"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"ເລືອກແຫຼ່ງສັນຍານຊ່ອງຂອງທ່ານ"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"ບໍ່ມີສັນຍານ"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"ປັບຫາ <xliff:g id="CHANNEL_NAME">%s</xliff:g> ບໍ່ສຳເລັດ"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ປັບຊ່ອງບໍ່ສຳເລັດ"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ຊອບແວຕົວປັບສັນຍານໄດ້ຮັບການອັບເດດເມື່ອບໍ່ດົນມານີ້ແລ້ວ. ກະລຸນາສະແກນຫາຊ່ອງຄືນໃໝ່."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ເປີດໃຊ້ສຽງຮອບທິດທາງໃນການຕັ້ງຄ່າລະບົບສຽງເພື່ອເປີດໃຊ້ສຽງ."</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Cannot play audio. Please try another TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"ຕັ້ງເຄື່ອງຮັບສັນຍານຊ່ອງ"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"ຕັ້ງຄ່າຕົວຮັບສັນຍານໂທລະພາບ"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"ຕັ້ງເຄື່ອງຮັບສັນຍານຊ່ອງ USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Network tuner setup"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"ໃຫ້ກວດສອບວ່າທ່ານເຊື່ອມຕໍ່ໂທລະພາບຂອງທ່ານຫາແຫລ່ງສັນຍານໂທລະພາບແລ້ວ.\n\nຫາກໃຊ້ເສົາອາກາດ, ໃຫ້ຍ້າຍບ້ອນວາງ ຫຼື ທິດທາງຂອງມັນ. ເພື່ອໃຫ້ໄດ້ຜົນທີ່ດີທີ່ສຸດ, ໃຫ້ວາງໄວ້ບ່ອນສູງໃກ້ໆປ່ອງຢ້ຽມ ແລ້ວລອງສະແກນໃໝ່."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"ກວດສອບເບິ່ງເຄື່ອງຮັບສັນຍານ USB ວ່າ ໄດ້ສຽບສາຍ ແລະ ເຊື່ອມຕໍ່ກັບແຫຼ່ງສັນຍານໂທລະພາບແລ້ວຫຼືຍັງ.\n\nຫາກໃຊ້ເສົາອາກາດ, ໃຫ້ຍ້າຍບ້ອນວາງ ຫຼື ທິດທາງຂອງມັນ. ເພື່ອໃຫ້ໄດ້ຜົນທີ່ດີທີ່ສຸດ, ໃຫ້ວາງໄວ້ບ່ອນສູງໃກ້ໆປ່ອງຢ້ຽມ ແລ້ວລອງສະແກນໃໝ່."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"ກວດສອບເບິ່ງເຄື່ອງຮັບສັນຍານເຄືອຂ່າຍວ່າ ໄດ້ສຽບສາຍ ແລະ ເຊື່ອມຕໍ່ກັບແຫຼ່ງສັນຍານໂທລະພາບແລ້ວຫຼືຍັງ.\n\nຫຼຫາກໃຊ້ເສົາອາກາດ, ໃຫ້ຍ້າຍບ່ອນວາງ ຫຼື ທິດທາງຂອງມັນ. ເພື່ອໃຫ້ໄດ້ຜົນທີ່ດີທີ່ສຸດ, ໃຫ້ວາງໄວ້ບ່ອນສູງໃກ້ໆປ່ອງຢ້ຽມ ແລ້ວລອງສະແກນໃໝ່."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"ສືບຕໍ່"</item>
<item msgid="727245208787621142">"ບໍ່ແມ່ນຕອນນີ້"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"ຕັ້ງຄ່າຊ່ອງຄືນໃໝ່ບໍ່?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"ນີ້ເປັນການລຶບຊ່ອງທີ່ພົບແລ້ວອອກໄປຈາກຕົວຮັບສັນຍານໂທລະພາບ ແລະ ສະແກນຫາຊ່ອງໃໝ່ອີກຄັ້ງ.\n\nກວດສອບເບິ່ງຕົວຮັບສັນຍານໂທລະພາບວ່າໄດ້ສຽບສາຍ ແລະ ເຊື່ອມຕໍ່ກັບແຫຼ່ງສັນຍານໂທລະພາບແລ້ວຫຼືຍັງ.\n\nຫາກໃຊ້ເສົາອາກາດ, ໃຫ້ຍ້າຍບ້ອນວາງ ຫຼື ທິດທາງຂອງມັນ. ເພື່ອໃຫ້ໄດ້ຜົນທີ່ດີທີ່ສຸດ, ໃຫ້ວາງໄວ້ບ່ອນສູງໃກ້ໆປ່ອງຢ້ຽມ ແລ້ວລອງສະແກນໃໝ່."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"ນີ້ຈະເປັນການລຶບຊ່ອງທີ່ພົບແລ້ວອອກໄປຈາກເຄື່ອງຮັບສັນຍານ USB ແລະ ສະແກນຫາຊ່ອງໃໝ່ອີກ.\n\nໃຫ້ກວດສອບເບິ່ງເຄື່ອງຮັບສັນຍານ USB ວ່າ ໄດ້ສຽບສາຍ ແລະ ເຊື່ອມຕໍ່ກັບແຫຼ່ງສັນຍານໂທລະພາບແລ້ວຫຼືຍັງ.\n\nຫາກໃຊ້ເສົາອາກາດ, ໃຫ້ຍ້າຍບ້ອນວາງ ຫຼື ທິດທາງຂອງມັນ. ເພື່ອໃຫ້ໄດ້ຜົນທີ່ດີທີ່ສຸດ, ໃຫ້ວາງໄວ້ບ່ອນສູງໃກ້ໆປ່ອງຢ້ຽມ ແລ້ວລອງສະແກນໃໝ່."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"ນີ້ຈະເປັນການລຶບຊ່ອງທີ່ພົບແລ້ວອອກໄປຈາກເຄື່ອງຮັບສັນຍານເຄືອຂ່າຍ ແລະ ສະແກນຫາຊ່ອງໃໝ່ອີກຄັ້ງ.\n\nໃຫ້ກວດສອບເບິ່ງເຄື່ອງຮັບສັນຍານເຄືອຂ່າຍວ່າໄດ້ສຽບສາຍ ແລະ ເຊື່ອມຕໍ່ກັບແຫຼ່ງສັນຍານໂທລະພາບແລ້ວຫຼືຍັງ.\n\nຫາກໃຊ້ເສົາອາກາດ, ທ່ານອາດຈະຕ້ອງໄດ້ປັບການຕັ້ງ ຫຼື ທິດທາງຂອງມັນ. ເພື່ອໃຫ້ໄດ້ຜົນດີຂຶ້ນ, ວາງມັນໄວ້ສູງ ແລະ ໃກ້ກັບປ່ອງຢ້ຽມແລ້ວສະແກນໃໝ່ອີກຄັ້ງ."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"ສືບຕໍ່"</item>
<item msgid="235450158666155406">"ຍົກເລີກ"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"ຕັ້ງຄ່າຕົວຮັບສັນຍານໂທລະພາບ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"ການຕັ້ງເຄື່ອງຮັບສັນຍານຊ່ອງ USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"ຕັ້ງຄ່າຕົວຈູນສັນຍານຊ່ອງເຄືອຂ່າຍ"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"ຂັ້ນຕອນນີ້ອາດຈະໃຊ້ເວລາຫຼາຍນາທີ"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ຈູນເນີບໍ່ສາມາດໃຊ້ໄດ້ຊົ່ວຄາວ ຫຼື ຖືກໃຊ້ໂດຍການບັນທຶກໃດໜຶ່ງຢູ່ກ່ອນແລ້ວ."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"ບໍ່ພົບຊ່ອງໃດ"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"ການສະແກນບໍ່ພົບຊ່ອງໃດໆເລີຍ. ໃຫ້ຢັ້ງຢືນວ່າທ່ານເຊື່ອມຕໍ່ໂທລະພາບຂອງທ່ານຫາແຫລ່ງສັນຍານໂທລະພາບແລ້ວ.\n\nຫາກໃຊ້ເສົາອາກາດ, ໃຫ້ຍ້າຍບ້ອນວາງ ຫຼື ທິດທາງຂອງມັນ. ເພື່ອໃຫ້ໄດ້ຜົນທີ່ດີທີ່ສຸດ, ໃຫ້ວາງໄວ້ບ່ອນສູງໃກ້ໆປ່ອງຢ້ຽມ ແລ້ວລອງສະແກນໃໝ່."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"ການສະແກນບໍ່ພົບຊ່ອງໃດ. ໃຫ້ກວດສອບເບິ່ງເຄື່ອງຮັບສັນຍານ USB ວ່າໄດ້ສຽບສາຍ ແລະ ເຊື່ອມຕໍ່ກັບແຫຼ່ງສັນຍານໂທລະພາບແລ້ວຫຼືຍັງ.\n\nຫາກໃຊ້ເສົາອາກາດ, ໃຫ້ຍ້າຍບ້ອນວາງ ຫຼື ທິດທາງຂອງມັນ. ເພື່ອໃຫ້ໄດ້ຜົນທີ່ດີທີ່ສຸດ, ໃຫ້ວາງໄວ້ບ່ອນສູງໃກ້ໆປ່ອງຢ້ຽມ ແລ້ວລອງສະແກນໃໝ່."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"ການສະແກນບໍ່ພົບຊ່ອງໃດ. ໃຫ້ກວດສອບເບິ່ງເຄື່ອງຮັບສັນຍານເຄືອຂ່າຍວ່າໄດ້ສຽບສາຍ ແລະ ເຊື່ອມຕໍ່ກັບແຫຼ່ງສັນຍານໂທລະພາບແລ້ວຫຼືຍັງ.\n\nຫາກໃຊ້ເສົາອາກາດ, ໃຫ້ຍ້າຍບ້ອນວາງ ຫຼື ທິດທາງຂອງມັນ. ເພື່ອໃຫ້ໄດ້ຜົນທີ່ດີທີ່ສຸດ, ໃຫ້ວາງໄວ້ບ່ອນສູງໃກ້ໆປ່ອງຢ້ຽມ ແລ້ວລອງສະແກນໃໝ່."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"ສະແກນອີກ"</item>
<item msgid="2092797862490235174">"ແລ້ວໆ"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"ສະແກນຫາຊ່ອງໂທລະພາບ"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"ຕັ້ງຄ່າຕົວຮັບສັນຍານໂທລະພາບ"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"ຕັ້ງຄ່າຕົວຮັບສັນຍານໂທລະພາບແບບ USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"ຕັ້ງຄ່າ Network TV Tuner"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"ຕັດການເຊື່ອມຕໍ່ USB TV tuner ແລ້ວ."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"ຕັດການເຊື່ອມຕໍ່ຕົວຈູນສັນຍານເຄືອຂ່າຍແລ້ວ."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"ການເຊື່ອມຕໍ່ USB TV tuner ຖືກຕັດແລ້ວ."</string>
</resources>
diff --git a/usbtuner-res/values-lt/strings.xml b/usbtuner-res/values-lt/strings.xml
index cc4ff197..3ce2efc7 100644
--- a/usbtuner-res/values-lt/strings.xml
+++ b/usbtuner-res/values-lt/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV imtuvas"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV imtuvas"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Tinklo TV imtuvas (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Įjungta"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Išjungti"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Palaukite, kol baigsis apdorojimas"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Pasirinkite kanalo šaltinį"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Nėra signalo"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Nepavyko įjungti kanalo „<xliff:g id="CHANNEL_NAME">%s</xliff:g>“"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Nepavyko suderinti"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Imtuvo programinė įranga buvo neseniai atnaujinta. Iš naujo nuskaitykite kanalus."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Įgalinkite erdvinį garsą sistemos garso nustatymuose, kad galėtumėte įgalinti garsą"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Negalima paleisti garso įrašo. Bandykite naudoti kitą TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Kanalų imtuvo sąranka"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV imtuvo sąranka"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB kanalų imtuvo sąranka"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Tinklo imtuvo sąranka"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Įsitikinkite, kad jūsų TV prijungtas prie TV signalo šaltinio.\n\nJei naudojate belaidę anteną, koreguokite jos vietą arba kryptį. Kad pasiektumėte geriausių rezultatų, ją padėkite aukštai prie lango."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Įsitikinkite, kad USB imtuvas prijungtas prie maitinimo ir TV signalo šaltinio.\n\nJei naudojate belaidę anteną, koreguokite jos vietą arba kryptį, kad būtų rodoma kuo daugiau kanalų. Kad pasiektumėte geriausių rezultatų, ją padėkite aukštai prie lango."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Įsitikinkite, kad tinklo imtuvas yra įjungtas ir prijungtas prie TV signalo šaltinio.\n\nJei naudojate belaidę anteną, koreguokite jos vietą arba kryptį. Kad pasiektumėte geriausių rezultatų, ją padėkite aukštai prie lango ir nuskaitykite dar kartą."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Tęsti"</item>
<item msgid="727245208787621142">"Ne dabar"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Iš naujo vykdyti kanalų sąranką?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Tai atlikus bus pašalinti kanalai, kuriuos aptiko TV imtuvas, ir bus vėl ieškoma naujų kanalų.\n\nNuskaičius nerasta jokių kanalų. Įsitikinkite, kad jūsų TV prijungtas prie TV signalo šaltinio.\n\nJei naudojate belaidę anteną, koreguokite jos vietą arba kryptį. Kad pasiektumėte geriausių rezultatų, ją padėkite aukštai prie lango."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Taip bus pašalinti rasti kanalai iš USB imtuvo ir nauji kanalai nuskaityti dar kartą.\n\nĮsitikinkite, kad USB imtuvas prijungtas prie maitinimo ir TV signalo šaltinio.\n\nJei naudojate belaidę anteną, koreguokite jos vietą arba kryptį, kad būtų rodoma kuo daugiau kanalų. Kad pasiektumėte geriausių rezultatų, ją padėkite aukštai prie lango."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Atlikus šį veiksmą iš tinklo imtuvo bus pašalinti rasti kanalai ir bus dar kartą nuskaitoma ieškant naujų kanalų.\n\nĮsitikinkite, kad tinklo imtuvas yra įjungtas ir prijungtas prie TV signalo šaltinio.\n\nJei naudojate belaidę anteną, koreguokite jos vietą arba kryptį. Kad pasiektumėte geriausių rezultatų, ją padėkite aukštai prie lango ir nuskaitykite dar kartą."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Tęsti"</item>
<item msgid="235450158666155406">"Atšaukti"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV imtuvo sąranka"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB kanalų imtuvo sąranka"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Tinklo kanalų imtuvo sąranka"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Tai gali užtrukti kelias minutes"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Derintuvas laikinai nepasiekiamas arba jau yra naudojamas įrašant."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -82,7 +82,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Nerasta kanalų"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Nuskaičius nerasta jokių kanalų. Įsitikinkite, kad jūsų TV prijungtas prie TV signalo šaltinio.\n\nJei naudojate belaidę anteną, koreguokite jos vietą arba kryptį. Kad pasiektumėte geriausių rezultatų, ją padėkite aukštai prie lango ir nuskaitykite dar kartą."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Nuskaitant nerasta kanalų. Patvirtinkite, ar USB imtuvas prijungtas prie TV signalo šaltinio.\n\nJei naudojate belaidę anteną, koreguokite jos vietą arba kryptį. Kad pasiektumėte geriausių rezultatų, ją padėkite aukštai prie lango ir nuskaitykite dar kartą."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Nuskaičius nerasta jokių kanalų. Įsitikinkite, kad tinklo imtuvas yra įjungtas ir prijungtas prie TV signalo šaltinio.\n\nJei naudojate belaidę anteną, koreguokite jos vietą arba kryptį. Kad pasiektumėte geriausių rezultatų, ją padėkite aukštai prie lango ir nuskaitykite dar kartą."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Nuskaityti dar kartą"</item>
<item msgid="2092797862490235174">"Atlikta"</item>
@@ -90,7 +89,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Vykdykite TV kanalų nuskaitymą"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV imtuvo sąranka"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV imtuvo sąranka"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Tinklo TV imtuvo sąranka"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV imtuvas atjungtas."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Tinklo imtuvas atjungtas."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV imtuvas atjungtas."</string>
</resources>
diff --git a/usbtuner-res/values-lv/strings.xml b/usbtuner-res/values-lv/strings.xml
index f59276c4..9337e7b3 100644
--- a/usbtuner-res/values-lv/strings.xml
+++ b/usbtuner-res/values-lv/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV kanālu meklētājs"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV kanālu meklētājs"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Interneta TV kanālu meklētājs (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Ieslēgta"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Izslēgta"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Lūdzu, uzgaidiet, līdz tiks pabeigta apstrāde!"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Atlasiet kanāla avotu"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Nav signāla"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Neizdevās atrast kanālu <xliff:g id="CHANNEL_NAME">%s</xliff:g>."</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Neizdevās atrast"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Nesen tika atjaunināta kanālu meklētāja programmatūra. Lūdzu, atkārtoti meklējiet kanālus."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Lai ieslēgtu audio, sistēmas skaņas iestatījumos iespējojiet ieskaujošo skaņu."</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Nevar atskaņot audio. Lūdzu, izmantojiet citu televizoru."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Kanālu meklētāja iestatīšana"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV kanālu meklētāja iestatīšana"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB kanālu meklētāja iestatīšana"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Interneta kanālu meklētāja iestatīšana"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Pārbaudiet, vai televizors ir pievienots TV signāla avotam.\n\nJa izmantojat bezvadu antenu, iespējams, būs jāmaina tās novietojums vai virziens, lai uztvertu lielāko daļu kanālu. Lai iegūtu labākos rezultātus, novietojiet antenu augstu pie loga."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Pārbaudiet, vai USB kanālu meklētājs ir pievienots strāvas avotam un TV signāla avotam.\n\nJa izmantojat bezvadu antenu, mainiet tās novietojumu un virzienu. Lai iegūtu labākos rezultātus, novietojiet antenu augstu pie loga un atkārtojiet kanālu meklēšanu."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Pārbaudiet, vai interneta kanālu meklētājs ir ieslēgts un pievienots TV signāla avotam.\n\nJa izmantojat bezvadu antenu, iespējams, jāmaina tās novietojums vai virziens, lai uztvertu lielāko daļu kanālu. Lai iegūtu labākos rezultātus, novietojiet antenu augstu pie loga."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Turpināt"</item>
<item msgid="727245208787621142">"Vēlāk"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Vai atkārtot kanālu iestatīšanu?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Šādi no TV kanālu meklētāja tiks noņemti atrastie kanāli un tiks vēlreiz meklēti jauni kanāli.\n\nPārbaudiet, vai televizors ir pievienots TV signāla avotam.\n\nJa izmantojat bezvadu antenu, iespējams, būs jāmaina tās novietojums vai virziens, lai uztvertu lielāko daļu kanālu. Lai iegūtu labākos rezultātus, novietojiet antenu augstu pie loga."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Tādējādi tiks noņemti kanāli, kas tika atrasti ar USB kanālu meklētāju, un tiks atkārtota kanālu meklēšana.\n\nPārbaudiet, vai USB kanālu meklētājs ir pievienots strāvas avotam un TV signāla avotam.\n\nJa izmantojat bezvadu antenu, mainiet tās novietojumu un virzienu, lai uztvertu lielāko daļu kanālu. Lai iegūtu labākos rezultātus, novietojiet antenu augstu pie loga."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Šādi no interneta kanālu meklētāja tiks noņemti atrastie kanāli un tiks vēlreiz meklēti jauni kanāli.\n\nPārbaudiet, vai interneta kanālu meklētājs ir ieslēgts un pievienots TV signāla avotam.\n\nJa izmantojat bezvadu antenu, iespējams, jāmaina tās novietojums vai virziens, lai uztvertu lielāko daļu kanālu. Lai iegūtu labākos rezultātus, novietojiet antenu augstu pie loga."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Turpināt"</item>
<item msgid="235450158666155406">"Atcelt"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV kanālu meklētāja iestatīšana"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB kanālu meklētāja iestatīšana"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Interneta kanālu meklētāja iestatīšana"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Tas var ilgt vairākas minūtes."</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Kanālu meklētājs īslaicīgi nav pieejams, vai arī tas jau tiek izmantots ierakstīšanai."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -79,7 +79,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Netika atrasts neviens kanāls"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Veicot meklēšanu, netika atrasts neviens kanāls. Pārbaudiet, vai televizors pievienots TV signāla avotam.\n\nJa izmantojat bezvadu antenu, mainiet tās novietojumu vai virzienu. Lai iegūtu labākos rezultātus, novietojiet antenu augstu pie loga, bet pēc tam vēlreiz veiciet meklēšanu."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Netika atrasts neviens kanāls. Pārbaudiet, vai USB kanālu meklētājs ir pievienots strāvas avotam un TV signāla avotam.\n\nJa izmantojat bezvadu antenu, mainiet tās novietojumu un virzienu. Lai iegūtu labākos rezultātus, novietojiet antenu augstu pie loga un atkārtojiet kanālu meklēšanu."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Netika atrasts neviens kanāls. Pārbaudiet, vai interneta kanālu meklētājs ir ieslēgts un pievienots TV signāla avotam.\n\nJa izmantojat bezvadu antenu, mainiet tās novietojumu un virzienu. Lai iegūtu labākos rezultātus, novietojiet antenu augstu pie loga un atkārtojiet kanālu meklēšanu."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Meklēt vēlreiz"</item>
<item msgid="2092797862490235174">"Gatavs"</item>
@@ -87,7 +86,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"TV kanālu meklēšana"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV kanālu meklētāja iestatīšana"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV kanālu meklētāja iestatīšana"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Interneta TV kanālu meklētāja iestatīšana"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV kanālu meklētājs ir atvienots."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Interneta kanālu meklētājs ir atvienots."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV kanālu meklētājs ir atvienots."</string>
</resources>
diff --git a/usbtuner-res/values-mk-rMK/strings.xml b/usbtuner-res/values-mk/strings.xml
index 8dfbc306..fb2e71e7 100644
--- a/usbtuner-res/values-mk-rMK/strings.xml
+++ b/usbtuner-res/values-mk/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"ТВ приемник"</string>
<string name="ut_app_name" msgid="8557698013780762454">"ТВ приемник со USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Мрежен ТВ приемник (БЕТА)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Вклучено"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Исклучено"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Почекајте да заврши обработувањето"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Изберете го изворот на каналот"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Нема сигнал"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Не успеа да се избере <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Не успеа да се избере"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Софтверот на приемникот неодамна е ажуриран. Скенирајте ги каналите повторно."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Овозможете опкружувачки звук во поставките за звуци на системот за да овозможите аудио"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Не може да се пушти аудио. Обидете се со друг ТВ"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Поставување приемник на канали"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Поставување ТВ приемник"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Поставување на USB-приемникот за канали"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Поставување мрежен приемник"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Потврдете дека телевизорот е приклучен и поврзан со изворот на ТВ сигналот.\n\nАко користите безжична антена, можеби ќе треба да ја приспособите поставеноста или насоката за да примате најмногу канали. За најдобри резултати, поставете ја високо и во близина на прозорец."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Потврдете дека USB-приемникот е приклучен и поврзан со изворот на ТВ сигналот.\n\nАко користите безжична антена, можеби ќе треба да ја приспособите поставеноста или насоката за да примате најмногу канали. За најдобри резултати, поставете ја високо и во близина на прозорец."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Потврдете дека мрежниот приемник е вклучен и поврзан со изворот на ТВ сигналот.\n\nАко користите безжична антена, може ќе треба да ја приспособите поставеноста или насоката за да примате најмногу канали. За најдобри резултати, поставете ја високо и во близина на прозорец."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Продолжи"</item>
<item msgid="727245208787621142">"Не сега"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Да се изврши поставувањето на каналите повторно?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Ова ќе ги отстрани каналите од ТВ приемникот и ќе скенира за нови канали повторно.\n\nПотврдете дека телевизорот е поврзан со изворот на ТВ сигналот.\n\nАко користите безжична антена, приспособете ја поставеноста или насоката. За најдобри резултати, поставете ја високо и во близина на прозорец."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Ова ќе ги отстрани каналите од USB-приемникот и ќе скенира за нови канали повторно.\n\nПотврдете дека USB-приемникот е приклучен и поврзан со изворот на ТВ сигналот.\n\nАко користите безжична антена, можеби ќе треба да ја приспособите поставеноста или насоката за да примате најмногу канали. За најдобри резултати, поставете ја високо и во близина на прозорец."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Ова ќе ги отстрани каналите од мрежниот приемник и ќе скенира за нови канали повторно.\n\nПотврдете дека мрежниот приемник е вклучен и поврзан со изворот на ТВ сигналот.\n\nАко користите безжична антена, може ќе треба да ја приспособите поставеноста или насоката. За најдобри резултати, поставете ја високо и во близина на прозорец."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Продолжи"</item>
<item msgid="235450158666155406">"Откажи"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Поставување ТВ приемник"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Поставување на USB-приемникот за канали"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Поставување мрежен приемник на канали"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Ова може да трае неколку минути"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Приемникот е привремено недостапен или веќе се користи за снимање."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Не се пронајдени канали"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Скенирањето не пронајде ниеден канал. Потврдете дека телевизорот е поврзан со изворот на ТВ сигналот.\n\nАко користите безжична антена, приспособете ја поставеноста или насоката. За најдобри резултати, поставете ја високо и во близина на прозорец и скенирајте повторно."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Скенирањето не пронајде ниеден канал. Потврдете дека USB-приемникот е приклучен и поврзан со изворот на ТВ сигналот.\n\nАко користите безжична антена, приспособете ја поставеноста или насоката. За најдобри резултати, поставете ја високо и во близина на прозорец и скенирајте повторно."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Скенирањето не пронајде ниеден канал. Потврдете дека мрежниот приемник е вклучен и поврзан со изворот на ТВ сигналот.\n\nАко користите безжична антена, приспособете ја поставеноста или насоката. За најдобри резултати, поставете ја високо и во близина на прозорец, па скенирајте повторно."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Скенирај пак"</item>
<item msgid="2092797862490235174">"Готово"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Скенирај ТВ-канали"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Поставување ТВ приемник"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Поставување ТВ приемник со USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Поставување мрежен ТВ приемник"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-приемникот за TV е исклучен."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Мрежниот приемник е исклучен."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"TV приемникот преку USB е исклучен."</string>
</resources>
diff --git a/usbtuner-res/values-ml-rIN/strings.xml b/usbtuner-res/values-ml/strings.xml
index b68953d2..d025ec7b 100644
--- a/usbtuner-res/values-ml-rIN/strings.xml
+++ b/usbtuner-res/values-ml/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"ടിവി ട്യൂണർ"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB ടിവി ട്യൂണർ"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"നെറ്റ്‌വർക്ക് ടിവി ട്യൂണർ (ബീറ്റ)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"ഓണാക്കുക"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"ഓഫാക്കുക"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"പ്രോസസ്സുചെയ്യൽ പൂർത്തിയാകുന്നത് വരെ കാത്തിരിക്കുക"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"നിങ്ങളുടെ ചാനൽ ഉറവിടം തിരഞ്ഞെടുക്കുക"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"സിഗ്‌നൽ ഇല്ല"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> എന്നതിലേക്ക് ട്യൂൺ ചെയ്യുന്നത് പരാജയപ്പെട്ടു"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ട്യൂൺ ചെയ്യുന്നത് പരാജയപ്പെട്ടു"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ട്യൂണർ സോഫ്‌റ്റ്‌വെയർ അടുത്തിടെ അപ്‌ഡേറ്റുചെയ്‌തു. ചാനലുകൾ വീണ്ടും സ്‌കാൻ ചെയ്യുക."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ഓഡിയോ പ്രവർത്തനക്ഷമമാക്കുന്നതിന് സിസ്റ്റം ശബ്ദ ക്രമീകരണത്തിൽ സറൗണ്ട് ശബ്‌ദം പ്രവർത്തനക്ഷമമാക്കുക"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"ഓഡിയോ പ്ലേ ചെയ്യാൻ കഴിയുന്നില്ല. മറ്റൊരു ടിവിയിൽ ശ്രമിച്ചുനോക്കൂ"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"ചാനൽ ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"ടിവി ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB ചാനൽ ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"നെറ്റ്‌വർക്ക് ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"ഒരു ടിവി സിഗ്നൽ ഉറവിടത്തിലേക്ക് നിങ്ങളുടെ ടിവി കണക്റ്റുചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക.\n\nഉയരത്തിൽ വയ്ക്കേണ്ട തരത്തിലുള്ള ആന്റിനയാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നതെങ്കിൽ, പരമാവധി ചാനലുകൾ ലഭിക്കുന്നതിന്, അതിന്റെ ഇരിപ്പോ ദിശയോ ക്രമീകരിക്കേണ്ടി വരാം. മികച്ച ഫലം ലഭിക്കാൻ, കുറച്ചുകൂടി ഉയരത്തിലും ജാലകത്തിന് അരികിലായും അത് സ്ഥാപിക്കുക."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB ട്യൂണർ പ്ലഗിൻ ചെയ്തിട്ടുണ്ടെന്നും ഒരു ടിവി സിഗ്നൽ ഉറവിടത്തിലേക്ക് കണക്റ്റുചെയ്തിട്ടുണ്ടെന്നും ഉറപ്പാക്കുക.\n\nഉയരത്തിൽ വയ്ക്കേണ്ട തരത്തിലുള്ള ആന്റിനയാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നതെങ്കിൽ, പരമാവധി ചാനലുകൾ ലഭിക്കുന്നതിന്, അതിന്റെ ഇരിപ്പോ ദിശയോ ക്രമീകരിക്കേണ്ടി വരാം. മികച്ച ഫലം ലഭിക്കാൻ, കുറച്ചുകൂടി ഉയരത്തിലും ജാലകത്തിന് അരികിലായും അത് സ്ഥാപിക്കുക."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"നെറ്റ്‌വർക്ക് ട്യൂണർ ഓണാക്കിയിട്ടുണ്ടെന്നും ഒരു ടിവി സിഗ്നൽ ഉറവിടത്തിലേക്ക് കണക്റ്റുചെയ്തിട്ടുണ്ടെന്നും ഉറപ്പാക്കുക.\n\nഉയരത്തിൽ വയ്ക്കേണ്ട തരത്തിലുള്ള ആന്റിനയാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നതെങ്കിൽ, പരമാവധി ചാനലുകൾ ലഭിക്കുന്നതിന്, അതിന്റെ ഇരിപ്പോ ദിശയോ ക്രമീകരിക്കേണ്ടി വരാം. മികച്ച ഫലം ലഭിക്കാൻ, കുറച്ചുകൂടി ഉയരത്തിലും ജാലകത്തിന് അരികിലായും അത് സ്ഥാപിക്കുക."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"തുടരുക"</item>
<item msgid="727245208787621142">"ഇപ്പോൾ വേണ്ട"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"ചാനൽ സജ്ജമാക്കൽ വീണ്ടും റൺ ചെയ്യണോ?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"ടിവി ട്യൂണറിൽ നിന്ന് കണ്ടെത്തിയ ചാനലുകളെ ഇത് നീക്കംചെയ്യും, പുതിയ ചാനലുകൾക്കായി വീണ്ടും സ്കാൻ ചെയ്യും.\n\nഒരു ടിവി സിഗ്നൽ ഉറവിടത്തിലേക്ക് നിങ്ങളുടെ ടിവി കണക്റ്റുചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക.\n\nഉയരത്തിൽ വയ്ക്കേണ്ട തരത്തിലുള്ള ആന്റിനയാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നതെങ്കിൽ, പരമാവധി ചാനലുകൾ ലഭിക്കുന്നതിന്, അതിന്റെ ഇരിപ്പോ ദിശയോ ക്രമീകരിക്കേണ്ടി വരാം. മികച്ച ഫലം ലഭിക്കാൻ, കുറച്ചുകൂടി ഉയരത്തിലും ജാലകത്തിന് അരികിലായും അത് സ്ഥാപിക്കുക."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"USB ട്യൂണറിൽ നിന്ന് കണ്ടെത്തിയ ചാനലുകളെ ഇത് നീക്കംചെയ്യും, പുതിയ ചാനലുകൾക്കായി വീണ്ടും സ്കാൻ ചെയ്യും.\n\nസ്കാൻ ചെയ്തപ്പോൾ ചാനലുകളൊന്നും കണ്ടെത്തിയില്ല. USB ട്യൂണർ പ്ലഗിൻ ചെയ്തിട്ടുണ്ടെന്നും ഒരു ടിവി സിഗ്നൽ ഉറവിടത്തിലേക്ക് കണക്റ്റുചെയ്തിട്ടുണ്ടെന്നും ഉറപ്പാക്കുക.\n\nഉയരത്തിൽ വയ്ക്കേണ്ട തരത്തിലുള്ള ആന്റിനയാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നതെങ്കിൽ, പരമാവധി ചാനലുകൾ ലഭിക്കുന്നതിന്, അതിന്റെ ഇരിപ്പോ ദിശയോ ക്രമീകരിക്കേണ്ടി വരാം. മികച്ച ഫലം ലഭിക്കാൻ, കുറച്ചുകൂടി ഉയരത്തിലും ജാലകത്തിന് അരികിലായും അത് സ്ഥാപിക്കുക."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"നെറ്റ്‌വർക്ക് ട്യൂണറിൽ നിന്ന് കണ്ടെത്തിയ ചാനലുകളെ ഇത് നീക്കംചെയ്യും, പുതിയ ചാനലുകൾക്കായി വീണ്ടും സ്കാൻ ചെയ്യും.\n\nനെറ്റ്‌വർക്ക് ട്യൂണർ ഓണാക്കിയിട്ടുണ്ടെന്നും ഒരു ടിവി സിഗ്നൽ ഉറവിടത്തിലേക്ക് കണക്റ്റുചെയ്തിട്ടുണ്ടെന്നും ഉറപ്പാക്കുക.\n\nഉയരത്തിൽ വയ്ക്കേണ്ട തരത്തിലുള്ള ആന്റിനയാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നതെങ്കിൽ, പരമാവധി ചാനലുകൾ ലഭിക്കുന്നതിന്, അതിന്റെ ഇരിപ്പോ ദിശയോ ക്രമീകരിക്കേണ്ടി വരാം മികച്ച ഫലം ലഭിക്കാൻ, കുറച്ചുകൂടി ഉയരത്തിലും ജാലകത്തിന് അരികിലായും അത് സ്ഥാപിക്കുക."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"തുടരുക"</item>
<item msgid="235450158666155406">"റദ്ദാക്കൂ"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"ടിവി ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB ചാനൽ ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"നെറ്റ്‌വർക്ക് ചാനൽ ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"ഇതിന് കുറച്ച് സമയം എടുത്തേക്കാം"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ട്യൂണർ നിലവിൽ ലഭ്യമല്ല അല്ലെങ്കിൽ ഇതിനകം തന്നെ റെക്കോർഡിംഗ് ഉപയോഗിച്ചുകൊണ്ടിരിക്കുന്നു."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"ചാനലുകളൊന്നും കണ്ടെത്തിയില്ല"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"സ്കാൻ ചെയ്തപ്പോൾ ചാനലുകളൊന്നും കണ്ടെത്തിയില്ല. ഒരു ടിവി സിഗ്നൽ ഉറവിടത്തിലേക്ക് നിങ്ങളുടെ ടിവി കണക്റ്റുചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക.\n\nഉയരത്തിൽ വയ്ക്കേണ്ട തരത്തിലുള്ള ആന്റിനയാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നതെങ്കിൽ അതിന്റെ ഇരിപ്പോ ദിശയോ ക്രമീകരിക്കുക. മികച്ച ഫലം ലഭിക്കാൻ, കുറച്ചുകൂടി ഉയരത്തിലും ജാലകത്തിന് അരികിലായും അത് സ്ഥാപിച്ച് വീണ്ടും സ്കാൻ ചെയ്യുക."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"സ്കാൻ ചെയ്തപ്പോൾ ചാനലുകളൊന്നും കണ്ടെത്തിയില്ല. USB ട്യൂണർ പ്ലഗിൻ ചെയ്തിട്ടുണ്ടെന്നും ഒരു ടിവി സിഗ്നൽ ഉറവിടത്തിലേക്ക് കണക്റ്റുചെയ്തിട്ടുണ്ടെന്നും ഉറപ്പാക്കുക.\n\nഉയരത്തിൽ വയ്ക്കേണ്ട തരത്തിലുള്ള ആന്റിനയാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നതെങ്കിൽ അതിന്റെ ഇരിപ്പോ ദിശയോ ക്രമീകരിക്കുക. മികച്ച ഫലം ലഭിക്കാൻ, കുറച്ചുകൂടി ഉയരത്തിലും ജാലകത്തിന് അരികിലായും അത് സ്ഥാപിച്ച് വീണ്ടും സ്കാൻ ചെയ്യുക."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"സ്കാൻ ചെയ്തപ്പോൾ ചാനലുകളൊന്നും കണ്ടെത്തിയില്ല. നെറ്റ്‌വർക്ക് ട്യൂണർ ഓണാക്കിയിട്ടുണ്ടെന്നും ഒരു ടിവി സിഗ്നൽ ഉറവിടത്തിലേക്ക് കണക്റ്റുചെയ്തിട്ടുണ്ടെന്നും ഉറപ്പാക്കുക.\n\nഉയരത്തിൽ വയ്ക്കേണ്ട തരത്തിലുള്ള ആന്റിനയാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നതെങ്കിൽ അതിന്റെ ഇരിപ്പോ ദിശയോ ക്രമീകരിക്കുക. മികച്ച ഫലം ലഭിക്കാൻ, കുറച്ചുകൂടി ഉയരത്തിലും ജാലകത്തിന് അരികിലായും അത് സ്ഥാപിച്ച് വീണ്ടും സ്കാൻ ചെയ്യുക."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"വീണ്ടും സ്കാൻ ചെയ്യുക"</item>
<item msgid="2092797862490235174">"പൂർത്തിയായി"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"ടിവി ചാനലുകൾക്കായി സ്കാൻ ചെയ്യുക"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"ടിവി ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB ടിവി ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"നെറ്റ്‌വർക്ക് ടിവി ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB ടിവി ട്യൂണർ വിച്ഛേദിച്ചു."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"നെറ്റ്‌വർക്ക് ട്യൂണർ വിച്ഛേദിച്ചു."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB ടിവി ട്യൂണർ വിച്ഛേദിച്ചു."</string>
</resources>
diff --git a/usbtuner-res/values-mn-rMN/strings.xml b/usbtuner-res/values-mn/strings.xml
index 232ebac9..51f7a8dd 100644
--- a/usbtuner-res/values-mn-rMN/strings.xml
+++ b/usbtuner-res/values-mn/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"ТВ тохируулагч"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB ТВ тохируулагч"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Сүлжээний ТВ Тохируулагч (БЭТА)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Идэвхтэй"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Идэвхгүй"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Боловсруулж дуусах хүртэл хүлээнэ үү"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Сувгийн эх үүсвэрээ сонгоно уу"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Дохио алга"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g>-д тохируулж чадсангүй"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Тохируулж чадсангүй"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Тохируулагчийн програмыг саяхан шинэчилсэн байна. Дахин суваг хайна уу."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Аудиог идэвхжүүлэхийн тулд орчны дууны системийг дууны тохиргоонд идэвхжүүлнэ үү"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Аудиог тоглуулах боломжгүй байна. Өөр ТВ дээр оролдож үзнэ үү"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Суваг тохируулагчийн тохиргоо"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"ТВ тохируулагчийн тохиргоо"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB суваг тохируулагчийн тохиргоо"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Сүлжээ тохируулагчийн тохиргоо"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"ТВ-ээ ТВ дохионы үүсвэртэй холбосон эсэхээ батална уу.\n\nХэрэв агаарын антен хэрэглэж байгаа бол олон суваг авахын тулд антены байршил эсвэл чиглэлийг өөрчилнө үү. Антеныг өндөрт, цонхны дэргэд байрлуулах нь илүү үр дүнтэй."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB тохируулагчийг залгасан ба ТВ дохионы үүсвэртэй холбосон эсэхээ шалгана уу.\n\nХэрэв агаарын антен хэрэглэж байгаа бол олон суваг авахын тулд антены байршлыг өөрчилнө үү. Антеныг өндөрт, цонхны дэргэд байрлуулах нь илүү үр дүнтэй байдаг."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Сүлжээ тохируулагчийг асааж, ТВ дохионы үүсвэртэй холбосон эсэхээ баталгаажуулна уу.\n\nХэрэв агаарын антен хэрэглэж байгаа бол олон суваг авахын тулд антены байршлыг өөрчилнө үү. Антеныг өндөрт, цонхны дэргэд байрлуулна уу."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Үргэлжлүүлэх"</item>
<item msgid="727245208787621142">"Одоо биш"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Сувгийн тохируулгыг дахин ажиллуулах уу?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Энэ нь ТВ тохируулагчаас олсон сувгийг устгаад, шинэ суваг хайх болно.\n\nТВ тохируулагчаа ТВ дохионы үүсвэртэй холбосон эсэхээ шалгана уу.\n\nХэрэв агаарын антен хэрэглэж байгаа бол олон суваг авахын тулд антены байршил эсвэл чиглэлийг өөрчилнө үү. Антеныг өндөрт, цонхны дэргэд байрлуулах нь илүү үр дүнтэй."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Энэ нь USB тохируулагчаас олдсон сувгийг устгаад, шинэ суваг хайх болно.\n\nUSB тохируулагчийг залгасан, ТВ дохионы үүсвэртэй холбосон эсэхээ шалгана уу.\n\nХэрэв агаарын антен хэрэглэж байгаа бол олон суваг авахын тулд антены байршлыг өөрчилнө үү. Антеныг өндөрт, цонхны дэргэд байрлуулах нь илүү үр дүнтэй."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Энэ нь сүлжээ тохируулагчаас олдсон сувгийг устгаж, шинэ суваг хайх болно.\n\nСүлжээ тохируулагчийг асааж, ТВ дохио үүсвэртэй холбосон эсэхээ шалгана уу.\n\nХэрэв антен хэрэглэж байгаа бол антены байршлыг өөрчилнө үү. Антеныг өндөрт, цонхны дэргэд байрлуулаад, дахин хайна уу."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Үргэлжлүүлэх"</item>
<item msgid="235450158666155406">"Цуцлах"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"ТВ тохируулагчийн тохиргоо"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB суваг тохируулагчийн тохиргоо"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Сүлжээний суваг тохируулагчийн тохиргоо"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Хэдэн минут шаардлагатай"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Суваг солигч одоогоор боломжгүй, эсвэл үүнийг өөр бичлэгт ашиглаж байна."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Суваг олсонгүй"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Хайлтын явцад суваг олсонгүй. ТВ-ээ ТВ дохионы үүсвэрт холбосон эсэхээ шалгана уу.\n\nХэрэв агаарын антен хэрэглэж байгаа бол антены байршлыг эсвэл чиглэлийг өөрчилнө үү. Антеныг өндөрт, цонхны дэргэд байрлуулаад, дахин хайх нь илүү үр дүнтэй."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Хайлтын явцад суваг олдсонгүй. USB тохируулагчийг залгасан бөгөөд ТВ дохионы үүсвэртэй холбосон эсэхээ шалгана уу.\n\nХэрэв агаарын антен хэрэглэж байгаа бол антены байршил эсвэл чиглэлийг өөрчилнө үү. Антеныг өндөрт, цонхны дэргэд байрлуулахаад, дахин хайх нь илүү үр дүнтэй."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Хайлтын явцад суваг олдсонгүй. Сүлжээ тохируулагчийг асааж, ТВ дохионы үүсвэртэй холбосон эсэхээ шалгана уу.\n\nХэрэв агаарын антен хэрэглэж байгаа бол антены байршил, эсвэл чиглэлийг өөрчилнө үү. Антеныг өндөрт, цонхны дэргэд байрлуулаад, дахин хайна уу."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Дахин хайх"</item>
<item msgid="2092797862490235174">"Дууссан"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"TВ-н суваг хайх"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"ТВ тохируулагчийн тохиргоо"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB ТВ тохируулагчийн тохиргоо"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Сүлжээний ТВ тохируулагчийн тохиргоо"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB ТВ тохируулагч салсан байна."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Сүлжээ тааруулагч салсан байна."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB ТВ тохируулагч салсан байна."</string>
</resources>
diff --git a/usbtuner-res/values-mr-rIN/strings.xml b/usbtuner-res/values-mr/strings.xml
index af7676fe..2ea242f1 100644
--- a/usbtuner-res/values-mr-rIN/strings.xml
+++ b/usbtuner-res/values-mr/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"टीव्ही ट्यूनर"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB टीव्ही ट्यूनर"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"नेटवर्क टीव्ही ट्यूनर (बीटा)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"चालू"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"बंद"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"कृपया प्रक्रिया पूर्ण होण्‍याची प्रतीक्षा करा"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"आपला चॅनेल स्रोत निवडा"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"सिग्नल नाही"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> वर ट्यून करण्‍यात अयशस्वी झाले"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ट्यून करण्यात अयशस्वी झाले"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ट्यूनर सॉफ्टवेअर अलीकडे अद्यतनित केले आहे. कृपया चॅनेल पुन्हा स्कॅन करा."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ऑडिओ सक्षम करण्यासाठी सिस्टीम ध्वनी सेटिंग्ज मध्ये सराउंड ध्वनी सक्षम करा"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"ऑडिओ प्ले करू शकत नाही. कृपया दुसरा टीव्ही वापरून पहा"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"चॅनेल ट्यूनर सेटअप"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"टीव्ही ट्यूनर सेटअप"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB चॅनेल ट्यूनर सेटअप"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"नेटवर्क ट्यूनर सेटअप"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"टीव्ही सिग्नल स्रोताशी आपला टीव्ही कनेक्ट केला असल्याची खात्री करा. \n\n बिनतारी अँटेना वापरत असल्‍यास, आपल्‍याला कदाचित सर्वाधिक चॅनेल मिळविण्‍यासाठी त्याचे स्थान किंवा दिशा समायोजित करावी लागेल. उत्कृष्‍ट परिणामांसाठी, त्‍यास उंचावर आणि खिडकी जवळ ठेवा."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB ट्यूनर प्लगिन केले आणि TV सिग्नल स्रोताशी कनेक्‍ट केले आहे हे सत्यापित करा.\n\nबिनतारी अँटेना वापरत असल्‍यास, आपल्‍याला कदाचित सर्वाधिक चॅनेल मिळविण्‍यासाठी त्याचे स्थान किंवा दिशा समायोजित करावी लागेल. उत्कृष्‍ट परिणामांसाठी, त्‍यास उंचावर आणि खिडकी जवळ ठेवा."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"नेटवर्क ट्यूनर प्लगिन केले आणि TV सिग्नल स्रोताशी कनेक्‍ट केले आहे हे सत्यापित करा.\n\nबिनतारी अँटेना वापरत असल्‍यास, आपल्‍याला कदाचित सर्वाधिक चॅनेल मिळविण्‍यासाठी त्याचे स्थान किंवा दिशा समायोजित करावी लागेल. उत्कृष्‍ट परिणामांसाठी, त्‍यास उंचावर आणि खिडकी जवळ ठेवा."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"सुरू ठेवा"</item>
<item msgid="727245208787621142">"सध्या नाही"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"चॅनेल सेटअप वर परत यायचे?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"हे टीव्ही ट्यूनर वरून शोधलेले चॅनेल काढेल आणि नवीन चॅनेलसाठी पुन्हा स्कॅन करेल.\n\n टीव्ही सिग्नल स्रोताशी आपला टीव्ही कनेक्ट केला असल्याचे सत्यापित करा.\n\nबिनतारी अँटेना वापरत असल्‍यास, आपल्‍याला कदाचित सर्वाधिक चॅनेल मिळविण्‍यासाठी त्याचे स्थान किंवा दिशा समायोजित करावी लागेल. उत्कृष्‍ट परिणामांसाठी, त्‍यास उंचावर आणि खिडकी जवळ ठेवा."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"हे USB ट्यूनर वरून शोधलेले चॅनेल काढेल आणि नवीन चॅनेलसाठी पुन्हा स्कॅन करेल.\n\n USB ट्यूनर प्लगिन केले आणि TV सिग्नल स्त्रोताशी कनेक्‍ट केले आहे हे सत्यापित करा.\n\nबिनतारी अँटेना वापरत असल्‍यास, आपल्‍याला कदाचित सर्वाधिक चॅनेल मिळविण्‍यासाठी त्याचे स्थान किंवा दिशा समायोजित करावी लागेल. उत्कृष्‍ट परिणामांसाठी, त्‍यास उंचावर आणि खिडकी जवळ ठेवा."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"हे नेटवर्क ट्यूनर वरून शोधलेले चॅनेल काढेल आणि नवीन चॅनेलसाठी पुन्हा स्कॅन करेल.\n\n नेटवर्क ट्यूनर प्लगिन केले आणि टीव्ही सिग्नल स्रोताशी कनेक्‍ट केले आहे हे सत्यापित करा.\n\nबिनतारी अँटेना वापरत असल्‍यास, आपल्याला कदाचित सर्वाधिक चॅनेल मिळविण्‍यासाठी त्याचे स्थान किंवा दिशा समायोजित करावी लागेल. उत्कृष्‍ट परिणामांसाठी, त्‍यास उंचावर आणि खिडकी जवळ ठेवा."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"सुरू ठेवा"</item>
<item msgid="235450158666155406">"रद्द करा"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"टीव्ही ट्यूनर सेटअप"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB चॅनेल ट्यूनर सेटअप"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"नेटवर्क चॅनेल ट्यूनर सेटअप"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"यास काही मिनिटे लागू शकतात"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ट्यूनर तात्पुरते उपलब्ध नाही किंवा रेकॉर्डिंगद्वारे आधीपासून वापरले गेले आहे."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"कोणतेही चॅनेल आढळले नाही"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"स्कॅन करताना कोणतेही चॅनेल आढळले नाही. टीव्ही सिग्नल स्रोताशी आपला टीव्ही कनेक्ट केला असल्याचे सत्यापित करा.\n\nबिनतारी अँटेना वापरत असल्‍यास, त्याचे स्थान किंवा दिशा समायोजित करा. उत्कृष्‍ट परिणामांसाठी, त्‍यास उंचावर आणि खिडकी जवळ ठेवा आणि पुन्हा स्कॅन करा."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"स्कॅन करताना कोणतेही चॅनेल आढळले नाही. USB ट्यूनर प्लगिन केले आणि TV सिग्नल स्रोताशी कनेक्‍ट केले आहे हे सत्यापित करा.\n\nबिनतारी अँटेना वापरत असल्‍यास, त्याचे स्थान किंवा दिशा समायोजित करा. उत्कृष्‍ट परिणामांसाठी, त्‍यास उंचावर आणि खिडकी जवळ ठेवा आणि पुन्हा स्कॅन करा."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"स्कॅन करताना कोणतेही चॅनेल आढळले नाहीत. नेटवर्क ट्यूनर प्लगिन केले आणि टीव्ही सिग्नल स्रोताशी कनेक्‍ट केले आहे हे सत्यापित करा.\n\nबिनतारी अँटेना वापरत असल्‍यास, त्याचे स्थान किंवा दिशा समायोजित करा. उत्कृष्‍ट परिणामांसाठी, त्‍यास उंचावर आणि खिडकी जवळ ठेवा आणि पुन्हा स्कॅन करा."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"पुन्हा स्कॅन करा"</item>
<item msgid="2092797862490235174">"पूर्ण झाले"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"टीव्ही चॅनेलसाठी स्कॅन करा"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"टीव्ही ट्यूनर सेटअप"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB टीव्ही ट्यूनर सेटअप"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"नेटवर्क टीव्ही ट्यूनर सेटअप"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB टीव्ही ट्यूनर डिस्कनेक्ट केला."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"नेटवर्क ट्यूनर डिस्कनेक्ट केले."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV ट्यूनर डिस्कनेक्ट केला."</string>
</resources>
diff --git a/usbtuner-res/values-ms-rMY/strings.xml b/usbtuner-res/values-ms/strings.xml
index a3ca255c..578e8ae5 100644
--- a/usbtuner-res/values-ms-rMY/strings.xml
+++ b/usbtuner-res/values-ms/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Penala TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Penala TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Penala TV Rangkaian (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Hidupkan"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Matikan"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Sila tunggu sehingga proses selesai"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Pilih sumber saluran anda"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Tiada Isyarat"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Gagal menala ke <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Gagal menala"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Perisian penala telah dikemas kini baru-baru ini. Sila imbas semula saluran."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Dayakan bunyi keliling dalam tetapan bunyi sistem untuk mendayakan audio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Tidak dapat memainkan audio. Sila cuba TV lain"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Persediaan penala saluran"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Persediaan Penala TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Persediaan penala saluran USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Persediaan penala rangkaian"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Sahkan bahawa TV anda disambungkan pada sumber isyarat TV.\n\nJika menggunakan antena siaran, anda mungkin perlu melaraskan peletakan atau arahnya untuk menerima saluran terbanyak. Untuk mendapatkan hasil yang terbaik, letakkan antena itu di tempat yang tinggi dan berdekatan dengan tingkap."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Sahkan bahawa penala USB dipalamkan dan disambungkan pada sumber isyarat TV.\n\nJika menggunakan antena siaran, anda mungkin perlu melaraskan peletakan atau arahnya untuk menerima saluran terbanyak. Untuk mendapatkan hasil yang terbaik, letakkan antena itu di tempat yang tinggi dan berdekatan dengan tingkap."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Sahkan bahawa penala rangkaian telah dihidupkan dan disambungkan pada sumber isyarat TV\n\nJika menggunakan antena siaran, anda mungkin perlu melaraskan peletakan atau arahnya untuk menerima saluran terbanyak. Untuk mendapatkan hasil yang terbaik, letakkan antena itu di tempat yang tinggi dan berdekatan dengan tingkap."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Teruskan"</item>
<item msgid="727245208787621142">"Bukan sekarang"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Jalankan semula persediaan saluran?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Tindakan ini akan mengalih keluar saluran yang ditemui daripada penala TV dan mengimbas saluran baharu sekali lagi.\n\nSahkan bahawa penala TV telah disambungkan pada sumber isyarat TV.\n\nJika menggunakan antena siaran, anda mungkin perlu melaraskan peletakan atau arahnya untuk menerima saluran terbanyak. Untuk mendapatkan hasil yang terbaik, letakkan antena itu di tempat yang tinggi dan berdekatan dengan tingkap."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Tindakan ini akan mengalih keluar saluran yang ditemui daripada penala USB dan mengimbas saluran baharu sekali lagi.\n\nSahkan bahawa penala USB telah dipalamkan dan disambungkan pada sumber isyarat TV.\n\nJika menggunakan antena siaran, anda mungkin perlu melaraskan peletakan atau arahnya untuk menerima saluran terbanyak. Untuk mendapatkan hasil yang terbaik, letakkan antena itu di tempat yang tinggi dan berdekatan dengan tingkap."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Tindakan ini akan mengalih keluar saluran yang ditemui daripada penala rangkaian dan mengimbas saluran baharu sekali lagi.\n\nSahkan bahawa penala rangkaian telah dihidupkan dan disambungkan pada sumber isyarat TV.\n\nJika menggunakan antena siaran, anda mungkin perlu melaraskan peletakan atau arahnya untuk menerima saluran terbanyak. Untuk mendapatkan hasil yang terbaik, letakkan antena itu di tempat yang tinggi dan berdekatan dengan tingkap."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Teruskan"</item>
<item msgid="235450158666155406">"Batal"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Persediaan penala TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Persediaan penala saluran USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Persediaan penala saluran rangkaian"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Proses ini mungkin mengambil masa beberapa minit"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Penala tidak tersedia buat sementara waktu atau sudah pun digunakan oleh rakaman."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Tiada Saluran ditemui"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Pengimbasan ini tidak menemui sebarang saluran. Sahkan bahawa TV anda disambungkan pada sumber isyarat TV.\n\nJika menggunakan antena siaran, laraskan peletakan atau arahnya. Untuk mendapatkan hasil yang terbaik, letakkan antena itu di tempat yang tinggi dan berdekatan dengan tingkap, kemudian imbas sekali lagi."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Pengimbasan tidak menemui sebarang saluran. Sahkan bahawa penala USB dipalamkan dan disambungkan pada sumber isyarat TV.\n\nJika menggunakan antena siaran, laraskan peletakan atau arahnya. Untuk mendapatkan hasil yang terbaik, letakkan antena itu di tempat yang tinggi dan berdekatan dengan tingkap, kemudian imbas sekali lagi."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Pengimbasan ini tidak menemui sebarang saluran. Sahkan bahawa penala rangkaian telah dihidupkan dan disambungkan pada sumber isyarat TV.\n\nJika menggunakan antena siaran, laraskan peletakan atau arahnya. Untuk mendapatkan hasil yang terbaik, letakkan antena itu di tempat yang tinggi dan berdekatan dengan tingkap, kemudian imbas sekali lagi."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Imbas lagi"</item>
<item msgid="2092797862490235174">"Selesai"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Imbas saluran TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Persediaan Penala TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Persediaan Penala TV USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Persediaan Penala TV Rangkaian"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Penala TV USB diputuskan sambungan."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Penala rangkaian diputuskan sambungan."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Penala TV USB diputuskan sambungan."</string>
</resources>
diff --git a/usbtuner-res/values-my-rMM/strings.xml b/usbtuner-res/values-my/strings.xml
index 0914e8ec..56a29e51 100644
--- a/usbtuner-res/values-my-rMM/strings.xml
+++ b/usbtuner-res/values-my/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"တီဗီချန်နယ်ချိန်ကိရိယာ"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB တီဗီချန်နယ်ချိန်ကိရိယာ"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"ကွန်ရက်တီဗီ လိုင်းချိန်စနစ် (စမ်းသပ်ဆော့ဖ်ဝဲ)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"ဖွင့်ပါ"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"ပိတ်ပါ"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"စီမံဆောင်ရွက်မှု အဆုံးသတ်ရန် ခဏစောင့်ပါ"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"သင့်ချန်နယ်လိုင်းထုတ်လွှင့်ရာ အရင်းအမြစ်ကို ရွေးပါ"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"လိုင်းမမိပါ"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> သို့ ချိန်ညှိခြင်း မအောင်မြင်ပါ"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ချိန်ညှိ၍ မရခဲ့ပါ"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ချန်နယ်ချိန်ဆော့ဖ်ဝဲကို မကြာသေးမီက အပ်ဒိတ်လုပ်ခဲ့သည်။ ချန်နယ်လိုင်းများကို ပြန်ရှာပါ။"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"အသံဖွင့်ရန် ပတ်ပတ်လည်အသံစနစ်ဆက်တင်များကို ဖွင့်ပါ"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"အသံဖွင့်၍မရပါ။ အခြားတီဗီတွင် စမ်းကြည့်ပါ"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"ချန်နယ်ချိန်ကိရိယာ ထည့်သွင်းတပ်ဆင်မှု"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"တီဗီချန်နယ်ချိန်ကိရိယာ ပြင်ဆင်သတ်မှတ်မှု"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB ချန်နယ်ချိန်ကိရိယာ ပြင်ဆင်သတ်မှတ်မှု"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"တီဗီလိုင်းဖမ်းကိရိယာ စနစ်ထည့်သွင်းမှု"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"သင့်တီဗီသည် တီဗီချန်နယ်ထုတ်လွှင့်ရာ အရင်းအမြစ်တစ်ခုနှင့် ချိတ်ဆက်ထားကြောင်း အတည်ပြုပါ။\n\nအကယ်၍ ကောင်းကင်အန်တန်နာတိုင်ကို အသုံးပြုနေပါက ချန်နယ်အများစုကို ဖမ်းယူနိုင်ရန် ၎င်း၏အနေအထား (သို့) ဦးတည်ဘက်ကို ချိန်ညှိရန် လိုပါသည်။ ရလဒ်များအကောင်းဆုံး ဖြစ်စေရန် ၎င်းကို ပြတင်းပေါက်နားတွင် မြင့်မြင့်ထားပါ။"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB ချန်နယ်ချိန်ကိရိယာကို တပ်ဆင်ထားပြီး တီဗီချန်နယ်ထုတ်လွှင့်ရာ အရင်းအမြစ်တစ်ခုနှင့် ချိတ်ဆက်ထားကြောင်း အတည်ပြုပါ။\n\nအကယ်၍ ကောင်းကင်အန်တန်နာတိုင်ကို အသုံးပြုနေပါက ချန်နယ်အများစုကို ဖမ်းယူနိုင်ရန် ၎င်း၏အနေအထား (သို့) ဦးတည်ဘက်ကို ချိန်ညှိရန် လိုပါသည်။ ရလဒ်များအကောင်းဆုံး ဖြစ်စေရန် ၎င်းကို ပြတင်းပေါက်နားတွင် မြင့်မြင့်ထားပါ။"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"တီဗီလိုင်းဖမ်းကိရိယာကို ပါဝါဖွင့်ထားခြင်း ရှိ မရှိနှင့် တီဗီစလောင်းသို့ ချိတ်ဆက်ထားခြင်းရှိမရှိ စစ်ဆေးပါ။\n\nအင်တင်နာကို အသုံးပြုလျှင် ၎င်း၏အနေအထား သို့မဟုတ် ဦးတည်ချက်တို့ကို ချိန်ညှိရန် လိုအပ်ပါသည်။ အကောင်းဆုံးရလဒ်အတွက် ပြတင်းပေါက်အနီး အမြင့်ပိုင်းတွင် ထားပါ။"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"ရှေ့ဆက်ရန်"</item>
<item msgid="727245208787621142">"မလုပ်သေးပါ"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"ချန်နယ်စနစ်ထည့်သွင်းမှု ပြန်စမလား။"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"ဤလုပ်ဆောင်ချက်သည် တီဗီချန်နယ်ချိန်ကိရိယာက တွေ့ရှိထားသော ချန်နယ်လိုင်းများကို ဖယ်ရှားလိုက်ပြီး ချန်နယ်အသစ်များကို ထပ်မံရှာဖွေလိမ့်မည်။\n\nသင့်တီဗီသည် တီဗီချန်နယ်ထုတ်လွှင့်ရာ အရင်းအမြစ်တစ်ခုနှင့် ချိတ်ဆက်ထားကြောင်း အတည်ပြုပါ။\n\nအကယ်၍ ကောင်းကင်အန်တန်နာတိုင်ကို အသုံးပြုနေပါက ချန်နယ်အများစုကို ဖမ်းယူနိုင်ရန် ၎င်း၏အနေအထား (သို့) ဦးတည်ဘက်ကို ချိန်ညှိရန် လိုပါသည်။ ရလဒ်များအကောင်းဆုံး ဖြစ်စေရန် ၎င်းကို ပြတင်းပေါက်နားတွင် မြင့်မြင့်ထားပါ။"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"ဤလုပ်ဆောင်ချက်သည် USB ချန်နယ်ချိန်ကိရိယာက တွေ့ရှိထားသော ချန်နယ်လိုင်းများကို ဖယ်ရှားလိုက်ပြီး ချန်နယ်အသစ်များကို ထပ်မံရှာဖွေလိမ့်မည်။\n\nUSB ချန်နယ်ချိန်ကိရိယာကို တပ်ဆင်ထားပြီး တီဗီချန်နယ်ထုတ်လွှင့်ရာ အရင်းအမြစ်တစ်ခုနှင့် ချိတ်ဆက်ထားကြောင်း အတည်ပြုပါ။\n\nအကယ်၍ ကောင်းကင်အန်တန်နာတိုင်ကို အသုံးပြုနေပါက ချန်နယ်အများစုကို ဖမ်းယူနိုင်ရန် ၎င်း၏အနေအထား (သို့) ဦးတည်ဘက်ကို ချိန်ညှိရန် လိုပါသည်။ ရလဒ်များအကောင်းဆုံး ဖြစ်စေရန် ၎င်းကို ပြတင်းပေါက်နားတွင် မြင့်မြင့်ထားပါ။"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"၎င်းသည် တီဗီလိုင်းဖမ်းကိရိယာက ရှာဖွေတွေ့ရှိခဲ့သည့် ချန်နယ်များကို ဖယ်ရှားလိုက်မည်ဖြစ်ပြီး ချန်နယ်အသစ်များကို ထပ်မံရှာဖွေသွားပါမည်။\n\nတီဗီလိုင်းဖမ်းကိရိယာကို ပါဝါဖွင့်ထားခြင်း ရှိ မရှိနှင့် တီဗီစလောင်းသို့ ချိတ်ဆက်ထားခြင်းရှိမရှိ စစ်ဆေးပါ။\n\nအင်တင်နာကို အသုံးပြုလျှင် ၎င်း၏အနေအထား သို့မဟုတ် ဦးတည်ချက်တို့ကို ချိန်ညှိရန် လိုအပ်ပါသည်။ အကောင်းဆုံးရလဒ်အတွက် ပြတင်းပေါက်အနီး အမြင့်ပိုင်းတွင် ထားပါ။"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"ရှေ့ဆက်ရန်"</item>
<item msgid="235450158666155406">"မလုပ်တော့"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"တီဗီချန်နယ်ချိန်ကိရိယာ ပြင်ဆင်သတ်မှတ်မှု"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB ချန်နယ်ချိန်ကိရိယာ ပြင်ဆင်သတ်မှတ်မှု"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"တီဗီလိုင်းဖမ်းကိရိယာ စနစ်ထည့်သွင်းမှု"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"မိနစ်အနည်းငယ် ကြာနိုင်ပါသည်"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"လိုင်းချိန်စက်သည် ယာယီမရနိုင်သေးပါ သို့မဟုတ် ဖမ်းယူခြင်းအတွက် အသုံးပြုနေပြီး ဖြစ်ပါသည်။"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"ချန်နယ်တစ်လိုင်းမျှ မတွေ့ပါ"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"ချန်နယ်များရှာဖွေရာတွင် တစ်လိုင်းမျှ ရှာမတွေ့ပါ။ သင့်တီဗီသည် တီဗီချန်နယ်ထုတ်လွှင့်ရာ အရင်းအမြစ်တစ်ခုနှင့် ချိတ်ဆက်ထားကြောင်း အတည်ပြုပါ။\n\n အကယ်၍ ကောင်းကင်အန်တန်နာတိုင်ကို အသုံးပြုနေပါက ၎င်း၏ အနေအထား (သို့) ဦးတည်ဘက်ကို ချိန်ညှိပါ။ ရလဒ်များအကောင်းဆုံးဖြစ်စေရန် ၎င်းကို ပြတင်းပေါက်နားတွင် မြင့်မြင့်ထားပြီး ထပ်ရှာကြည့်ပါ။"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"ချန်နယ်များရှာဖွေရာတွင် တစ်လိုင်းမျှ ရှာမတွေ့ပါ။ USB ချန်နယ်ချိန်ကိရိယာကို တပ်ဆင်ထား၍ တီဗီချန်နယ်ထုတ်လွှင့်ရာ အရင်းအမြစ်တစ်ခုနှင့် ချိတ်ဆက်ထားကြောင်း အတည်ပြုပါ။\n\n အကယ်၍ ကောင်းကင်အန်တန်နာတိုင်ကို အသုံးပြုနေပါက ၎င်း၏ အနေအထား (သို့) ဦးတည်ဘက်ကို ချိန်ညှိပါ။ ရလဒ်များအကောင်းဆုံးဖြစ်စေရန် ၎င်းကို ပြတင်းပေါက်နားတွင် မြင့်မြင့်ထားပြီး ထပ်ရှာကြည့်ပါ။"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"မည်သည့် ချန်နယ်မျှ ရှာမတွေ့ပါ။ တီဗီလိုင်းဖမ်းကိရိယာကို ပါဝါဖွင့်ထားခြင်းရှိ မရှိနှင့် တီဗီစလောင်းသို့ ချိတ်ဆက်ထားခြင်းရှိမရှိ စစ်ဆေးပါ။\n\nအင်တင်နာကို အသုံးပြုလျှင် ၎င်း၏အနေအထား သို့မဟုတ် ဦးတည်ချက်တို့ကို ချိန်ညှိရန် လိုအပ်ပါသည်။ အကောင်းဆုံးရလဒ်အတွက် ပြတင်းပေါက်အနီး အမြင့်ပိုင်းတွင် ထားပါ။"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"ထပ်ရှာရန်"</item>
<item msgid="2092797862490235174">"ပြီးသွားပြီ"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"တီဗီချန်နယ်များကို ရှာပါ"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"တီဗီချန်နယ်ချိန် ကိရိယာအက်ပ် ထည့်သွင်းမှု"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB တီဗီချန်နယ်ချိန်အက်ပ် ထည့်သွင်းမှု"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"တီဗီလိုင်းဖမ်းကိရိယာ စနစ်ထည့်သွင်းမှု"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB တီဗီလိုင်းချိန်ကိရိယာကို ဖြုတ်လိုက်ပါပြီ။"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"ကွန်ရက်လိုင်းချိန်ကိရိယာကို ဖြုတ်လိုက်ပါပြီ။"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB တီဗီချိန်စက်ကို ဖြုတ်လိုက်ပါပြီ"</string>
</resources>
diff --git a/usbtuner-res/values-nb/strings.xml b/usbtuner-res/values-nb/strings.xml
index 60bf7e1a..bce9e176 100644
--- a/usbtuner-res/values-nb/strings.xml
+++ b/usbtuner-res/values-nb/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV-tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-tuneren for TV"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Nettverkstuner for TV (betaversjon)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"På"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Av"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Vent til behandlingen er fullført"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Velg en kanalkilde"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Ikke noe signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Kunne ikke bytte kanal til <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Kunne ikke bytte kanal"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Programvaren for tuneren er nylig blitt oppdatert. Du må skanne kanalene på nytt."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Slå på surroundlyd i innstillingene for systemlyd for å slå på lyd"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Kan ikke spille av lyd. Prøv en annen TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Konfigurasjon av kanaler via tuneren"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Konfigurasjon av TV-tuneren"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Konfigurasjon av kanaler via USB-tuneren"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Konfigurasjon av nettverkstuner"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Bekreft at TV-en din er koblet til en TV-signalkilde.\n\nHvis du bruker en trådløs antenne, kan det hende du må justere posisjonen eller retningen for å motta flest mulig kanaler. For å få de beste resultatene bør du plassere antennen høyt og i nærheten av et vindu."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Bekreft at USB-tuneren er plugget i og koblet til en TV-signalkilde.\n\nHvis du bruker en trådløs antenne, kan det hende du må justere posisjonen eller retningen for å motta flest mulig kanaler. For å få de beste resultatene bør du plassere antennen høyt og i nærheten av et vindu."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Bekreft at nettverkstuneren er slått på og koblet til en TV-signalkilde.\n\nHvis du bruker en trådløs antenne, må du kanskje justere posisjonen eller retningen for å motta flere kanaler. For å få de beste resultatene bør du plassere antennen høyt og i nærheten av et vindu."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Fortsett"</item>
<item msgid="727245208787621142">"Ikke nå"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Vil du kjøre kanalkonfigureringen på nytt?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Dette fjerner kanalene som ble funnet med TV-tuneren, og skanner etter nye kanaler igjen.\n\nBekreft at TV-en din er koblet til en TV-signalkilde.\n\nHvis du bruker en trådløs antenne, kan det hende du må justere posisjonen eller retningen for å motta flest mulig kanaler. For å få de beste resultatene bør du plassere antennen høyt og i nærheten av et vindu."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Dette fjerner kanaler som er funnet via USB-tuneren, og skanner på nytt etter nye kanaler.\n\nBekreft at USB-tuneren er plugget i og koblet til en TV-signalkilde.\n\nHvis du bruker en trådløs antenne, kan det hende du må justere posisjonen eller retningen for å motta flest mulig kanaler. For å få de beste resultatene bør du plassere antennen høyt og i nærheten av et vindu."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Dette fjerner kanalene som ble funnet av nettverkstuneren, og skanner på nytt etter nye kanaler.\n\nBekreft at nettverkstuneren er slått på og koblet til en TV-signalkilde.\n\nHvis du bruker en trådløs antenne, må du kanskje justere posisjonen eller retningen for å motta flere kanaler. For å få de beste resultatene bør du plassere antennen høyt og i nærheten av et vindu."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Fortsett"</item>
<item msgid="235450158666155406">"Avbryt"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Konfigurasjon av TV-tuneren"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Konfigurasjon av kanaler via USB-tuneren"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Konfigurasjon av tuner for nettverkskanaler"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Dette kan ta flere minutter"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuneren er midlertidig utilgjengelig eller brukes allerede av opptak."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Fant ingen kanaler"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Ingen kanaler ble funnet under skanningen. Bekreft at TV-en din er koblet til en TV-signalkilde.\n\nHvis du bruker en trådløs antenne, kan du justere posisjonen eller retningen. For å få de beste resultatene bør du plassere antennen høyt og i nærheten av et vindu. Deretter skanner du på nytt."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Fant ingen kanaler under skanningen. Bekreft at USB-tuneren er plugget i og koblet til en TV-signalkilde.\n\nHvis du bruker en trådløs antenne, kan du justere posisjonen eller retningen. For å få de beste resultatene bør du plassere antennen høyt og i nærheten av et vindu. Deretter skanner du på nytt."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Skanningen fant ingen kanaler. Bekreft at nettverkstuneren er slått på og koblet til en TV-signalkilde.\n\nHvis du bruker en trådløs antenne, må du justere posisjonen eller retningen. For å få de beste resultatene bør du plassere antennen høyt og i nærheten av et vindu. Deretter skanner du på nytt."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Skann på nytt"</item>
<item msgid="2092797862490235174">"Ferdig"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Skann etter TV-kanaler"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Konfigurasjon av TV-tuneren"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Konfigurasjon av USB-tuner for TV"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Konfigurasjon av nettverkstuner for TV"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-tuneren for TV er frakoblet."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Nettverkstuneren er frakoblet."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-tuneren for TV er frakoblet."</string>
</resources>
diff --git a/usbtuner-res/values-ne-rNP/strings.xml b/usbtuner-res/values-ne/strings.xml
index 387ebbf6..07d68e2c 100644
--- a/usbtuner-res/values-ne-rNP/strings.xml
+++ b/usbtuner-res/values-ne/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV ट्युनर"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV ट्युनर"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"नेटवर्कको TV ट्युनर (बिटा)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"सक्रिय"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"निष्क्रिय"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"कृपया प्रक्रिया सम्पन्न हुने प्रतीक्षा गर्नुहोस्"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"आफ्नो च्यानलको स्रोत चयन गर्नुहोस्"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"कुनै सिग्‍नल छैन"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> मा ट्युन गर्न सकिएन"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ट्युन गर्न सकिएन"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ट्युनरको सफ्टवेयरलाई हालसालै अद्यावधिक गरिएको छ। कृपया च्यानलहरू पुन:स्क्यान गर्नुहोस्।"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"अडियोलाई सक्षम पार्न प्रणालीको ध्वनि सम्बन्धी सेटिङहरूमा गई सराउन्ड साउन्डलाई सक्षम पार्नुहोस्"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"अडियो बजाउन सकिँदैन। कृपया अर्को TV को प्रयोग गरी हेर्नुहोस्"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"च्यानल ट्युनरको सेटअप"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV ट्युनरको सेटअप"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB च्यानल ट्युनरको सेटअप"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"नेटवर्क ट्युनरको सेटअप"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"तपाईँको TV कुनै TV सिग्नलको स्रोतमा जडान गरिएको छ भनी पुष्टि गर्नुहोस्।\n\nयदि कुनै ओभर-दि-एयर एन्टेनाको प्रयोग भइरहेको छ भने धेरै च्यानलहरू प्राप्त गर्न तपाईँले त्यसको स्थान वा दिशा समायोजन गर्नुपर्ने हुन सक्छ। उत्कृष्ट परिणामहरूका लागि त्यसलाई उच्च स्थानमा र कुनै झ्यालको नजिक राख्नुहोस्।"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB ट्युनर प्लगइन रहेको र कुनै TV सिग्नलको स्रोतमा जडान गरिएको छ भनी पुष्टि गर्नुहोस्।\n\nयदि कुनै ओभर-दि-एयर एन्टेनाको प्रयोग भइरहेको छ भने धेरै च्यानलहरू प्राप्त गर्न तपाईँले त्यसको स्थान वा दिशा समायोजन गर्नुपर्ने हुन सक्छ। उत्कृष्ट परिणामहरूका लागि त्यसलाई उच्च स्थानमा र कुनै झ्यालको नजिक राख्नुहोस्।"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"नेटवर्क ट्युनर सक्रिय रहेको र कुनै TV सिग्नलको स्रोतमा जडान गरिएको छ भनी पुष्टि गर्नुहोस्।\n\nयदि कुनै ओभर-दि-एयर एन्टेनाको प्रयोग भइरहेको छ भने धेरै च्यानलहरू प्राप्त गर्न तपाईंले त्यसको स्थान वा दिशा समायोजन गर्नुपर्ने हुन सक्छ। उत्कृष्ट परिणामहरूका लागि त्यसलाई उच्च स्थानमा र कुनै झ्यालको नजिक राख्नुहोस्।"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"जारी राख्नुहोस्"</item>
<item msgid="727245208787621142">"अहिले होइन"</item>
@@ -38,13 +40,12 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"च्यानलको सेटअप पुनःसञ्चालन गर्ने हो?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"यसले USB ट्युनरबाट भेट्टिएका च्यानलहरूलाई हटाउनेछ र नयाँ च्यानलहरू भेट्टाउन फेरि स्क्यान गर्नेछ।\n\nतपाईँको TV कुनै TV सिग्नलको स्रोतमा जडान गरिएको छ भनी पुष्टि गर्नुहोस्।\n\nयदि कुनै ओभर-दि-एयर एन्टेनाको प्रयोग भइरहेको छ भने धेरै च्यानलहरू प्राप्त गर्न तपाईँले त्यसको स्थान वा दिशा समायोजन गर्नुपर्ने हुन सक्छ। उत्कृष्ट परिणामहरूका लागि त्यसलाई उच्च स्थानमा र कुनै झ्यालको नजिक राख्नुहोस्।"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"यसले USB ट्युनरबाट भेट्टिएका च्यानलहरूलाई हटाउनेछ र नयाँ च्यानलहरू भेट्टाउन फेरि स्क्यान गर्नेछ।\n\nUSB ट्युनर प्लगइन गरिएको र कुनै TV सिग्नलको स्रोतमा जडान गरिएको छ भनी पुष्टि गर्नुहोस्।\n\nयदि कुनै ओभर-दि-एयर एन्टेनाको प्रयोग भइरहेको छ भने धेरै च्यानलहरू प्राप्त गर्न तपाईँले त्यसको स्थान वा दिशा समायोजन गर्नुपर्ने हुन सक्छ। उत्कृष्ट परिणामहरूका लागि त्यसलाई उच्च स्थानमा र कुनै झ्यालको नजिक राख्नुहोस्।"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"यसले नेटवर्क ट्युनर मार्फत भेट्टिएका च्यानलहरूलाई हटाउनेछ र नयाँ च्यानलहरू भेट्टाउन फेरि स्क्यान गर्नेछ।\n\nनेटवर्क ट्युनरलाई सक्रिय गरिएको र कुनै TV सिग्नलको स्रोतमा जडान गरिएको छ भनी पुष्टि गर्नुहोस्।\n\nयदि कुनै ओभर-दि-एयर एन्टेनाको प्रयोग भइरहेको छ भने धेरै च्यानलहरू प्राप्त गर्न तपाईंले त्यसको स्थान वा दिशा समायोजन गर्नुपर्ने हुन सक्छ। उत्कृष्ट परिणामहरूका लागि त्यसलाई उच्च स्थानमा र कुनै झ्यालको नजिक राख्नुहोस्।"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"जारी राख्नुहोस्"</item>
<item msgid="235450158666155406">"रद्द गर्नुहोस्"</item>
</string-array>
<string name="ut_connection_title" msgid="8435949189164677545">"जडानको प्रकार चयन गर्नुहोस्"</string>
- <string name="ut_connection_description" msgid="7234582943233286192">"यदि उक्त ट्युनरमा कुनै बाह्य एन्टेना जडान गरिएको छ भने एन्टेना छनौट गर्नुहोस्। यदि तपाईंका च्यानलहरू केबल सेवा प्रदायक मार्फत आउँछन् भने केबल छनौट गर्नुहोस्। यदि तपाईं निश्चित हुनुहुन्न भने दुवै प्रकारहरू स्क्यान गरिने छन् तर यसमा लामो समय लाग्न सक्छ।"</string>
+ <string name="ut_connection_description" msgid="7234582943233286192">"यदि उक्त ट्युनरमा कुनै बाह्य एन्टेना जडान गरिएको छ भने एन्टेना छनौट गर्नुहोस्। यदि तपाईँका च्यानलहरू केबल सेवा प्रदायक मार्फत आउँछन् भने केबल छनौट गर्नुहोस्। यदि तपाईँ निश्चित हुनुहुन्न भने दुवै प्रकारहरू स्क्यान गरिने छन् तर यसमा लामो समय लाग्न सक्छ।"</string>
<string-array name="ut_connection_choices">
<item msgid="1499878461856892555">"एन्टेना"</item>
<item msgid="2670079958754180142">"केबल"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV ट्युनरको सेटअप"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB च्यानल ट्युनरको सेटअप"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"नेटवर्कको च्यानल ट्युनरको सेटअप"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"यसमा धेरै मिनेट लाग्न सक्छ"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ट्युनर अस्थायी रूपले अनुपलब्ध छ वा रेकर्डिङद्वारा पहिले नै प्रयोग गरिएको छ।"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"कुनै च्यानल भेट्टिएन"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"उक्त स्क्यानले कुनै पनि च्यानल भेट्टाएन। तपाईँको TV कुनै TV सिग्नलको स्रोतमा जडान गरिएको छ भनी पुष्टि गर्नुहोस्।\n\nयदि कुनै ओभर-दि-एयर एन्टेनाको प्रयोग भइरहेको छ भने त्यसको स्थान वा दिशा समायोजन गर्नुहोस्। उत्कृष्ट परिणामहरूका लागि त्यसलाई उच्च स्थानमा र कुनै झ्यालको नजिक राखी फेरि स्क्यान गर्नुहोस्।"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"उक्त स्क्यानले कुनै पनि च्यानल भेट्टाएन। USB ट्युनर प्लगइन गरिएको र कुनै TV सिग्नलको स्रोतमा जडान गरिएको छ भनी पुष्टि गर्नुहोस्।\n\nयदि कुनै ओभर-दि-एयर एन्टेनाको प्रयोग भइरहेको छ भने त्यसको स्थान वा दिशा समायोजन गर्नुहोस्। उत्कृष्ट परिणामहरूका लागि त्यसलाई उच्च स्थानमा र कुनै झ्यालको नजिक राखी फेरि स्क्यान गर्नुहोस्।"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"उक्त स्क्यानले कुनै पनि च्यानल भेट्टाएन। नेटवर्क ट्युनरलाई सक्रिय गरिएको र कुनै TV सिग्नलको स्रोतमा जडान गरिएको छ भनी पुष्टि गर्नुहोस्।\n\nयदि कुनै ओभर-दि-एयर एन्टेनाको प्रयोग भइरहेको छ भने त्यसको स्थान वा दिशा समायोजन गर्नुहोस्। उत्कृष्ट परिणामहरूका लागि त्यसलाई उच्च स्थानमा र कुनै झ्यालको नजिक राखी फेरि स्क्यान गर्नुहोस्।"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"फेरि स्क्यान गर्नुहोस्"</item>
<item msgid="2092797862490235174">"सम्पन्न भयो"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"TV च्यानलहरू भेट्टाउन स्क्यान गर्नुहोस्"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV ट्युनरको सेटअप"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV ट्युनरको सेटअप"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"नेटवर्कको TV ट्युनरको सेटअप"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV ट्युनरलाई विच्छेद गरियो।"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"नेटवर्क ट्युनरलाई विच्छेद गरियो।"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV ट्युनरलाई विच्छेद गरियो।"</string>
</resources>
diff --git a/usbtuner-res/values-nl/strings.xml b/usbtuner-res/values-nl/strings.xml
index 53852ce3..b9e18682 100644
--- a/usbtuner-res/values-nl/strings.xml
+++ b/usbtuner-res/values-nl/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Tv-tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-tv-tuner"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Netwerk-tv-tuner (BÈTA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Aan"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Uit"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Wacht tot het proces is voltooid"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Selecteer je kanaalbron"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Geen signaal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Kan niet afstemmen op <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Kan niet afstemmen"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"De software van de tuner is recent geüpdatet. Scan de kanalen opnieuw."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Schakel surrond sound in via de geluidsinstellingen van het systeem om audio in te schakelen"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Kan audio niet afspelen. Probeer een andere tv."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configuratie van kanaaltuner"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Tv-tuner instellen"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Kanaalconfiguratie van USB-tuner"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Netwerktuner instellen"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Controleer of je tv is aangesloten op een tv-signaalbron.\n\nAls je een over-the-air-antenne gebruikt, moet je de positie of richting daarvan mogelijk aanpassen om zo veel mogelijk kanalen te ontvangen. Voor de beste resultaten plaats je de antenne op een hoge plek in de buurt van een raam."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Controleer of de USB-tuner is ingeschakeld en aangesloten op een tv-signaalbron.\n\nAls je een over-the-air-antenne gebruikt, moet je de positie of richting daarvan mogelijk aanpassen om zo veel mogelijk kanalen te ontvangen. Voor de beste resultaten plaats je de antenne op een hoge plek in de buurt van een raam."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Controleer of de netwerktuner is ingeschakeld en aangesloten op een tv-signaalbron.\n\nAls je een over-the-air-antenne gebruikt, moet je de positie of richting daarvan mogelijk aanpassen om zo veel mogelijk kanalen te ontvangen. Voor de beste resultaten plaats je de antenne op een hoge plek in de buurt van een raam."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Doorgaan"</item>
<item msgid="727245208787621142">"Niet nu"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Kanaalconfiguratie opnieuw uitvoeren?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Hiermee worden de gevonden kanalen verwijderd van de tv-tuner en wordt opnieuw gezocht naar nieuwe kanalen.\n\nControleer of je tv is aangesloten op een tv-signaalbron.\n\nAls je een over-the-air-antenne gebruikt, moet je de positie of richting daarvan mogelijk aanpassen om zo veel mogelijk kanalen te ontvangen. Voor de beste resultaten plaats je de antenne op een hoge plek in de buurt van een raam."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Hiermee worden de gevonden kanalen verwijderd van de USB-tuner en wordt opnieuw gescand naar nieuwe kanalen.\n\nControleer of de USB-tuner is ingeschakeld en aangesloten op een tv-signaalbron.\n\nAls je een over-the-air-antenne gebruikt, moet je de positie of richting daarvan mogelijk aanpassen om zo veel mogelijk kanalen te ontvangen. Voor de beste resultaten plaats je de antenne op een hoge plek in de buurt van een raam."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Hiermee worden de gevonden kanalen verwijderd van de netwerktuner en wordt opnieuw gezocht naar nieuwe kanalen.\n\nControleer of de netwerktuner is ingeschakeld en aangesloten op een tv-signaalbron.\n\nAls je een over-the-air-antenne gebruikt, moet je de positie of richting daarvan mogelijk aanpassen om zo veel mogelijk kanalen te ontvangen. Voor de beste resultaten plaats je de antenne op een hoge plek in de buurt van een raam."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Doorgaan"</item>
<item msgid="235450158666155406">"Annuleren"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Tv-tuner instellen"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Kanaalconfiguratie van USB-tuner"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Netwerkkanaaltuner instellen"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Dit kan enkele minuten duren"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"De tuner is tijdelijk niet beschikbaar of wordt al gebruikt voor een opname."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Geen kanalen gevonden"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Er zijn geen kanalen gevonden tijdens de scan. Controleer of je tv is aangesloten op een tv-signaalbron.\n\nAls je een over-the-air-antenne gebruikt, pas je de positie of richting daarvan aan. Voor de beste resultaten plaats je de antenne op een hoge plek in de buurt van een raam en voer je de scan opnieuw uit."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Er zijn geen kanalen gevonden tijdens de scan. Controleer of de USB-tuner is ingeschakeld en aangesloten op een tv-signaalbron.\n\nAls je een over-the-air-antenne gebruikt, pas je de positie of richting daarvan aan. Voor de beste resultaten plaats je de antenne op een hoge plek in de buurt van een raam en voer je de scan opnieuw uit."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"De scan heeft geen kanalen gevonden. Controleer of de netwerktuner is ingeschakeld en aangesloten op een tv-signaalbron.\n\nAls je een over-the-air-antenne gebruikt, moet je de positie of richting daarvan mogelijk aanpassen. Voor de beste resultaten plaats je de antenne op een hoge plek in de buurt van een raam en voer je de scan opnieuw uit."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Opnieuw scannen"</item>
<item msgid="2092797862490235174">"Gereed"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Scannen naar tv-kanalen"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Tv-tuner instellen"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB-tv-tuner instellen"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Netwerk-tv-tuner instellen"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-tv-tuner losgekoppeld."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Netwerktuner losgekoppeld."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-tv-tuner ontkoppeld."</string>
</resources>
diff --git a/usbtuner-res/values-pl/strings.xml b/usbtuner-res/values-pl/strings.xml
index 33287ea9..0bc7e734 100644
--- a/usbtuner-res/values-pl/strings.xml
+++ b/usbtuner-res/values-pl/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Tuner TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Tuner TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Sieciowy tuner TV (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Włącz"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Wyłącz"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Poczekaj na zakończenie przetwarzania"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Wybierz źródło kanału"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Brak sygnału"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Nie udało się dostroić kanału <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Nie udało się dostroić kanału"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Oprogramowanie tunera zostało niedawno zaktualizowane. Przeskanuj ponownie kanały."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Aby włączyć dźwięk, włącz dźwięk przestrzenny w ustawieniach systemowych dźwięku"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Nie można odtworzyć dźwięku. Spróbuj użyć innego telewizora"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Konfiguracja kanałów w tunerze"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Konfiguracja tunera TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Konfiguracja kanałów w tunerze USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Konfiguracja tunera sieciowego"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Upewnij się, że telewizor jest podłączony do źródła sygnału telewizyjnego.\n\nJeśli używasz anteny telewizyjnej, może być konieczne wyregulowanie jej położenia lub kierunku, by można było odbierać jak najwięcej kanałów. Aby uzyskać najlepszy sygnał, umieść antenę na podwyższeniu, w pobliżu okna."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Upewnij się, że tuner USB jest podłączony do telewizora oraz do źródła sygnału telewizyjnego.\n\nJeśli używasz anteny telewizyjnej, może być konieczne wyregulowanie jej położenia lub kierunku, by można było odbierać jak najwięcej kanałów. Aby uzyskać najlepszy sygnał, umieść antenę na podwyższeniu, w pobliżu okna."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Upewnij się, że tuner sieciowy jest włączony i został podłączony do źródła sygnału telewizyjnego.\n\nJeśli używasz anteny telewizyjnej, może być konieczne wyregulowanie jej położenia lub kierunku, by można było odbierać jak najwięcej kanałów. Aby uzyskać najlepszy sygnał, umieść antenę na podwyższeniu, w pobliżu okna."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Kontynuuj"</item>
<item msgid="727245208787621142">"Nie teraz"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Skonfigurować ponownie kanały?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Spowoduje to usunięcie kanałów znalezionych przez tuner TV i ponowne wykonanie skanowania.\n\nUpewnij się, że telewizor jest podłączony do źródła sygnału telewizyjnego.\n\nJeśli używasz anteny telewizyjnej, może być konieczne wyregulowanie jej położenia lub kierunku, by można było odbierać jak najwięcej kanałów. Aby uzyskać najlepszy sygnał, umieść antenę na podwyższeniu, w pobliżu okna."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Spowoduje to usunięcie kanałów znalezionych przez tuner USB i ponowne wykonanie skanowania.\n\nUpewnij się, że tuner USB jest podłączony do telewizora oraz do źródła sygnału telewizyjnego.\n\nJeśli używasz anteny telewizyjnej, może być konieczne wyregulowanie jej położenia lub kierunku, by można było odbierać jak najwięcej kanałów. Aby uzyskać najlepszy sygnał, umieść antenę na podwyższeniu, w pobliżu okna."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Spowoduje to usunięcie kanałów znalezionych przez tuner sieciowy i ponowne wykonanie skanowania.\n\nUpewnij się, że tuner sieciowy jest włączony i został podłączony do źródła sygnału telewizyjnego.\n\nJeśli używasz anteny telewizyjnej, może być konieczne wyregulowanie jej położenia lub kierunku, by można było odbierać jak najwięcej kanałów. Aby uzyskać najlepszy sygnał, umieść antenę na podwyższeniu, w pobliżu okna."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Kontynuuj"</item>
<item msgid="235450158666155406">"Anuluj"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Konfiguracja tunera TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Konfiguracja kanałów w tunerze USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Konfiguracja kanałów w tunerze sieciowym"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Może to potrwać kilka minut"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuner jest czasowo niedostępny lub właśnie nagrywa."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -82,7 +82,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Nie znaleziono kanałów"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Podczas skanowania nie znaleziono żadnych kanałów. Upewnij się, że telewizor jest podłączony do źródła sygnału telewizyjnego.\n\nJeśli używasz anteny telewizyjnej, wyreguluj jej położenie lub kierunek. Aby uzyskać najlepszy sygnał, umieść antenę na podwyższeniu, w pobliżu okna, a następnie ponownie wykonaj skanowanie."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Podczas skanowania nie znaleziono żadnych kanałów. Upewnij się, że tuner USB jest podłączony do telewizora oraz do źródła sygnału telewizyjnego.\n\nJeśli używasz anteny telewizyjnej, wyreguluj jej położenie lub kierunek. Aby uzyskać najlepszy sygnał, umieść antenę na podwyższeniu, w pobliżu okna, a następnie ponownie wykonaj skanowanie."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Podczas skanowania nie znaleziono żadnych kanałów. Upewnij się, że tuner sieciowy jest włączony i został podłączony do źródła sygnału telewizyjnego.\n\nJeśli używasz anteny telewizyjnej, wyreguluj jej położenie lub kierunek. Aby uzyskać najlepszy sygnał, umieść antenę na podwyższeniu, w pobliżu okna, a następnie ponownie wykonaj skanowanie."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Skanuj ponownie"</item>
<item msgid="2092797862490235174">"Gotowe"</item>
@@ -90,7 +89,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Wyszukaj kanały TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Konfiguracja tunera TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Konfiguracja tunera TV USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Konfiguracja sieciowego tunera TV"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Telewizyjny tuner USB rozłączony."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Tuner sieciowy rozłączony."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Tuner TV USB odłączony."</string>
</resources>
diff --git a/usbtuner-res/values-pt-rPT/strings.xml b/usbtuner-res/values-pt-rPT/strings.xml
index b7586f13..c78c92c1 100644
--- a/usbtuner-res/values-pt-rPT/strings.xml
+++ b/usbtuner-res/values-pt-rPT/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sintonizador de TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Sintonizador de TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Sintonizador de televisão (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Ativar"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Desativar"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Aguarde enquanto o processamento é terminado"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Selecione a origem do canal"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Sem sinal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Falha ao sintonizar <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Falha ao sintonizar"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"O software do sintonizador foi atualizado recentemente. Procure novamente os canais."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Ative o som surround nas definições de som do sistema para ativar o áudio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Não é possível reproduzir áudio. Experimente outra TV."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configuração do sintonizador de canais"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configuração do sintonizador de TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configuração do sintonizador de canais USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configuração do sintonizador de rede"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Confirme se a sua TV está ligada a uma fonte de sinal da TV.\n\nSe estiver a utilizar uma antena via rede sem fios, pode ter de ajustar a respetiva posição ou a direção para receber a maioria dos canais. Para obter os melhores resultados, coloque-a num ponto alto e junto a uma janela."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Confirme se o sintonizador USB está ativado e ligado a uma fonte de sinal da TV.\n\nSe estiver a utilizar uma antena via rede sem fios, pode ter de ajustar a respetiva posição ou a direção para receber a maioria dos canais. Para obter os melhores resultados, coloque-a num ponto alto e junto a uma janela."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Confirme se o sintonizador de rede está ligado à alimentação e ligado a uma fonte de sinal de TV.\n\nSe estiver a utilizar uma antena via rede sem fios, pode ter de ajustar a respetiva posição ou direção para receber a maioria dos canais. Para obter os melhores resultados, coloque-a num ponto alto e junto a uma janela."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continuar"</item>
<item msgid="727245208787621142">"Agora não"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Pretende executar novamente a configuração do canal?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Esta ação remove os canais encontrados pelo sintonizador de TV e procura novamente canais novos.\n\nConfirme se a sua TV está ligada a uma fonte de sinal da TV.\n\nSe estiver a utilizar uma antena via rede sem fios, pode ter de ajustar a respetiva posição ou a direção para receber a maioria dos canais. Para obter os melhores resultados, coloque-a num ponto alto e junto a uma janela."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Esta ação remove os canais encontrados do sintonizador USB e procura novamente canais novos.\n\nConfirme se o sintonizador USB está ativado e ligado a uma fonte de sinal da TV.\n\nSe estiver a utilizar uma antena via rede sem fios, pode ter de ajustar a respetiva posição ou a direção para receber a maioria dos canais. Para obter os melhores resultados, coloque-a num ponto alto e junto a uma janela."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Esta ação vai remover os canais encontrados do sintonizador de rede e procurar novos canais novamente.\n\nConfirme se o sintonizador de rede está ligado à alimentação e ligado a uma fonte de sinal de TV.\n\nSe estiver a utilizar uma antena via rede sem fios, pode ter de ajustar a respetiva posição ou direção para receber a maioria dos canais. Para obter os melhores resultados, coloque-a num ponto alto e junto a uma janela."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continuar"</item>
<item msgid="235450158666155406">"Cancelar"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configuração do sintonizador de TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configuração do sintonizador de canais USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configuração do sintonizador de canais"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Esta operação pode demorar vários minutos"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"O sintonizador está temporariamente indisponível ou já está a ser utilizado pela gravação."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Não foram encontrados canais"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"A procura não encontrou quaisquer canais. Confirme se a TV está ligada a uma fonte de sinal da TV.\n\nSe estiver a utilizar uma antena via rede sem fios, ajuste a respetiva posição ou a direção. Para obter os melhores resultados, coloque-a num ponto alto e junto a uma janela e procure novamente."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Não foram encontrados quaisquer canais. Verifique se o sintonizador USB está ativado e ligado a uma fonte de sinal da TV.\n\nSe estiver a utilizar uma antena via rede sem fios, ajuste a respetiva posição ou a direção. Para obter os melhores resultados, coloque-a num ponto alto e junto a uma janela e procure novamente."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"A procura não encontrou quaisquer canais. Confirme se o sintonizador de rede está ligado à alimentação e ligado a uma fonte de sinal de TV.\n\nSe estiver a utilizar uma antena via rede sem fios, ajuste a respetiva posição ou direção. Para obter os melhores resultados, coloque-a num ponto alto e junto a uma janela. Em seguida, procure novamente."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Procurar novamente"</item>
<item msgid="2092797862490235174">"Concluído"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Procurar canais de TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configuração do sintonizador de TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configuração do sintonizador de TV USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configuração do sintonizador de televisão"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Sintonizador de TV USB desligado."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Sintonizador de rede desligado."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Sintonizador de TV USB desligado."</string>
</resources>
diff --git a/usbtuner-res/values-pt/strings.xml b/usbtuner-res/values-pt/strings.xml
index 862b1dbe..3dfd30c0 100644
--- a/usbtuner-res/values-pt/strings.xml
+++ b/usbtuner-res/values-pt/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sintonizador de TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Sintonizador de TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Sintonizador de rede de TV (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Ativar"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Desativar"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Aguarde a conclusão do processamento"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Selecione a fonte do canal"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Sem sinal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Falha ao sintonizar <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Falha ao sintonizar"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"O software do sintonizador foi atualizado recentemente. Procure os canais mais uma vez."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Ative o som surround nas configurações de som do sistema para ativar o áudio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Não foi possível reproduzir o áudio. Tente em outra TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configuração do sintonizador de canais"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configuração do Sintonizador de TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configuração do sintonizador de canais USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configuração do sintonizador de rede"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Verifique se sua TV está conecta a uma fonte de sinal de TV.\n\nSe você estiver usando uma antena Over-the-air (OTA), talvez seja necessário ajustar o posicionamento ou a direção dela para receber o máximo de canais. Para ter resultados melhores, coloque-a em um lugar alto e perto de uma janela."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Verifique se o sintonizador USB está conectado a uma fonte de sinal de TV.\n\nSe você usa uma antena Over the air, talvez seja necessário ajustar o posicionamento ou a direção dela para receber o maior número de canais. Para ter resultados melhores, coloque-a em um lugar alto e perto de uma janela."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Verifique se o sintonizador de rede está ligado e conectado a uma fonte de sinal de TV.\n\nSe você estiver usando uma antena OTA (over-the-air), talvez seja necessário ajustar o posicionamento ou a direção dela para receber o máximo de canais. Para ter resultados melhores, coloque-a em um lugar alto e perto de uma janela."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continuar"</item>
<item msgid="727245208787621142">"Agora não"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Executar novamente a configuração de canais?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Isso removerá os canais encontrados do Sintonizador de TV e procurará novos canais mais uma vez.\n\nVerifique se sua TV está conectada a uma fonte de sinal de TV.\n\nSe você estiver usando uma antena Over-the-air (OTA), talvez seja necessário ajustar o posicionamento ou a direção dela para receber o máximo de canais. Para ter resultados melhores, coloque-a em um lugar alto e perto de uma janela."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Essa ação remove os canais encontrados pelo sintonizador USB e procura canais novamente.\n\nVerifique se o sintonizador USB está conectado a uma fonte de sinal de TV.\n\n.Se você usa uma antena Over the air, talvez seja necessário ajustar o posicionamento ou a direção dela para receber o maior número de canais. Para ter resultados melhores, coloque-a em um lugar alto e perto de uma janela."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Essa ação removerá os canais encontrados do sintonizador de rede e procurará novos canais mais uma vez.\n\nVerifique se o sintonizador de rede está ligado e conectado a uma fonte de sinal de TV.\n\nSe você estiver usando uma antena OTA (over-the-air), talvez seja necessário ajustar o posicionamento ou a direção dela para receber o máximo de canais. Para ter resultados melhores, coloque-a em um lugar alto e perto de uma janela."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continuar"</item>
<item msgid="235450158666155406">"Cancelar"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configuração do Sintonizador de TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configuração do sintonizador de canais USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configuração do sintonizador de canais de rede"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Isso pode demorar alguns minutos"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"O sintonizador está temporariamente indisponível ou já está sendo usado pela gravação."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Nenhum canal encontrado"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"A procura não encontrou nenhum canal. Verifique se sua TV está conectada a uma fonte de sinal de TV.\n\nSe você estiver usando uma antena Over-the-air (OTA), ajuste o posicionamento ou a direção dela. Para ter resultados melhores, coloque-a em um lugar alto e perto de uma janela e procure novamente."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Nenhum canal foi encontrado pela procura. Verifique se o sintonizador USB está conectado a uma fonte de sinal de TV.\n\nSe você estiver usando uma antena Over the air, ajuste o posicionamento ou a direção dela. Para ter resultados melhores, coloque-a em um lugar alto e perto de uma janela e procure novamente."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Nenhum canal foi encontrado pela procura. Verifique se o sintonizador de rede está ligado e conectado a uma fonte de sinal de TV.\n\nSe você estiver usando uma antena OTA (over-the-air), ajuste o posicionamento ou a direção dela. Para ter resultados melhores, coloque-a em um lugar alto e perto de uma janela, depois procure novamente."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Procurar novamente"</item>
<item msgid="2092797862490235174">"Concluído"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Procurar canais de TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configuração do Sintonizador de TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configuração do Sintonizador de TV USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configuração do sintonizador de rede de TV"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Sintonizador de TV USB desconectado."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Sintonizador de rede desconectado."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Sintonizador de TV USB desconectado."</string>
</resources>
diff --git a/usbtuner-res/values-ro/strings.xml b/usbtuner-res/values-ro/strings.xml
index f87c5494..57f1ca48 100644
--- a/usbtuner-res/values-ro/strings.xml
+++ b/usbtuner-res/values-ro/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Tuner TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Tuner TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Tuner de rețea TV (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Activați"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Dezactivați"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Așteptați ca procesarea să fie finalizată"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Selectați sursa canalului"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Fără semnal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Canalul <xliff:g id="CHANNEL_NAME">%s</xliff:g> nu a putut fi selectat"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Canalul nu a putut fi selectat"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Software-ul tunerului a fost actualizat recent. Scanați din nou canalele."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Pentru a activa conținutul audio, activați sunetul surround din setările de sunet ale sistemului"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Conținutul audio nu poate fi redat. Încercați pe un alt televizor."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Configurarea tunerului de canale"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Configurarea tunerului TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Configurarea tunerului de canale USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Configurarea tunerului de rețea"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Asigurați-vă că televizorul este conectat la o sursă de semnal TV.\n\nDacă folosiți o antenă over the air, poate fi necesar să-i ajustați amplasarea sau direcția astfel încât să capteze majoritatea canalelor. Pentru cele mai bune rezultate, amplasați-o la înălțime și în apropierea unei ferestre."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Asigurați-vă că tunerul USB este conectat la o sursă de alimentare și la o sursă de semnal TV.\n\nDacă folosiți o antenă over the air, poate fi necesar să-i ajustați amplasarea sau direcția astfel încât să capteze majoritatea canalelor. Pentru cele mai bune rezultate, amplasați-o la înălțime și în apropierea unei ferestre."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Verificați dacă tunerul de rețea este pornit și conectat la o sursă de semnal TV.\n\nDacă folosiți o antenă over-the-air, ar putea fi necesar să-i ajustați poziția sau direcția pentru a recepționa cât mai multe canale. Pentru rezultate optime, plasați-o sus și lângă o fereastră."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Continuați"</item>
<item msgid="727245208787621142">"Nu acum"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Configurați din nou canalul?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Astfel, vor fi eliminate canalele găsite de tunerul TV și se vor căuta din nou canale.\n\nAsigurați-vă că televizorul este conectat la o sursă de semnal TV.\n\nDacă folosiți o antenă over the air, poate fi necesar să-i ajustați amplasarea sau direcția astfel încât să capteze majoritatea canalelor. Pentru cele mai bune rezultate, amplasați-o la înălțime și în apropierea unei ferestre."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Astfel, vor fi eliminate canalele găsite de pe tunerul USB și se vor căuta din nou canale.\n\nAsigurați-vă că tunerul USB este conectat la o sursă de alimentare și la o sursă de semnal TV.\n\nDacă folosiți o antenă over the air, poate fi necesar să-i ajustați amplasarea sau direcția pentru a capta majoritatea canalelor. Pentru cele mai bune rezultate, amplasați-o la înălțime și în apropierea unei ferestre."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Astfel veți elimina canalele găsite din tunerul de rețea și veți scana iar pentru a găsi canale noi.\n\nVerificați dacă tunerul de rețea este pornit și conectat la o sursă de semnal TV.\n\nDacă folosiți o antenă over-the-air, ar putea fi necesar să-i ajustați poziția sau direcția pentru a recepționa cât mai multe canale. Pentru rezultate optime, plasați-o sus și lângă o fereastră."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Continuați"</item>
<item msgid="235450158666155406">"Anulați"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Configurarea tunerului TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Configurarea tunerului de canale USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Configurarea tunerului de canale de rețea"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Poate dura câteva minute"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tunerul nu este disponibil temporar sau este folosit deja de înregistrare."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -79,7 +79,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Nu s-au găsit canale"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Scanarea nu a găsit niciun canal. Asigurați-vă că televizorul este conectat la o sursă de semnal TV.\n\nDacă folosiți o antenă over the air, ajustați-i amplasarea sau direcția. Pentru cele mai bune rezultate, amplasați-o la înălțime și în apropierea unei ferestre, apoi repetați scanarea."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Nu s-a găsit niciun canal la scanare. Asigurați-vă că tunerul USB este conectat la o sursă de alimentare și la o sursă de semnal TV. \n\nDacă folosiți o antenă over the air, ajustați-i amplasarea sau direcția. Pentru cele mai bune rezultate, amplasați-o la înălțime și în apropierea unei ferestre, apoi repetați scanarea."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Scanarea nu a găsit niciun canal. Verificați dacă tunerul de rețea este pornit și conectat la o sursă de semnal TV.\n\nDacă folosiți o antenă over-the-air, ajustați poziția sau direcția. Pentru rezultate optime, plasați-o sus și lângă o fereastră și scanați din nou."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Scanați din nou"</item>
<item msgid="2092797862490235174">"Terminat"</item>
@@ -87,7 +86,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Căutați canale TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Configurarea tunerului TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Configurarea tunerului TV USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Configurarea tunerului de rețea TV"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Tunerul TV USB este deconectat."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Tunerul de rețea este deconectat."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Tunerul TV USB a fost deconectat."</string>
</resources>
diff --git a/usbtuner-res/values-ru/strings.xml b/usbtuner-res/values-ru/strings.xml
index 4ddf0c58..7509ff19 100644
--- a/usbtuner-res/values-ru/strings.xml
+++ b/usbtuner-res/values-ru/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"ТВ-тюнер"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-тюнер"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Сетевой ТВ-тюнер (бета)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Вкл."</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Выкл."</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Дождитесь окончания обработки"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Выберите источник каналов"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Нет сигнала"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Не удалось настроиться на канал \"<xliff:g id="CHANNEL_NAME">%s</xliff:g>\""</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Не удалось настроиться на канал"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Программное обеспечение тюнера было обновлено. Повторите сканирование."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Включите объемный звук в системных настройках"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Не удается воспроизвести аудио. Выберите другой канал."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Настройка тюнера"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Настройка ТВ-тюнера"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Настройка USB-тюнера"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Настройка сетевого тюнера"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Убедитесь, что телевизор подключен к источнику сигнала.\n\nЕсли вы используете телеантенну, переместите или перенаправьте ее. Рекомендуем расположить ее высоко и рядом с окном."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Убедитесь, что USB-тюнер включен в сеть и подсоединен к источнику сигнала.\n\nЕсли вы используете телеантенну, переместите или перенаправьте ее. Рекомендуем расположить ее высоко и рядом с окном."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Убедитесь, что сетевой тюнер включен в сеть и подсоединен к источнику ТВ-сигнала.\n\nЕсли вы используете телеантенну, поместите и направьте ее так, чтобы она принимала большинство каналов. Рекомендуем расположить антенну высоко и рядом с окном."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Продолжить"</item>
<item msgid="727245208787621142">"Не сейчас"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Настроить каналы заново?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Все каналы, найденные с помощью ТВ-тюнера, будут удалены, и поиск начнется заново.\n\nУбедитесь, что телевизор подключен к источнику сигнала.\n\nЕсли вы используете телеантенну, переместите или перенаправьте ее. Рекомендуем расположить ее высоко и рядом с окном."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Все каналы, найденные с помощью USB-тюнера, будут удалены, и сканирование начнется заново.\n\nУбедитесь, что USB-тюнер включен в сеть и подсоединен к источнику сигнала.\n\nЕсли вы используете телеантенну, переместите или перенаправьте ее. Рекомендуем расположить ее высоко и рядом с окном."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Все каналы, найденные с помощью сетевого тюнера, будут удалены, и сканирование начнется заново.\n\nУбедитесь, что сетевой тюнер включен в сеть и подсоединен к источнику ТВ-сигнала.\n\nЕсли вы используете телеантенну, поместите и направьте ее так, чтобы она принимала большинство каналов. Рекомендуем расположить антенну высоко и рядом с окном."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Продолжить"</item>
<item msgid="235450158666155406">"Отмена"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Настройка ТВ-тюнера"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Настройка USB-тюнера"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Настройка каналов сетевого тюнера"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Это может занять несколько минут"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Тюнер временно недоступен или уже используется для записи."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -78,7 +78,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Каналы не найдены"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Каналы не найдены. Убедитесь, что телевизор подключен к источнику сигнала.\n\nЕсли вы используете телеантенну, переместите или перенаправьте ее. Рекомендуем расположить ее высоко и рядом с окном."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Каналы не найдены. Убедитесь, что USB-тюнер включен в сеть и подсоединен к источнику сигнала.\n\nЕсли вы используете телеантенну, переместите или перенаправьте ее. Рекомендуем расположить ее высоко и рядом с окном."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Каналы не найдены. Убедитесь, что сетевой тюнер включен в сеть и подсоединен к источнику ТВ-сигнала.\n\nЕсли вы используете телеантенну, переместите или перенаправьте ее (рекомендуем расположить антенну высоко и рядом с окном). Затем повторите сканирование."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Искать повторно"</item>
<item msgid="2092797862490235174">"Готово"</item>
@@ -86,7 +85,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Сканирование телеканалов"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Настройка ТВ-тюнера"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Настройка USB-тюнера"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Настройка сетевого ТВ-тюнера"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-тюнер отключен."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Сетевой тюнер отключен."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-тюнер отключен."</string>
</resources>
diff --git a/usbtuner-res/values-si-rLK/strings.xml b/usbtuner-res/values-si/strings.xml
index 5f195311..a792b2c0 100644
--- a/usbtuner-res/values-si-rLK/strings.xml
+++ b/usbtuner-res/values-si/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV සුසරකය"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV සුසරකය"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Network TV Tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"ක්‍රියාත්මක කරන්න"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"ක්‍රියාවිරහිත කරන්න"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"සැකසීම අවසන් කිරීමට කරුණාකර රැඳී සිටින්න"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"ඔබගේ නාලිකා මූලාශ්‍රය තෝරන්න"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"සංඥාවක් නැත"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> වෙත සුසර කිරීම අසාර්ථක විය"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"සුසර කිරීම අසාර්ථක විය"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"සුසරක මෘදුකාංගය පසුගියදා යාවත්කාලීන කර ඇත. කරුණාකර නාලිකා නැවත ස්කෑන් කරන්න."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ශ්‍රව්‍ය සබල කිරීමට හඬ සැකසීම් තුළ අවට හඬ සබල කරන්න"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"ශ්‍රව්‍යය ධාවනය කළ නොහැකිය. කරුණාකර වෙනත් TV එකක් උත්සාහ කරන්න"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"නාලිකා සුසරක පිහිටුවීම"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV සුසරක පිහිටුවීම"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB නාලිකා සුසරක පිහිටුවීම"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"ජාල සුසරකය පිහිටුවීම"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"ඔබේ TV, TV සංඥා මූලාශ්‍රයකට සම්බන්ධ කර ඇති බව තහවුරු කර ගන්න.\n\nගුවන-ඔස්සේ ඇන්ටනාවක් භාවිත කරන්නේ නම්, ඔබට බොහොමයක් නාලිකා ලබා ගැනීමට පිහිටීම හෝ දිශාව සීරුමාරු කිරීමට අවශ්‍ය විය හැකිය. හොඳම ප්‍රතිඵල සඳහා, එය ඉහළින් සහ කවුළුවක් ආසන්නයේ තබන්න."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"සුසරකය පේනුගත කර ඇති බව සහ TV සංඥා මූලාශ්‍රයකට සම්බන්ධ කර ඇති බව තහවුරු කර ගන්න.\n\nගුවන-ඔස්සේ ඇන්ටනාවක් භාවිත කරන්නේ නම්, ඔබට බොහොමයක් නාලිකා ලබා ගැනීමට පිහිටීම හෝ දිශාව සීරුමාරු කිරීමට අවශ්‍ය විය හැකිය. හොඳම ප්‍රතිඵල සඳහා, එය ඉහළින් සහ කවුළුවක් ආසන්නයේ තබන්න."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"ජාල සුසරකය බලයට සම්බන්ධ කර ඇති බව සහ TV සංඥා මූලාශ්‍රයකට සම්බන්ධ කර ඇති බව තහවුරු කර ගන්න.\n\nගුවන-ඔස්සේ ඇන්ටනාවක් භාවිත කරන්නේ නම්, ඔබට බොහොමයක් නාලිකා ලබා ගැනීමට පිහිටීම හෝ දිශාව සීරුමාරු කිරීමට අවශ්‍ය විය හැකිය. හොඳම ප්‍රතිඵල සඳහා, එය ඉහළින් සහ කවුළුවක් ආසන්නයේ තබන්න."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"දිගටම කර ගෙන යන්න"</item>
<item msgid="727245208787621142">"දැන් නොවේ"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"නාලිකා පිහිටුවීම නැවත ධාවනය කරන්නද?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"මෙය TV සුසරකය වෙතින් සොයා ගත් නාලිකා ඉවත් කරනු ඇති අතර නව නාලිකා සඳහා නැවත ස්කෑන් කරනු ඇත.\n\nඔබේ TV, TV සංඥා මූලාශ්‍රයකට සම්බන්ධ කර ඇති බව තහවුරු කර ගන්න.\n\nගුවන-ඔස්සේ ඇන්ටනාවක් භාවිත කරන්නේ නම්, ඔබට බොහොමයක් නාලිකා ලබා ගැනීමට පිහිටීම හෝ දිශාව සීරුමාරු කිරීමට අවශ්‍ය විය හැකිය. හොඳම ප්‍රතිඵල සඳහා, එය ඉහළින් සහ කවුළුවක් ආසන්නයේ තබන්න."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"මෙය USB සුසරකය වෙතින් සොයා ගත් නාලිකා ඉවත් කරනු ඇති අතර නව නාලිකා සඳහා නැවත ස්කෑන් කරනු ඇත.\n\nUSB සුසරකය පේනුගත කර ඇති බව සහ TV සංඥා මූලාශ්‍රයකට සම්බන්ධ කර ඇති බව තහවුරු කර ගන්න.\n\nගුවන-ඔස්සේ ඇන්ටනාවක් භාවිත කරන්නේ නම්, ඔබට බොහොමයක් නාලිකා ලබා ගැනීමට පිහිටීම හෝ දිශාව සීරුමාරු කිරීමට අවශ්‍ය විය හැකිය. හොඳම ප්‍රතිඵල සඳහා, එය ඉහළින් සහ කවුළුවක් ආසන්නයේ තබන්න."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"මෙය ජාල සුසරකය වෙතින් සොයා ගත් නාලිකා ඉවත් කරනු ඇති අතර නව නාලිකා සඳහා නැවත ස්කෑන් කරනු ඇත.\n\nජාල සුසරකය බලයට සම්බන්ධ කර ඇති බව සහ TV සංඥා මූලාශ්‍රයකට සම්බන්ධ කර ඇති බව තහවුරු කර ගන්න.\n\nගුවන-ඔස්සේ ඇන්ටනාවක් භාවිත කරන්නේ නම්, ඔබට බොහොමයක් නාලිකා ලබා ගැනීමට පිහිටීම හෝ දිශාව සීරුමාරු කිරීමට අවශ්‍ය විය හැකිය. හොඳම ප්‍රතිඵල සඳහා, එය ඉහළින් සහ කවුළුවක් ආසන්නයේ තබන්න."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"දිගටම කර ගෙන යන්න"</item>
<item msgid="235450158666155406">"අවලංගු කරන්න"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV සුසරක පිහිටුවීම"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB නාලිකා සුසරක පිහිටුවීම"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"ජාල නාලිකා සුසරකය පිහිටුවීම"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"මෙය මිනිත්තු කිහිපයක් ගත හැකිය"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"සුසරකය තාවකාලිකව ලබා ගත නොහැකිය නැතහොත් දැනටමත් පටිගත කිරීම මගින් භාවිත කරනු ලැබේ."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"නාලිකා හමු නොවීය"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"ස්කෑන් කිරීමට නාලිකා කිසිවක් හමු නොවීය. ඔබේ TV, TV සංඥා මූලාශ්‍රයකට සම්බන්ධ කර ඇති බව තහවුරු කර ගන්න.\n\nගුවන-ඔස්සේ ඇන්ටනාවක් භාවිත කරන්නේ නම්, එහි පිහිටීම හෝ දිශාව සීරුමාරු කරන්න. හොඳම ප්‍රතිඵල සඳහා, එය ඉහළින් සහ කවුළුවක් ආසන්නයේ තබා නැවත ස්කෑන් කරන්න."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"ස්කෑන් කිරීමට නාලිකා කිසිවක් හමු නොවීය. USB සුසරකය පේනුගත කර ඇති බව සහ TV සංඥා මූලාශ්‍රයකට සම්බන්ධ කර ඇති බව තහවුරු කර ගන්න.\n\nගුවන-ඔස්සේ ඇන්ටනාවක් භාවිත කරන්නේ නම්, පිහිටීම හෝ දිශාව සීරුමාරු කරන්න. හොඳම ප්‍රතිඵල සඳහා, එය ඉහළින් සහ කවුළුවක් ආසන්නයේ තබා නැවත ස්කෑන් කරන්න."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"ස්කෑන් කිරීමට නාලිකා කිසිවක් හමු නොවීය. ජාල සුසරකය බලයට සම්බන්ධ කර ඇති බව සහ TV සංඥා මූලාශ්‍රයකට සම්බන්ධ කර ඇති බව තහවුරු කර ගන්න.\n\nගුවන-ඔස්සේ ඇන්ටනාවක් භාවිත කරන්නේ නම්, පිහිටීම හෝ දිශාව සීරුමාරු කරන්න. හොඳම ප්‍රතිඵල සඳහා, එය ඉහළින් සහ කවුළුවක් ආසන්නයේ තබා නැවත ස්කෑන් කරන්න."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"නැවත ස්කෑන් කරන්න"</item>
<item msgid="2092797862490235174">"නිමයි"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"TV නාලිකා සඳහා ස්කෑන් කරන්න"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV සුසරක පිහිටුවීම"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV සුසරක පිහිටුවීම"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"ජාල TV සුසරකය පිහිටුවීම"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV සුසරකය විසන්ධි වුණි."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"ජාල සුසරකය විසන්ධි වුණි."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV සුසරකය විසන්ධි කරන ලදී."</string>
</resources>
diff --git a/usbtuner-res/values-sk/strings.xml b/usbtuner-res/values-sk/strings.xml
index 00b9ba6b..67f9829e 100644
--- a/usbtuner-res/values-sk/strings.xml
+++ b/usbtuner-res/values-sk/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Televízny tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Televízny tuner s rozhraním USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Televízny sieťový tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Zapnúť"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Vypnúť"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Počkajte, kým bude spracovanie dokončené"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Vyberte zdroj kanála"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Žiadny signál"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Nepodarilo sa naladiť kanál <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Ladenie zlyhalo"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Softvér tunera bol nedávno aktualizovaný. Znova vyhľadajte kanály."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Ak chcete zapnúť zvuk, v nastaveniach systémového zvuku povoľte priestorový zvuk"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Zvuk nie je možné prehrať. Skúste použiť iný televízor."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Nastavenie tunera kanálov"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Nastavenie televízneho tunera"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Nastavenie kanálov tunera USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Nastavenie sieťového tunera"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Skontrolujte, či je televízor pripojený k zdroju televízneho signálu.\n\nAk používate vzdušnú anténu, upravte jej umiestnenie alebo orientáciu, aby ste získali čo najviac kanálov. Najlepšie výsledky dosiahnete umiestnením antény dostatočne vysoko a do blízkosti okna."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Skontrolujte, či je tuner USB zapojený a pripojený k zdroju televízneho signálu.\n\nAk používate vzdušnú anténu, upravte jej umiestnenie alebo orientáciu, aby ste získali čo najviac kanálov. Najlepšie výsledky dosiahnete umiestnením antény dostatočne vysoko a do blízkosti okna."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Skontrolujte, či je sieťový tuner zapnutý a pripojený k zdroju televízneho signálu.\n\nAk používate bezdrôtovú anténu, upravte jej umiestnenie alebo orientáciu tak, aby ste získali čo najviac kanálov. Najlepšie výsledky dosiahnete umiestnením antény dostatočne vysoko a do blízkosti okna."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Pokračovať"</item>
<item msgid="727245208787621142">"Teraz nie"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Znova spustiť nastavenie kanálov?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Táto akcia odstráni nájdené kanály z televízneho tunera a opätovne spustí vyhľadávanie nových kanálov.\n\nSkontrolujte, či je televízor pripojený k zdroju televízneho signálu.\n\nAk používate vzdušnú anténu, upravte jej umiestnenie alebo orientáciu, aby ste získali čo najviac kanálov. Najlepšie výsledky dosiahnete umiestnením antény dostatočne vysoko a do blízkosti okna."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Táto akcia odstráni nájdené kanály z tunera USB a opätovne spustí vyhľadávanie nových kanálov.\n\nSkontrolujte, či je tuner USB zapojený a pripojený k zdroju televízneho signálu.\n\nAk používate vzdušnú anténu, upravte jej umiestnenie alebo orientáciu, aby ste získali čo najviac kanálov. Najlepšie výsledky dosiahnete umiestnením antény dostatočne vysoko a do blízkosti okna."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Táto akcia odstráni nájdené kanály zo sieťového tunera a opätovne spustí vyhľadávanie nových kanálov.\n\nSkontrolujte, či je sieťový tuner zapnutý a pripojený k zdroju televízneho signálu.\n\nAk používate bezdrôtovú anténu, upravte jej umiestnenie alebo orientáciu tak, aby ste získali čo najviac kanálov. Najlepšie výsledky dosiahnete umiestnením antény dostatočne vysoko a do blízkosti okna."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Pokračovať"</item>
<item msgid="235450158666155406">"Zrušiť"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Nastavenie televízneho tunera"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Nastavenie kanálov tunera USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Nastavenie kanálov sieťového tunera"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Môže to trvať niekoľko minút"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tuner nie je dočasne kˆ dispozícii alebo sa práve používa na nahrávanie."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -82,7 +82,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Nenašli sa žiadne kanály"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Nenašli sa žiadne kanály. Skontrolujte, či je televízor pripojený k zdroju televízneho signálu.\n\nAk používate vzdušnú anténu, upravte jej umiestnenie alebo orientáciu. Najlepšie výsledky dosiahnete umiestnením antény dostatočne vysoko a do blízkosti okna. Potom znova spustite hľadanie."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Nenašli sa žiadne kanály. Skontrolujte, či je tuner USB zapojený a pripojený k zdroju televízneho signálu.\n\nAk používate vzdušnú anténu, upravte jej umiestnenie alebo orientáciu. Najlepšie výsledky dosiahnete umiestnením antény dostatočne vysoko a do blízkosti okna. Potom znova spustite hľadanie."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Nenašli sa žiadne kanály. Skontrolujte, či je sieťový tuner zapnutý a pripojený k zdroju televízneho signálu.\n\nAk používate bezdrôtovú anténu, upravte jej umiestnenie alebo orientáciu. Najlepšie výsledky dosiahnete umiestnením antény dostatočne vysoko a do blízkosti okna. Potom znova spustite hľadanie."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Hľadať znova"</item>
<item msgid="2092797862490235174">"Hotovo"</item>
@@ -90,7 +89,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Vyhľadajte televízne kanály"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Nastavenie televízneho tunera"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Nastavenie televízneho tunera s rozhraním USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Nastavenie televízneho sieťového tunera"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"TV tuner s rozhraním USB bol odpojený."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Sieťový tuner bol odpojený."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"TV tuner s rozhraním USB je odpojený."</string>
</resources>
diff --git a/usbtuner-res/values-sl/strings.xml b/usbtuner-res/values-sl/strings.xml
index fdde1e61..e454e971 100644
--- a/usbtuner-res/values-sl/strings.xml
+++ b/usbtuner-res/values-sl/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Sprejemnik TV-kanalov"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Sprejemnik TV-kanalov USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Omrežni sprejemnik TV-kanalov (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Vklop"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Izklop"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Počakajte, da se dokonča obdelava"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Izberite vir kanalov"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Ni signala"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Iskanje kanala <xliff:g id="CHANNEL_NAME">%s</xliff:g> ni uspelo"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Iskanje kanala ni uspelo"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Programska oprema sprejemnika je bila nedavno posodobljena. Znova poiščite kanale."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"V sistemskih nastavitvah zvoka omogočite prostorski zvok, če želite omogočiti zvok"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Zvoka ni mogoče predvajati. Poskusite na drugem televizorju."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Nastavitev sprejemnika kanalov"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Nastavitev sprejemnika TV-kanalov"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Nastavitev sprejemnika kanalov USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Nastavitev omrežnega sprejemnika"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Preverite, ali je televizor povezan z virom TV-signala.\n\nČe uporabljate anteno za prizemno televizijo, prilagodite njen položaj oziroma njeno usmerjenost. Če želite najboljši rezultat, jo postavite na visok položaj in blizu okna ter iščite kanale znova."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Preverite, ali je sprejemnik USB priključen in povezan z virom TV-signala.\n\nČe uporabljate anteno za prizemno televizijo, morate morda prilagoditi njen položaj oziroma njeno usmerjenost, če želite prejemati največ kanalov. Če želite najboljši rezultat, jo postavite na visok položaj in blizu okna."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Preverite, ali je omrežni sprejemnik vklopljen in povezan z virom TV-signala.\n\nČe uporabljate anteno za prizemno televizijo, prilagodite njen položaj oziroma njeno usmerjenost. Če želite najboljši rezultat, jo postavite na visok položaj in blizu okna."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Naprej"</item>
<item msgid="727245208787621142">"Ne zdaj"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Ali želite znova zagnati namestitev kanalov?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"S tem bodo odstranjeni kanali, najdeni prek sprejemnika TV-kanalov, in iskanje kanalov se bo začelo znova.\n\nPreverite, ali je televizor povezan z virom TV-signala.\n\nČe uporabljate anteno za prizemno televizijo, prilagodite njen položaj oziroma njeno usmerjenost. Če želite najboljši rezultat, jo postavite na visok položaj in blizu okna ter iščite kanale znova."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"S tem bodo odstranjeni kanali, najdeni prek sprejemnika USB, in iskanje kanalov se bo začelo znova.\n\nPreverite, ali je sprejemnik USB priključen in povezan z virom TV-signala.\n\nČe uporabljate anteno za prizemno televizijo, morate morda prilagoditi njen položaj oziroma njeno usmerjenost, če želite prejemati največ kanalov. Če želite najboljši rezultat, jo postavite na visok položaj in blizu okna."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"S tem bodo odstranjeni kanali, najdeni z omrežnim sprejemnikom kanalov, in vnovič se bo začelo iskanje novih kanalov.\n\nPreverite, ali je omrežni sprejemnik vklopljen in povezan z virom TV-signala.\n\nČe uporabljate anteno za prizemno televizijo, prilagodite njen položaj oziroma njeno usmerjenost. Če želite najboljši rezultat, jo postavite na visok položaj in blizu okna."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Naprej"</item>
<item msgid="235450158666155406">"Prekliči"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Nastavitev sprejemnika TV-kanalov"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Nastavitev sprejemnika kanalov USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Nastavitev omrežnega sprejemnika kanalov"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"To lahko traja nekaj minut"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Sprejemnik začasno ni na voljo ali se že uporablja za snemanje."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -82,7 +82,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Ni najdenih kanalov"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Pri iskanju kanali niso bili najdeni. Preverite, ali je televizor povezan z virom TV-signala.\n\nČe uporabljate anteno za prizemno televizijo, prilagodite njen položaj oziroma njeno usmerjenost. Če želite najboljši rezultat, jo postavite na visok položaj in blizu okna ter iščite kanale znova."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Pri iskanju kanali niso bili najdeni. Preverite, ali je sprejemnik USB priključen in povezan z virom TV-signala.\n\nČe uporabljate anteno za prizemno televizijo, prilagodite njen položaj oziroma njeno usmerjenost. Če želite najboljši rezultat, jo postavite na visok položaj in blizu okna ter iščite kanale znova."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Pri iskanju ni bil najden noben kanal. Preverite, ali je omrežni sprejemnik vklopljen in povezan z virom TV-signala.\n\nČe uporabljate anteno za prizemno televizijo, prilagodite njen položaj oziroma njeno usmerjenost. Če želite najboljši rezultat, jo postavite na visok položaj in blizu okna ter iščite kanale znova."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Znova išči"</item>
<item msgid="2092797862490235174">"Končano"</item>
@@ -90,7 +89,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Iskanje TV-kanalov"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Nastavitev sprejemnika TV-kanalov"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Nastavitev sprejemnika TV-kanalov USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Nastavitev omrežnega sprejemnika TV-kanalov"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Povezava s sprejemnikom za TV-kanale USB je prekinjena."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Povezava z omrežnim sprejemnikom je prekinjena."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Povezava s sprejemnikom za TV-kanale USB je prekinjena."</string>
</resources>
diff --git a/usbtuner-res/values-sr/strings.xml b/usbtuner-res/values-sr/strings.xml
index 12b8ae17..6c1fa1bf 100644
--- a/usbtuner-res/values-sr/strings.xml
+++ b/usbtuner-res/values-sr/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Тјунер за ТВ"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB тјунер за ТВ"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Мрежни тјунер за ТВ (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Укључи"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Искључи"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Сачекајте да се заврши обрада"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Изаберите извор канала"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Нема сигнала"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Укључивање канала <xliff:g id="CHANNEL_NAME">%s</xliff:g> није успело"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Укључивање канала није успело"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Софтвер тјунера је недавно ажуриран. Претражите канале поново."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Омогући звучни систем у подешавањима звука да бисте омогућили аудио"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Звук не може да се пусти. Испробајте други ТВ уређај"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Подешавање тјунера за канале"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Подешавање тјунера за ТВ"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Подешавање USB тјунера за канале"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Подешавање мрежног тјунера"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Проверите да ли је ТВ повезан са извором ТВ сигнала.\n\nАко користите антену за сигнал преко мреже, можда треба да прилагодите њен положај или смер да бисте имали највише канала. Ако желите најбоље резултате, поставите је високо и близу прозора."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Проверите да ли је USB тјунер прикључен и повезан са извором ТВ сигнала.\n\nАко користите антену за сигнал преко мреже, можда треба да прилагодите њен положај или смер да бисте имали највише канала. Ако желите најбоље резултате, поставите је високо и близу прозора."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Проверите да ли је мрежни тјунер укључен и повезан са извором ТВ сигнала.\n\nАко користите антену за сигнал преко мреже, можда треба да прилагодите њен положај или смер да бисте имали највише канала. Ако желите најбоље резултате, поставите је високо и близу прозора."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Настави"</item>
<item msgid="727245208787621142">"Не сада"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Желите ли да поново покренете подешавање канала?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"На овај начин уклањате канале пронађене помоћу тјунера за ТВ и поново тражите нове канале.\n\nПроверите да ли је ТВ повезан са извором ТВ сигнала.\n\nАко користите антену за сигнал преко мреже, можда треба да прилагодите њен положај или смер да бисте имали највише канала. Ако желите најбоље резултате, поставите је високо и близу прозора."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"На овај начин уклањате канале пронађене помоћу USB тјунера и поново тражите нове канале.\n\nПроверите да ли је USB тјунер прикључен и повезан са извором ТВ сигнала.\n\nАко користите антену за сигнал преко мреже, можда треба да прилагодите њен положај или смер да бисте имали највише канала. Ако желите најбоље резултате, поставите је високо и близу прозора."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"На овај начин уклањате канале пронађене помоћу мрежног тјунера и поново скенирате нове канале.\n\nПроверите да ли је мрежни тјунер укључен и повезан са извором ТВ сигнала.\n\nАко користите антену за сигнал преко мреже, можда треба да прилагодите њен положај или смер да бисте имали највише канала. Ако желите најбоље резултате, поставите је високо и близу прозора."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Настави"</item>
<item msgid="235450158666155406">"Откажи"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Подешавање тјунера за ТВ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Подешавање USB тјунера за канале"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Подешавање мрежног тјунера за канале"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Ово може да потраје неколико минута"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Тјунер привремено није доступан или се већ користи за снимање."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -79,7 +79,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Није пронађен ниједан канал"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Претрагом није пронађен ниједан канал. Проверите да ли је ТВ повезан са извором ТВ сигнала.\n\nАко користите антену за сигнал преко мреже, прилагодите њен положај или смер. Ако желите најбоље резултате, поставите је високо и близу прозора, па поново обавите претрагу."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Претрагом није пронађен ниједан канал. Проверите да ли је USB тјунер прикључен и повезан са извором ТВ сигнала.\n\nАко користите антену за сигнал преко мреже, прилагодите њен положај или смер. Ако желите најбоље резултате, поставите је високо и близу прозора, па поново обавите претрагу."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Скенирањем није пронађен ниједан канал. Проверите да ли је мрежни тјунер укључен и повезан са извором ТВ сигнала.\n\nАко користите антену за сигнал преко мреже, прилагодите њен положај или смер. Ако желите најбоље резултате, поставите је високо и близу прозора, па поново обавите скенирање."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Претражи поново"</item>
<item msgid="2092797862490235174">"Готово"</item>
@@ -87,7 +86,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Потражите ТВ канале"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Подешавање тјунера за ТВ"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Подешавање USB тјунера за ТВ"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Подешавање мрежног тјунера за ТВ"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB тјунер за ТВ није прикључен."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Мрежни тјунер није прикључен."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB тјунер за ТВ није прикључен."</string>
</resources>
diff --git a/usbtuner-res/values-sv/strings.xml b/usbtuner-res/values-sv/strings.xml
index dfa02252..dea421bb 100644
--- a/usbtuner-res/values-sv/strings.xml
+++ b/usbtuner-res/values-sv/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV-mottagare"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB-TV-mottagare"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Mottagare för TV över nätverket (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"På"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Av"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Vänta tills sökningen är klar"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Välj kanalkälla"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Ingen signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Det gick inte att ställa in <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Det gick inte att ställa in kanalen"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Programvaran för mottagaren har nyligen uppdaterats. Sök igenom kanalerna igen."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Aktivera surroundljud under inställningarna för systemljud om du vill aktivera ljud"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Det går inte att spela upp ljud. Testa en annan TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Inställning av kanalmottagare"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Konfiguration av TV-mottagare"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Kanalinställning för USB-mottagare"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Konfiguration av nätverksmottagare"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Verifiera att TV:n är ansluten till en signalkälla på TV:n.\n\nOm du använder en antenn för over the air-uppdateringar justerar du dess placering eller riktning. Placera den högt upp och nära ett fönster och sök på nytt för bästa resultat."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Verifiera att USB-mottagaren är ansluten till en signalkälla på TV:n.\n\nOm du använder en antenn för over the air-uppdateringar kan du behöva justera dess placering eller riktning för att hitta så många kanaler som möjligt. Placera den högt upp och nära ett fönster för bästa resultat."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Verifiera att nätverksmottagaren är på och ansluten till en signalkälla på TV:n.\n\nOm du använder en antenn för over the air-uppdateringar justerar du dess placering eller riktning. Placera den högt upp och nära ett fönster och sök på nytt för bästa resultat."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Fortsätt"</item>
<item msgid="727245208787621142">"Inte nu"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Vill du göra om kanalinställningen?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Kanalerna som hittats via TV-mottagaren tas bort och en ny kanalsökning startas.\n\nVerifiera att TV:n är ansluten till en signalkälla på TV:n.\n\nOm du använder en antenn för over the air-uppdateringar justerar du dess placering eller riktning. Placera den högt upp och nära ett fönster och sök på nytt för bästa resultat."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Kanalerna som hittats via USB-mottagaren tas bort och en ny kanalsökning startas.\n\nVerifiera att USB-mottagaren är ansluten till en signalkälla på TV:n.\n\nOm du använder en antenn för over the air-uppdateringar kan du behöva justera dess placering eller riktning för att hitta så många kanaler som möjligt. Placera den högt upp och nära ett fönster för bästa resultat."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Åtgärden tar bort alla kanaler som hittades av nätverksmottagaren och söker efter nya kanaler igen.\n\nVerifiera att nätverksmottagaren är på och ansluten till en signalkälla på TV:n.\n\nOm du använder en antenn för over the air-uppdateringar justerar du dess placering eller riktning. Placera den högt upp och nära ett fönster och sök på nytt för bästa resultat."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Fortsätt"</item>
<item msgid="235450158666155406">"Avbryt"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Konfiguration av TV-mottagare"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Kanalinställning för USB-mottagare"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Konfiguration av mottagare för nätverkskanaler"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Det här kan ta flera minuter"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Mottagaren är inte tillgänglig just nu eller så spelas andra program in med den."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Inga kanaler hittades"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Inga kanaler hittades vid sökningen. Verifiera att TV:n är ansluten till en signalkälla på TV:n.\n\nOm du använder en antenn för over the air-uppdateringar justerar du dess placering eller riktning. Placera den högt upp och nära ett fönster och sök på nytt för bästa resultat."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Inga kanaler hittades vid sökningen. Verifiera att USB-mottagaren är ansluten till en signalkälla på TV:n.\n\nOm du använder en antenn för over the air-uppdateringar justerar du dess placering eller riktning. Placera den högt upp och nära ett fönster och sök på nytt för bästa resultat."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Inga kanaler hittades under genomsökningen. Verifiera att nätverksmottagaren är på och ansluten till en signalkälla på TV:n.\n\nOm du använder en antenn för over the air-uppdateringar justerar du dess placering eller riktning. Placera den högt upp och nära ett fönster och sök på nytt för bästa resultat."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Sök igen"</item>
<item msgid="2092797862490235174">"Klar"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Sök efter TV-kanaler"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Konfiguration av TV-mottagare"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Konfiguration av USB-TV-mottagare"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Konfiguration av nätverksmottagare till TV"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-TV-mottagaren har kopplats från."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Nätverksmottagaren har kopplats från."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-TV-mottagaren har kopplats från"</string>
</resources>
diff --git a/usbtuner-res/values-sw/strings.xml b/usbtuner-res/values-sw/strings.xml
index d35e239f..1ade7516 100644
--- a/usbtuner-res/values-sw/strings.xml
+++ b/usbtuner-res/values-sw/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Kitafutaji cha vituo vya TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Kitafutaji cha Vituo vya TV cha USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Kitafuta Vituo vya TV ya Mtandao (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Washa"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Zima"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Tafadhali subiri ili shughuli imalizike"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Chagua chanzo cha kituo"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Hakuna Mawimbi"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Imeshindwa kupata kituo cha <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Imeshindwa kupata kituo"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Programu ya kitafutaji cha vituo cha USB ilisasishwa hivi majuzi. Tafadhali tafuta vituo tena."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Washa sauti ya mzunguko katika mipangilio ya mfumo wa sauti ili uruhusu sauti"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Haiwezi kucheza sauti. Tafadhali jaribu TV nyingine"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Kuweka mipangilio ya kitafutaji cha vituo"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Kuweka mipangilio ya kitafutaji cha vituo vya TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Kuweka mipangilio ya kitafutaji cha vituo cha USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Kuweka mipangilio ya kitafuta vituo vya TV"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Hakikisha TV yako imeunganishwa kwenye chanzo cha TV.\n\nIkiwa unatumia antena ya hewani, rekebisha jinsi ilivyowekwa au mwelekeo wake. Ili kupata matokeo bora zaidi, ipandishe juu na uiweke karibu na dirisha."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Thibitisha kuwa kitafutaji cha vituo cha USB kimechomekwa katika chanzo cha umeme na kuunganishwa katika chanzo cha mawimbi ya TV.\n\nKama unatumia antena ya hewani, rekebisha mkao wake au kule inakoelekea. Kwa matokeo bora zaidi, iweke juu , karibu na dirisha."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Thibitisha kuwa kitafuta vituo kimewashwa na kuunganishwa kwenye chanzo cha mawimbi ya TV. \n\nIkiwa unatumia antena ya hewani, huenda ukahitaji kurekebisha jinsi ilivyowekwa au inakoelekea, ili upate vituo vingi. Kwa matokeo bora zaidi, ipandishe juu na iwe karibu na dirisha."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Endelea"</item>
<item msgid="727245208787621142">"Si sasa"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Ungependa kuweka mipangilio ya vituo upya?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Hatua hii itaondoa vituo vilivyopatikana kwenye kitafutaji cha vituo vya TV na kutafuta vituo vipya tena.\n\nHakikisha TV yako imeunganishwa kwenye chanzo cha mawimbi ya TV.\n\nIkiwa unatumia antena ya hewani, rekebisha jinsi ilivyowekwa au mwelekeo wake. Ili kupata matokeo bora zaidi, ipandishe juu na uiweke karibu na dirisha kisha utafute tena."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Hatua hii itaondoa vituo vilivyopatikana kwenye kitafutaji cha vituo cha USB na kutafuta vituo tena. \n\nThibitisha kuwa kitafutaji cha vituo cha USB kimechomekwa kwenye chanzo cha umeme na kuunganishwa katika chanzo cha mawimbi ya TV.\n\nKama unatumia antena ya hewani, rekebisha mkao wake au kule inakoelekea. Kwa matokeo bora zaidi, iweke juu, karibu na dirisha."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Hatua hii itaondoa vituo ulivyopata kwenye kitafuta vituo na kutafuta vituo vipya tena.\n\nThibitisha kwamba kitafuta vituo kimewashwa na kuunganishwa kwenye chanzo cha mawimbi ya TV.\n\nIkiwa unatumia antena ya hewani, rekebisha jinsi ilivyowekwa au inakoelekea, ili upate vituo vingi. Kwa matokeo bora zaidi, ipandishe juu na iwe karibu na dirisha."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Endelea"</item>
<item msgid="235450158666155406">"Ghairi"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Kuweka mipangilio ya kitafutaji cha vituo vya TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Kuweka mipangilio ya kitafutaji cha vituo cha USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Kuweka mipangilio ya kitafuta vituo"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Shughuli hii inaweza kuchukua dakika kadhaa"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Kitafuta vituo hakipatikani kwa sasa au tayari kinatumiwa kurekodi."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Hakuna Vituo vilivyopatikana"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Hakuna vituo vilivyopatikana baada ya kutafuta. Hakikisha TV yako imeunganishwa kwenye chanzo cha mawimbi ya TV.\n\nIkiwa unatumia antena ya hewani, rekebisha jinsi ilivyowekwa au mwelekeo wake. Ili kupata matokeo bora zaidi, ipandishe juu na uiweke karibu na dirisha kisha utafute tena."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Utafutaji haukupata vituo vyovyote. Thibitisha kuwa kitafutaji cha vituo cha USB kimechomekwa kwenye chanzo cha umeme na kuunganishwa katika chanzo cha mawimbi ya TV.\n\nKama unatumia antena ya hewani, rekebisha mkao wake au kule inakoelekea. Kwa matokeo bora zaidi, iweke juu, karibu na dirisha na utafute tena."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Haikupata vituo vyovyote. Thibitisha kwamba kitafuta vituo kimewashwa na kuunganishwa kwenye chanzo cha mawimbi ya TV.\n\nIkiwa unatumia antena ya hewani, rekebisha jinsi ilivyowekwa au inakoelekea. Ili upate matokeo bora zaidi, ipandishe juu na karibu na dirisha kisha utafute tena."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Tafuta tena"</item>
<item msgid="2092797862490235174">"Nimemaliza"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Tafuta vituo vya TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Kuweka mipangilio ya kitafutaji cha vituo vya TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Kuweka mipangilio ya Kitafutaji cha Vituo cha USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Kuweka mipangilio ya Kitafuta Vituo vya TV"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Umeondoa kichagua programu cha USB cha TV."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Umeondoa kitafuta mitandao."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Umeondoa kichagua programu cha USB cha TV."</string>
</resources>
diff --git a/usbtuner-res/values-ta-rIN/strings.xml b/usbtuner-res/values-ta/strings.xml
index f6a7cbe5..dd09420d 100644
--- a/usbtuner-res/values-ta-rIN/strings.xml
+++ b/usbtuner-res/values-ta/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"டிவி ட்யூனர்"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB டிவி ட்யூனர்"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"நெட்வொர்க் டிவி டியூனர் (பீட்டா)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"இயக்கு"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"முடக்கு"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"செயலாக்கம் முடியும் வரை காத்திருக்கவும்"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"சேனல் மூலத்தைத் தேர்ந்தெடுக்கவும்"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"சிக்னல் இல்லை"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g>க்கு ட்யூன் செய்ய முடியவில்லை"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ட்யூன் செய்ய முடியவில்லை"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ட்யூனர் மென்பொருள் சமீபத்தில் புதுப்பிக்கப்பட்டது. சேனல்களை மீண்டும் ஸ்கேன் செய்யவும்."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ஆடியோவை இயக்க, சாதன ஒலி அமைப்புகளில் \"சரவுண்ட் சவுண்ட்\" என்பதை இயக்கவும்"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"ஆடியோவை இயக்க முடியவில்லை. வேறு டிவியைப் பயன்படுத்தவும்"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"சேனல் ட்யூனர் அமைவு"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"டிவி ட்யூனர் அமைவு"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB சேனல் ட்யூனர் அமைவு"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"நெட்வொர்க் டியூனர் அமைவு"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"டிவி சிக்னல் மூலத்துடன் உங்கள் டிவி இணைக்கப்பட்டுள்ளதைச் சரிபார்க்கவும்.\n\nஆன்டெனாவைப் பயன்படுத்தினால், அதிகமான சேனல்களைப் பெறுவதற்காக அதன் இடம் அல்லது திசையைச் சரிசெய்ய வேண்டியிருக்கலாம். இன்னும் சிறப்பான முடிவுகளுக்கு, அதை உயரமான இடத்தில் ஜன்னலுக்கு அருகே வைக்கவும்."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB ட்யூனர் செருகப்பட்டுள்ளதையும் டிவி சிக்னல் மூலத்துடன் இணைக்கப்பட்டுள்ளதையும் சரிபார்க்கவும்.\n\nஆன்டெனாவைப் பயன்படுத்தினால், அதிகமான சேனல்களைப் பெறுவதற்காக அதன் இடம் அல்லது திசையைச் சரிசெய்ய வேண்டியிருக்கலாம். இன்னும் சிறப்பான முடிவுகளுக்கு, அதை உயரமான இடத்தில் ஜன்னலுக்கு அருகே வைக்கவும்."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"நெட்வொர்க் டியூனர் ஆன் செய்யப்பட்டுள்ளதையும் டிவி சிக்னல் மூலத்துடன் இணைக்கப்பட்டுள்ளதையும் சரிபார்க்கவும்.\n\nஆன்டெனாவைப் பயன்படுத்தினால், அதிகமான சேனல்களைப் பெறுவதற்காக அதன் இடம் அல்லது திசையைச் சரிசெய்ய வேண்டியிருக்கலாம். இன்னும் சிறப்பான முடிவுகளுக்கு, அதை உயரமான இடத்தில் ஜன்னலுக்கு அருகே வைக்கவும்."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"தொடர்க"</item>
<item msgid="727245208787621142">"இப்போது வேண்டாம்"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"சேனல் அமைவை மீண்டும் இயக்கவா?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"இவ்வாறு செய்வதால் டிவி ட்யூனர் மூலம் கண்டறிந்த சேனல்கள் அகற்றப்படுவதுடன், புதிய சேனல்களுக்காக மீண்டும் ஸ்கேன் செய்யும்.\n\nடிவி சிக்னல் மூலத்துடன் உங்கள் டிவி இணைக்கப்பட்டுள்ளதைச் சரிபார்க்கவும்.\n\nஆன்டெனாவைப் பயன்படுத்தினால், அதிகமான சேனல்களைப் பெறுவதற்காக அதன் இடம் அல்லது திசையைச் சரிசெய்ய வேண்டியிருக்கலாம். இன்னும் சிறப்பான முடிவுகளுக்கு, அதை உயரமான இடத்தில் ஜன்னலுக்கு அருகே வைக்கவும்."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"இவ்வாறு செய்வதால் USB ட்யூனர் மூலம் கண்டறிந்த சேனல்கள் அகற்றப்படுவதுடன், புதிய சேனல்களுக்காக மீண்டும் ஸ்கேன் செய்யும்.\n\nUSB ட்யூனர் செருகப்பட்டுள்ளதையும் டிவி சிக்னல் மூலத்துடன் இணைக்கப்பட்டுள்ளதையும் சரிபார்க்கவும்.\n\nஆன்டெனாவைப் பயன்படுத்தினால், அதிகமான சேனல்களைப் பெறுவதற்காக அதன் இடம் அல்லது திசையைச் சரிசெய்ய வேண்டியிருக்கலாம். இன்னும் சிறப்பான முடிவுகளுக்கு, அதை உயரமான இடத்தில் ஜன்னலுக்கு அருகே வைக்கவும்."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"இது நெட்வொர்க் டியூனரிலிருந்து கண்டறிந்த சேனல்களை அகற்றும் மற்றும் புதிய சேனல்களுக்காக மீண்டும் ஸ்கேன் செய்யும்.\n\nநெட்வொர்க் டியூனர் ஆன் செய்யப்பட்டுள்ளதையும் டிவி சிக்னல் மூலத்துடன் இணைக்கப்பட்டுள்ளதையும் சரிபார்க்கவும்.\n\nஆன்டெனாவைப் பயன்படுத்தினால், அதிகமான சேனல்களைப் பெறுவதற்காக, அதன் இடம் அல்லது திசையைச் சரிசெய்ய வேண்டியிருக்கலாம். இன்னும் சிறப்பான முடிவுகளுக்கு, உயரமான இடத்தில், ஜன்னலுக்கு அருகில் வைக்கவும்."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"தொடர்க"</item>
<item msgid="235450158666155406">"ரத்துசெய்"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"டிவி ட்யூனர் அமைவு"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB சேனல் ட்யூனர் அமைவு"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"நெட்வொர்க் சேனல் டியூனர் அமைவு"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"இதற்குச் சில நிமிடங்கள் ஆகலாம்"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ட்யூனர் தற்காலிகமாகக் கிடைக்கவில்லை அல்லது ரெக்கார்டு செய்வதற்காக ஏற்கனவே பயன்படுத்தப்படுகிறது."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"சேனல்கள் இல்லை"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"ஸ்கேன் செய்ததில் சேனல்கள் எவையும் கண்டறியப்படவில்லை. டிவி சிக்னல் மூலத்துடன் உங்கள் டிவி இணைக்கப்பட்டுள்ளதைச் சரிபார்க்கவும்.\n\nஆன்டெனாவைப் பயன்படுத்தினால், அதன் இடம் அல்லது திசையைச் சரிசெய்யவும். இன்னும் சிறப்பான முடிவுகளுக்கு, அதை உயரமான இடத்தில் ஜன்னலுக்கு அருகே வைத்து, மீண்டும் ஸ்கேன் செய்யவும்."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"ஸ்கேன் செய்ததில் சேனல்கள் எவையும் கண்டறியப்படவில்லை. USB ட்யூனர் செருகப்பட்டுள்ளதையும் டிவி சிக்னல் மூலத்துடன் இணைக்கப்பட்டுள்ளதையும் சரிபார்க்கவும்.\n\nஆன்டெனாவைப் பயன்படுத்தினால், அதன் இடம் அல்லது திசையைச் சரிசெய்யவும். இன்னும் சிறப்பான முடிவுகளுக்கு, அதை உயரமான இடத்தில் ஜன்னலுக்கு அருகே வைத்து, மீண்டும் ஸ்கேன் செய்யவும்."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"ஸ்கேன் செய்ததில் சேனல்கள் எதுவும் கண்டறியப்படவில்லை. நெட்வொர்க் டியூனர் ஆன் செய்யப்பட்டுள்ளதையும் டிவி சிக்னல் மூலத்துடன் இணைக்கப்பட்டுள்ளதையும் சரிபார்க்கவும்.\n\nஆன்டெனாவைப் பயன்படுத்தினால், அதன் இடம் அல்லது திசையைச் சரிசெய்யவும். இன்னும் சிறப்பான முடிவுகளுக்கு, அதை உயரமான இடத்தில் ஜன்னலுக்கு அருகே வைத்து, மீண்டும் ஸ்கேன் செய்யவும்."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"மீண்டும் ஸ்கேன் செய்"</item>
<item msgid="2092797862490235174">"முடிந்தது"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"டிவி சேனல்களை ஸ்கேன் செய்"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"டிவி ட்யூனர் அமைவு"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB டிவி ட்யூனர் அமைவு"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"நெட்வொர்க் டிவி டியூனர் அமைவு"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB டிவி ட்யூனர் துண்டிக்கப்பட்டது."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"நெட்வொர்க் ட்யூனர் துண்டிக்கப்பட்டது."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB டிவி ட்யூனர் வெளியே எடுக்கப்பட்டது."</string>
</resources>
diff --git a/usbtuner-res/values-te-rIN/strings.xml b/usbtuner-res/values-te/strings.xml
index a0023d71..a80bd1c7 100644
--- a/usbtuner-res/values-te-rIN/strings.xml
+++ b/usbtuner-res/values-te/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"టీవీ ట్యూనర్"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB టీవీ ట్యూనర్"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"నెట్‌వర్క్ టీవీ ట్యూనర్ (బీటా)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"ఆన్ చేయి"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"ఆఫ్ చేయి"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"దయచేసి ప్రాసెస్ చేయడం పూర్తయ్యే వరకు వేచి ఉండండి"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"మీ ఛానెల్ మూలాన్ని ఎంచుకోండి"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"సిగ్నల్ లేదు"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g>కి ట్యూన్ చేయడంలో విఫలమైంది"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ట్యూన్ చేయడంలో విఫలమైంది"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ట్యూనర్ సాఫ్ట్‌వేర్ ఇటీవల నవీకరించబడింది. దయచేసి ఛానెల్‌లను మళ్లీ స్కాన్ చేయండి."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ఆడియోను ప్రారంభించడానికి సిస్టమ్ శబ్ద సెట్టింగ్‌ల్లో పరిసర వ్యాప్త శబ్దాన్ని ప్రారంభించండి"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"ఆడియోను ప్లే చేయడం సాధ్యపడదు. దయచేసి మరో టీవీలో ప్రయత్నించండి"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"ఛానెల్ ట్యూనర్ సెటప్"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"టీవీ ట్యూనర్ సెటప్"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB ఛానెల్ ట్యూనర్ సెటప్"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"నెట్‍వర్క్ ట్యూనర్ సెటప్"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"టీవీ.సిగ్నల్ సోర్స్‌కు మీ టీవీ కనెక్ట్ చేయబడిందని ధృవపరుచుకోండి.\n\nప్రసారాల కోసం యాంటెన్నాను ఉపయోగిస్తుంటే, మీరు మరిన్ని ఛానెల్‌లను స్వీకరించడానికి దాని స్థానాన్ని లేదా దిశను మార్చాల్సి రావచ్చు. ఉత్తమ ఫలితాల కోసం, దాన్ని ఎత్తులో కిటికీకి దగ్గరగా ఉంచండి."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB ట్యూనర్ ప్లగిన్ చేయబడి, టీవీ సిగ్నల్ సోర్స్‌కు కనెక్ట్ చేయబడినట్లు ధృవపరుచుకోండి.\n\nప్రసారాల కోసం యాంటెన్నాను ఉపయోగిస్తుంటే, మీరు మరిన్ని ఛానెల్‌లను స్వీకరించడానికి దాని స్థానాన్ని లేదా దిశను మార్చాల్సి రావచ్చు. ఉత్తమ ఫలితాల కోసం, దాన్ని ఎత్తులో కిటికీకి దగ్గరగా ఉంచండి."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"నెట్‍వర్క్ ట్యూనర్ పవర్ ఆన్ చేయబడి, టీవీ సిగ్నల్ సోర్స్‌కు కనెక్ట్ చేయబడినట్లు ధృవపరుచుకోండి.\n\nప్రసారాల కోసం యాంటెన్నాను ఉపయోగిస్తుంటే, మీరు మరిన్ని ఛానెల్‌లను స్వీకరించడానికి దాని స్థానాన్ని లేదా దిశను మార్చాల్సి రావచ్చు. ఉత్తమ ఫలితాల కోసం, దాన్ని ఎత్తులో కిటికీకి దగ్గరగా ఉంచండి."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"కొనసాగించు"</item>
<item msgid="727245208787621142">"ఇప్పుడు కాదు"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"ఛానెల్ సెటప్‌ను మళ్లీ అమలు చేయాలా?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"ఇది టీవీ ట్యూనర్ నుండి కనుగొన్న ఛానెల్‌లను తీసివేస్తుంది మరియు మళ్లీ కొత్త ఛానెల్‌ల కోసం స్కాన్ చేస్తుంది.\n\nటీవీ సిగ్నల్ సోర్స్‌కు మీ టీవీ కనెక్ట్ చేయబడిందని ధృవపరుచుకోండి.\n\nప్రసారాల కోసం యాంటెన్నాను ఉపయోగిస్తుంటే, మీరు మరిన్ని ఛానెల్‌లను స్వీకరించడానికి దాని స్థానాన్ని లేదా దిశను మార్చాల్సి రావచ్చు. ఉత్తమ ఫలితాల కోసం, దాన్ని ఎత్తులో కిటికీకి దగ్గరగా ఉంచండి."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"ఇది USB ట్యూనర్ నుండి కనుగొన్న ఛానెల్‌లను తీసివేస్తుంది మరియు మళ్లీ కొత్త ఛానెల్‌ల కోసం స్కాన్ చేస్తుంది.\n\nUSB ట్యూనర్ ప్లగిన్ చేయబడి, టీవీ సిగ్నల్ సోర్స్‌కు కనెక్ట్ చేయబడిందని ధృవపరుచుకోండి.\n\nప్రసారాల కోసం యాంటెన్నాను ఉపయోగిస్తుంటే, మీరు మరిన్ని ఛానెల్‌లను స్వీకరించడానికి దాని స్థానాన్ని లేదా దిశను మార్చాల్సి రావచ్చు. ఉత్తమ ఫలితాల కోసం, దాన్ని ఎత్తులో కిటికీకి దగ్గరగా ఉంచండి."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"ఇది నెట్‍వర్క్ ట్యూనర్ నుండి కనుగొన్న ఛానెల్‌లను తీసివేస్తుంది మరియు మళ్లీ కొత్త ఛానెల్‌ల కోసం స్కాన్ చేస్తుంది.\n\nనెట్‍వర్క్ ట్యూనర్ పవర్ ఆన్ చేయబడి, టీవీ సిగ్నల్ సోర్స్‌కు కనెక్ట్ చేయబడిందని ధృవపరుచుకోండి.\n\nప్రసారాల కోసం యాంటెన్నాను ఉపయోగిస్తుంటే, మీరు మరిన్ని ఛానెల్‌లను స్వీకరించడానికి దాని స్థానాన్ని లేదా దిశను మార్చాలి. ఉత్తమ ఫలితాల కోసం, దాన్ని ఎత్తులో కిటికీకి దగ్గరగా ఉంచండి."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"కొనసాగించు"</item>
<item msgid="235450158666155406">"రద్దు చేయి"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"టీవీ ట్యూనర్ సెటప్"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB ఛానెల్ ట్యూనర్ సెటప్"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"నెట్‍వర్క్ ఛానెల్ ట్యూనర్ సెటప్"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"దీనికి కొన్ని నిమిషాలు పట్టవచ్చు"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ట్యూనర్ తాత్కాలికంగా అందుబాటులో లేదు లేదా ఇప్పటికే రికార్డింగ్ ద్వారా ఉపయోగించబడుతోంది."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"ఛానెల్‌లు ఏవీ కనుగొనబడలేదు"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"స్కాన్‌లో ఏ ఛానెల్ కనుగొనబడలేదు. టీవీ సిగ్నల్ సోర్స్‌కి మీ టీవీ కనెక్ట్ చేయబడిందని ధృవపరుచుకోండి. \n\nప్రసారాల కోసం యాంటెన్నాను ఉపయోగిస్తుంటే, దాని స్థానాన్ని లేదా దిశను సర్దుబాటు చేయండి. ఉత్తమ ఫలితాల కోసం, దాన్ని ఎత్తులో కిటికీకి దగ్గరగా ఉంచి, ఆపై మళ్లీ స్కాన్ చేయండి."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"స్కాన్‌లో ఛానెల్‌లు ఏవీ కనుగొనబడలేదు. USB ట్యూనర్ ప్లగిన్ చేయబడి, టీవీ సిగ్నల్ సోర్స్‌కు కనెక్ట్ చేయబడిందని ధృవపరుచుకోండి.\n\nప్రసారాల కోసం యాంటెన్నాను ఉపయోగిస్తుంటే, దాని స్థానాన్ని లేదా దిశను సర్దుబాటు చేయండి. ఉత్తమ ఫలితాల కోసం, దాన్ని ఎత్తులో కిటికీకి దగ్గరగా ఉంచి, ఆపై మళ్లీ స్కాన్ చేయండి."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"స్కాన్‌లో ఛానెల్‌లు ఏవీ కనుగొనబడలేదు. నెట్‍వర్క్ ట్యూనర్ పవర్ ఆన్ చేయబడి, టీవీ సిగ్నల్ సోర్స్‌కు కనెక్ట్ చేయబడిందని ధృవపరుచుకోండి.\n\nప్రసారాల కోసం యాంటెన్నాను ఉపయోగిస్తుంటే, దాని స్థానాన్ని లేదా దిశను సర్దుబాటు చేయండి. ఉత్తమ ఫలితాల కోసం, దాన్ని ఎత్తులో కిటికీకి దగ్గరగా ఉంచి, ఆపై మళ్లీ స్కాన్ చేయండి."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"మళ్లీ స్కాన్ చేయి"</item>
<item msgid="2092797862490235174">"పూర్తయింది"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"టీవీ ఛానెల్‌ల కోసం స్కాన్ చేయండి"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"టీవీ ట్యూనర్ సెటప్"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB టీవీ ట్యూనర్ సెటప్"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"నెట్‍వర్క్ టీవీ ట్యూనర్ సెటప్"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB టీవీ ట్యూనర్ డిస్‌కనెక్ట్ చేయబడింది."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"నెట్‌వర్క్ ట్యూనర్ డిస్‌కనెక్ట్ చేయబడింది."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB టీవీ ట్యూనర్ డిస్‌కనెక్ట్ చేయబడింది."</string>
</resources>
diff --git a/usbtuner-res/values-th/strings.xml b/usbtuner-res/values-th/strings.xml
index 8e41544e..217520df 100644
--- a/usbtuner-res/values-th/strings.xml
+++ b/usbtuner-res/values-th/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"ตัวรับสัญญาณทีวี"</string>
<string name="ut_app_name" msgid="8557698013780762454">"ตัวรับสัญญาณทีวีแบบ USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"ตัวรับสัญญาณทีวีเครือข่าย (เบต้า)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"เปิด"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"ปิด"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"โปรดรอให้การดำเนินการหยุดลงสักครู่"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"เลือกแหล่งที่มาของช่อง"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"ไม่มีสัญญาณ"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"ไม่สามารถรับสัญญาณ <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ไม่สามารถรับสัญญาณ"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ซอฟต์แวร์ตัวรับสัญญาณมีการอัปเดตเมื่อเร็วๆ นี้ โปรดสแกนช่องอีกครั้ง"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"เปิดใช้เสียงเซอร์ราวด์ในการตั้งค่าเสียงของระบบเพื่อเปิดใช้เสียง"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"เล่นเสียงไม่ได้ โปรดลองทีวีเครื่องอื่น"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"ตั้งค่าตัวรับสัญญาณช่อง"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"ตั้งค่าตัวรับสัญญาณทีวี"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"ตั้งค่าตัวรับสัญญาณช่องแบบ USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"ตั้งค่าตัวรับสัญญาณเครือข่าย"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"โปรดตรวจสอบว่าทีวีของคุณเชื่อมต่อกับแหล่งสัญญาณทีวีแล้ว\n\nหากใช้เสาอากาศแบบผ่านอากาศ คุณอาจต้องปรับตำแหน่งและทิศทางเพื่อรับช่องให้ได้มากที่สุด เพื่อผลลัพธ์ที่ดีที่สุด ให้วางไว้บนที่สูงใกล้หน้าต่าง"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"โปรดตรวจสอบว่าได้เสียบปลั๊กตัวรับสัญญาณแบบ USB และเชื่อมต่อกับแหล่งสัญญาณทีวีแล้ว\n\nหากใช้เสาอากาศแบบผ่านอากาศ คุณอาจต้องปรับตำแหน่งหรือทิศทางเพื่อรับช่องให้ได้มากที่สุด เพื่อผลลัพธ์ที่ดีที่สุด ให้วางไว้บนที่สูงใกล้หน้าต่าง"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"โปรดตรวจสอบว่าตัวรับสัญญาณเครือข่ายเปิดอยู่และเชื่อมต่อกับแหล่งสัญญาณทีวีแล้ว\n\nหากใช้เสาอากาศแบบผ่านอากาศ (OTA) คุณอาจต้องปรับตำแหน่งหรือทิศทางเพื่อรับช่องให้ได้มากที่สุด เพื่อผลลัพธ์ที่ดีที่สุด ให้วางไว้บนที่สูงใกล้หน้าต่าง"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"ต่อไป"</item>
<item msgid="727245208787621142">"ข้ามไปก่อน"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"ต้องการเริ่มการตั้งค่าช่องอีกครั้งใช่ไหม"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"วิธีนี้จะนำช่องที่พบจากตัวรับสัญญาณทีวีออกและสแกนหาช่องใหม่อีกครั้ง\n\nโปรดตรวจสอบว่าทีวีของคุณเชื่อมต่อกับแหล่งสัญญาณทีวีแล้ว\n\nหากใช้เสาอากาศแบบผ่านอากาศ คุณอาจต้องปรับตำแหน่งและทิศทางเพื่อรับช่องให้ได้มากที่สุด เพื่อผลลัพธ์ที่ดีที่สุด ให้วางไว้บนที่สูงใกล้หน้าต่าง"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"วิธีนี้จะนำช่องที่พบจากตัวรับสัญญาณแบบ USB ออกและสแกนหาช่องใหม่อีกครั้ง\n\nโปรดตรวจสอบว่าได้เสียบปลั๊กตัวรับสัญญาณแบบ USB และเชื่อมต่อกับแหล่งสัญญาณทีวีแล้ว\n\nหากใช้เสาอากาศแบบผ่านอากาศ คุณอาจต้องปรับตำแหน่งหรือทิศทางเพื่อรับช่องให้ได้มากที่สุด เพื่อผลลัพธ์ที่ดีที่สุด ให้วางไว้บนที่สูงใกล้หน้าต่าง"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"การดำเนินการนี้จะนำช่องที่พบจากตัวรับสัญญาณเครือข่ายออกแล้วสแกนหาช่องใหม่อีกครั้ง\n\nโปรดตรวจสอบว่าตัวรับสัญญาณเครือข่ายเปิดอยู่และเชื่อมต่อกับแหล่งสัญญาณทีวีแล้ว\n\nหากใช้เสาอากาศแบบผ่านอากาศ (OTA) คุณอาจต้องปรับตำแหน่งหรือทิศทางเพื่อรับช่องให้ได้มากที่สุด เพื่อผลลัพธ์ที่ดีที่สุด ให้วางไว้บนที่สูงใกล้หน้าต่าง"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"ต่อไป"</item>
<item msgid="235450158666155406">"ยกเลิก"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"ตั้งค่าตัวรับสัญญาณทีวี"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"ตั้งค่าตัวรับสัญญาณช่องแบบ USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"ตั้งค่าตัวรับสัญญาณช่องเครือข่าย"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"อาจใช้เวลาหลายนาที"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ตัวรับสัญญาณไม่สามารถใช้ได้ชั่วคราว หรือถูกใช้ในการบันทึกแล้ว"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"ไม่พบช่อง"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"สแกนไม่พบช่องใดเลย โปรดตรวจสอบว่าทีวีของคุณเชื่อมต่อกับแหล่งสัญญาณทีวีแล้ว\n\nหากคุณใช้เสาอากาศแบบผ่านอากาศ ให้ปรับตำแหน่งและทิศทาง เพื่อผลลัพธ์ที่ดีที่สุด ให้วางไว้บนที่สูงใกล้หน้าต่างแล้วสแกนอีกครั้ง"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"สแกนไม่พบช่องใดเลย โปรดตรวจสอบว่าได้เสียบปลั๊กตัวรับสัญญาณแบบ USB และเชื่อมต่อกับแหล่งสัญญาณทีวีแล้ว\n\nหากคุณใช้เสาอากาศแบบผ่านอากาศ ให้ปรับตำแหน่งหรือทิศทาง เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ให้วางไว้บนที่สูงใกล้หน้าต่างแล้วสแกนอีกครั้ง"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"สแกนไม่พบช่องใดเลย โปรดตรวจสอบว่าตัวรับสัญญาณเครือข่ายเปิดอยู่และเชื่อมต่อกับแหล่งสัญญาณทีวีแล้ว\n\nหากใช้เสาอากาศแบบผ่านอากาศ (OTA) ให้ปรับตำแหน่งหรือทิศทาง เพื่อผลลัพธ์ที่ดีที่สุด ให้วางไว้บนที่สูงใกล้หน้าต่างแล้วสแกนอีกครั้ง"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"สแกนอีกครั้ง"</item>
<item msgid="2092797862490235174">"เสร็จสิ้น"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"สแกนหาช่องทีวี"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"ตั้งค่าตัวรับสัญญาณทีวี"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"ตั้งค่าตัวรับสัญญาณทีวีแบบ USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"ตั้งค่าตัวรับสัญญาณทีวีเครือข่าย"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"ยกเลิกการเชื่อมต่อตัวรับสัญญาณทีวีผ่าน USB แล้ว"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"ยกเลิกการเชื่อมต่อตัวรับสัญญาณเครือข่ายแล้ว"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"ยกเลิกการเชื่อมต่อตัวรับสัญญาณทีวีผ่าน USB แล้ว"</string>
</resources>
diff --git a/usbtuner-res/values-tl/strings.xml b/usbtuner-res/values-tl/strings.xml
index 83550b1a..7a0ce826 100644
--- a/usbtuner-res/values-tl/strings.xml
+++ b/usbtuner-res/values-tl/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV Tuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV Tuner"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Network TV Tuner (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"I-on"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"I-off"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Mangyaring maghintay na matapos ang pagpoproseso"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Piliin ang pinagmulan ng iyong channel"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Walang Signal"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Hindi na-tune sa <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Hindi na-tune"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Na-update kamakailan ang software ng tuner. Paki-scan muli ang mga channel."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"I-enable ang surround sound sa mga setting ng tunog ng system upang ma-enable ang audio"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Hindi ma-play ang audio. Mangyaring sumubok ng ibang TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Setup ng channel tuner"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Setup ng TV Tuner"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Setup ng USB channel tuner"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Pag-set up ng network tuner"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"I-verify na nakakonekta ang iyong TV sa isang TV signal source.\n\nKung gumagamit ng over-the-air antenna, maaaring kailanganin mong ayusin ang pagkakalagay o direksyon nito upang makuha ang pinakamaraming channel. Para sa mga pinakamainam na resulta, ilagay ito sa mataas na lugar at malapit sa isang bintana."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"I-verify na nakasaksak at nakakonekta ang USB tuner sa isang TV source signal.\n\nKung gumagamit ka ng isang over-the-air antenna, maaaring kailanganin mong ayusin ang pagkakalagay o direksyon nito upang makuha ang pinakamaraming channel. Para sa mga pinakamainam na resulta, ilagay ito sa isang mataas na lugar at malapit sa isang bintana."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"I-verify na naka-on ang network tuner at nakakonekta sa isang pinagmumulan ng TV signal.\n\nKung gumagamit ng over-the-air na antenna, maaaring kailanganin mong ayusin ang pagkakalagay o direksyon nito upang masagap ang karamihan ng mga channel. Para sa mga pinakamainam na resulta, ilagay ito sa mataas na lugar at malapit sa bintana."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Magpatuloy"</item>
<item msgid="727245208787621142">"Hindi ngayon"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Gusto mo bang muling patakbuhin ang pag-set up ng channel?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Aalisin nito ang mga nakitang channel mula sa TV tuner at mag-scan muli para sa mga bagong channel.\n\nI-verify na nakakonekta ang iyong TV sa isang TV signal source.\n\nKung gumagamit ka ng over-the-air antenna, maaaring kailanganin mong ayusin ang pagkakalagay o direksyon nito upang makuha ang pinakamaraming channel. Para sa mga pinakamainam na resulta, ilagay ito sa mataas na lugar at malapit sa isang bintana."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Aalisin nito ang mga channel na nahanap mula sa USB tuner at mag-scan muli para sa mga bagong channel.\n\nI-verify na nakasaksak at nakakonekta ang USB tuner sa isang TV source signal.\n\nKung gumagamit ng over-the-air antenna, maaaring kailanganin mong ayusin ang pagkakalagay o direksyon nito upang makuha ang pinakamaraming channel. Para sa mga pinakamainam na resulta, ilagay ito sa isang mataas na lugar at malapit sa isang bintana."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Aalisin nito ang mga nahanap na channel sa network tuner at muling magsa-scan ng mga bagong channel.\n\nI-verify na naka-on ang network tuner at nakakonekta sa isang pinagmumulan ng TV signal.\n\nKung gumagamit ng over-the-air na antenna, maaaring kailanganin mong ayusin ang pagkakalagay o direksyon nito upang masagap ang karamihan ng mga channel. Para sa mga pinakamainam na resulta, ilagay ito sa mataas na lugar at malapit sa bintana."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Magpatuloy"</item>
<item msgid="235450158666155406">"Kanselahin"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Setup ng TV tuner"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Setup ng USB channel tuner"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Pag-set up ng network channel tuner"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Maaari itong tumagal ng ilang minuto"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Pansamantalang hindi available ang Tuner o ginagamit na ito ng recording."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Walang nakitang Mga Channel"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Hindi nakahanap ng anumang mga channel ang pag-scan. I-verify na nakakonekta ang iyong TV sa isang TV signal source.\n\nKung gumagamit ka ng over-the-air antenna, ayusin ang pagkakalagay o direksyon nito. Para sa mga pinakamainam na resulta, ilagay ito sa mataas na lugar malapit sa isang bintana at mag-scan muli."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Walang nahanap na anumang mga channel noong nag-scan. I-verify na nakasaksak at nakakonekta ang USB tuner sa isang TV signal source.\n\nKung gumagamit ka ng over-the-air antenna, ayusin ang pagkakalagay o direksyon nito. Para sa mga pinakamainam na resulta, ilagay ito sa isang mataas na lugar at malapit sa isang bintana mag-scan muli."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Walang nahanap na channel sa pag-scan. I-verify na naka-on ang network tuner at nakakonekta sa isang pinagmumulan ng TV signal.\n\nKung gumagamit ng over-the-air na antenna, ayusin ang pagkakalagay o direksyon nito. Para sa mga pinakamainam na resulta, ilagay ito sa mataas na lugar at malapit sa bintana at muling mag-scan."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Muling mag-scan"</item>
<item msgid="2092797862490235174">"Tapos Na"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Mag-scan ng mga channel sa TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Setup ng TV Tuner"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Setup ng USB TV Tuner"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Pag-set up ng Network TV Tuner"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Nadiskonekta ang USB TV tuner."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Nadiskonekta ang network tuner."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Nadiskonekta ang USB TV tuner."</string>
</resources>
diff --git a/usbtuner-res/values-tr/strings.xml b/usbtuner-res/values-tr/strings.xml
index 198d72ae..29910f9e 100644
--- a/usbtuner-res/values-tr/strings.xml
+++ b/usbtuner-res/values-tr/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV Kanal Ayarlayıcı"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV Kanal Ayarlayıcı"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Ağ TV Kanal Ayarlayıcı (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Açık"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Kapalı"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Lütfen işlemin tamamlanmasını bekleyin"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Kanal kaynağınızı seçin"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Sinyal Yok"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> adlı kanala ayarlanamadı"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Kanal ayarlanamadı"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Kanal ayarlayıcı yazılımı yakın zamanda güncellendi. Lütfen kanalları yeniden tarayın."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Sesi etkinleştirmek için sistemin ses ayarlarında surround sesi etkinleştirin"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Ses çalınamıyor. Lütfen başka bir TV deneyin"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Kanal ayarlayıcı kurulumu"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV Kanal Ayarlayıcı kurulumu"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB kanal ayarlayıcı kurulumu"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Ağ kanal ayarlayıcı kurulumu"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"TV\'nizin bir TV sinyal kaynağına bağlı olduğunu doğrulayın.\n\nHavadan yayın alan bir anten kullanıyorsanız en çok sayıda kanalı almak için antenin yerini veya yönünü ayarlamanız gerekebilir. En iyi sonucu elde etmek için anteni yüksek ve pencereye yakın bir yere yerleştirin."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB kanal ayarlayıcının takılı olduğunu ve bir TV sinyali kaynağına bağlandığını doğrulayın.\n\nHavadan yayın alan bir anten kullanıyorsanız en çok sayıda kanalı almak için antenin yerini veya yönünü ayarlamanız gerekebilir. En iyi sonucu elde etmek için anteni yüksek ve pencereye yakın bir yere yerleştirin."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Ağ kanal ayarlayıcının açık olduğunu ve TV sinyali alabileceği bir kaynağa bağlandığını doğrulayın.\n\nHavadan gelen yayını alacak bir anten kullanıyorsanız en fazla sayıda kanalı almak için antenin yerini veya yönünü ayarlamanız gerekebilir. En iyi sonuçları elde etmek için anteni yüksek ve pencereye yakın bir yere yerleştirin."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Devam"</item>
<item msgid="727245208787621142">"Şimdi değil"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Kanal kurulumu yeniden çalıştırılsın mı?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Bu işlem, TV kanal ayarlayıcının bulduğu kanalları kaldıracak ve tekrar yeni kanallar arayacak.\n\nTV\'nizin bir TV sinyal kaynağına bağlı olduğunu doğrulayın.\n\nHavadan yayın alan bir anten kullanıyorsanız en çok sayıda kanalı almak için antenin yerini veya yönünü ayarlamanız gerekebilir. En iyi sonucu elde etmek için anteni yüksek ve pencereye yakın bir yere yerleştirin."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Bu işlem, USB kanal ayarlayıcıdan bulunan kanalları kaldıracak ve yeni kanallar için tekrar tarama yapacaktır.\n\nUSB kanal ayarlayıcının takılı olduğunu ve bir TV sinyali kaynağına bağlandığını doğrulayın.\n\nHavadan yayın alan bir anten kullanıyorsanız en çok sayıda kanalı almak için antenin yerini veya yönünü ayarlamanız gerekebilir. En iyi sonucu elde etmek için anteni yüksek ve pencereye yakın bir yere yerleştirin."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Bu işlem, bulunan kanalları ağ kanal ayarlayıcıdan kaldıracak ve yeni kanalların bulunması için tekrar tarama yapacak.\n\nAğ kanal ayarlayıcının açık olduğunu ve TV sinyali alabileceği bir kaynağa bağlandığını doğrulayın.\n\nHavadan gelen yayını alacak bir anten kullanıyorsanız en fazla sayıda kanalı almak için antenin yerini veya yönünü ayarlamanız gerekebilir. En iyi sonucu elde etmek için anteni yüksek ve pencereye yakın bir yere yerleştirin."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Devam"</item>
<item msgid="235450158666155406">"İptal"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV kanal ayarlayıcı kurulumu"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB kanal ayarlayıcı kurulumu"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Ağ kanal ayarlayıcı kurulumu"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Bu işlem birkaç dakika sürebilir"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Kanal ayarlayıcı geçici olarak kullanılamıyor veya şu anda kayıt yapmak için kullanılıyor."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Hiçbir kanal bulunamadı"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Tarama işleminde hiçbir kanal bulunamadı. TV\'nizin bir TV sinyal kaynağına bağlı olduğunu doğrulayın.\n\nHavadan yayın alan bir anten kullanıyorsanız yerini veya yönünü ayarlayın. En iyi sonucu elde etmek için anteni yüksek ve pencereye yakın bir yere yerleştirerek tekrar tarayın."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Tarama işlemi herhangi bir kanal bulamadı. USB kanal ayarlayıcının takılı olduğunu ve bir TV sinyali kaynağına bağlandığını doğrulayın.\n\nHavadan yayın alan bir anten kullanıyorsanız yerini veya yönünü ayarlayın. En iyi sonucu elde etmek için anteni yüksek ve pencereye yakın bir yere yerleştirerek tekrar tarayın."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Taramada herhangi bir kanal bulunamadı. Ağ kanal ayarlayıcının açık olduğunu ve TV sinyali alabileceği bir kaynağa bağlandığını doğrulayın.\n\nHavadan gelen yayınları alacak bir anten kullanıyorsanız antenin yerini veya yönünü ayarlayın. En iyi sonucu elde etmek için anteni yüksek ve pencereye yakın bir yere yerleştirin."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Yeniden tara"</item>
<item msgid="2092797862490235174">"Bitti"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"TV kanallarını tarayın"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV Kanal Ayarlayıcı kurulumu"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV Kanal Ayarlayıcı kurulumu"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Ağ TV Kanal Ayarlayıcı kurulumu"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB TV kanal ayarlayıcı bağlantısı kesildi."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Ağ kanal ayarlayıcı bağlantısı kesildi."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB TV kanal ayarlayıcı bağlantısı kesildi."</string>
</resources>
diff --git a/usbtuner-res/values-uk/strings.xml b/usbtuner-res/values-uk/strings.xml
index 06076825..cf7cc85e 100644
--- a/usbtuner-res/values-uk/strings.xml
+++ b/usbtuner-res/values-uk/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"ТВ-тюнер"</string>
<string name="ut_app_name" msgid="8557698013780762454">"ТВ-тюнер USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Мережевий ТВ-тюнер (БЕТА-ВЕРСІЯ)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Увімкнути"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Вимкнути"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Зачекайте, доки завершиться пошук"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Виберіть джерело каналу"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Немає сигналу"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Не вдалося налаштувати канал <xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Не вдалося налаштувати"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Програмне забезпечення тюнера нещодавно оновлено. Проскануйте канали знову."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Увімкнути об’ємний звук у налаштуваннях системи, щоб слухати аудіо"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Не вдається відтворити відео. Спробуйте на іншому телевізорі"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Налаштування тюнера"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Налаштування ТВ-тюнера"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Налаштування USB-тюнера"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Налаштування мережевого тюнера"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Переконайтеся, що ви під’єднали телевізор до джерела вхідного телевізійного сигналу.\n\nЯкщо ви користуєтесь ефірною антеною, змініть її положення,щоб знайти більше каналів. Розмістіть антену вище та біля вікна."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Переконайтеся, що ви підключили USB-тюнер і під’єднали джерело вхідного телевізійного сигналу.\n\nЯкщо ви користуєтесь ефірною антеною, змініть її положення, щоб знайти більше каналів. Розмістіть антену вище та біля вікна."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Переконайтеся, що мережевий тюнер увімкнено та під’єднано до джерела телевізійного сигналу.\n\nЯкщо у вас ефірна антена, змініть її положення. Розмістіть антену вище та біля вікна й повторіть спробу."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Продовжити"</item>
<item msgid="727245208787621142">"Не зараз"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Відновити налаштування каналу?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Канали, знайдені за допомогою ТВ-тюнера, буде видалено. Пошук почнеться знову.\n\nПереконайтеся, що ви під’єднали телевізор до джерела вхідного телевізійного сигналу.\n\nЯкщо ви користуєтесь ефірною антеною, змініть її положення, щоб знайти більше каналів. Розмістіть антену вище та біля вікна й повторіть спробу."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Канали, знайдені за допомогою USB-тюнера, буде видалено. Пошук почнеться знову.\n\nПереконайтеся, що ви підключили USB-тюнер і під’єднали джерело вхідного телевізійного сигналу.\n\nЯкщо ви користуєтесь ефірною антеною, змініть її положення, щоб знайти більше каналів. Розмістіть антену вище та біля вікна."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Канали, знайдені мережевим тюнером, буде видалено. Пошук почнеться знову.\n\nПереконайтеся, що мережевий тюнер увімкнено та під’єднано до джерела телевізійного сигналу.\n\nЯкщо у вас ефірна антена, змініть її положення. Розмістіть антену вище та біля вікна й повторіть спробу."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Продовжити"</item>
<item msgid="235450158666155406">"Скасувати"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Налаштування ТВ-тюнера"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Налаштування USB-тюнера"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Налаштування мережевого тюнера"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Це може зайняти декілька хвилин"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Тюнер тимчасово недоступний або вже використовується для запису."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -82,7 +82,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Канали не знайдено"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Канали не знайдено. Переконайтеся, що ви під’єднали телевізор до джерела вхідного телевізійного сигналу.\n\nЯкщо ви користуєтесь ефірною антеною, змініть її положення. Розмістіть антену вище та біля вікна й повторіть спробу."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Канали не знайдено. Переконайтеся, що ви підключили USB-тюнер і під’єднали джерело вхідного телевізійного сигналу.\n\nЯкщо ви користуєтесь ефірною антеною, змініть її положення. Розмістіть антену вище та біля вікна й повторіть спробу."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Каналів не знайдено. Переконайтеся, що мережевий тюнер увімкнено та під’єднано до джерела телевізійного сигналу.\n\nЯкщо у вас ефірна антена, змініть її положення. Розмістіть антену вище та біля вікна й повторіть спробу."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Шукати знову"</item>
<item msgid="2092797862490235174">"Готово"</item>
@@ -90,7 +89,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Пошук телевізійних каналів"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Налаштування ТВ-тюнера"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Налаштування ТВ-тюнера USB"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Налаштування мережевого ТВ-тюнера"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"ТВ-тюнер USB від’єднано."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Мережевий тюнер від’єднано."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"ТВ-тюнер USB від’єднано."</string>
</resources>
diff --git a/usbtuner-res/values-ur-rPK/strings.xml b/usbtuner-res/values-ur/strings.xml
index 0debaa53..68c85d05 100644
--- a/usbtuner-res/values-ur-rPK/strings.xml
+++ b/usbtuner-res/values-ur/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"‏TV ٹیونر"</string>
<string name="ut_app_name" msgid="8557698013780762454">"‏USB TV ٹیونر"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"‏نیٹ ورک TV ٹیونر (بی ٹا)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"آن"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"آف"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"براہ کرم کارروائی ختم ہونے کا انتظار کریں"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"اپنے چینل کا ماخذ منتخب کریں"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"کوئی سگنل نہیں ہے"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"<xliff:g id="CHANNEL_NAME">%s</xliff:g> پر ٹیون ہونے میں ناکام ہوگیا"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"ٹیون کرنے میں ناکام ہو گیا"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"ٹیونر سافٹ ویئر حال ہی میں اپ ڈیٹ کیا گیا ہے۔ براہ کرم چینلز کو دوبارہ اسکین کریں۔"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"آڈیو کو فعال کرنے کیلئے سسٹم کی آواز کی ترتیبات میں محیط آواز فعال کریں"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"آڈیو نہیں چل رہی۔ براہ کرم کوئی اور ٹی وی آزمائیں"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"چینل ٹیونر سیٹ اپ"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"‏TV ٹیونر سیٹ اپ"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"‏USB چینل ٹیونر سیٹ اپ"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"نیٹ ورک ٹیونر سیٹ اپ"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"‏اپنے TV کے کسی TV سگنل ماخذ سے منسلک ہونے کی توثیق کریں۔\n\nاگر وائرلیس نیٹ ورک کنکشن انٹینا استعمال کر رہے ہیں تو زیادہ تر چینلز موصول کرنے کیلئے آپ کو اس کا مقام یا سمت ایڈجسٹ کرنے کی ضرورت پیش آ سکتی ہے۔ بہترین نتائج کیلئے اسے اونچی جگہ اور کھڑکی کے پاس رکھیں۔"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"‏USB ٹیونر کے پلگ ان ہونے اور TV سگنل ماخذ سے منسلک ہونے کی توثیق کریں۔\n\nاگر وائرلیس نیٹ ورک کنکشن انٹینا استعمال کر رہے ہیں تو زیادہ تر چینلز موصول کرنے کیلئے آپ کو اس کا مقام یا سمت ایڈجسٹ کرنے کی ضرورت پیش آ سکتی ہے۔ بہترین نتائج کیلئے اسے اونچی جگہ اور کھڑکی کے پاس رکھیں۔"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"‏نیٹ ورک ٹیونر کے آن ہونے اور TV سگنل ماخذ سے منسلک ہونے کی توثیق کریں۔\n\nاگر وائرلیس نیٹ ورک کنکشن انٹینا استعمال کر رہے ہیں تو زیادہ تر چینلز موصول کرنے کیلئے آپ کو اس کا مقام یا سمت ایڈجسٹ کرنے کی ضرورت پیش آ سکتی ہے۔ بہترین نتائج کیلئے اسے اونچی جگہ اور کھڑکی کے پاس رکھیں۔"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"جاری رکھیں"</item>
<item msgid="727245208787621142">"ابھی نہیں"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"چینل سیٹ اپ دوبارہ چلائیں؟"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"‏یہ TV ٹیونر سے ملے چینلز ہٹا دے گا اور دوبارہ نئے چینلز کیلئے اسکین کرے گا۔\n\nاپنے TV کے کسی سگنل ماخذ سے منسلک ہونے کی توثیق کریں۔\n\nاگر وائرلیس نیٹ ورک کنکشن انٹینا استعمال کر رہے ہیں تو زیادہ تر چینلز موصول کرنے کیلئے آپ کو اس کا مقام یا سمت ایڈجسٹ کرنے کی ضرورت پیش آ سکتی ہے۔ بہترین نتائج کیلئے اسے اونچی جگہ اور کھڑکی کے پاس رکھیں۔"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"‏یہ USB ٹیونر سے ملے چینلز ہٹا دے گا اور دوبارہ نئے چینلز کیلئے اسکین کرے گا۔\n\nTV ٹیونر کے پلگ ان ہونے اور سگنل ماخذ سے منسلک ہونے کی توثیق کریں۔\n\nاگر وائرلیس نیٹ ورک کنکشن انٹینا استعمال کر رہے ہیں تو زیادہ تر چینلز موصول کرنے کیلئے آپ کو اس کا مقام یا سمت ایڈجسٹ کرنے کی ضرورت پیش آ سکتی ہے۔ بہترین نتائج کیلئے اسے اونچی جگہ اور کھڑکی کے پاس رکھیں۔"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"‏یہ نیٹ ورک ٹیونر سے ملنے والے چیلنز ہٹا دے گا اور دوبارہ نئے چینلز کیلئے اسکین کرے گا۔\n\nTV ٹیونر کے آن ہونے اور سگنل ماخذ سے منسلک ہونے کی توثیق کریں۔\n\nاگر وائرلیس نیٹ ورک کنکشن انٹینا استعمال کر رہے ہیں، تو زیادہ تر چینلز موصول کرنے کیلئے آپ کو اس کی مقام بندی یا سمت ایڈجسٹ کرنے کی ضرورت پیش آ سکتی ہے۔ بہترین نتائج کیلئے اسے اونچی جگہ اور کھڑکی کے پاس رکھیں۔"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"جاری رکھیں"</item>
<item msgid="235450158666155406">"منسوخ کریں"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"‏TV ٹیونر سیٹ اپ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"‏USB چینل ٹیونر سیٹ اپ"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"نیٹ ورک چینل ٹیونر سیٹ اپ"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"اس میں کئی منٹ لگ سکتے ہیں"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"ٹیونر عارضی طور پر غیر دستیاب ہے یا پہلے سے ریکارڈنگ کی وجہ سے استعمال ہو گیا ہے۔"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"کوئی چینلز نہیں ملے"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"‏اسکین سے کوئی چینلز نہیں ملے۔ اپنے TV کے ایک TV سگنل ماخذ سے منسلک ہونے کی توثیق کریں۔\n\nاگر وائرلیس نیٹ ورک کنکشن انٹینا استعمال کر رہے ہیں تو اس کا مقام یا سمت ایڈجسٹ کریں۔ بہترین نتائج کیلئے اسے اونچی جگہ اور کھڑکی کے پاس رکھیں اور دوبارہ اسکین کریں۔"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"‏اسکین سے کوئی چینلز نہیں ملے۔ USB ٹیونر کے پلگ ان ہونے اور TV سگنل ماخذ سے منسلک ہونے کی توثیق کریں۔\n\nاگر وائرلیس نیٹ ورک کنکشن انٹینا استعمال کر رہے ہیں تو اس کا مقام یا سمت ایڈجسٹ کریں۔ بہترین نتائج کیلئے اسے اونچی جگہ اور کھڑکی کے پاس رکھیں اور دوبارہ اسکین کریں۔"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"‏اسکین سے کوئی چینلز نہیں ملے۔ توثیق کریں کہ نیٹ ورک ٹیونر آن ہے اور TV سگنل ماخذ سے منسلک ہے۔\n\nاگر وائرلیس نیٹ ورک کنکشن انٹینا استعمال کر رہے ہیں، تو اس کا مقام یا سمت ایڈجسٹ کریں۔ بہترین نتائج کیلئے، اسے اونچی جگہ اور کھڑکی کے قریب رکھیں اور دوبارہ اسکین کریں۔"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"دوبارہ اسکین کریں"</item>
<item msgid="2092797862490235174">"ہو گیا"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"‏TV چینلز کے لیے اسکین کریں"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"‏TV ٹیونر سیٹ اپ"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"‏USB TV ٹیونر سیٹ اپ"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"‏نیٹ ورک TV ٹیونر سیٹ اپ"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"‏USB TV ٹیونر غیر منسلک ہے۔"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"نیٹ ورک ٹیونر غیر منسلک ہے۔"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"‏USB TV ٹیونر غیر منسلک ہے۔"</string>
</resources>
diff --git a/usbtuner-res/values-uz-rUZ/strings.xml b/usbtuner-res/values-uz/strings.xml
index 97bd97b6..9aefd57b 100644
--- a/usbtuner-res/values-uz-rUZ/strings.xml
+++ b/usbtuner-res/values-uz/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"TV-tyuner"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB TV-tyuner"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Tarmoq TV-tyuneri (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Yoqish"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"O‘chirib qo‘yish"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Iltimos, jarayon tugashini kuting"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Kanal manbasini tanlang"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Signal yo‘q"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"“<xliff:g id="CHANNEL_NAME">%s</xliff:g>” kanaliga sozlab bo‘lmadi"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Sozlab bo‘lmadi"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Tyunerning dasturiy ta’minoti yaqinda yangilandi. Kanallarni qaytadan qidiring."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Audioni yoqish uchun tizim ovozi sozlamalari orqali qamrovli ovozni yoqing"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Audioni ijro ettirib bo‘lmadi. Boshqa kanalni sinab ko‘ring."</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Tyunerni sozlash"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"TV-tyunerni sozlash"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB-tyunerni sozlash"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Tarmoq tyunerini sozlash"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Televizor signali manbasiga ulangan ekanligini tekshiring.\n\nAgar havo orqali to‘lqin tutuvchi antennadan foydalanayotgan bo‘lsangiz, ko‘proq kanal topilishi uchun uning joyi va yo‘nalishini sozlang. Eng yaxshi natijaga erishish uchun uni yuqoriroq va oynaga yaqin joyga o‘rnating."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"USB-tyuner suqilgan hamda televizor signali manbasiga ulangan ekanligini tekshiring.\n\nAgar havo orqali to‘lqin tutuvchi antennadan foydalanayotgan bo‘lsangiz, ko‘proq kanal topilishi uchun uning joyi va yo‘nalishini sozlang. Eng yaxshi natijaga erishish uchun uni yuqoriroq va oynaga yaqin joyga o‘rnating."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Tarmoq tyuneri yoqilgan hamda televizor signali manbasiga ulangan ekanligini tekshiring.\n\nAgar havo orqali to‘lqin tutuvchi antennadan foydalanayotgan bo‘lsangiz, ko‘proq kanal topilishi uchun uning joyi va yo‘nalishini sozlang. Eng yaxshi natijaga erishish uchun uni yuqoriroq va oynaga yaqin joyga o‘rnating."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Davom etish"</item>
<item msgid="727245208787621142">"Hozir emas"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Kanallar qaytadan sozlansinmi?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Buning natijasida TV-tyuner orqali topilgan kanallar o‘chirib tashlanadi va kanallar boshqatdan qidiriladi.\n\nTelevizor signal manbasiga ulangan ekanligini tekshiring.\n\nAgar havo orqali to‘lqin tutuvchi antennadan foydalanayotgan bo‘lsangiz, uning joyi va yo‘nalishini sozlang. Eng yaxshi natijaga erishish uchun uni yuqoriroq va oynaga yaqin joyga o‘rnating hamda qaytadan qidiring."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Buning natijasida USB-tyuner orqali topilgan kanallar o‘chirib tashlanadi va kanallar boshqatdan qidiriladi.\n\nUSB-tyuner suqilgan hamda televizor signali manbasiga ulangan ekanligini tekshiring.\n\nAgar havo orqali to‘lqin tutuvchi antennadan foydalanayotgan bo‘lsangiz, uning joyi va yo‘nalishini sozlang. Eng yaxshi natijaga erishish uchun uni yuqoriroq va oynaga yaqin joyga o‘rnating hamda qaytadan qidiring."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Buning natijasida tarmoq tyuneri orqali topilgan kanallar o‘chirib tashlanadi va kanallar boshqatdan qidiriladi.\n\nTarmoq tyuneri yoqilgan hamda televizor signali manbasiga ulangan ekanligini tekshiring.\n\nAgar havo orqali to‘lqin tutuvchi antennadan foydalanayotgan bo‘lsangiz, uning joyi va yo‘nalishini sozlang. Eng yaxshi natijaga erishish uchun uni yuqoriroq va oynaga yaqin joyga o‘rnating hamda qaytadan qidiring."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Davom etish"</item>
<item msgid="235450158666155406">"Bekor qilish"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"TV-tyunerni sozlash"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB-tyunerni sozlash"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Tarmoq tyuneri kanallarini sozlash"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Bu bir necha daqiqa vaqt olishi mumkin"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Tyunerdan vaqtinchalik foydalanib bo‘lmaydi yoki allaqachon yozib olishda foydalanilmoqda."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Hech qanday kanal topilmadi"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Qidiruv natijasida hech qanday kanal topilmadi. Televizor signal manbasiga ulangan ekanligini tekshiring.\n\nAgar havo orqali to‘lqin tutuvchi antennadan foydalanayotgan bo‘lsangiz, uning joyi va yo‘nalishini sozlang. Eng yaxshi natijaga erishish uchun uni yuqoriroq va oynaga yaqin joyga o‘rnating hamda qaytadan qidiring."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Qidiruv natijasida hech qanday kanal topilmadi. USB-tyuner suqilgan hamda televizor signali manbasiga ulangan ekanligini tekshiring.\n\nAgar havo orqali to‘lqin tutuvchi antennadan foydalanayotgan bo‘lsangiz, uning joyi va yo‘nalishini sozlang. Eng yaxshi natijaga erishish uchun uni yuqoriroq va oynaga yaqin joyga o‘rnating hamda qaytadan qidiring."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Qidiruv natijasida hech qanday kanal topilmadi. Tarmoq tyuneri yoqilgan hamda televizor signali manbasiga ulangan ekanligini tekshiring.\n\nAgar havo orqali to‘lqin tutuvchi antennadan foydalanayotgan bo‘lsangiz, uning joyi va yo‘nalishini sozlang. Eng yaxshi natijaga erishish uchun uni yuqoriroq va oynaga yaqin joyga o‘rnating hamda qaytadan qidiring."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Yana qidirish"</item>
<item msgid="2092797862490235174">"Tayyor"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Telekanallarni qidiring"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"TV-tyunerni sozlash"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB TV-tyunerni sozlang"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Tarmoq TV-tyunerini sozlash"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB-tyuner o‘chirib qo‘yildi."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Tarmoq tyuneri uzib qo‘yildi."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB-tyuner o‘chirib qo‘yildi."</string>
</resources>
diff --git a/usbtuner-res/values-vi/strings.xml b/usbtuner-res/values-vi/strings.xml
index 838ae769..605234e4 100644
--- a/usbtuner-res/values-vi/strings.xml
+++ b/usbtuner-res/values-vi/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Bộ dò TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Bộ dò TV USB"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Bộ dò TV mạng (BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Bật"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Tắt"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Vui lòng đợi để hoàn tất xử lý"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Chọn nguồn kênh của bạn"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Không có tín hiệu"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Dò tới <xliff:g id="CHANNEL_NAME">%s</xliff:g> không thành công"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Dò không thành công"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Phần mềm bộ dò đã được cập nhật gần đây. Vui lòng quét lại các kênh."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Bật tính năng âm thanh vòm trong cài đặt âm thanh hệ thống để bật âm thanh"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Không thể phát âm thanh. Vui lòng thử TV khác"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Thiết lập bộ dò kênh"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Thiết lập bộ dò TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Thiết lập bộ dò kênh USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Thiết lập bộ dò mạng"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Hãy xác minh rằng TV của bạn đã được kết nối với nguồn tín hiệu TV.\n\nNếu sử dụng ăng-ten không dây thì bạn có thể cần phải điều chỉnh vị trí hoặc hướng của ăng-ten đó để nhận nhiều kênh nhất. Để có kết quả tốt nhất, hãy đặt ăng-ten lên cao và gần cửa sổ."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Xác minh rằng bộ dò USB đã được cắm và được kết nối với nguồn tín hiệu TV.\n\nNếu sử dụng ăng-ten không dây, có thể bạn cần phải điều chỉnh vị trí hoặc hướng của ăng-ten đó để nhận được nhiều kênh nhất. Để có kết quả tốt nhất, hãy đặt ăng-ten lên cao và gần cửa sổ."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Hãy xác minh là bộ dò mạng đã được bật nguồn và kết nối với một nguồn tín hiệu TV.\n\nNếu sử dụng ăng-ten không dây, hãy điều chỉnh vị trí hoặc hướng của ăng-ten để nhận hầu hết kênh. Để có kết quả tốt nhất, hãy đặt ăng-ten ở vị trí cao và gần cửa sổ."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Tiếp tục"</item>
<item msgid="727245208787621142">"Không phải bây giờ"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Chạy lại quá trình thiết lập kênh?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Điều này sẽ xóa các kênh được tìm thấy khỏi bộ dò TV và quét các kênh mới lần nữa.\n\nHãy xác minh rằng TV của bạn đã được kết nối với nguồn tín hiệu TV.\n\nNếu sử dụng ăng-ten không dây thì bạn có thể cần phải điều chỉnh vị trí hoặc hướng của ăng-ten đó để nhận nhiều kênh nhất. Để có kết quả tốt nhất, hãy đặt ăng-ten lên cao và gần cửa sổ."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Quá trình này sẽ xóa các kênh bộ dò USB đã tìm thấy và quét lại để tìm các kênh mới.\n\nHãy xác minh rằng bộ dò USB đã được cắm và kết nối với nguồn tín hiệu TV.\n\nNếu sử dụng ăng-ten không dây, bạn có thể cần phải điều chỉnh vị trí hoặc hướng của ăng-ten đó để nhận được nhiều kênh nhất. Để có kết quả tốt nhất, hãy đặt ăng-ten lên cao và gần cửa sổ."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Điều này sẽ xóa các kênh được tìm thấy từ bộ dò mạng và quét các kênh mới một lần nữa.\n\nHãy xác minh là bộ dò mạng đã được bật nguồn và kết nối với một nguồn tín hiệu TV.\n\nNếu sử dụng ăng-ten không dây, hãy điều chỉnh vị trí hoặc hướng của ăng-ten để nhận hầu hết kênh. Để có kết quả tốt nhất, hãy đặt ăng-ten ở vị trí cao và gần cửa sổ."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Tiếp tục"</item>
<item msgid="235450158666155406">"Hủy"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Thiết lập bộ dò TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Thiết lập bộ dò kênh USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Thiết lập bộ do kênh mạng"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Quá trình này có thể mất vài phút"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Bộ dò tạm thời không có sẵn hoặc đã được sử dụng để ghi."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Không tìm thấy kênh nào"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Quá trình quét không tìm thấy bất kỳ kênh nào. Hãy xác minh rằng TV của bạn đã được kết nối với nguồn tín hiệu TV.\n\nNếu sử dụng ăng-ten không dây, hãy điều chỉnh vị trí hoặc hướng của ăng-ten đó. Để có kết quả tốt nhất, hãy đặt ăng-ten lên cao và gần cửa sổ rồi quét lại."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Quá trình quét không tìm thấy bất kỳ kênh nào. Hãy xác minh rằng bộ dò USB đã được cắm và kết nối với nguồn tín hiệu TV.\n\nNếu sử dụng ăng-ten không dây, hãy điều chỉnh vị trí hoặc hướng của ăng-ten đó. Để có kết quả tốt nhất, hãy đặt ăng-ten lên cao và gần cửa sổ rồi quét lại."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Quá trình quét không tìm thấy bất kỳ kênh nào. Hãy xác minh là bộ dò mạng đã được bật nguồn và kết nối với một nguồn tín hiệu TV.\n\nNếu sử dụng ăng-ten không dây, hãy điều chỉnh vị trí hoặc hướng của ăng-ten. Để có kết quả tốt nhất, hãy đặt ăng-ten ở vị trí cao và gần cửa sổ và quét lại."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Quét lại"</item>
<item msgid="2092797862490235174">"Xong"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Quét tìm các kênh TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Thiết lập bộ dò TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Thiết lập bộ dò TV USB."</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Thiết lập bộ dò TV mạng"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Đã ngắt kết nối bộ dò truyền hình USB."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Đã ngắt kết nối bộ dò mạng."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Đã ngắt kết nối bộ điều chỉnh TV USB."</string>
</resources>
diff --git a/usbtuner-res/values-zh-rCN/strings.xml b/usbtuner-res/values-zh-rCN/strings.xml
index 546cfb5b..a4f6da22 100644
--- a/usbtuner-res/values-zh-rCN/strings.xml
+++ b/usbtuner-res/values-zh-rCN/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"电视调谐器"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB 电视调谐器"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"网络电视调谐器(测试版)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"开启"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"关闭"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"请耐心等待处理完毕"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"选择您的频道来源"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"无信号"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"无法调到<xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"无法调到相应频道"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"调谐器软件近期已更新。请重新扫描频道。"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"在系统声音设置中启用环绕声即可启用音频"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"无法播放音频,请试试其他电视频道"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"频道调谐器设置"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"电视调谐器设置"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB 频道调谐器设置"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"网络调谐器设置"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"请检查您的电视是否已连接到电视信号源。\n\n如果您使用的是无线电视,则可能需要调节天线的位置或方向,以便接收尽可能多的频道。要获得最佳效果,请将天线的位置调高并靠近窗户。"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"请检查 USB 调谐器是否已插好并连接到电视信号源。\n\n如果您使用的是无线电视,则可能需要调节天线的位置或方向,以便接收尽可能多的频道。要获得最佳效果,请将天线的位置调高并靠近窗户。"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"请检查网络调谐器是否已接通电源并连接到电视信号源。\n\n如果您使用的是无线电视,则可能需要调节天线的位置或方向,以便接收尽可能多的频道。要获得最佳效果,请将天线的位置调高并靠近窗户。"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"继续"</item>
<item msgid="727245208787621142">"以后再说"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"要重新进行频道设置吗?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"此操作将移除通过电视调谐器找到的频道,并重新扫描新频道。\n\n请检查您的电视是否已连接到电视信号源。\n\n如果您使用的是无线电视,则可能需要调节天线的位置或方向,以便接收尽可能多的频道。要获得最佳效果,请将天线的位置调高并靠近窗户。"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"此操作将移除通过 USB 调谐器找到的频道,并重新扫描新频道。\n\n请检查 USB 调谐器是否已插好并连接到电视信号源。\n\n如果您使用的是无线电视,则可能需要调节天线的位置或方向,以便接收尽可能多的频道。要获得最佳效果,请将天线的位置调高并靠近窗户。"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"此操作将移除通过网络调谐器找到的频道,并重新扫描新频道。\n\n请检查网络调谐器是否已接通电源并连接到电视信号源。\n\n如果您使用的是无线电视,则可能需要调节天线的位置或方向,以便接收尽可能多的频道。要获得最佳效果,请将天线的位置调高并靠近窗户。"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"继续"</item>
<item msgid="235450158666155406">"取消"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"电视调谐器设置"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB 频道调谐器设置"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"网络频道调谐器设置"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"此过程可能需要几分钟时间"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"调谐器暂时无法使用或已用于录制。"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"未找到任何频道"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"扫描后未找到任何频道。请检查您的电视是否已连接到电视信号源。\n\n如果您使用的是无线电视,请调节天线的位置或方向。要获得最佳效果,请将天线的位置调高并靠近窗户,然后再扫描一次。"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"扫描后未找到任何频道。请检查 USB 调谐器是否已插好并连接到电视信号源。\n\n如果您使用的是无线电视,请调节天线的位置或方向。要获得最佳效果,请将天线的位置调高并靠近窗户,然后再扫描一次。"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"扫描后未找到任何频道。请检查网络调谐器是否已接通电源并连接到电视信号源。\n\n如果您使用的是无线电视,请调节天线的位置或方向。要获得最佳效果,请将天线的位置调高并靠近窗户,然后再扫描一次。"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"重新扫描"</item>
<item msgid="2092797862490235174">"完成"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"扫描电视频道"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"电视调谐器设置"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB 电视调谐器设置"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"网络电视调谐器设置"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB 电视调谐器已断开连接。"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"网络调谐器已断开连接。"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB 电视调谐器已断开连接。"</string>
</resources>
diff --git a/usbtuner-res/values-zh-rHK/strings.xml b/usbtuner-res/values-zh-rHK/strings.xml
index 84a04685..6d40401e 100644
--- a/usbtuner-res/values-zh-rHK/strings.xml
+++ b/usbtuner-res/values-zh-rHK/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"電視調諧器"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB 電視調諧器"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"網絡電視調諧器 (測試版)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"開啟"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"關閉"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"請等待系統完成處理程序"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"請選擇您的頻道來源"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"無訊號"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"無法調校至<xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"無法調校頻道"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"調諧器軟件最近已更新。請重新掃瞄頻道。"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"在系統音效設定中啟用環迴立體聲功能即可啟用音效"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"無法播放音效,請嘗試使用其他電視頻道"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"頻道調諧器設定"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"電視調諧器設定"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB 頻道調諧器設定"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"網絡調諧器設定"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"請確定電視已連接至電視訊號來源。\n\n如果您使用無線天線,可能需要調整天線的位置或方向,以接收最多頻道。您亦可將天線放在較高位置並靠近窗戶,以獲得最佳效果。"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"請確定 USB 調諧器已接駁並連接至電視訊號來源。\n\n如果您使用無線天線,可能需要調整天線的位置或方向,以接收最多頻道。您亦可以將天線放在較高位置並靠近窗戶,以獲取最佳效果。"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"請確定網絡調諧器已開啟電源,並連接至電視訊號來源。\n\n如果您使用無線天線,可能需要調整天線的位置或方向,以接收最多頻道。要取得最佳效果,請將天線放在較高位置並靠近窗戶,然後重新掃瞄。"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"繼續"</item>
<item msgid="727245208787621142">"暫時不要"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"要重新設定頻道嗎?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"這項操作將移除電視調諧器找到的頻道,並重新掃瞄新的頻道。\n\n請確定電視已連接至電視訊號來源。\n\n如果您使用無線天線,可能需要調整天線的位置或方向,以接收最多頻道。您亦可將天線放在較高位置並靠近窗戶,以獲得最佳效果。"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"這項操作將移除 USB 調諧器找到的頻道,並會重新掃瞄新頻道。\n\n請確定 USB 調諧器已接駁並連接至電視訊號來源。\n\n如果您使用無線天線,可能需要調整天線的位置或方向,以接收最多頻道。您亦可將天線放在較高位置並靠近窗戶,以獲取最佳效果。"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"這項操作將移除網絡調諧器找到的頻道,並再次掃瞄新頻道。\n\n請確定網絡調諧器已開啟電源並連接至電視訊號來源。\n\n如果您使用無線天線,請調整天線的位置或方向。要取得最佳效果,請將天線放在較高位置並靠近窗戶,然後重新掃瞄。"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"繼續"</item>
<item msgid="235450158666155406">"取消"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"電視調諧器設定"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB 頻道調諧器設定"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"網絡頻道調諧器設定"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"可能需時數分鐘"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"調諧器暫時無法使用,或已用於錄影。"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"找不到頻道"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"掃瞄後找不到頻道。請確定電視已連接至電視訊號來源。\n\n如果您使用無線天線,請調整天線的位置或方向。您亦可將天線放在較高位置並靠近窗戶,然後重新掃瞄,以獲得最佳效果。"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"掃瞄找不到頻道。請確定 USB 調諧器已接駁並連接至電視訊號來源。\n\n如果您使用無線天線,請調整天線的位置或方向。您亦可將天線放在較高位置並靠近窗戶,然後重新掃瞄,以獲取最佳效果。"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"掃瞄後找不到任何頻道。請確定網絡調諧器已開啟電源,並連接至電視訊號來源。\n\n如果您使用無線天線,請調整天線的位置或方向。要取得最佳效果,請將天線放在較高位置並靠近窗戶,然後重新掃瞄。"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"重新掃瞄"</item>
<item msgid="2092797862490235174">"完成"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"掃瞄電視頻道"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"電視調諧器設定"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB 電視調諧器設定"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"網絡電視調諧器設定"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB 電視調諧器已中斷連線。"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"網絡調諧器已中斷連線。"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"已解除 USB 電視調諧器的連接。"</string>
</resources>
diff --git a/usbtuner-res/values-zh-rTW/strings.xml b/usbtuner-res/values-zh-rTW/strings.xml
index 9f46c3ef..802d8b73 100644
--- a/usbtuner-res/values-zh-rTW/strings.xml
+++ b/usbtuner-res/values-zh-rTW/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"電視調諧器"</string>
<string name="ut_app_name" msgid="8557698013780762454">"USB 電視調諧器"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"網路電視調諧器 (測試版)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"開啟"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"關閉"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"請等待處理程序完成"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"選取你的頻道來源"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"無訊號"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"無法轉到「<xliff:g id="CHANNEL_NAME">%s</xliff:g>」"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"無法轉台"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"調諧器軟體最近已更新。請重新掃描頻道。"</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"前往系統音效設定開啟環繞音效即可啟用音訊"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"無法播放音訊,請改用其他電視頻道"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"頻道調諧器設定"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"電視調諧器設定"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"USB 頻道調諧器設定"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"網路調諧器設定"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"請確認你的電視已連接到電視訊號來源。\n\n如果你使用無線電視天線,可能需要調整天線的位置和方向,以便接收最多頻道。為達最佳效果,請將天線放在靠近窗戶的較高位置。"</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"請確認 USB 調諧器已插入並連接到電視訊號來源。\n\n如果你使用無線電視天線,可能需要調整天線的位置和方向,以便接收最多頻道。為達最佳效果,請將天線放在靠近窗戶的較高位置。"</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"請確認你的網路調諧器已開啟電源,並連接到電視訊號來源。\n\n如果你使用無線電視天線,可能需要調整天線的位置和方向,以便接收最多頻道。為達最佳效果,請將天線放在靠近窗戶的較高位置。"</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"繼續"</item>
<item msgid="727245208787621142">"暫時不要"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"要重新設定頻道嗎?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"這項動作將移除電視調諧器找到的頻道,並再次掃描新的頻道。\n\n請確認你的電視已連接到電視訊號來源。\n\n如果你使用無線電視天線,可能需要調整天線的位置和方向,以便接收最多頻道。為達最佳效果,請將天線放在靠近窗戶的較高位置。"</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"這項動作將移除 USB 調諧器找到的頻道,並再次掃描新的頻道。\n\n請確認 USB 調諧器已插入並連接到電視訊號來源。\n\n如果你使用無線電視天線,可能需要調整天線的位置和方向,以便接收最多頻道。為達最佳效果,請將天線放在靠近窗戶的較高位置。"</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"這個動作將移除網路調諧器找到的頻道,並再次掃描新的頻道。\n\n請確認你的網路調諧器已開啟電源,並連接到電視訊號來源。\n\n如果你使用無線電視天線,可能需要調整天線的位置和方向,以便接收最多頻道。為達最佳效果,請將天線放在靠近窗戶的較高位置。"</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"繼續"</item>
<item msgid="235450158666155406">"取消"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"電視調諧器設定"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB 頻道調諧器設定"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"網路頻道調諧器設定"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"這可能需要幾分鐘的時間"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"調諧器暫時無法使用,或是已用於錄製。"</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"找不到任何頻道"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"掃描後並未發現任何頻道。請確認你的電視已連接到電視訊號來源。\n\n如果你使用無線電視天線,請調整天線的位置和方向。為達最佳效果,請將天線放在靠近窗戶的較高位置,然後再掃描一次。"</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"掃描後並未發現任何頻道。請確認 USB 調諧器已插入並連接到電視訊號來源。\n\n如果你使用無線電視天線,請調整天線的位置和方向。為達最佳效果,請將天線放在靠近窗戶的較高位置,然後再掃描一次。"</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"掃描後並未發現任何頻道。請確認你的網路調諧器已開啟電源,並連接到電視訊號來源。\n\n如果你使用無線電視天線,請調整天線的位置和方向。為達最佳效果,請將天線放在靠近窗戶的較高位置,然後再掃描一次。"</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"重新掃描"</item>
<item msgid="2092797862490235174">"完成"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"掃描電視頻道"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"電視調諧器設定"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"USB 電視調諧器設定"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"網路電視調諧器設定"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"USB 電視調諧器已中斷連線。"</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"網路調諧器已中斷連線。"</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"USB 電視調諧器已中斷連結。"</string>
</resources>
diff --git a/usbtuner-res/values-zu/strings.xml b/usbtuner-res/values-zu/strings.xml
index ddeb0faa..905e9a16 100644
--- a/usbtuner-res/values-zu/strings.xml
+++ b/usbtuner-res/values-zu/strings.xml
@@ -19,18 +19,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="bt_app_name" msgid="5515382901862469770">"Ishuna ye-TV"</string>
<string name="ut_app_name" msgid="8557698013780762454">"Ishuna ye-USB TV"</string>
- <string name="nt_app_name" msgid="4627006858832620833">"Ishuna yenethiwekhi ye-TV (i-BETA)"</string>
+ <string name="ut_setup_on" msgid="7755608253387551795">"Vuliwe"</string>
+ <string name="ut_setup_off" msgid="1333878787059290524">"Valiwe"</string>
<string name="ut_setup_cancel" msgid="5318292052302751909">"Sicela ulinde ukuze uqede ukucubungula"</string>
+ <string name="ut_select_channel_map" msgid="4831940000362338865">"Khetha umthombo wesiteshi sakho"</string>
+ <string name="ut_no_signal" msgid="7390099185275997984">"Ayikho isignali"</string>
+ <string name="ut_fail_to_tune" msgid="2964582177222053143">"Yehlulekile ukushunela ku-<xliff:g id="CHANNEL_NAME">%s</xliff:g>"</string>
+ <string name="ut_fail_to_tune_to_unknown_channel" msgid="7078953579048783762">"Yehlulekile ukushuna"</string>
<string name="ut_rescan_needed" msgid="2273655435759849436">"Isofthiwe yeshuna ibuyekezwe kamuva. Sicela uphinde uskene iziteshi."</string>
<string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Nika amandla umsindo ozungezile kuzilungiselelo zomsindo wesistimu"</string>
- <string name="audio_passthrough_not_supported" msgid="8766302073295760976">"Ayikwazi ukudlala umsindo. Sicela uzame enye i-TV"</string>
<string name="ut_setup_breadcrumb" msgid="2810318605327367247">"Ukusethwa kweshuna yesiteshi"</string>
<string name="bt_setup_new_title" msgid="8447554965697762891">"Ukusethwa kweshuna ye-TV"</string>
<string name="ut_setup_new_title" msgid="2118880835101453405">"Ukusetha kweshuna yesiteshi se-USB"</string>
- <string name="nt_setup_new_title" msgid="2996573474450060002">"Ukusethwa kweshuna yenethiwekhi"</string>
<string name="bt_setup_new_description" msgid="256690722062003128">"Qinisekisa ukuthi i-TV yakho ixhunywe kumthombo wesignali ye-TV.\n\nUma usebenzisa i-antenna esemoyeni, kungenzeka ukuthi kumele ulungise ukubekwa noma ukubheka ukuze uthole iziteshi eziningi. Ukuze uthole imiphumela ehamba phambili, beka phezulu naseduze kwewindi."</string>
<string name="ut_setup_new_description" msgid="2610122936163002137">"Qinisekisa ukuthi ishuna ye-USB ixhunyiwe futhi ixhumeke kumthombo wesignali ye-TV.\n\nUma usebenzisa i-antenna esemoyeni, kuzomele ulungise ukubekwa kwayo noma ukubheka kwayo ukuze uthole iziteshi eziningi. Ukuze uthole imiphumela ehamba phambili, yibeke phezulu eduze kwewindi."</string>
- <string name="nt_setup_new_description" msgid="8315318180352515751">"Qinisekisa ukuthi ishuna yenethiwekhi ivuliwe yaphinde yaxhunywa kumthombo wesignali ye-TV.\n\nUma usebenzisa i-antenna esemoyeni, kungenzeka ukuthi kumele ulungise ukubekwa kwayo noma indawo ebhekiwe ukuze uthole iziteshi eziningi. Ukuze uthole imiphumela ehamba phambili, ibeke ngaphezulu naseduze kwewindi."</string>
<string-array name="ut_setup_new_choices">
<item msgid="8728069574888601683">"Qhubeka"</item>
<item msgid="727245208787621142">"Hhayi manje"</item>
@@ -38,7 +40,6 @@
<string name="bt_setup_again_title" msgid="884713873101099572">"Phinda uqalise ukusethwa kwesiteshi?"</string>
<string name="bt_setup_again_description" msgid="1247792492948741337">"Lokhu kuzosusa iziteshi ezitholwe kusukela kushuna ye-TV kuphinde kuskenele iziteshi ezintsha.\n\nQinisekisa ukuthi i-TV yakho ixhunywe kumthombo wesignali ye-TV.\n\nUma usebenzisa i-antenna esemoyeni, kungenzeka ukuthi kumele ulungise ukubekwa noma ukubheka ukuze uthole iziteshi eziningi. Ukuze uthole imiphumela ehamba phambili, beka phezulu naseduze kwewindi."</string>
<string name="ut_setup_again_description" msgid="7837706010887799255">"Lokhu kuzosusa iziteshi ezitholakele kusukela kushuna ye-USB kuphinde kuskenele iziteshi ezintsha futhi.\n\nQinisekisa ukuthi ishuna ye-USB ixhunyiwe futhi ixhumeke kumthombo wesignali ye-TV.\n\nUma usebenzisa i-antenna esemoyeni, kuzomele ulungise ukubekwa kwayo noma ukubheka kwayo ukuze uthole iziteshi eziningi. Ukuze uthole imiphumela ehamba phambili, yibeke ngaphezulu naseduze kwewindi."</string>
- <string name="nt_setup_again_description" msgid="681642895365018072">"Lokhu kuzosusa iziteshi ezitholakele kusukela kushuna yenethiwekhi kuphinde kuskenele iziteshi ezintsha futhi.\n\nQinisekisa ukuthi ishuna yenethiwekhi ixhunyiwe futhi ixhumeke kumthombo wesignali ye-TV.\n\nUma usebenzisa i-antenna esemoyeni, kuzomele ulungise ukubekwa kwayo noma ukubheka kwayo ukuze uthole iziteshi eziningi. Ukuze uthole imiphumela ehamba phambili, yibeke ngaphezulu naseduze kwewindi."</string>
<string-array name="ut_setup_again_choices">
<item msgid="2557527790311851317">"Qhubeka"</item>
<item msgid="235450158666155406">"Khansela"</item>
@@ -53,7 +54,6 @@
</string-array>
<string name="bt_channel_scan" msgid="3291924771702347469">"Ukusethwa kweshuna ye-TV"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Ukusetha kweshuna yesiteshi se-USB"</string>
- <string name="nt_channel_scan" msgid="30206992732534178">"Ukusethwa kweshuna yesiteshi senethiwekhi"</string>
<string name="ut_channel_scan_time" msgid="1844845425359642393">"Lokhu kungathatha amaminithi athile"</string>
<string name="ut_channel_scan_tuner_unavailable" msgid="3135723754380409658">"Ishuna okwamanje ayitholakali noma isivele isetshenziswa ngokurekhodwa."</string>
<plurals name="ut_channel_scan_message" formatted="false" msgid="3131606783282632056">
@@ -76,7 +76,6 @@
<string name="ut_result_not_found_title" msgid="4649533929056795595">"Azikho iziteshi ezitholiwe"</string>
<string name="bt_result_not_found_description" msgid="7378208337325024042">"Ukuskena akuzange kuthole iziteshi. Qinisekisa ukuthi i-TV yakho ixhumeke kumthombo wesignali we-TV.\n\nUma usebenzisa i-antenna esemoyeni, kungenzeka ukuthi kumele ulungise ukubekwa noma ukubheka ukuze uthole iziteshi eziningi. Ukuze uthole imiphumela ehamba phambili, beka phezulu naseduze kwewindi."</string>
<string name="ut_result_not_found_description" msgid="1080746285957681414">"Iskena asizange sithole noma yiziphi iziteshi. Qinisekisa ukuthi ishuna ye-USB ixhunyiwe futhi ixhumeke kumthombo wesignali ye-TV.\n\nUma usebenzisa i-antenna esemoyeni, lungisa ukubekwa kwayo noma ukuma kwayo. Ukuze uthole imiphumela ehamba phambili, yibeke phezulu naseduze kwewindi uphinde uskene."</string>
- <string name="nt_result_not_found_description" msgid="2177919867285510855">"Iskena asizange sithole noma iziphi iziteshi. Qinisekisa ukuthi ishuna ye-USB ixhunyiwe futhi ixhumeke kumthombo wesignali ye-TV.\n\nUma usebenzisa i-antenna esemoyeni, lungisa ukubekwa kwayo noma ukuma kwayo. Ukuze uthole imiphumela ehamba phambili, yibeke phezulu naseduze kwewindi uphinde uskene."</string>
<string-array name="ut_result_not_found_choices">
<item msgid="5436884968471542030">"Skena futhi"</item>
<item msgid="2092797862490235174">"Kwenziwe"</item>
@@ -84,7 +83,5 @@
<string name="ut_setup_recommendation_card_focused_title" msgid="7434151993964505386">"Skenela iziteshi ze-TV"</string>
<string name="bt_setup_recommendation_card_title" msgid="1026906771141769829">"Ukusethwa kweshuna ye-TV"</string>
<string name="ut_setup_recommendation_card_title" msgid="1093869817128338226">"Ukusetha kweshuna ye-USB TV"</string>
- <string name="nt_setup_recommendation_card_title" msgid="3727909608135654457">"Ukusethwa kweshuna yenethiwekhi ye-TV"</string>
- <string name="msg_usb_tuner_disconnected" msgid="1206606328815245830">"Ishuna ye-USB TV inqanyuliwe."</string>
- <string name="msg_network_tuner_disconnected" msgid="7103193099674978964">"Ishuna yenethiwekhi inqanyuliwe."</string>
+ <string name="msg_usb_device_detached" msgid="5123930566630230724">"Isishuni se-USB TV sinqanyuliwe."</string>
</resources>
diff --git a/usbtuner-res/values/colors.xml b/usbtuner-res/values/colors.xml
index 873ecc8e..bbcc431f 100644
--- a/usbtuner-res/values/colors.xml
+++ b/usbtuner-res/values/colors.xml
@@ -16,9 +16,15 @@
-->
<resources>
+ <color name="ut_guidedstep_background">#01579B</color>
+ <color name="ut_guidance_title_text">#EEEEEE</color>
+ <color name="ut_guidance_breadcrumb_text">#EEEEEE</color>
+ <color name="ut_guidance_description_text">#B3EEEEEE</color>
+ <color name="ut_guidedactions_title_text">#EEEEEE</color>
<color name="ut_scan_title_text">#EEEEEE</color>
<color name="ut_scan_description_text">#B3EEEEEE</color>
<color name="ut_scan_progress">#EEEEEE</color>
<color name="ut_scan_progress_background">#26EEEEEE</color>
<color name="ut_scan_button_text">#EEEEEE</color>
+ <color name="ut_scan_channellist_background">#26EEEEEE</color>
</resources> \ No newline at end of file
diff --git a/usbtuner-res/values/dimens.xml b/usbtuner-res/values/dimens.xml
index 1fe39f6c..0a09b062 100644
--- a/usbtuner-res/values/dimens.xml
+++ b/usbtuner-res/values/dimens.xml
@@ -16,7 +16,41 @@
-->
<resources>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="ut_activity_horizontal_margin">16dp</dimen>
+ <dimen name="ut_activity_vertical_margin">16dp</dimen>
+
+ <dimen name="ut_guidance_section_width">592dp</dimen>
+ <dimen name="ut_guidedactions_section_width">368dp</dimen>
+
+ <dimen name="ut_guidedstep_entry_slide_from">100dp</dimen>
+ <dimen name="ut_guidedstep_exit_slide_to">-100dp</dimen>
+
+ <dimen name="ut_guidance_padding_start">56dp</dimen>
+ <dimen name="ut_guidance_padding_end">32dp</dimen>
+ <dimen name="ut_guidance_padding_top">27dp</dimen>
+ <dimen name="ut_guidance_anchor_height">156dp</dimen>
+
+ <dimen name="ut_guidance_title_text_size">34sp</dimen>
+ <dimen name="ut_guidance_breadcrumb_text_size">14sp</dimen>
+ <dimen name="ut_guidance_description_text_size">14sp</dimen>
+ <dimen name="ut_guidance_description_margin_top">8dp</dimen>
+
+ <dimen name="ut_guidedactions_padding_start">24dp</dimen>
+ <dimen name="ut_guidedactions_padding_end">40dp</dimen>
+ <dimen name="ut_guidedactions_padding_top">27dp</dimen>
+ <dimen name="ut_guidedactions_padding_bottom">48dp</dimen>
+ <dimen name="ut_guidedactions_anchor_height">163dp</dimen>
+ <dimen name="ut_guidedactions_selector_height">48dp</dimen>
+
+ <dimen name="ut_guidedactions_item_height">48dp</dimen>
+ <dimen name="ut_guidedactions_item_padding_start">16dp</dimen>
+ <dimen name="ut_guidedactions_item_padding_end">16dp</dimen>
+ <dimen name="ut_guidedactions_item_padding_top">14dp</dimen>
+ <dimen name="ut_guidedactions_item_padding_bottom">15dp</dimen>
+
<dimen name="ut_scan_icon_width">80dp</dimen>
+ <dimen name="ut_scan_icon_height">80dp</dimen>
<dimen name="ut_scan_icon_margin_right">24dp</dimen>
<dimen name="ut_scan_title_text_size">34sp</dimen>
diff --git a/usbtuner-res/values/integers.xml b/usbtuner-res/values/integers.xml
index 65d20c67..21b438e9 100644
--- a/usbtuner-res/values/integers.xml
+++ b/usbtuner-res/values/integers.xml
@@ -16,5 +16,10 @@
-->
<resources>
+ <integer name="ut_guidance_title_max_lines">2</integer>
+ <integer name="ut_guidance_description_max_lines">10</integer>
+ <integer name="ut_guidedactions_vertical_spcae">8</integer>
<integer name="ut_scan_title_max_lines">2</integer>
+ <integer name="ut_entry_anim_duration">300</integer>
+ <integer name="ut_exit_anim_duration">300</integer>
</resources> \ No newline at end of file
diff --git a/usbtuner-res/values/strings.xml b/usbtuner-res/values/strings.xml
index 2b08a354..e3a8586d 100644
--- a/usbtuner-res/values/strings.xml
+++ b/usbtuner-res/values/strings.xml
@@ -18,15 +18,26 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Name of this application. It appears in TV app UI, as one of available TV inputs. -->
<string name="bt_app_name">TV Tuner</string>
- <!-- Name of this application when one uses USB tuners. It appears in TV app UI, as one of
+ <!-- Name of this application when one uses USB tuner. It appears in TV app UI, as one of
available TV inputs. -->
<string name="ut_app_name">USB TV Tuner</string>
- <!-- Name of this application when one uses network tuners. It appears in TV app UI, as one of
- available TV inputs. -->
- <string name="nt_app_name">Network TV Tuner (BETA)</string>
+ <!-- Title for an action which turns a feature on [CHAR LIMIT=30] -->
+ <string name="ut_setup_on">On</string>
+ <!-- Title for an action which turns a feature off [CHAR LIMIT=30] -->
+ <string name="ut_setup_off">Off</string>
<!-- Message shown when the scanning process is being canceled by a user and the scanning
process needs the time to wait to finish the processing -->
<string name="ut_setup_cancel">Please wait to finish processing</string>
+ <!-- Message that asks a user to select the type of signal to be used for input among
+ the choices like terrestrial, cable, or satellite -->
+ <string name="ut_select_channel_map">Select your channel source</string>
+ <!-- Message that indicates TV input signal is lost due to physical disconnection or bad
+ reception -->
+ <string name="ut_no_signal">No Signal</string>
+ <!-- Message that says TV failed to change to a channel (or tune) -->
+ <string name="ut_fail_to_tune">Failed to tune to <xliff:g id="channel_name">%s</xliff:g></string>
+ <!-- Message that says TV failed to change(or tune) to a channel which has no title -->
+ <string name="ut_fail_to_tune_to_unknown_channel">Failed to tune</string>
<!-- Message shown when the scanned channels became invalid due to incompatible changes
found across application versions, hence a user is required to rescan the channels -->
<string name="ut_rescan_needed">Tuner software has been recently updated. Please re-scan the
@@ -34,16 +45,12 @@
<!-- Message that says audio of the current channel is not available due to surround sound
of TV device disabled -->
<string name="ut_surround_sound_disabled">Enable surround sound in system sound settings to enable audio</string>
- <!-- Message that says audio of the current channel is not available due to AC3 passthrough is not usable -->
- <string name="audio_passthrough_not_supported">Cannot play audio. Please try another TV</string>
<!-- Usb Tuner setup common UI breadcrumb -->
<string name="ut_setup_breadcrumb">Channel tuner setup</string>
<!-- Title for TV Tuner main setup menu when no channel exists -->
<string name="bt_setup_new_title">TV Tuner setup</string>
<!-- Title for USB tuner main setup menu when no channel exists -->
<string name="ut_setup_new_title">USB channel tuner setup</string>
- <!-- Title for network tuner main setup menu when no channel exists -->
- <string name="nt_setup_new_title">Network tuner setup</string>
<!-- Description for TV tuner main setup menu when no channel exists -->
<string name="bt_setup_new_description">Verify your TV is connected to a TV signal
source.\n\nIf using an over-the-air antenna, you may need to adjust its placement or
@@ -54,11 +61,6 @@
to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its
placement or direction to receive the most channels. For best results,
place it high and near a window.</string>
- <!-- Description for network tuner main setup menu when no channel exists -->
- <string name="nt_setup_new_description">Verify the network tuner is powered on and connected
- to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its
- placement or direction to receive the most channels. For best results,
- place it high and near a window.</string>
<!-- Menu items for USB tuner main setup menu when no channel exists -->
<string-array name="ut_setup_new_choices">
<!-- Continue setup -->
@@ -80,12 +82,6 @@
to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust its
placement or direction to receive the most channels. For best results, place it high and
near a window.</string>
- <!-- Description for network tuner main setup menu when channel exists already -->
- <string name="nt_setup_again_description">This will remove the channels found from the network
- tuner and scan for new channels again.\n\nVerify the network tuner is powered on and
- connected to a TV signal source.\n\nIf using an over-the-air antenna, you may need to adjust
- its placement or direction to receive the most channels. For best results, place it high and
- near a window.</string>
<!-- Menu items for USB tuner main setup menu when channel exists already -->
<string-array name="ut_setup_again_choices">
<!-- Continue setup -->
@@ -113,8 +109,6 @@
<string name="bt_channel_scan">TV tuner setup</string>
<!-- Title for channel scanning menu. Use this title with USB tuners -->
<string name="ut_channel_scan">USB channel tuner setup</string>
- <!-- Title for channel scanning menu. Use this title with network tuners -->
- <string name="nt_channel_scan">Network channel tuner setup</string>
<!-- Message that says channel is not yet scanned during channel scanning process -->
<string name="ut_channel_scan_time">This may take several minutes</string>
<!-- Message that says Tuner is not available -->
@@ -151,17 +145,11 @@
your TV is connected to a TV signal source.\n\nIf using an over-the-air antenna, adjust
its placement or direction. For best results, place it high and near a window and scan
again.</string>
- <!-- Description for channel scanning result menu when no channel was found with USB tuners-->
+ <!-- Description for channel scanning result menu when no channel was found -->
<string name="ut_result_not_found_description">The scan did not find any channels. Verify the
USB tuner is plugged in and connected to a TV signal source.\n\nIf using an over-the-air
antenna, adjust its placement or direction. For best results, place it high and near a
window and scan again.</string>
- <!-- Description for channel scanning result menu when no channel was found with network
- tuners -->
- <string name="nt_result_not_found_description">The scan did not find any channels. Verify the
- network tuner is powered on and connected to a TV signal source.\n\nIf using an over-the-air
- antenna, adjust its placement or direction. For best results, place it high and near a
- window and scan again.</string>
<!-- Menu items for channel scanning result menu when no channel was found -->
<string-array name="ut_result_not_found_choices">
<item>Scan again</item>
@@ -179,12 +167,7 @@
<!-- Content text and info of the recommendation card to launch the setup application of
USB tuner TV input for scanning channels. -->
<string name="ut_setup_recommendation_card_title">USB TV Tuner setup</string>
- <!-- Content text and info of the recommendation card to launch the setup application of
- network tuner TV input for scanning channels. -->
- <string name="nt_setup_recommendation_card_title">Network TV Tuner setup</string>
- <!-- Message when USB tuner device is unplugged or disconnected. [CHAR LIMIT=NONE] -->
- <string name="msg_usb_tuner_disconnected">USB TV tuner disconnected.</string>
- <!-- Message when Network tuner device is unplugged or disconnected. [CHAR LIMIT=NONE] -->
- <string name="msg_network_tuner_disconnected">Network tuner disconnected.</string>
+ <!-- Message when usb tuner device is unplugged. [CHAR LIMIT=NONE] -->
+ <string name="msg_usb_device_detached">USB TV tuner disconnected.</string>
</resources>
diff --git a/usbtuner-res/values/styles.xml b/usbtuner-res/values/styles.xml
new file mode 100644
index 00000000..c79319ba
--- /dev/null
+++ b/usbtuner-res/values/styles.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+ <style name="ut_guidance_anchor">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">@dimen/ut_guidance_anchor_height</item>
+ </style>
+ <style name="ut_guidance_container">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:background">@null</item>
+ <item name="android:clipToPadding">false</item>
+ <item name="android:clipChildren">false</item>
+ </style>
+ <style name="ut_guidance_title">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_alignWithParentIfMissing">true</item>
+ <item name="android:layout_below">@id/guidance_anchor_space</item>
+ <item name="android:ellipsize">end</item>
+ <item name="android:fontFamily">sans-serif-light</item>
+ <item name="android:maxLines">@integer/ut_guidance_title_max_lines</item>
+ <item name="android:textColor">@color/ut_guidance_title_text</item>
+ <item name="android:textSize">@dimen/ut_guidance_title_text_size</item>
+ </style>
+ <style name="ut_guidance_breadcrumb">
+ <item name="android:layout_above">@id/guidance_title</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_alignWithParentIfMissing">true</item>
+ <item name="android:ellipsize">end</item>
+ <item name="android:fontFamily">sans-serif-condensed</item>
+ <item name="android:singleLine">true</item>
+ <item name="android:textColor">@color/ut_guidance_breadcrumb_text</item>
+ <item name="android:textSize">@dimen/ut_guidance_breadcrumb_text_size</item>
+ </style>
+ <style name="ut_guidance_desc">
+ <item name="android:layout_below">@id/guidance_title</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_marginTop">@dimen/ut_guidance_description_margin_top</item>
+ <item name="android:layout_alignWithParentIfMissing">true</item>
+ <item name="android:ellipsize">end</item>
+ <item name="android:fontFamily">sans-serif</item>
+ <item name="android:maxLines">@integer/ut_guidance_description_max_lines</item>
+ <item name="android:textColor">@color/ut_guidance_description_text</item>
+ <item name="android:textSize">@dimen/ut_guidance_description_text_size</item>
+ </style>
+ <style name="ut_guidedactions_container">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:background">@null</item>
+ <item name="android:clipToPadding">false</item>
+ <item name="android:clipChildren">false</item>
+ </style>
+ <style name="ut_guidedactions_anchor">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">@dimen/ut_guidedactions_anchor_height</item>
+ </style>
+ <style name="ut_guidedactions_null_selector">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">@dimen/ut_guidedactions_selector_height</item>
+ <item name="android:layout_below">@id/guidedactions_anchor_space</item>
+ <item name="android:background">@null</item>
+ </style>
+ <style name="ut_guidedactions_list">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:layout_below">@id/guidedactions_anchor_space</item>
+ <item name="android:background">@null</item>
+ <item name="android:clipToPadding">false</item>
+ <item name="android:clipChildren">false</item>
+ <item name="android:focusable">true</item>
+ </style>
+ <style name="ut_guidedactions_item_container">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">@dimen/ut_guidedactions_item_height</item>
+ <item name="android:background">@drawable/ut_selector_background</item>
+ <item name="android:focusable">true</item>
+ <item name="android:paddingStart">@dimen/ut_guidedactions_item_padding_start</item>
+ <item name="android:paddingEnd">@dimen/ut_guidedactions_item_padding_end</item>
+ <item name="android:paddingTop">@dimen/ut_guidedactions_item_padding_top</item>
+ <item name="android:paddingBottom">@dimen/ut_guidedactions_item_padding_bottom</item>
+ </style>
+ <style name="ut_guidedactions_item_checkmark">
+ <item name="android:layout_width">@dimen/lb_guidedactions_item_checkmark_diameter</item>
+ <item name="android:layout_height">@dimen/lb_guidedactions_item_checkmark_diameter</item>
+ <item name="android:visibility">gone</item>
+ </style>
+ <style name="ut_guidedactions_item_title">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:ellipsize">end</item>
+ <item name="android:fontFamily">sans-serif-condensed</item>
+ <item name="android:singleLine">true</item>
+ <item name="android:textColor">@color/ut_guidedactions_title_text</item>
+ <item name="android:textSize">14sp</item>
+ <item name="android:background">@null</item>
+ </style>
+ <style name="ut_guidedactions_item_chevron">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:visibility">gone</item>
+ </style>
+</resources>
diff --git a/version.mk b/version.mk
index 6db8c732..f63f5834 100644
--- a/version.mk
+++ b/version.mk
@@ -48,13 +48,13 @@
base_version_major := 1
# Change this for each branch
-base_version_minor := 13
+base_version_minor := 11
# code_version_major will overflow at 22
code_version_major := $(shell echo $$(($(base_version_major)+3)))
# x86 and arm sometimes don't match.
-code_version_build := 016
+code_version_build := 011
#####################################################
#####################################################
# Collect automatic version code parameters