aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Chalko <nchalko@google.com>2016-10-26 14:03:09 -0700
committerNick Chalko <nchalko@google.com>2016-10-31 10:36:49 -0700
commitd41f0075a7d2ea826204e81fcec57d0aa57171a9 (patch)
treecb30cfbafd80e01d314868cdc36e783d39981119
parent5e0ec06a797e3497da94390c63c7072de442695b (diff)
downloadTV-d41f0075a7d2ea826204e81fcec57d0aa57171a9.tar.gz
Sync to ub-tv-killing at 6f6e46557accb62c9548e4177d6005aa944dbf33
Change-Id: I873644d6d9d0110c981ef6075cb4019c16bbb94b
-rw-r--r--AndroidManifest.xml32
-rw-r--r--common/res/values-af/strings.xml2
-rw-r--r--common/res/values-am/strings.xml2
-rw-r--r--common/res/values-ar/strings.xml2
-rw-r--r--common/res/values-az-rAZ/strings.xml2
-rw-r--r--common/res/values-bg/strings.xml2
-rw-r--r--common/res/values-bn-rBD/strings.xml2
-rw-r--r--common/res/values-ca/strings.xml2
-rw-r--r--common/res/values-cs/strings.xml2
-rw-r--r--common/res/values-da/strings.xml2
-rw-r--r--common/res/values-de/strings.xml2
-rw-r--r--common/res/values-el/strings.xml2
-rw-r--r--common/res/values-en-rAU/strings.xml2
-rw-r--r--common/res/values-en-rGB/strings.xml2
-rw-r--r--common/res/values-en-rIN/strings.xml2
-rw-r--r--common/res/values-es-rUS/strings.xml2
-rw-r--r--common/res/values-es/strings.xml2
-rw-r--r--common/res/values-et-rEE/strings.xml2
-rw-r--r--common/res/values-eu-rES/strings.xml2
-rw-r--r--common/res/values-fa/strings.xml2
-rw-r--r--common/res/values-fi/strings.xml2
-rw-r--r--common/res/values-fr-rCA/strings.xml2
-rw-r--r--common/res/values-fr/strings.xml2
-rw-r--r--common/res/values-gl-rES/strings.xml2
-rw-r--r--common/res/values-hi/strings.xml2
-rw-r--r--common/res/values-hr/strings.xml2
-rw-r--r--common/res/values-hu/strings.xml2
-rw-r--r--common/res/values-hy-rAM/strings.xml2
-rw-r--r--common/res/values-in/strings.xml2
-rw-r--r--common/res/values-is-rIS/strings.xml2
-rw-r--r--common/res/values-it/strings.xml2
-rw-r--r--common/res/values-iw/strings.xml2
-rw-r--r--common/res/values-ja/strings.xml2
-rw-r--r--common/res/values-ka-rGE/strings.xml2
-rw-r--r--common/res/values-kk-rKZ/strings.xml2
-rw-r--r--common/res/values-km-rKH/strings.xml2
-rw-r--r--common/res/values-kn-rIN/strings.xml2
-rw-r--r--common/res/values-ko/strings.xml2
-rw-r--r--common/res/values-ky-rKG/strings.xml2
-rw-r--r--common/res/values-lo-rLA/strings.xml2
-rw-r--r--common/res/values-lt/strings.xml2
-rw-r--r--common/res/values-lv/strings.xml2
-rw-r--r--common/res/values-mk-rMK/strings.xml2
-rw-r--r--common/res/values-ml-rIN/strings.xml2
-rw-r--r--common/res/values-mn-rMN/strings.xml2
-rw-r--r--common/res/values-mr-rIN/strings.xml2
-rw-r--r--common/res/values-ms-rMY/strings.xml2
-rw-r--r--common/res/values-my-rMM/strings.xml2
-rw-r--r--common/res/values-nb/strings.xml2
-rw-r--r--common/res/values-ne-rNP/strings.xml2
-rw-r--r--common/res/values-nl/strings.xml2
-rw-r--r--common/res/values-pl/strings.xml2
-rw-r--r--common/res/values-pt-rPT/strings.xml2
-rw-r--r--common/res/values-pt/strings.xml2
-rw-r--r--common/res/values-ro/strings.xml2
-rw-r--r--common/res/values-ru/strings.xml2
-rw-r--r--common/res/values-si-rLK/strings.xml2
-rw-r--r--common/res/values-sk/strings.xml2
-rw-r--r--common/res/values-sl/strings.xml2
-rw-r--r--common/res/values-sr/strings.xml2
-rw-r--r--common/res/values-sv/strings.xml2
-rw-r--r--common/res/values-sw/strings.xml2
-rw-r--r--common/res/values-ta-rIN/strings.xml2
-rw-r--r--common/res/values-te-rIN/strings.xml2
-rw-r--r--common/res/values-th/strings.xml2
-rw-r--r--common/res/values-tl/strings.xml2
-rw-r--r--common/res/values-tr/strings.xml2
-rw-r--r--common/res/values-uk/strings.xml2
-rw-r--r--common/res/values-ur-rPK/strings.xml2
-rw-r--r--common/res/values-uz-rUZ/strings.xml2
-rw-r--r--common/res/values-vi/strings.xml2
-rw-r--r--common/res/values-zh-rCN/strings.xml2
-rw-r--r--common/res/values-zh-rHK/strings.xml2
-rw-r--r--common/res/values-zh-rTW/strings.xml2
-rw-r--r--common/res/values-zu/strings.xml2
-rw-r--r--common/res/values/dimens.xml2
-rw-r--r--common/res/values/strings.xml4
-rw-r--r--common/src/com/android/tv/common/CollectionUtils.java6
-rw-r--r--common/src/com/android/tv/common/feature/CommonFeatures.java9
-rw-r--r--common/src/com/android/tv/common/feature/SystemAppFeature.java (renamed from src/com/android/tv/tuner/TunerFlags.java)20
-rw-r--r--common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java4
-rw-r--r--libs/exoplayer.jarbin769535 -> 792705 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_00.pngbin266 -> 98 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_01.pngbin1565 -> 463 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_02.pngbin1983 -> 661 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_03.pngbin2206 -> 796 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_04.pngbin2379 -> 884 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_05.pngbin2545 -> 962 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_06.pngbin2646 -> 1019 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_07.pngbin2534 -> 919 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_08.pngbin2630 -> 944 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_09.pngbin2779 -> 1149 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_10.pngbin2819 -> 1143 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_11.pngbin2841 -> 1190 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_12.pngbin2726 -> 1009 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_13.pngbin2824 -> 1109 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_14.pngbin2714 -> 1020 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_15.pngbin2824 -> 1217 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_16.pngbin2770 -> 1137 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_17.pngbin2331 -> 928 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_18.pngbin2845 -> 1233 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_19.pngbin2810 -> 1175 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_20.pngbin2831 -> 1174 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_21.pngbin2851 -> 1236 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_22.pngbin2790 -> 1074 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_23.pngbin2831 -> 1236 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_24.pngbin2790 -> 1118 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_25.pngbin2818 -> 1206 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_26.pngbin2809 -> 1207 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_27.pngbin2836 -> 1150 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_28.pngbin2859 -> 1240 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_29.pngbin2547 -> 925 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_30.pngbin2852 -> 1229 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_31.pngbin2815 -> 1180 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_32.pngbin2868 -> 1198 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_33.pngbin2837 -> 1228 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_34.pngbin2769 -> 1079 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_35.pngbin2810 -> 1239 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_36.pngbin2739 -> 1108 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_37.pngbin2838 -> 1212 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_38.pngbin2822 -> 1195 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_39.pngbin2821 -> 1142 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_40.pngbin2844 -> 1246 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_41.pngbin2367 -> 924 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_42.pngbin2781 -> 1031 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_43.pngbin2846 -> 1167 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_44.pngbin2850 -> 1213 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_45.pngbin2844 -> 1205 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_46.pngbin2805 -> 1070 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_47.pngbin2804 -> 1195 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_48.pngbin2703 -> 1050 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_49.pngbin2776 -> 1145 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_50.pngbin2567 -> 976 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_51.pngbin2643 -> 1063 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_52.pngbin2559 -> 987 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_53.pngbin2520 -> 970 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_54.pngbin2413 -> 928 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_55.pngbin2282 -> 874 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_56.pngbin2277 -> 844 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_57.pngbin2152 -> 765 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_58.pngbin1964 -> 638 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_59.pngbin1699 -> 499 bytes
-rw-r--r--res/drawable-xhdpi/arrow_blue_60.pngbin266 -> 98 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_180.pngbin266 -> 98 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_181.pngbin1548 -> 463 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_182.pngbin1962 -> 661 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_183.pngbin2184 -> 796 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_184.pngbin2358 -> 884 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_185.pngbin2500 -> 962 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_186.pngbin2585 -> 1019 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_187.pngbin2430 -> 919 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_188.pngbin2547 -> 944 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_189.pngbin2646 -> 1149 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_190.pngbin2698 -> 1143 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_191.pngbin2738 -> 1190 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_192.pngbin2698 -> 1009 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_193.pngbin2793 -> 1109 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_194.pngbin2686 -> 1020 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_195.pngbin2786 -> 1217 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_196.pngbin2738 -> 1137 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_197.pngbin2329 -> 928 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_198.pngbin2809 -> 1233 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_199.pngbin2784 -> 1175 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_200.pngbin2796 -> 1174 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_201.pngbin2812 -> 1236 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_202.pngbin2751 -> 1074 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_203.pngbin2805 -> 1236 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_204.pngbin2759 -> 1118 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_205.pngbin2780 -> 1206 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_206.pngbin2776 -> 1207 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_207.pngbin2796 -> 1150 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_208.pngbin2824 -> 1240 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_209.pngbin2517 -> 925 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_210.pngbin2809 -> 1229 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_211.pngbin2773 -> 1180 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_212.pngbin2821 -> 1198 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_213.pngbin2806 -> 1228 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_214.pngbin2739 -> 1079 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_215.pngbin2767 -> 1239 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_216.pngbin2705 -> 1108 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_217.pngbin2804 -> 1212 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_218.pngbin2795 -> 1195 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_219.pngbin2782 -> 1142 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_220.pngbin2808 -> 1245 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_221.pngbin2347 -> 924 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_222.pngbin2749 -> 1031 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_223.pngbin2800 -> 1167 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_224.pngbin2822 -> 1213 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_225.pngbin2815 -> 1205 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_226.pngbin2771 -> 1070 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_227.pngbin2775 -> 1195 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_228.pngbin2676 -> 1050 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_229.pngbin2673 -> 1145 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_230.pngbin2478 -> 976 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_231.pngbin2526 -> 1061 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_232.pngbin2473 -> 985 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_233.pngbin2424 -> 970 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_234.pngbin2339 -> 927 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_235.pngbin2239 -> 873 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_236.pngbin2257 -> 844 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_237.pngbin2125 -> 765 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_238.pngbin1937 -> 638 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_239.pngbin1678 -> 499 bytes
-rw-r--r--res/drawable-xhdpi/arrow_orange_240.pngbin266 -> 98 bytes
-rw-r--r--res/drawable-xhdpi/banner.pngbin6367 -> 4873 bytes
-rw-r--r--res/drawable-xhdpi/bg_protection.pngbin132636 -> 132623 bytes
-rw-r--r--res/drawable-xhdpi/cloud01.pngbin3529 -> 2357 bytes
-rw-r--r--res/drawable-xhdpi/cloud02.pngbin1119 -> 1118 bytes
-rw-r--r--res/drawable-xhdpi/default_now_card.pngbin3371 -> 3370 bytes
-rw-r--r--res/drawable-xhdpi/dvr_default_poster.pngbin4042 -> 766 bytes
-rw-r--r--res/drawable-xhdpi/dvr_default_program_art.pngbin11576 -> 11562 bytes
-rw-r--r--res/drawable-xhdpi/dvr_full_schedule.pngbin7002 -> 1750 bytes
-rw-r--r--res/drawable-xhdpi/ic_channel_guide.pngbin1448 -> 906 bytes
-rw-r--r--res/drawable-xhdpi/ic_check_circle_white_48dp.pngbin0 -> 361 bytes
-rw-r--r--res/drawable-xhdpi/ic_delete_32dp.pngbin579 -> 802 bytes
-rwxr-xr-xres/drawable-xhdpi/ic_developer_mode_tv_white_48dp.pngbin581 -> 851 bytes
-rw-r--r--res/drawable-xhdpi/ic_draggable_white.pngbin594 -> 148 bytes
-rw-r--r--res/drawable-xhdpi/ic_dragging_grey.pngbin924 -> 313 bytes
-rw-r--r--res/drawable-xhdpi/ic_dvr.pngbin684 -> 934 bytes
-rw-r--r--res/drawable-xhdpi/ic_dvr_cancel.pngbin414 -> 658 bytes
-rw-r--r--res/drawable-xhdpi/ic_dvr_cancel_32dp.pngbin1106 -> 1514 bytes
-rw-r--r--res/drawable-xhdpi/ic_dvr_cancel_large.pngbin751 -> 1158 bytes
-rw-r--r--res/drawable-xhdpi/ic_dvr_delete.pngbin379 -> 657 bytes
-rw-r--r--res/drawable-xhdpi/ic_error_recording.pngbin492 -> 729 bytes
-rw-r--r--res/drawable-xhdpi/ic_error_white_48dp.pngbin684 -> 1117 bytes
-rw-r--r--res/drawable-xhdpi/ic_guide_lock.pngbin740 -> 737 bytes
-rw-r--r--res/drawable-xhdpi/ic_launcher.pngbin3326 -> 3325 bytes
-rw-r--r--res/drawable-xhdpi/ic_message_lock.pngbin7078 -> 3928 bytes
-rw-r--r--res/drawable-xhdpi/ic_message_lock_no_permission.pngbin3553 -> 2147 bytes
-rw-r--r--res/drawable-xhdpi/ic_message_lock_preview.pngbin2593 -> 1847 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_input.pngbin445 -> 270 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout1.pngbin302 -> 175 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout2.pngbin300 -> 176 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout3.pngbin299 -> 176 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout4.pngbin296 -> 175 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_layout5.pngbin308 -> 178 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_size.pngbin262 -> 155 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_swap.pngbin242 -> 241 bytes
-rw-r--r--res/drawable-xhdpi/ic_pip_option_swap_audio.pngbin846 -> 479 bytes
-rw-r--r--res/drawable-xhdpi/ic_recent_thumbnail_default.pngbin2977 -> 1961 bytes
-rw-r--r--res/drawable-xhdpi/ic_record_start.pngbin804 -> 556 bytes
-rw-r--r--res/drawable-xhdpi/ic_record_stop.pngbin193 -> 127 bytes
-rw-r--r--res/drawable-xhdpi/ic_recorded_program.pngbin399 -> 612 bytes
-rw-r--r--res/drawable-xhdpi/ic_recording_program.pngbin397 -> 313 bytes
-rw-r--r--res/drawable-xhdpi/ic_rotten.pngbin10204 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_sad_cloud.pngbin6411 -> 2507 bytes
-rw-r--r--res/drawable-xhdpi/ic_schedule_32dp.pngbin1095 -> 1490 bytes
-rw-r--r--res/drawable-xhdpi/ic_scheduled_recording.pngbin523 -> 902 bytes
-rw-r--r--res/drawable-xhdpi/ic_scheduled_white.pngbin375 -> 491 bytes
-rw-r--r--res/drawable-xhdpi/ic_settings.pngbin408 -> 406 bytes
-rw-r--r--res/drawable-xhdpi/ic_setup_antenna.pngbin2637 -> 1264 bytes
-rw-r--r--res/drawable-xhdpi/ic_store.pngbin4842 -> 3894 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvoption_aspect.pngbin333 -> 188 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvoption_cc.pngbin500 -> 268 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvoption_channel_sources.pngbin423 -> 272 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvoption_multi_track.pngbin415 -> 412 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvoption_pip.pngbin347 -> 192 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvoption_pip_off.pngbin262 -> 261 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_009.pngbin1094 -> 1093 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_013.pngbin1059 -> 1058 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_014.pngbin1049 -> 1047 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_001.pngbin1049 -> 1046 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_006.pngbin929 -> 927 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_007.pngbin916 -> 914 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_008.pngbin878 -> 877 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_009.pngbin866 -> 864 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_011.pngbin834 -> 831 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_012.pngbin838 -> 837 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_013.pngbin838 -> 837 bytes
-rw-r--r--res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_015.pngbin834 -> 830 bytes
-rw-r--r--res/drawable-xhdpi/ic_warning_white_12dp.pngbin0 -> 242 bytes
-rw-r--r--res/drawable-xhdpi/ic_warning_white_18dp.pngbin0 -> 356 bytes
-rw-r--r--res/drawable-xhdpi/ic_warning_white_24dp.pngbin318 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_warning_white_32dp.pngbin0 -> 553 bytes
-rw-r--r--res/drawable-xhdpi/ic_warning_white_36dp.pngbin325 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_warning_white_96dp.pngbin1044 -> 992 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_remote.pngbin10193 -> 5556 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_000.pngbin2007 -> 1120 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_001.pngbin2387 -> 1470 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_002.pngbin2588 -> 1682 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_003.pngbin2771 -> 1871 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_004.pngbin2935 -> 2064 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_005.pngbin3097 -> 2164 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_006.pngbin3186 -> 2279 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_007.pngbin3221 -> 2279 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_008.pngbin3350 -> 2324 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_009.pngbin3543 -> 2352 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_010.pngbin3480 -> 2325 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_011.pngbin3561 -> 2222 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_012.pngbin3568 -> 2181 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_013.pngbin3680 -> 2110 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_014.pngbin3638 -> 1944 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_015.pngbin3600 -> 1871 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_016.pngbin3672 -> 1918 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_017.pngbin3731 -> 1976 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_018.pngbin3780 -> 2036 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_019.pngbin3773 -> 2069 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_020.pngbin3843 -> 2097 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_021.pngbin3823 -> 2078 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_022.pngbin3850 -> 2148 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_023.pngbin3927 -> 2266 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_024.pngbin3909 -> 2245 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_025.pngbin3930 -> 2278 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_026.pngbin3834 -> 2236 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_027.pngbin3807 -> 2217 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_028.pngbin3706 -> 2113 bytes
-rw-r--r--res/drawable-xhdpi/ic_welcome_ripple_029.pngbin3502 -> 1905 bytes
-rw-r--r--res/drawable-xhdpi/ic_youtube.pngbin1008 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/splash_logo.pngbin11576 -> 11562 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_03.pngbin395 -> 394 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_04.pngbin379 -> 377 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_06.pngbin3417 -> 3413 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_07.pngbin4872 -> 4871 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_08.pngbin5488 -> 5486 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_09.pngbin5882 -> 5878 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_10.pngbin6013 -> 6009 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_11.pngbin6011 -> 6009 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_13.pngbin6012 -> 6010 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_14.pngbin6013 -> 6010 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_15.pngbin6015 -> 6012 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_16.pngbin6011 -> 6008 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_17.pngbin6010 -> 6009 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_18.pngbin6001 -> 5999 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_19.pngbin6003 -> 6002 bytes
-rw-r--r--res/drawable-xhdpi/tv_1a_20.pngbin5993 -> 5988 bytes
-rw-r--r--res/drawable-xhdpi/tv_1b_01.pngbin5993 -> 5987 bytes
-rw-r--r--res/drawable-xhdpi/tv_1b_02.pngbin6010 -> 6008 bytes
-rw-r--r--res/drawable-xhdpi/tv_1b_03.pngbin6010 -> 6008 bytes
-rw-r--r--res/drawable-xhdpi/tv_1b_05.pngbin4989 -> 4987 bytes
-rw-r--r--res/drawable-xhdpi/tv_1b_06.pngbin3413 -> 3410 bytes
-rw-r--r--res/drawable-xhdpi/tv_1b_08.pngbin1099 -> 1098 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_03.pngbin265 -> 264 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_04.pngbin345 -> 344 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_05.pngbin791 -> 788 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_06.pngbin1704 -> 1698 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_07.pngbin3733 -> 3732 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_08.pngbin5379 -> 5378 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_09.pngbin5900 -> 5899 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_10.pngbin5683 -> 5678 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_11.pngbin5604 -> 5600 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_12.pngbin5469 -> 5466 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_13.pngbin5483 -> 5482 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_14.pngbin5130 -> 5126 bytes
-rw-r--r--res/drawable-xhdpi/tv_2a_16.pngbin2887 -> 2883 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_02.pngbin2224 -> 2222 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_03.pngbin2094 -> 2089 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_07.pngbin1748 -> 1747 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_08.pngbin1680 -> 1679 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_11.pngbin1498 -> 1496 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_12.pngbin1429 -> 1427 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_13.pngbin1349 -> 1348 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_16.pngbin1048 -> 1045 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_17.pngbin988 -> 987 bytes
-rw-r--r--res/drawable-xhdpi/tv_2b_18.pngbin887 -> 886 bytes
-rw-r--r--res/drawable-xhdpi/tv_2c_03.pngbin852 -> 850 bytes
-rw-r--r--res/drawable-xhdpi/tv_2c_04.pngbin1837 -> 1833 bytes
-rw-r--r--res/drawable-xhdpi/tv_2c_07.pngbin5483 -> 5482 bytes
-rw-r--r--res/drawable-xhdpi/tv_2c_10.pngbin5177 -> 5172 bytes
-rw-r--r--res/drawable-xhdpi/tv_2c_11.pngbin5148 -> 5146 bytes
-rw-r--r--res/drawable-xhdpi/tv_2c_12.pngbin4311 -> 4283 bytes
-rw-r--r--res/drawable-xhdpi/tv_2c_13.pngbin3741 -> 3736 bytes
-rw-r--r--res/drawable-xhdpi/tv_3a_02.pngbin198 -> 197 bytes
-rw-r--r--res/drawable-xhdpi/tv_3a_03.pngbin239 -> 237 bytes
-rw-r--r--res/drawable-xhdpi/tv_3a_05.pngbin326 -> 323 bytes
-rw-r--r--res/drawable-xhdpi/tv_3a_06.pngbin333 -> 327 bytes
-rw-r--r--res/drawable-xhdpi/tv_3a_14.pngbin533 -> 532 bytes
-rw-r--r--res/drawable-xhdpi/tv_3a_15.pngbin527 -> 526 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_101.pngbin379 -> 378 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_102.pngbin521 -> 520 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_103.pngbin517 -> 515 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_108.pngbin616 -> 615 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_109.pngbin616 -> 615 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_111.pngbin602 -> 600 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_114.pngbin621 -> 619 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_115.pngbin624 -> 623 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_116.pngbin598 -> 597 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_117.pngbin598 -> 597 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_118.pngbin596 -> 594 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_78.pngbin365 -> 364 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_82.pngbin758 -> 755 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_83.pngbin800 -> 799 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_84.pngbin818 -> 817 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_87.pngbin848 -> 843 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_88.pngbin871 -> 870 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_89.pngbin878 -> 875 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_90.pngbin830 -> 829 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_91.pngbin825 -> 822 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_92.pngbin829 -> 827 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_93.pngbin813 -> 812 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_95.pngbin804 -> 802 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_96.pngbin771 -> 770 bytes
-rw-r--r--res/drawable-xhdpi/tv_3b_97.pngbin734 -> 732 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_10.pngbin1268 -> 1267 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_101.pngbin5535 -> 5517 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_104.pngbin5557 -> 5553 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_105.pngbin5694 -> 5681 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_107.pngbin5907 -> 5898 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_108.pngbin5975 -> 5958 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_109.pngbin6169 -> 6163 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_110.pngbin5945 -> 5937 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_111.pngbin5966 -> 5944 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_112.pngbin5799 -> 5794 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_113.pngbin5747 -> 5743 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_114.pngbin5736 -> 5727 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_115.pngbin5604 -> 5595 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_118.pngbin5190 -> 5176 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_119.pngbin5015 -> 5005 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_12.pngbin1317 -> 1316 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_122.pngbin4780 -> 4766 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_123.pngbin4600 -> 4595 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_124.pngbin4445 -> 4443 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_125.pngbin4535 -> 4528 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_126.pngbin4455 -> 4440 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_128.pngbin4488 -> 4478 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_129.pngbin4524 -> 4521 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_131.pngbin4246 -> 4242 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_135.pngbin4834 -> 4827 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_136.pngbin4606 -> 4598 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_137.pngbin4328 -> 4326 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_139.pngbin4063 -> 4052 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_14.pngbin1514 -> 1507 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_140.pngbin3977 -> 3976 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_141.pngbin3936 -> 3933 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_142.pngbin3768 -> 3761 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_143.pngbin3710 -> 3709 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_144.pngbin3712 -> 3708 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_146.pngbin3862 -> 3858 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_147.pngbin3518 -> 3515 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_149.pngbin3297 -> 3294 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_151.pngbin3319 -> 3315 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_153.pngbin3304 -> 3302 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_155.pngbin3283 -> 3282 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_157.pngbin2998 -> 2997 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_158.pngbin3075 -> 3071 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_159.pngbin2905 -> 2902 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_16.pngbin1786 -> 1785 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_160.pngbin3059 -> 3054 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_161.pngbin3025 -> 3024 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_162.pngbin2893 -> 2891 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_163.pngbin3010 -> 3004 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_169.pngbin2617 -> 2616 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_17.pngbin1935 -> 1931 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_171.pngbin2508 -> 2506 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_172.pngbin2388 -> 2387 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_177.pngbin2263 -> 2262 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_178.pngbin2201 -> 2200 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_179.pngbin2210 -> 2209 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_181.pngbin2323 -> 2321 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_182.pngbin2383 -> 2376 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_183.pngbin2326 -> 2322 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_184.pngbin2322 -> 2321 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_185.pngbin2319 -> 2316 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_187.pngbin2333 -> 2329 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_188.pngbin2403 -> 2401 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_190.pngbin2392 -> 2390 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_191.pngbin2323 -> 2321 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_192.pngbin2304 -> 2303 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_193.pngbin2367 -> 2362 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_194.pngbin2341 -> 2340 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_196.pngbin2182 -> 2169 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_197.pngbin2147 -> 2135 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_198.pngbin2036 -> 2026 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_199.pngbin1885 -> 1880 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_20.pngbin2250 -> 2220 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_200.pngbin1836 -> 1833 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_203.pngbin1774 -> 1771 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_204.pngbin1886 -> 1881 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_205.pngbin1883 -> 1870 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_206.pngbin1866 -> 1864 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_207.pngbin1886 -> 1874 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_208.pngbin1883 -> 1878 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_209.pngbin1913 -> 1910 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_21.pngbin2416 -> 2414 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_210.pngbin1820 -> 1816 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_212.pngbin1799 -> 1791 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_216.pngbin1729 -> 1726 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_217.pngbin1663 -> 1662 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_218.pngbin1646 -> 1645 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_22.pngbin2493 -> 2489 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_221.pngbin1612 -> 1610 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_222.pngbin1453 -> 1451 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_223.pngbin1358 -> 1357 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_224.pngbin1360 -> 1357 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_25.pngbin2803 -> 2799 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_29.pngbin3256 -> 3254 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_30.pngbin3401 -> 3390 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_31.pngbin3500 -> 3494 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_32.pngbin3524 -> 3521 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_33.pngbin3493 -> 3485 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_36.pngbin4426 -> 4419 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_37.pngbin4365 -> 4364 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_38.pngbin4503 -> 4500 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_40.pngbin4597 -> 4595 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_41.pngbin4742 -> 4741 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_42.pngbin4659 -> 4657 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_43.pngbin4506 -> 4505 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_45.pngbin4451 -> 4448 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_46.pngbin4724 -> 4721 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_47.pngbin4728 -> 4723 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_48.pngbin4561 -> 4556 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_5.pngbin770 -> 768 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_50.pngbin4450 -> 4448 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_51.pngbin4657 -> 4641 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_52.pngbin4744 -> 4732 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_54.pngbin4884 -> 4880 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_57.pngbin4751 -> 4749 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_58.pngbin4680 -> 4665 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_59.pngbin4692 -> 4683 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_6.pngbin874 -> 871 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_60.pngbin4812 -> 4802 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_61.pngbin4824 -> 4814 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_63.pngbin4930 -> 4921 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_64.pngbin4438 -> 4437 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_65.pngbin4379 -> 4378 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_66.pngbin4539 -> 4525 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_68.pngbin4716 -> 4711 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_69.pngbin4526 -> 4508 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_70.pngbin4866 -> 4858 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_71.pngbin5124 -> 5107 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_72.pngbin5140 -> 5131 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_73.pngbin5174 -> 5163 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_74.pngbin5277 -> 5270 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_75.pngbin5179 -> 5176 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_76.pngbin5094 -> 5091 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_77.pngbin4991 -> 4985 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_78.pngbin4960 -> 4955 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_79.pngbin5142 -> 5129 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_80.pngbin5136 -> 5129 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_81.pngbin5230 -> 5204 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_82.pngbin5317 -> 5295 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_83.pngbin5159 -> 5152 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_87.pngbin5120 -> 5108 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_88.pngbin5279 -> 5276 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_89.pngbin5313 -> 5307 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_9.pngbin1197 -> 1195 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_91.pngbin5533 -> 5526 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_94.pngbin5288 -> 5273 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_95.pngbin4976 -> 4963 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_96.pngbin4985 -> 4977 bytes
-rw-r--r--res/drawable-xhdpi/tv_5a_99.pngbin5090 -> 5081 bytes
-rw-r--r--res/drawable-xhdpi/tv_error.pngbin5430 -> 2846 bytes
-rw-r--r--res/drawable-xhdpi/tv_usb_antenna.pngbin21399 -> 21390 bytes
-rw-r--r--res/drawable-xhdpi/usb_antenna.pngbin2897 -> 1639 bytes
-rw-r--r--res/layout/dvr_details_description.xml69
-rw-r--r--res/layout/dvr_recording_card_view.xml14
-rw-r--r--res/layout/dvr_schedules_header.xml11
-rw-r--r--res/layout/dvr_schedules_item.xml41
-rw-r--r--res/layout/lb_details_overview.xml89
-rw-r--r--res/layout/menu_card_app_link.xml26
-rw-r--r--res/layout/menu_card_channel.xml26
-rw-r--r--res/layout/menu_card_dvr.xml18
-rw-r--r--res/layout/menu_card_setup.xml4
-rw-r--r--res/layout/menu_card_text.xml46
-rw-r--r--res/layout/program_guide_table_row.xml4
-rw-r--r--res/layout/program_track_meta.xml12
-rw-r--r--res/values-af/strings.xml68
-rw-r--r--res/values-am/strings.xml68
-rw-r--r--res/values-ar/strings.xml88
-rw-r--r--res/values-az-rAZ/strings.xml68
-rw-r--r--res/values-bg/strings.xml68
-rw-r--r--res/values-bn-rBD/strings.xml68
-rw-r--r--res/values-ca/strings.xml72
-rw-r--r--res/values-cs/strings.xml78
-rw-r--r--res/values-da/strings.xml68
-rw-r--r--res/values-de/strings.xml68
-rw-r--r--res/values-el/strings.xml68
-rw-r--r--res/values-en-rAU/strings.xml68
-rw-r--r--res/values-en-rGB/strings.xml68
-rw-r--r--res/values-en-rIN/strings.xml68
-rw-r--r--res/values-es-rUS/strings.xml68
-rw-r--r--res/values-es/strings.xml68
-rw-r--r--res/values-et-rEE/strings.xml68
-rw-r--r--res/values-eu-rES/strings.xml70
-rw-r--r--res/values-fa/strings.xml70
-rw-r--r--res/values-fi/strings.xml68
-rw-r--r--res/values-fr-rCA/strings.xml68
-rw-r--r--res/values-fr/strings.xml68
-rw-r--r--res/values-gl-rES/strings.xml68
-rw-r--r--res/values-hi/strings.xml68
-rw-r--r--res/values-hr/strings.xml73
-rw-r--r--res/values-hu/strings.xml68
-rw-r--r--res/values-hy-rAM/strings.xml68
-rw-r--r--res/values-in/strings.xml68
-rw-r--r--res/values-is-rIS/strings.xml68
-rw-r--r--res/values-it/strings.xml68
-rw-r--r--res/values-iw/strings.xml78
-rw-r--r--res/values-ja/strings.xml74
-rw-r--r--res/values-ka-rGE/strings.xml70
-rw-r--r--res/values-kk-rKZ/strings.xml68
-rw-r--r--res/values-km-rKH/strings.xml68
-rw-r--r--res/values-kn-rIN/strings.xml68
-rw-r--r--res/values-ko/strings.xml68
-rw-r--r--res/values-ky-rKG/strings.xml68
-rw-r--r--res/values-lo-rLA/strings.xml68
-rw-r--r--res/values-lt/strings.xml78
-rw-r--r--res/values-lv/strings.xml73
-rw-r--r--res/values-mk-rMK/strings.xml68
-rw-r--r--res/values-ml-rIN/strings.xml68
-rw-r--r--res/values-mn-rMN/strings.xml68
-rw-r--r--res/values-mr-rIN/strings.xml68
-rw-r--r--res/values-ms-rMY/strings.xml68
-rw-r--r--res/values-my-rMM/strings.xml68
-rw-r--r--res/values-nb/strings.xml68
-rw-r--r--res/values-ne-rNP/strings.xml68
-rw-r--r--res/values-nl/strings.xml74
-rw-r--r--res/values-pl/strings.xml78
-rw-r--r--res/values-pt-rPT/strings.xml68
-rw-r--r--res/values-pt/strings.xml68
-rw-r--r--res/values-ro/strings.xml73
-rw-r--r--res/values-ru/strings.xml78
-rw-r--r--res/values-si-rLK/strings.xml68
-rw-r--r--res/values-sk/strings.xml78
-rw-r--r--res/values-sl/strings.xml78
-rw-r--r--res/values-sr/strings.xml83
-rw-r--r--res/values-sv/strings.xml68
-rw-r--r--res/values-sw/strings.xml68
-rw-r--r--res/values-ta-rIN/strings.xml68
-rw-r--r--res/values-te-rIN/strings.xml68
-rw-r--r--res/values-th/strings.xml70
-rw-r--r--res/values-tl/strings.xml68
-rw-r--r--res/values-tr/strings.xml68
-rw-r--r--res/values-uk/strings.xml78
-rw-r--r--res/values-ur-rPK/strings.xml68
-rw-r--r--res/values-uz-rUZ/strings.xml68
-rw-r--r--res/values-vi/strings.xml68
-rw-r--r--res/values-zh-rCN/strings.xml68
-rw-r--r--res/values-zh-rHK/strings.xml68
-rw-r--r--res/values-zh-rTW/strings.xml68
-rw-r--r--res/values-zu/strings.xml68
-rw-r--r--res/values/dimens.xml10
-rw-r--r--res/values/integers.xml3
-rw-r--r--res/values/strings.xml116
-rw-r--r--res/values/themes.xml5
-rw-r--r--src/com/android/exoplayer/MediaFormatUtil.java30
-rw-r--r--src/com/android/tv/ApplicationSingletons.java3
-rw-r--r--src/com/android/tv/InputSessionManager.java37
-rw-r--r--src/com/android/tv/MainActivity.java142
-rw-r--r--src/com/android/tv/TimeShiftManager.java52
-rw-r--r--src/com/android/tv/TvApplication.java36
-rw-r--r--src/com/android/tv/data/BaseProgram.java10
-rw-r--r--src/com/android/tv/data/Channel.java7
-rw-r--r--src/com/android/tv/data/ChannelDataManager.java10
-rw-r--r--src/com/android/tv/data/Lineup.java1
-rw-r--r--src/com/android/tv/data/Program.java2
-rw-r--r--src/com/android/tv/data/StreamInfo.java3
-rw-r--r--src/com/android/tv/data/epg/EpgFetcher.java29
-rw-r--r--src/com/android/tv/dvr/BaseDvrDataManager.java55
-rw-r--r--src/com/android/tv/dvr/DvrDataManager.java11
-rw-r--r--src/com/android/tv/dvr/DvrDataManagerImpl.java408
-rw-r--r--src/com/android/tv/dvr/DvrDbSync.java208
-rw-r--r--src/com/android/tv/dvr/DvrManager.java465
-rw-r--r--src/com/android/tv/dvr/DvrPlaybackActivity.java2
-rw-r--r--src/com/android/tv/dvr/DvrPlaybackMediaSessionHelper.java44
-rw-r--r--src/com/android/tv/dvr/DvrPlayer.java84
-rw-r--r--src/com/android/tv/dvr/DvrRecordingService.java3
-rw-r--r--src/com/android/tv/dvr/DvrScheduleManager.java439
-rw-r--r--src/com/android/tv/dvr/DvrStorageStatusManager.java376
-rw-r--r--src/com/android/tv/dvr/DvrUiHelper.java154
-rw-r--r--src/com/android/tv/dvr/DvrWatchedPositionManager.java43
-rw-r--r--src/com/android/tv/dvr/EpisodicProgramLoadTask.java382
-rw-r--r--src/com/android/tv/dvr/InputTaskScheduler.java85
-rw-r--r--src/com/android/tv/dvr/RecordedProgram.java43
-rw-r--r--src/com/android/tv/dvr/RecordingTask.java78
-rw-r--r--src/com/android/tv/dvr/ScheduledRecording.java48
-rw-r--r--src/com/android/tv/dvr/Scheduler.java22
-rw-r--r--src/com/android/tv/dvr/SeriesRecording.java48
-rw-r--r--src/com/android/tv/dvr/SeriesRecordingScheduler.java412
-rw-r--r--src/com/android/tv/dvr/WritableDvrDataManager.java15
-rw-r--r--src/com/android/tv/dvr/provider/DvrContract.java6
-rw-r--r--src/com/android/tv/dvr/ui/DetailsContentPresenter.java284
-rw-r--r--src/com/android/tv/dvr/ui/DetailsViewBackgroundHelper.java8
-rw-r--r--src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java2
-rw-r--r--src/com/android/tv/dvr/ui/DvrBrowseFragment.java157
-rw-r--r--src/com/android/tv/dvr/ui/DvrCancelAllSeriesRecordingFragment.java65
-rw-r--r--src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java2
-rw-r--r--src/com/android/tv/dvr/ui/DvrDetailsActivity.java2
-rw-r--r--src/com/android/tv/dvr/ui/DvrDetailsFragment.java109
-rw-r--r--src/com/android/tv/dvr/ui/DvrForgetStorageErrorFragment.java11
-rw-r--r--src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java17
-rw-r--r--src/com/android/tv/dvr/ui/DvrHalfSizedDialogFragment.java88
-rw-r--r--src/com/android/tv/dvr/ui/DvrItemPresenter.java80
-rw-r--r--src/com/android/tv/dvr/ui/DvrPlaybackCardPresenter.java20
-rw-r--r--src/com/android/tv/dvr/ui/DvrPlaybackControlHelper.java12
-rw-r--r--src/com/android/tv/dvr/ui/DvrPlaybackOverlayFragment.java34
-rw-r--r--src/com/android/tv/dvr/ui/DvrScheduleFragment.java43
-rw-r--r--src/com/android/tv/dvr/ui/DvrSchedulesActivity.java86
-rw-r--r--src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java1
-rw-r--r--src/com/android/tv/dvr/ui/DvrSeriesScheduledDialogActivity.java48
-rw-r--r--src/com/android/tv/dvr/ui/DvrSeriesScheduledFragment.java154
-rw-r--r--src/com/android/tv/dvr/ui/DvrSeriesSettingsActivity.java40
-rw-r--r--src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java57
-rw-r--r--src/com/android/tv/dvr/ui/DvrStopSeriesRecordingDialogFragment.java (renamed from src/com/android/tv/dvr/ui/DvrCancelAllSeriesRecordingDialogFragment.java)6
-rw-r--r--src/com/android/tv/dvr/ui/DvrStopSeriesRecordingFragment.java104
-rw-r--r--src/com/android/tv/dvr/ui/HalfSizedDialogFragment.java37
-rw-r--r--src/com/android/tv/dvr/ui/PrioritySettingsFragment.java7
-rw-r--r--src/com/android/tv/dvr/ui/RecordedProgramDetailsFragment.java110
-rw-r--r--src/com/android/tv/dvr/ui/RecordedProgramPresenter.java30
-rw-r--r--src/com/android/tv/dvr/ui/RecordingCardView.java13
-rw-r--r--src/com/android/tv/dvr/ui/RecordingDetailsFragment.java13
-rw-r--r--src/com/android/tv/dvr/ui/ScheduledRecordingDetailsFragment.java2
-rw-r--r--src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java25
-rw-r--r--src/com/android/tv/dvr/ui/SeriesDeletionFragment.java13
-rw-r--r--src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java162
-rw-r--r--src/com/android/tv/dvr/ui/SeriesRecordingPresenter.java82
-rw-r--r--src/com/android/tv/dvr/ui/SeriesSettingsFragment.java221
-rw-r--r--src/com/android/tv/dvr/ui/SortedArrayAdapter.java5
-rw-r--r--src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java127
-rw-r--r--src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java35
-rw-r--r--src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java168
-rw-r--r--src/com/android/tv/dvr/ui/list/EpisodicProgramRow.java89
-rw-r--r--src/com/android/tv/dvr/ui/list/ScheduleRow.java176
-rw-r--r--src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java269
-rw-r--r--src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java909
-rw-r--r--src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java34
-rw-r--r--src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java139
-rw-r--r--src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java275
-rw-r--r--src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java98
-rw-r--r--src/com/android/tv/guide/ProgramGuide.java61
-rw-r--r--src/com/android/tv/guide/ProgramItemView.java42
-rw-r--r--src/com/android/tv/guide/ProgramManager.java24
-rw-r--r--src/com/android/tv/guide/ProgramRow.java100
-rw-r--r--src/com/android/tv/guide/ProgramTableAdapter.java92
-rw-r--r--src/com/android/tv/menu/ActionCardView.java2
-rw-r--r--src/com/android/tv/menu/AppLinkCardView.java73
-rw-r--r--src/com/android/tv/menu/BaseCardView.java109
-rw-r--r--src/com/android/tv/menu/ChannelCardView.java92
-rw-r--r--src/com/android/tv/menu/ChannelsRowAdapter.java7
-rw-r--r--src/com/android/tv/menu/Menu.java7
-rw-r--r--src/com/android/tv/menu/MenuRowView.java19
-rw-r--r--src/com/android/tv/menu/MenuUpdater.java96
-rw-r--r--src/com/android/tv/menu/MenuView.java23
-rw-r--r--src/com/android/tv/menu/PlayControlsButton.java1
-rw-r--r--src/com/android/tv/menu/PlayControlsRowView.java38
-rw-r--r--src/com/android/tv/menu/SetupCardView.java53
-rw-r--r--src/com/android/tv/menu/SimpleCardView.java10
-rw-r--r--src/com/android/tv/onboarding/NewSourcesFragment.java3
-rw-r--r--src/com/android/tv/onboarding/OnboardingActivity.java28
-rw-r--r--src/com/android/tv/setup/SystemSetupActivity.java124
-rw-r--r--src/com/android/tv/tuner/TunerPreferenceProvider.java2
-rw-r--r--src/com/android/tv/tuner/TunerPreferences.java24
-rw-r--r--src/com/android/tv/tuner/data/TunerChannel.java2
-rw-r--r--src/com/android/tv/tuner/exoplayer/DataSourceAdapter.java57
-rw-r--r--src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java290
-rw-r--r--src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java5
-rw-r--r--src/com/android/tv/tuner/exoplayer/FrameworkSampleExtractor.java283
-rw-r--r--src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java52
-rw-r--r--src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java4
-rw-r--r--src/com/android/tv/tuner/exoplayer/MpegTsSampleExtractor.java147
-rw-r--r--src/com/android/tv/tuner/exoplayer/MpegTsSampleSource.java3
-rw-r--r--src/com/android/tv/tuner/exoplayer/SampleExtractor.java15
-rw-r--r--src/com/android/tv/tuner/exoplayer/ac3/Ac3PassthroughTrackRenderer.java18
-rw-r--r--src/com/android/tv/tuner/exoplayer/ac3/Ac3TrackRenderer.java75
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java17
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java7
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java10
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java22
-rw-r--r--src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java22
-rw-r--r--src/com/android/tv/tuner/setup/ScanFragment.java53
-rw-r--r--src/com/android/tv/tuner/setup/ScanResultFragment.java6
-rw-r--r--src/com/android/tv/tuner/setup/TunerSetupActivity.java20
-rw-r--r--src/com/android/tv/tuner/source/FileTsStreamer.java51
-rw-r--r--src/com/android/tv/tuner/source/TsDataSource.java (renamed from src/com/android/tv/tuner/source/TsMediaDataSource.java)8
-rw-r--r--src/com/android/tv/tuner/source/TsDataSourceManager.java (renamed from src/com/android/tv/tuner/source/TsMediaDataSourceManager.java)37
-rw-r--r--src/com/android/tv/tuner/source/TsStreamWriter.java237
-rw-r--r--src/com/android/tv/tuner/source/TsStreamer.java6
-rw-r--r--src/com/android/tv/tuner/source/TunerTsStreamer.java83
-rw-r--r--src/com/android/tv/tuner/source/TunerTsStreamerManager.java14
-rw-r--r--src/com/android/tv/tuner/ts/SectionParser.java7
-rw-r--r--src/com/android/tv/tuner/tvinput/ChannelDataManager.java201
-rw-r--r--src/com/android/tv/tuner/tvinput/EventDetector.java9
-rw-r--r--src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java105
-rw-r--r--src/com/android/tv/tuner/tvinput/TunerSession.java12
-rw-r--r--src/com/android/tv/tuner/tvinput/TunerSessionWorker.java196
-rw-r--r--src/com/android/tv/tuner/tvinput/TunerStorageCleanUpService.java166
-rw-r--r--src/com/android/tv/tuner/tvinput/TunerTvInputService.java19
-rw-r--r--src/com/android/tv/tuner/util/GlobalSettingsUtils.java36
-rw-r--r--src/com/android/tv/ui/AppLayerTvView.java2
-rw-r--r--src/com/android/tv/ui/ChannelBannerView.java56
-rw-r--r--src/com/android/tv/ui/TunableTvView.java23
-rw-r--r--src/com/android/tv/ui/ViewUtils.java50
-rw-r--r--src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java30
-rw-r--r--src/com/android/tv/ui/sidepanel/SideFragment.java10
-rw-r--r--src/com/android/tv/ui/sidepanel/SideFragmentManager.java12
-rw-r--r--src/com/android/tv/util/AsyncDbTask.java4
-rw-r--r--src/com/android/tv/util/CompositeComparator.java42
-rw-r--r--src/com/android/tv/util/DvrTunerStorageUtils.java113
-rw-r--r--src/com/android/tv/util/LocationUtils.java99
-rw-r--r--src/com/android/tv/util/PermissionUtils.java7
-rw-r--r--src/com/android/tv/util/PipInputManager.java2
-rw-r--r--src/com/android/tv/util/RecurringRunner.java5
-rw-r--r--src/com/android/tv/util/SetupUtils.java43
-rw-r--r--src/com/android/tv/util/SystemProperties.java6
-rw-r--r--src/com/android/tv/util/ToastUtils.java43
-rw-r--r--src/com/android/tv/util/TvSettings.java4
-rw-r--r--src/com/android/tv/util/Utils.java16
-rw-r--r--tests/common/res/drawable-xhdpi/blue.pngbin3253 -> 152 bytes
-rw-r--r--tests/common/res/drawable-xhdpi/blue_small.pngbin1158 -> 109 bytes
-rw-r--r--tests/common/res/drawable-xhdpi/crash_test_android_logo.pngbin18721 -> 14828 bytes
-rw-r--r--tests/common/res/drawable-xhdpi/green.pngbin3253 -> 152 bytes
-rw-r--r--tests/common/res/drawable-xhdpi/green_large.pngbin10263 -> 327 bytes
-rw-r--r--tests/common/res/drawable-xhdpi/red.pngbin3252 -> 152 bytes
-rw-r--r--tests/common/res/drawable-xhdpi/red_large.pngbin10262 -> 327 bytes
-rw-r--r--tests/common/src/com/android/tv/testing/ChannelInfo.java2
-rw-r--r--tests/common/src/com/android/tv/testing/Constants.java2
-rw-r--r--tests/common/src/com/android/tv/testing/ProgramUtils.java10
-rw-r--r--tests/common/src/com/android/tv/testing/TvContentRatingConstants.java3
-rw-r--r--tests/input/res/drawable-xhdpi/android_48dp.pngbin5985 -> 5706 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_1000_logo.pngbin1499 -> 1041 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_100_logo.pngbin1548 -> 1128 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_101_logo.pngbin1252 -> 921 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_102_logo.pngbin1579 -> 1224 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_103_logo.pngbin1341 -> 971 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_104_logo.pngbin1280 -> 952 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_105_logo.pngbin1337 -> 977 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_106_logo.pngbin1098 -> 884 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_107_logo.pngbin1192 -> 910 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_108_logo.pngbin1041 -> 848 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_109_logo.pngbin1042 -> 842 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_10_logo.pngbin1200 -> 936 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_110_logo.pngbin1584 -> 1155 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_111_logo.pngbin1279 -> 915 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_112_logo.pngbin992 -> 843 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_113_logo.pngbin1472 -> 1064 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_114_logo.pngbin1152 -> 861 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_115_logo.pngbin1286 -> 995 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_116_logo.pngbin1512 -> 1086 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_117_logo.pngbin1270 -> 917 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_118_logo.pngbin1522 -> 1131 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_119_logo.pngbin1184 -> 875 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_11_logo.pngbin1266 -> 932 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_120_logo.pngbin1504 -> 1113 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_121_logo.pngbin838 -> 663 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_122_logo.pngbin1089 -> 845 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_123_logo.pngbin1504 -> 1090 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_124_logo.pngbin1362 -> 1033 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_125_logo.pngbin1137 -> 880 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_126_logo.pngbin1392 -> 1051 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_127_logo.pngbin1314 -> 1044 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_128_logo.pngbin1398 -> 1051 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_129_logo.pngbin1370 -> 983 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_12_logo.pngbin1481 -> 1014 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_130_logo.pngbin1245 -> 891 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_131_logo.pngbin1288 -> 975 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_132_logo.pngbin1280 -> 1076 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_133_logo.pngbin1307 -> 971 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_134_logo.pngbin1590 -> 1191 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_135_logo.pngbin1615 -> 1143 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_136_logo.pngbin1485 -> 1057 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_137_logo.pngbin1401 -> 1007 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_138_logo.pngbin1257 -> 995 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_139_logo.pngbin1497 -> 1137 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_13_logo.pngbin1201 -> 896 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_140_logo.pngbin1315 -> 1010 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_141_logo.pngbin1356 -> 970 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_142_logo.pngbin1497 -> 1103 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_143_logo.pngbin1507 -> 1206 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_144_logo.pngbin1419 -> 1023 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_145_logo.pngbin1474 -> 1037 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_146_logo.pngbin1278 -> 994 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_147_logo.pngbin1108 -> 828 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_148_logo.pngbin1248 -> 1009 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_149_logo.pngbin1110 -> 882 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_14_logo.pngbin1649 -> 1193 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_150_logo.pngbin1624 -> 1314 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_151_logo.pngbin1229 -> 931 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_152_logo.pngbin1394 -> 1030 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_153_logo.pngbin1703 -> 1245 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_154_logo.pngbin1378 -> 1017 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_155_logo.pngbin1818 -> 1317 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_156_logo.pngbin1430 -> 1080 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_157_logo.pngbin1562 -> 1126 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_158_logo.pngbin1542 -> 1223 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_159_logo.pngbin1638 -> 1362 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_15_logo.pngbin1549 -> 1123 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_160_logo.pngbin1396 -> 1059 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_161_logo.pngbin1439 -> 1074 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_162_logo.pngbin1327 -> 1015 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_163_logo.pngbin1472 -> 1093 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_164_logo.pngbin1532 -> 1073 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_165_logo.pngbin1326 -> 1001 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_166_logo.pngbin1721 -> 1276 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_167_logo.pngbin1647 -> 1184 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_168_logo.pngbin1216 -> 963 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_169_logo.pngbin1539 -> 1121 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_16_logo.pngbin1120 -> 877 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_170_logo.pngbin1145 -> 957 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_171_logo.pngbin1421 -> 978 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_172_logo.pngbin1282 -> 939 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_173_logo.pngbin1177 -> 906 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_174_logo.pngbin1221 -> 875 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_175_logo.pngbin1357 -> 974 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_176_logo.pngbin1509 -> 1146 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_177_logo.pngbin1370 -> 951 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_178_logo.pngbin1598 -> 1224 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_179_logo.pngbin1287 -> 948 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_17_logo.pngbin1366 -> 956 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_180_logo.pngbin1322 -> 980 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_181_logo.pngbin1230 -> 903 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_182_logo.pngbin1081 -> 854 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_183_logo.pngbin1164 -> 908 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_184_logo.pngbin967 -> 804 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_185_logo.pngbin1058 -> 840 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_186_logo.pngbin1651 -> 1238 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_187_logo.pngbin1547 -> 1137 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_188_logo.pngbin1102 -> 883 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_189_logo.pngbin1508 -> 1127 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_18_logo.pngbin1073 -> 903 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_190_logo.pngbin1281 -> 977 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_191_logo.pngbin1263 -> 984 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_192_logo.pngbin1565 -> 1131 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_193_logo.pngbin1421 -> 1050 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_194_logo.pngbin1557 -> 1164 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_195_logo.pngbin1224 -> 918 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_196_logo.pngbin1471 -> 1124 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_197_logo.pngbin914 -> 723 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_198_logo.pngbin1159 -> 929 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_199_logo.pngbin1427 -> 1072 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_19_logo.pngbin1448 -> 1011 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_1_logo.pngbin1446 -> 1009 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_200_logo.pngbin1313 -> 1019 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_201_logo.pngbin1153 -> 923 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_202_logo.pngbin1412 -> 1029 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_203_logo.pngbin1408 -> 1107 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_204_logo.pngbin1609 -> 1148 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_205_logo.pngbin1296 -> 954 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_206_logo.pngbin1379 -> 940 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_207_logo.pngbin1434 -> 1062 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_208_logo.pngbin1307 -> 1108 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_209_logo.pngbin1397 -> 1062 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_20_logo.pngbin1331 -> 973 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_210_logo.pngbin1697 -> 1230 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_211_logo.pngbin1512 -> 1048 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_212_logo.pngbin1336 -> 962 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_213_logo.pngbin1409 -> 1026 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_214_logo.pngbin1133 -> 888 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_215_logo.pngbin1458 -> 1121 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_216_logo.pngbin1367 -> 1038 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_217_logo.pngbin1530 -> 1058 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_218_logo.pngbin1512 -> 1124 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_219_logo.pngbin1551 -> 1277 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_21_logo.pngbin1087 -> 833 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_220_logo.pngbin1555 -> 1100 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_221_logo.pngbin1350 -> 972 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_222_logo.pngbin1292 -> 943 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_223_logo.pngbin1153 -> 850 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_224_logo.pngbin1199 -> 967 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_225_logo.pngbin1132 -> 898 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_226_logo.pngbin1577 -> 1287 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_227_logo.pngbin1380 -> 1013 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_228_logo.pngbin1348 -> 999 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_229_logo.pngbin1682 -> 1209 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_22_logo.pngbin1157 -> 814 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_230_logo.pngbin1469 -> 1073 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_231_logo.pngbin1853 -> 1371 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_232_logo.pngbin1425 -> 1038 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_233_logo.pngbin1750 -> 1234 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_234_logo.pngbin1364 -> 1122 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_235_logo.pngbin1653 -> 1351 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_236_logo.pngbin1444 -> 1089 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_237_logo.pngbin1535 -> 1143 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_238_logo.pngbin1302 -> 1028 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_239_logo.pngbin1464 -> 1116 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_23_logo.pngbin1249 -> 905 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_240_logo.pngbin1537 -> 1101 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_241_logo.pngbin1274 -> 959 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_242_logo.pngbin1649 -> 1238 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_243_logo.pngbin1548 -> 1137 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_244_logo.pngbin1089 -> 849 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_245_logo.pngbin1372 -> 1058 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_246_logo.pngbin1175 -> 991 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_247_logo.pngbin1368 -> 991 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_248_logo.pngbin1401 -> 1034 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_249_logo.pngbin1202 -> 942 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_24_logo.pngbin1438 -> 1073 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_250_logo.pngbin1285 -> 955 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_251_logo.pngbin1349 -> 966 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_252_logo.pngbin1415 -> 1048 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_253_logo.pngbin1495 -> 1084 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_254_logo.pngbin1576 -> 1231 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_255_logo.pngbin1257 -> 917 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_256_logo.pngbin1309 -> 999 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_257_logo.pngbin1297 -> 963 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_258_logo.pngbin1232 -> 968 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_259_logo.pngbin1238 -> 970 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_25_logo.pngbin1407 -> 994 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_260_logo.pngbin1034 -> 858 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_261_logo.pngbin1007 -> 809 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_262_logo.pngbin1609 -> 1179 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_263_logo.pngbin1585 -> 1170 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_264_logo.pngbin1094 -> 914 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_265_logo.pngbin1583 -> 1154 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_266_logo.pngbin1261 -> 947 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_267_logo.pngbin1230 -> 986 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_268_logo.pngbin1468 -> 1103 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_269_logo.pngbin1472 -> 1075 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_26_logo.pngbin1535 -> 1193 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_270_logo.pngbin1613 -> 1143 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_271_logo.pngbin1168 -> 872 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_272_logo.pngbin1445 -> 1057 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_273_logo.pngbin949 -> 748 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_274_logo.pngbin1133 -> 896 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_275_logo.pngbin1519 -> 1095 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_276_logo.pngbin1366 -> 1061 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_277_logo.pngbin1082 -> 847 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_278_logo.pngbin1456 -> 1079 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_279_logo.pngbin1289 -> 1008 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_27_logo.pngbin1236 -> 887 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_280_logo.pngbin1543 -> 1142 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_281_logo.pngbin1355 -> 980 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_282_logo.pngbin1177 -> 833 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_283_logo.pngbin1466 -> 1080 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_284_logo.pngbin1271 -> 1082 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_285_logo.pngbin1404 -> 1064 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_286_logo.pngbin1650 -> 1254 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_287_logo.pngbin1604 -> 1137 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_288_logo.pngbin1458 -> 1013 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_289_logo.pngbin1425 -> 1058 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_28_logo.pngbin1263 -> 928 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_290_logo.pngbin1262 -> 1002 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_291_logo.pngbin1474 -> 1121 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_292_logo.pngbin1262 -> 946 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_293_logo.pngbin1618 -> 1160 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_294_logo.pngbin1533 -> 1133 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_295_logo.pngbin1595 -> 1303 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_296_logo.pngbin1448 -> 1085 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_297_logo.pngbin1463 -> 1060 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_298_logo.pngbin1288 -> 1028 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_299_logo.pngbin1118 -> 842 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_29_logo.pngbin1192 -> 886 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_2_logo.pngbin1262 -> 907 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_300_logo.pngbin1144 -> 934 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_301_logo.pngbin1069 -> 887 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_302_logo.pngbin1641 -> 1338 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_303_logo.pngbin1407 -> 1055 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_304_logo.pngbin1388 -> 1045 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_305_logo.pngbin1736 -> 1282 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_306_logo.pngbin1338 -> 1027 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_307_logo.pngbin1724 -> 1272 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_308_logo.pngbin1480 -> 1115 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_309_logo.pngbin1807 -> 1324 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_30_logo.pngbin1125 -> 894 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_310_logo.pngbin1509 -> 1222 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_311_logo.pngbin1563 -> 1303 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_312_logo.pngbin1439 -> 1057 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_313_logo.pngbin1471 -> 1085 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_314_logo.pngbin1261 -> 990 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_315_logo.pngbin1494 -> 1109 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_316_logo.pngbin1580 -> 1109 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_317_logo.pngbin1293 -> 968 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_318_logo.pngbin1585 -> 1206 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_319_logo.pngbin1482 -> 1113 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_31_logo.pngbin1115 -> 858 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_320_logo.pngbin1249 -> 979 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_321_logo.pngbin1479 -> 1092 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_322_logo.pngbin1145 -> 939 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_323_logo.pngbin1465 -> 1017 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_324_logo.pngbin1381 -> 1008 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_325_logo.pngbin1229 -> 953 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_326_logo.pngbin1290 -> 966 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_327_logo.pngbin1404 -> 1000 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_328_logo.pngbin1652 -> 1205 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_329_logo.pngbin1467 -> 1073 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_32_logo.pngbin972 -> 781 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_330_logo.pngbin1563 -> 1201 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_331_logo.pngbin1256 -> 899 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_332_logo.pngbin1300 -> 946 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_333_logo.pngbin1220 -> 863 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_334_logo.pngbin1093 -> 857 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_335_logo.pngbin1210 -> 913 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_336_logo.pngbin985 -> 805 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_337_logo.pngbin1003 -> 773 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_338_logo.pngbin1598 -> 1167 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_339_logo.pngbin1513 -> 1110 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_33_logo.pngbin910 -> 708 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_340_logo.pngbin1092 -> 937 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_341_logo.pngbin1449 -> 1070 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_342_logo.pngbin1297 -> 984 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_343_logo.pngbin1303 -> 1010 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_344_logo.pngbin1508 -> 1091 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_345_logo.pngbin1345 -> 996 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_346_logo.pngbin1659 -> 1243 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_347_logo.pngbin1245 -> 920 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_348_logo.pngbin1529 -> 1103 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_349_logo.pngbin959 -> 770 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_34_logo.pngbin1537 -> 1137 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_350_logo.pngbin1194 -> 961 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_351_logo.pngbin1547 -> 1147 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_352_logo.pngbin1346 -> 1036 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_353_logo.pngbin1176 -> 920 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_354_logo.pngbin1456 -> 1075 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_355_logo.pngbin1292 -> 1010 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_356_logo.pngbin1624 -> 1176 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_357_logo.pngbin1374 -> 997 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_358_logo.pngbin1252 -> 910 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_359_logo.pngbin1473 -> 1102 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_35_logo.pngbin1407 -> 1038 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_360_logo.pngbin1279 -> 1119 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_361_logo.pngbin1350 -> 1025 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_362_logo.pngbin1711 -> 1264 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_363_logo.pngbin1518 -> 1099 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_364_logo.pngbin1429 -> 1032 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_365_logo.pngbin1294 -> 1014 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_366_logo.pngbin1239 -> 967 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_367_logo.pngbin1375 -> 1061 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_368_logo.pngbin1339 -> 1023 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_369_logo.pngbin1641 -> 1178 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_36_logo.pngbin1032 -> 847 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_370_logo.pngbin1552 -> 1148 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_371_logo.pngbin1528 -> 1249 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_372_logo.pngbin1565 -> 1137 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_373_logo.pngbin1422 -> 999 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_374_logo.pngbin1283 -> 989 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_375_logo.pngbin1187 -> 900 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_376_logo.pngbin1249 -> 1031 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_377_logo.pngbin1144 -> 886 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_378_logo.pngbin1652 -> 1334 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_379_logo.pngbin1420 -> 1099 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_37_logo.pngbin1489 -> 1060 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_380_logo.pngbin1331 -> 1009 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_381_logo.pngbin1642 -> 1223 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_382_logo.pngbin1470 -> 1072 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_383_logo.pngbin1719 -> 1249 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_384_logo.pngbin1412 -> 1083 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_385_logo.pngbin1845 -> 1344 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_386_logo.pngbin1530 -> 1244 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_387_logo.pngbin1671 -> 1380 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_388_logo.pngbin1334 -> 981 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_389_logo.pngbin1602 -> 1197 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_38_logo.pngbin1257 -> 938 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_390_logo.pngbin1252 -> 986 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_391_logo.pngbin1424 -> 1084 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_392_logo.pngbin1591 -> 1118 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_393_logo.pngbin1319 -> 981 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_394_logo.pngbin1636 -> 1231 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_395_logo.pngbin1661 -> 1243 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_396_logo.pngbin1253 -> 995 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_397_logo.pngbin1532 -> 1118 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_398_logo.pngbin1244 -> 1014 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_399_logo.pngbin1487 -> 1049 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_39_logo.pngbin1296 -> 1014 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_3_logo.pngbin1717 -> 1160 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_400_logo.pngbin1317 -> 974 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_401_logo.pngbin1114 -> 862 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_402_logo.pngbin1302 -> 945 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_403_logo.pngbin1361 -> 1004 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_404_logo.pngbin1484 -> 1106 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_405_logo.pngbin1422 -> 1051 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_406_logo.pngbin1543 -> 1184 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_407_logo.pngbin1234 -> 910 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_408_logo.pngbin1325 -> 992 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_409_logo.pngbin1339 -> 988 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_40_logo.pngbin1507 -> 1078 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_410_logo.pngbin1150 -> 915 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_411_logo.pngbin1091 -> 842 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_412_logo.pngbin1003 -> 814 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_413_logo.pngbin1032 -> 817 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_414_logo.pngbin1536 -> 1120 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_415_logo.pngbin1522 -> 1116 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_416_logo.pngbin1126 -> 923 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_417_logo.pngbin1433 -> 1044 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_418_logo.pngbin1234 -> 946 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_419_logo.pngbin1334 -> 1045 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_41_logo.pngbin1195 -> 857 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_420_logo.pngbin1399 -> 1056 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_421_logo.pngbin1380 -> 1003 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_422_logo.pngbin1595 -> 1154 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_423_logo.pngbin1235 -> 921 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_424_logo.pngbin1457 -> 1069 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_425_logo.pngbin948 -> 744 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_426_logo.pngbin1160 -> 923 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_427_logo.pngbin1511 -> 1113 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_428_logo.pngbin1400 -> 1073 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_429_logo.pngbin1179 -> 940 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_42_logo.pngbin1563 -> 1135 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_430_logo.pngbin1414 -> 1072 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_431_logo.pngbin1344 -> 1059 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_432_logo.pngbin1620 -> 1149 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_433_logo.pngbin1330 -> 933 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_434_logo.pngbin1308 -> 867 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_435_logo.pngbin1403 -> 1055 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_436_logo.pngbin1228 -> 1039 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_437_logo.pngbin1362 -> 1012 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_438_logo.pngbin1634 -> 1241 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_439_logo.pngbin1563 -> 1134 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_43_logo.pngbin1092 -> 810 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_440_logo.pngbin1372 -> 987 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_441_logo.pngbin1227 -> 905 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_442_logo.pngbin1165 -> 906 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_443_logo.pngbin1424 -> 1071 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_444_logo.pngbin1167 -> 871 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_445_logo.pngbin1555 -> 1073 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_446_logo.pngbin1484 -> 1083 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_447_logo.pngbin1463 -> 1196 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_448_logo.pngbin1500 -> 1077 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_449_logo.pngbin1428 -> 1012 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_44_logo.pngbin1332 -> 966 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_450_logo.pngbin1351 -> 1066 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_451_logo.pngbin1119 -> 845 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_452_logo.pngbin1278 -> 1028 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_453_logo.pngbin1176 -> 946 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_454_logo.pngbin1511 -> 1228 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_455_logo.pngbin1374 -> 1035 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_456_logo.pngbin1398 -> 1061 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_457_logo.pngbin1643 -> 1162 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_458_logo.pngbin1457 -> 1067 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_459_logo.pngbin1885 -> 1384 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_45_logo.pngbin851 -> 674 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_460_logo.pngbin1464 -> 1087 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_461_logo.pngbin1717 -> 1234 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_462_logo.pngbin1526 -> 1212 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_463_logo.pngbin1654 -> 1360 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_464_logo.pngbin1384 -> 1024 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_465_logo.pngbin1559 -> 1159 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_466_logo.pngbin1223 -> 973 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_467_logo.pngbin1456 -> 1079 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_468_logo.pngbin1535 -> 1113 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_469_logo.pngbin1310 -> 1011 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_46_logo.pngbin1031 -> 815 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_470_logo.pngbin1694 -> 1271 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_471_logo.pngbin1559 -> 1096 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_472_logo.pngbin1184 -> 925 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_473_logo.pngbin1542 -> 1104 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_474_logo.pngbin1073 -> 892 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_475_logo.pngbin1542 -> 1065 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_476_logo.pngbin1375 -> 1012 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_477_logo.pngbin1097 -> 833 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_478_logo.pngbin1298 -> 936 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_479_logo.pngbin1387 -> 991 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_47_logo.pngbin1438 -> 1054 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_480_logo.pngbin1584 -> 1193 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_481_logo.pngbin1369 -> 1001 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_482_logo.pngbin1557 -> 1242 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_483_logo.pngbin1326 -> 981 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_484_logo.pngbin1203 -> 870 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_485_logo.pngbin1352 -> 992 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_486_logo.pngbin1115 -> 899 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_487_logo.pngbin1198 -> 930 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_488_logo.pngbin983 -> 790 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_489_logo.pngbin1042 -> 846 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_48_logo.pngbin1316 -> 1008 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_490_logo.pngbin1643 -> 1228 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_491_logo.pngbin1534 -> 1125 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_492_logo.pngbin1134 -> 940 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_493_logo.pngbin1604 -> 1151 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_494_logo.pngbin1139 -> 866 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_495_logo.pngbin1372 -> 1072 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_496_logo.pngbin1572 -> 1155 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_497_logo.pngbin1270 -> 945 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_498_logo.pngbin1656 -> 1241 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_499_logo.pngbin1201 -> 873 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_49_logo.pngbin1104 -> 872 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_4_logo.pngbin1190 -> 852 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_500_logo.pngbin1367 -> 1022 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_501_logo.pngbin920 -> 745 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_502_logo.pngbin1194 -> 944 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_503_logo.pngbin1554 -> 1198 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_504_logo.pngbin1405 -> 1087 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_505_logo.pngbin1180 -> 928 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_506_logo.pngbin1446 -> 1104 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_507_logo.pngbin1357 -> 1088 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_508_logo.pngbin1503 -> 1109 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_509_logo.pngbin1299 -> 973 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_50_logo.pngbin1343 -> 992 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_510_logo.pngbin1375 -> 935 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_511_logo.pngbin1326 -> 981 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_512_logo.pngbin1285 -> 1078 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_513_logo.pngbin1438 -> 1065 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_514_logo.pngbin1522 -> 1132 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_515_logo.pngbin1505 -> 1066 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_516_logo.pngbin1481 -> 1061 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_517_logo.pngbin1389 -> 1005 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_518_logo.pngbin1253 -> 975 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_519_logo.pngbin1504 -> 1143 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_51_logo.pngbin1300 -> 1003 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_520_logo.pngbin1405 -> 1064 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_521_logo.pngbin1586 -> 1123 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_522_logo.pngbin1509 -> 1086 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_523_logo.pngbin1600 -> 1308 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_524_logo.pngbin1559 -> 1129 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_525_logo.pngbin1410 -> 1021 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_526_logo.pngbin1295 -> 1020 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_527_logo.pngbin1162 -> 879 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_528_logo.pngbin1271 -> 1043 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_529_logo.pngbin1182 -> 961 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_52_logo.pngbin1526 -> 1083 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_530_logo.pngbin1594 -> 1332 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_531_logo.pngbin1375 -> 1071 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_532_logo.pngbin1433 -> 1071 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_533_logo.pngbin1683 -> 1211 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_534_logo.pngbin1422 -> 1058 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_535_logo.pngbin1922 -> 1380 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_536_logo.pngbin1490 -> 1124 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_537_logo.pngbin1788 -> 1298 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_538_logo.pngbin1592 -> 1273 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_539_logo.pngbin1679 -> 1391 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_53_logo.pngbin1281 -> 938 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_540_logo.pngbin1422 -> 1086 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_541_logo.pngbin1523 -> 1127 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_542_logo.pngbin1303 -> 1026 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_543_logo.pngbin1514 -> 1113 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_544_logo.pngbin1530 -> 1059 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_545_logo.pngbin1273 -> 949 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_546_logo.pngbin1795 -> 1343 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_547_logo.pngbin1612 -> 1138 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_548_logo.pngbin1201 -> 975 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_549_logo.pngbin1545 -> 1144 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_54_logo.pngbin1168 -> 808 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_550_logo.pngbin1094 -> 923 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_551_logo.pngbin1342 -> 953 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_552_logo.pngbin1426 -> 1005 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_553_logo.pngbin1193 -> 918 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_554_logo.pngbin1225 -> 892 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_555_logo.pngbin1290 -> 903 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_556_logo.pngbin1570 -> 1172 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_557_logo.pngbin1456 -> 1005 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_558_logo.pngbin1609 -> 1241 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_559_logo.pngbin1323 -> 963 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_55_logo.pngbin1336 -> 951 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_560_logo.pngbin1320 -> 1011 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_561_logo.pngbin1313 -> 968 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_562_logo.pngbin1221 -> 962 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_563_logo.pngbin1259 -> 982 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_564_logo.pngbin1041 -> 854 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_565_logo.pngbin1042 -> 827 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_566_logo.pngbin1600 -> 1186 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_567_logo.pngbin1542 -> 1145 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_568_logo.pngbin1182 -> 984 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_569_logo.pngbin1527 -> 1134 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_56_logo.pngbin1123 -> 967 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_570_logo.pngbin1296 -> 992 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_571_logo.pngbin1292 -> 1012 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_572_logo.pngbin1576 -> 1138 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_573_logo.pngbin1347 -> 995 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_574_logo.pngbin1596 -> 1169 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_575_logo.pngbin1163 -> 853 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_576_logo.pngbin1548 -> 1148 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_577_logo.pngbin870 -> 684 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_578_logo.pngbin1184 -> 932 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_579_logo.pngbin1558 -> 1159 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_57_logo.pngbin1336 -> 981 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_580_logo.pngbin1435 -> 1107 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_581_logo.pngbin1164 -> 939 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_582_logo.pngbin1479 -> 1093 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_583_logo.pngbin1364 -> 1066 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_584_logo.pngbin1529 -> 1134 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_585_logo.pngbin1341 -> 960 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_586_logo.pngbin1295 -> 925 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_587_logo.pngbin1452 -> 1079 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_588_logo.pngbin1258 -> 1053 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_589_logo.pngbin1418 -> 1081 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_58_logo.pngbin1641 -> 1193 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_590_logo.pngbin1646 -> 1258 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_591_logo.pngbin1623 -> 1137 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_592_logo.pngbin1507 -> 1072 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_593_logo.pngbin1446 -> 1071 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_594_logo.pngbin1259 -> 988 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_595_logo.pngbin1476 -> 1106 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_596_logo.pngbin1402 -> 1089 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_597_logo.pngbin1585 -> 1132 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_598_logo.pngbin1563 -> 1164 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_599_logo.pngbin1533 -> 1257 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_59_logo.pngbin1583 -> 1097 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_5_logo.pngbin1620 -> 1137 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_600_logo.pngbin1544 -> 1107 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_601_logo.pngbin1449 -> 1059 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_602_logo.pngbin1401 -> 1078 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_603_logo.pngbin1198 -> 925 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_604_logo.pngbin1160 -> 961 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_605_logo.pngbin1229 -> 977 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_606_logo.pngbin1458 -> 1217 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_607_logo.pngbin1456 -> 1094 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_608_logo.pngbin1359 -> 1050 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_609_logo.pngbin1730 -> 1273 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_60_logo.pngbin1318 -> 958 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_610_logo.pngbin1348 -> 1009 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_611_logo.pngbin1851 -> 1320 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_612_logo.pngbin1434 -> 1076 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_613_logo.pngbin1787 -> 1300 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_614_logo.pngbin1468 -> 1185 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_615_logo.pngbin1632 -> 1360 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_616_logo.pngbin1311 -> 985 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_617_logo.pngbin1476 -> 1113 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_618_logo.pngbin1300 -> 1026 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_619_logo.pngbin1357 -> 1031 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_61_logo.pngbin1223 -> 898 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_620_logo.pngbin1606 -> 1127 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_621_logo.pngbin1299 -> 975 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_622_logo.pngbin1735 -> 1268 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_623_logo.pngbin1710 -> 1233 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_624_logo.pngbin1223 -> 954 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_625_logo.pngbin1373 -> 1064 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_626_logo.pngbin1076 -> 931 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_627_logo.pngbin1500 -> 1068 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_628_logo.pngbin1305 -> 994 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_629_logo.pngbin1155 -> 911 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_62_logo.pngbin1179 -> 926 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_630_logo.pngbin1299 -> 974 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_631_logo.pngbin1391 -> 1006 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_632_logo.pngbin1630 -> 1207 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_633_logo.pngbin1414 -> 1019 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_634_logo.pngbin1540 -> 1185 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_635_logo.pngbin1373 -> 1005 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_636_logo.pngbin1290 -> 950 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_637_logo.pngbin1267 -> 942 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_638_logo.pngbin1226 -> 977 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_639_logo.pngbin1256 -> 982 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_63_logo.pngbin1394 -> 1070 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_640_logo.pngbin1045 -> 861 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_641_logo.pngbin1014 -> 811 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_642_logo.pngbin1656 -> 1230 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_643_logo.pngbin1582 -> 1172 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_644_logo.pngbin1062 -> 883 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_645_logo.pngbin1430 -> 1078 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_646_logo.pngbin1179 -> 878 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_647_logo.pngbin1289 -> 1026 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_648_logo.pngbin1564 -> 1161 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_649_logo.pngbin1453 -> 1068 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_64_logo.pngbin1281 -> 976 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_650_logo.pngbin1687 -> 1263 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_651_logo.pngbin1202 -> 910 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_652_logo.pngbin1498 -> 1138 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_653_logo.pngbin985 -> 777 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_654_logo.pngbin1106 -> 894 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_655_logo.pngbin1401 -> 1052 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_656_logo.pngbin1360 -> 1049 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_657_logo.pngbin1167 -> 937 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_658_logo.pngbin1489 -> 1120 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_659_logo.pngbin1437 -> 1134 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_65_logo.pngbin1504 -> 1048 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_660_logo.pngbin1490 -> 1107 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_661_logo.pngbin1280 -> 929 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_662_logo.pngbin1299 -> 887 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_663_logo.pngbin1410 -> 1039 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_664_logo.pngbin1213 -> 1033 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_665_logo.pngbin1401 -> 1036 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_666_logo.pngbin1575 -> 1134 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_667_logo.pngbin1557 -> 1087 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_668_logo.pngbin1449 -> 1032 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_669_logo.pngbin1400 -> 1029 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_66_logo.pngbin1360 -> 1023 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_670_logo.pngbin1253 -> 974 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_671_logo.pngbin1441 -> 1103 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_672_logo.pngbin1350 -> 1016 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_673_logo.pngbin1635 -> 1157 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_674_logo.pngbin1525 -> 1118 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_675_logo.pngbin1587 -> 1288 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_676_logo.pngbin1445 -> 1064 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_677_logo.pngbin1422 -> 1012 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_678_logo.pngbin1394 -> 1081 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_679_logo.pngbin1157 -> 898 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_67_logo.pngbin1493 -> 1208 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_680_logo.pngbin1283 -> 1061 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_681_logo.pngbin1099 -> 901 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_682_logo.pngbin1667 -> 1340 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_683_logo.pngbin1482 -> 1123 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_684_logo.pngbin1382 -> 1045 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_685_logo.pngbin1631 -> 1220 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_686_logo.pngbin1388 -> 1042 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_687_logo.pngbin1923 -> 1417 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_688_logo.pngbin1408 -> 1052 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_689_logo.pngbin1817 -> 1331 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_68_logo.pngbin1526 -> 1106 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_690_logo.pngbin1576 -> 1253 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_691_logo.pngbin1639 -> 1359 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_692_logo.pngbin1425 -> 1079 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_693_logo.pngbin1544 -> 1169 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_694_logo.pngbin1304 -> 1025 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_695_logo.pngbin1532 -> 1136 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_696_logo.pngbin1559 -> 1078 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_697_logo.pngbin1337 -> 1014 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_698_logo.pngbin1818 -> 1366 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_699_logo.pngbin1647 -> 1191 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_69_logo.pngbin1426 -> 1035 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_6_logo.pngbin1215 -> 1002 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_700_logo.pngbin1166 -> 910 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_701_logo.pngbin1486 -> 1088 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_702_logo.pngbin1179 -> 967 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_703_logo.pngbin1516 -> 1079 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_704_logo.pngbin1358 -> 986 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_705_logo.pngbin1187 -> 926 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_706_logo.pngbin1294 -> 952 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_707_logo.pngbin1312 -> 928 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_708_logo.pngbin1457 -> 1089 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_709_logo.pngbin1475 -> 1062 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_70_logo.pngbin1336 -> 996 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_710_logo.pngbin1513 -> 1152 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_711_logo.pngbin1192 -> 855 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_712_logo.pngbin1281 -> 944 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_713_logo.pngbin1296 -> 952 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_714_logo.pngbin1089 -> 861 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_715_logo.pngbin1193 -> 918 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_716_logo.pngbin1009 -> 827 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_717_logo.pngbin938 -> 736 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_718_logo.pngbin1618 -> 1183 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_719_logo.pngbin1519 -> 1115 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_71_logo.pngbin1036 -> 770 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_720_logo.pngbin1145 -> 927 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_721_logo.pngbin1483 -> 1080 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_722_logo.pngbin1246 -> 909 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_723_logo.pngbin1304 -> 1002 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_724_logo.pngbin1541 -> 1110 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_725_logo.pngbin1421 -> 1037 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_726_logo.pngbin1601 -> 1195 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_727_logo.pngbin1129 -> 814 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_728_logo.pngbin1547 -> 1129 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_729_logo.pngbin935 -> 743 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_72_logo.pngbin1151 -> 919 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_730_logo.pngbin1151 -> 921 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_731_logo.pngbin1511 -> 1122 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_732_logo.pngbin1370 -> 1054 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_733_logo.pngbin1110 -> 865 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_734_logo.pngbin1440 -> 1052 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_735_logo.pngbin1397 -> 1086 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_736_logo.pngbin1529 -> 1135 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_737_logo.pngbin1290 -> 911 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_738_logo.pngbin1408 -> 936 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_739_logo.pngbin1462 -> 1081 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_73_logo.pngbin1091 -> 861 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_740_logo.pngbin1204 -> 1011 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_741_logo.pngbin1310 -> 982 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_742_logo.pngbin1616 -> 1149 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_743_logo.pngbin1608 -> 1119 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_744_logo.pngbin1328 -> 944 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_745_logo.pngbin1314 -> 967 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_746_logo.pngbin1214 -> 958 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_747_logo.pngbin1379 -> 1035 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_748_logo.pngbin1350 -> 1023 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_749_logo.pngbin1589 -> 1105 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_74_logo.pngbin1384 -> 1126 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_750_logo.pngbin1575 -> 1147 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_751_logo.pngbin1544 -> 1249 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_752_logo.pngbin1537 -> 1117 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_753_logo.pngbin1493 -> 1070 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_754_logo.pngbin1370 -> 1040 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_755_logo.pngbin1144 -> 837 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_756_logo.pngbin1271 -> 1032 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_757_logo.pngbin1143 -> 879 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_758_logo.pngbin1475 -> 1220 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_759_logo.pngbin1463 -> 1088 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_75_logo.pngbin1337 -> 993 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_760_logo.pngbin1370 -> 1047 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_761_logo.pngbin1646 -> 1201 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_762_logo.pngbin1409 -> 1033 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_763_logo.pngbin1789 -> 1294 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_764_logo.pngbin1418 -> 1059 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_765_logo.pngbin1778 -> 1271 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_766_logo.pngbin1441 -> 1153 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_767_logo.pngbin1612 -> 1309 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_768_logo.pngbin1456 -> 1081 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_769_logo.pngbin1563 -> 1162 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_76_logo.pngbin1324 -> 977 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_770_logo.pngbin1157 -> 897 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_771_logo.pngbin1338 -> 990 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_772_logo.pngbin1515 -> 1034 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_773_logo.pngbin1256 -> 933 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_774_logo.pngbin1677 -> 1208 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_775_logo.pngbin1483 -> 1064 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_776_logo.pngbin1181 -> 912 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_777_logo.pngbin1305 -> 943 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_778_logo.pngbin1127 -> 924 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_779_logo.pngbin1487 -> 1025 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_77_logo.pngbin1543 -> 1091 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_780_logo.pngbin1429 -> 1033 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_781_logo.pngbin1156 -> 904 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_782_logo.pngbin1235 -> 899 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_783_logo.pngbin1401 -> 1013 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_784_logo.pngbin1543 -> 1153 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_785_logo.pngbin1447 -> 1052 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_786_logo.pngbin1586 -> 1264 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_787_logo.pngbin1281 -> 910 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_788_logo.pngbin1288 -> 931 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_789_logo.pngbin1340 -> 983 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_78_logo.pngbin1328 -> 969 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_790_logo.pngbin1188 -> 943 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_791_logo.pngbin1112 -> 864 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_792_logo.pngbin1043 -> 838 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_793_logo.pngbin1046 -> 843 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_794_logo.pngbin1605 -> 1175 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_795_logo.pngbin1482 -> 1087 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_796_logo.pngbin1112 -> 934 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_797_logo.pngbin1514 -> 1075 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_798_logo.pngbin1301 -> 986 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_799_logo.pngbin1316 -> 1010 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_79_logo.pngbin1806 -> 1300 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_7_logo.pngbin1484 -> 1196 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_800_logo.pngbin1573 -> 1135 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_801_logo.pngbin1418 -> 1043 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_802_logo.pngbin1681 -> 1254 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_803_logo.pngbin1228 -> 931 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_804_logo.pngbin1523 -> 1145 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_805_logo.pngbin983 -> 778 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_806_logo.pngbin1186 -> 964 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_807_logo.pngbin1551 -> 1157 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_808_logo.pngbin1362 -> 1047 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_809_logo.pngbin1231 -> 982 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_80_logo.pngbin1406 -> 1035 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_810_logo.pngbin1448 -> 1079 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_811_logo.pngbin1224 -> 960 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_812_logo.pngbin1573 -> 1154 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_813_logo.pngbin1365 -> 1006 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_814_logo.pngbin1168 -> 849 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_815_logo.pngbin1394 -> 1054 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_816_logo.pngbin1273 -> 1093 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_817_logo.pngbin1392 -> 1031 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_818_logo.pngbin1586 -> 1164 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_819_logo.pngbin1535 -> 1132 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_81_logo.pngbin1680 -> 1191 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_820_logo.pngbin1514 -> 1066 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_821_logo.pngbin1389 -> 1012 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_822_logo.pngbin1232 -> 947 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_823_logo.pngbin1510 -> 1151 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_824_logo.pngbin1300 -> 984 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_825_logo.pngbin1452 -> 1086 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_826_logo.pngbin1560 -> 1161 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_827_logo.pngbin1570 -> 1283 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_828_logo.pngbin1544 -> 1100 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_829_logo.pngbin1521 -> 1100 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_82_logo.pngbin1423 -> 1151 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_830_logo.pngbin1300 -> 1034 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_831_logo.pngbin1152 -> 885 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_832_logo.pngbin1304 -> 1056 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_833_logo.pngbin1156 -> 924 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_834_logo.pngbin1640 -> 1339 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_835_logo.pngbin1425 -> 1111 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_836_logo.pngbin1391 -> 1075 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_837_logo.pngbin1725 -> 1251 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_838_logo.pngbin1426 -> 1026 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_839_logo.pngbin1980 -> 1448 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_83_logo.pngbin1588 -> 1315 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_840_logo.pngbin1467 -> 1102 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_841_logo.pngbin1744 -> 1254 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_842_logo.pngbin1484 -> 1209 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_843_logo.pngbin1646 -> 1346 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_844_logo.pngbin1361 -> 985 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_845_logo.pngbin1469 -> 1095 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_846_logo.pngbin1346 -> 1056 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_847_logo.pngbin1349 -> 1008 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_848_logo.pngbin1508 -> 1057 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_849_logo.pngbin1313 -> 1018 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_84_logo.pngbin1324 -> 991 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_850_logo.pngbin1811 -> 1347 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_851_logo.pngbin1647 -> 1196 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_852_logo.pngbin1197 -> 941 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_853_logo.pngbin1575 -> 1156 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_854_logo.pngbin1158 -> 986 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_855_logo.pngbin1529 -> 1071 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_856_logo.pngbin1457 -> 1074 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_857_logo.pngbin1210 -> 942 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_858_logo.pngbin1280 -> 920 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_859_logo.pngbin1435 -> 1046 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_85_logo.pngbin1476 -> 1104 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_860_logo.pngbin1581 -> 1210 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_861_logo.pngbin1384 -> 1032 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_862_logo.pngbin1541 -> 1263 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_863_logo.pngbin1389 -> 1015 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_864_logo.pngbin1319 -> 989 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_865_logo.pngbin1359 -> 1014 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_866_logo.pngbin1176 -> 923 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_867_logo.pngbin1226 -> 961 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_868_logo.pngbin1016 -> 824 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_869_logo.pngbin1060 -> 875 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_86_logo.pngbin1214 -> 975 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_870_logo.pngbin1503 -> 1125 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_871_logo.pngbin1536 -> 1121 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_872_logo.pngbin1142 -> 937 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_873_logo.pngbin1530 -> 1131 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_874_logo.pngbin1242 -> 944 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_875_logo.pngbin1314 -> 1026 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_876_logo.pngbin1519 -> 1149 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_877_logo.pngbin1344 -> 977 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_878_logo.pngbin1463 -> 1075 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_879_logo.pngbin1242 -> 941 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_87_logo.pngbin1316 -> 959 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_880_logo.pngbin1450 -> 1081 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_881_logo.pngbin858 -> 679 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_882_logo.pngbin1120 -> 883 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_883_logo.pngbin1541 -> 1127 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_884_logo.pngbin1360 -> 1028 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_885_logo.pngbin1153 -> 904 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_886_logo.pngbin1427 -> 1046 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_887_logo.pngbin1364 -> 1040 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_888_logo.pngbin1473 -> 1030 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_889_logo.pngbin1333 -> 961 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_88_logo.pngbin1418 -> 982 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_890_logo.pngbin1395 -> 954 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_891_logo.pngbin1433 -> 1070 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_892_logo.pngbin1242 -> 1055 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_893_logo.pngbin1467 -> 1092 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_894_logo.pngbin1627 -> 1237 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_895_logo.pngbin1464 -> 1100 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_896_logo.pngbin1526 -> 1095 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_897_logo.pngbin1423 -> 1040 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_898_logo.pngbin1239 -> 959 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_899_logo.pngbin1475 -> 1099 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_89_logo.pngbin1239 -> 939 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_8_logo.pngbin1274 -> 914 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_900_logo.pngbin1346 -> 1021 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_901_logo.pngbin1515 -> 1121 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_902_logo.pngbin1577 -> 1157 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_903_logo.pngbin1611 -> 1307 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_904_logo.pngbin1582 -> 1151 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_905_logo.pngbin1521 -> 1106 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_906_logo.pngbin1418 -> 1102 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_907_logo.pngbin1193 -> 900 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_908_logo.pngbin1274 -> 1054 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_909_logo.pngbin1163 -> 928 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_90_logo.pngbin1675 -> 1252 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_910_logo.pngbin1459 -> 1225 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_911_logo.pngbin1367 -> 1016 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_912_logo.pngbin1345 -> 1002 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_913_logo.pngbin1683 -> 1245 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_914_logo.pngbin1406 -> 1030 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_915_logo.pngbin1885 -> 1384 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_916_logo.pngbin1423 -> 1095 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_917_logo.pngbin1757 -> 1259 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_918_logo.pngbin1546 -> 1229 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_919_logo.pngbin1568 -> 1311 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_91_logo.pngbin1541 -> 1121 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_920_logo.pngbin1348 -> 1011 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_921_logo.pngbin1512 -> 1133 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_922_logo.pngbin1171 -> 913 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_923_logo.pngbin1508 -> 1119 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_924_logo.pngbin1571 -> 1104 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_925_logo.pngbin1341 -> 1027 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_926_logo.pngbin1799 -> 1346 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_927_logo.pngbin1536 -> 1126 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_928_logo.pngbin1268 -> 989 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_929_logo.pngbin1523 -> 1088 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_92_logo.pngbin1153 -> 907 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_930_logo.pngbin1200 -> 1017 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_931_logo.pngbin1408 -> 1008 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_932_logo.pngbin1402 -> 1047 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_933_logo.pngbin1186 -> 908 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_934_logo.pngbin1231 -> 912 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_935_logo.pngbin1422 -> 1041 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_936_logo.pngbin1574 -> 1219 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_937_logo.pngbin1488 -> 1065 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_938_logo.pngbin1464 -> 1194 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_939_logo.pngbin1234 -> 908 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_93_logo.pngbin1486 -> 1077 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_940_logo.pngbin1344 -> 1009 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_941_logo.pngbin1221 -> 913 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_942_logo.pngbin1176 -> 947 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_943_logo.pngbin1260 -> 971 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_944_logo.pngbin989 -> 795 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_945_logo.pngbin1069 -> 850 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_946_logo.pngbin1668 -> 1255 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_947_logo.pngbin1548 -> 1135 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_948_logo.pngbin1098 -> 942 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_949_logo.pngbin1528 -> 1091 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_94_logo.pngbin1113 -> 913 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_950_logo.pngbin1297 -> 997 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_951_logo.pngbin1357 -> 1060 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_952_logo.pngbin1561 -> 1153 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_953_logo.pngbin1431 -> 1057 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_954_logo.pngbin1665 -> 1233 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_955_logo.pngbin1247 -> 901 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_956_logo.pngbin1571 -> 1177 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_957_logo.pngbin961 -> 751 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_958_logo.pngbin1209 -> 965 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_959_logo.pngbin1504 -> 1125 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_95_logo.pngbin1489 -> 1048 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_960_logo.pngbin1401 -> 1102 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_961_logo.pngbin1178 -> 943 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_962_logo.pngbin1486 -> 1107 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_963_logo.pngbin1436 -> 1138 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_964_logo.pngbin1623 -> 1173 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_965_logo.pngbin1385 -> 1024 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_966_logo.pngbin1305 -> 904 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_967_logo.pngbin1368 -> 1020 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_968_logo.pngbin1253 -> 1074 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_969_logo.pngbin1357 -> 1022 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_96_logo.pngbin1337 -> 989 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_970_logo.pngbin1506 -> 1164 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_971_logo.pngbin1563 -> 1103 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_972_logo.pngbin1469 -> 1054 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_973_logo.pngbin1434 -> 1044 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_974_logo.pngbin1233 -> 966 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_975_logo.pngbin1474 -> 1098 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_976_logo.pngbin1387 -> 1068 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_977_logo.pngbin1486 -> 1062 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_978_logo.pngbin1579 -> 1157 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_979_logo.pngbin1508 -> 1234 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_97_logo.pngbin1125 -> 861 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_980_logo.pngbin1635 -> 1188 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_981_logo.pngbin1474 -> 1069 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_982_logo.pngbin1397 -> 1087 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_983_logo.pngbin1205 -> 920 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_984_logo.pngbin1278 -> 1041 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_985_logo.pngbin1227 -> 984 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_986_logo.pngbin1615 -> 1346 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_987_logo.pngbin1450 -> 1091 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_988_logo.pngbin1347 -> 1001 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_989_logo.pngbin1643 -> 1201 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_98_logo.pngbin1216 -> 902 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_990_logo.pngbin1419 -> 1027 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_991_logo.pngbin1850 -> 1334 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_992_logo.pngbin1438 -> 1055 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_993_logo.pngbin1769 -> 1252 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_994_logo.pngbin1487 -> 1168 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_995_logo.pngbin1605 -> 1305 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_996_logo.pngbin1413 -> 1047 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_997_logo.pngbin1513 -> 1104 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_998_logo.pngbin1289 -> 996 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_999_logo.pngbin1386 -> 999 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_99_logo.pngbin1287 -> 900 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/ch_9_logo.pngbin1414 -> 1031 bytes
-rw-r--r--tests/input/res/drawable-xhdpi/icon.pngbin3641 -> 272 bytes
-rw-r--r--tests/unit/Android.mk2
-rw-r--r--tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java13
-rw-r--r--tests/unit/src/com/android/tv/dvr/DvrDbSyncTest.java5
-rw-r--r--tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java166
-rw-r--r--tests/unit/src/com/android/tv/dvr/EpisodicProgramLoadTaskTest.java76
-rw-r--r--tests/unit/src/com/android/tv/dvr/RecordingTaskTest.java6
-rw-r--r--tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java6
-rw-r--r--tests/unit/src/com/android/tv/dvr/SchedulerTest.java1
-rw-r--r--tests/unit/src/com/android/tv/dvr/SeriesRecordingSchedulerTest.java46
-rw-r--r--usbtuner-res/drawable-xhdpi/ic_setup_antenna.pngbin2637 -> 1264 bytes
-rw-r--r--usbtuner-res/drawable-xhdpi/recommendation_antenna.pngbin1664 -> 1662 bytes
-rw-r--r--usbtuner-res/drawable-xhdpi/usb_antenna.pngbin2897 -> 1639 bytes
-rw-r--r--usbtuner-res/values-af/strings.xml3
-rw-r--r--usbtuner-res/values-am/strings.xml3
-rw-r--r--usbtuner-res/values-ar/strings.xml3
-rw-r--r--usbtuner-res/values-az-rAZ/strings.xml3
-rw-r--r--usbtuner-res/values-bg/strings.xml3
-rw-r--r--usbtuner-res/values-bn-rBD/strings.xml3
-rw-r--r--usbtuner-res/values-ca/strings.xml3
-rw-r--r--usbtuner-res/values-cs/strings.xml3
-rw-r--r--usbtuner-res/values-da/strings.xml3
-rw-r--r--usbtuner-res/values-de/strings.xml3
-rw-r--r--usbtuner-res/values-el/strings.xml3
-rw-r--r--usbtuner-res/values-en-rAU/strings.xml3
-rw-r--r--usbtuner-res/values-en-rGB/strings.xml3
-rw-r--r--usbtuner-res/values-en-rIN/strings.xml3
-rw-r--r--usbtuner-res/values-es-rUS/strings.xml3
-rw-r--r--usbtuner-res/values-es/strings.xml3
-rw-r--r--usbtuner-res/values-et-rEE/strings.xml3
-rw-r--r--usbtuner-res/values-eu-rES/strings.xml3
-rw-r--r--usbtuner-res/values-fa/strings.xml3
-rw-r--r--usbtuner-res/values-fi/strings.xml3
-rw-r--r--usbtuner-res/values-fr-rCA/strings.xml3
-rw-r--r--usbtuner-res/values-fr/strings.xml3
-rw-r--r--usbtuner-res/values-gl-rES/strings.xml3
-rw-r--r--usbtuner-res/values-hi/strings.xml3
-rw-r--r--usbtuner-res/values-hr/strings.xml3
-rw-r--r--usbtuner-res/values-hu/strings.xml3
-rw-r--r--usbtuner-res/values-hy-rAM/strings.xml3
-rw-r--r--usbtuner-res/values-in/strings.xml3
-rw-r--r--usbtuner-res/values-is-rIS/strings.xml3
-rw-r--r--usbtuner-res/values-it/strings.xml3
-rw-r--r--usbtuner-res/values-iw/strings.xml3
-rw-r--r--usbtuner-res/values-ja/strings.xml3
-rw-r--r--usbtuner-res/values-ka-rGE/strings.xml3
-rw-r--r--usbtuner-res/values-kk-rKZ/strings.xml3
-rw-r--r--usbtuner-res/values-km-rKH/strings.xml3
-rw-r--r--usbtuner-res/values-kn-rIN/strings.xml3
-rw-r--r--usbtuner-res/values-ko/strings.xml3
-rw-r--r--usbtuner-res/values-ky-rKG/strings.xml3
-rw-r--r--usbtuner-res/values-lo-rLA/strings.xml3
-rw-r--r--usbtuner-res/values-lt/strings.xml3
-rw-r--r--usbtuner-res/values-lv/strings.xml3
-rw-r--r--usbtuner-res/values-mk-rMK/strings.xml3
-rw-r--r--usbtuner-res/values-ml-rIN/strings.xml3
-rw-r--r--usbtuner-res/values-mn-rMN/strings.xml3
-rw-r--r--usbtuner-res/values-mr-rIN/strings.xml3
-rw-r--r--usbtuner-res/values-ms-rMY/strings.xml3
-rw-r--r--usbtuner-res/values-my-rMM/strings.xml3
-rw-r--r--usbtuner-res/values-nb/strings.xml3
-rw-r--r--usbtuner-res/values-ne-rNP/strings.xml3
-rw-r--r--usbtuner-res/values-nl/strings.xml3
-rw-r--r--usbtuner-res/values-pl/strings.xml3
-rw-r--r--usbtuner-res/values-pt-rPT/strings.xml3
-rw-r--r--usbtuner-res/values-pt/strings.xml3
-rw-r--r--usbtuner-res/values-ro/strings.xml3
-rw-r--r--usbtuner-res/values-ru/strings.xml3
-rw-r--r--usbtuner-res/values-si-rLK/strings.xml3
-rw-r--r--usbtuner-res/values-sk/strings.xml3
-rw-r--r--usbtuner-res/values-sl/strings.xml3
-rw-r--r--usbtuner-res/values-sr/strings.xml3
-rw-r--r--usbtuner-res/values-sv/strings.xml3
-rw-r--r--usbtuner-res/values-sw/strings.xml3
-rw-r--r--usbtuner-res/values-ta-rIN/strings.xml3
-rw-r--r--usbtuner-res/values-te-rIN/strings.xml3
-rw-r--r--usbtuner-res/values-th/strings.xml3
-rw-r--r--usbtuner-res/values-tl/strings.xml3
-rw-r--r--usbtuner-res/values-tr/strings.xml3
-rw-r--r--usbtuner-res/values-uk/strings.xml3
-rw-r--r--usbtuner-res/values-ur-rPK/strings.xml3
-rw-r--r--usbtuner-res/values-uz-rUZ/strings.xml3
-rw-r--r--usbtuner-res/values-vi/strings.xml3
-rw-r--r--usbtuner-res/values-zh-rCN/strings.xml3
-rw-r--r--usbtuner-res/values-zh-rHK/strings.xml3
-rw-r--r--usbtuner-res/values-zh-rTW/strings.xml3
-rw-r--r--usbtuner-res/values-zu/strings.xml3
-rw-r--r--usbtuner-res/values/strings.xml11
-rw-r--r--version.mk2
1896 files changed, 12596 insertions, 6036 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 5283d6d4..1faa2ae3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -40,6 +40,7 @@
<uses-feature android:name="android.software.live_tv" android:required="true" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
+
<!-- Receives input events from the TV app. -->
<permission android:name="com.android.tv.permission.RECEIVE_INPUT_EVENT"
android:protectionLevel="signatureOrSystem"
@@ -90,9 +91,11 @@
</activity>
<activity android:name=".LauncherActivity"
+ android:configChanges="keyboard|keyboardHidden"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity android:name=".SetupPassthroughActivity"
+ android:configChanges="keyboard|keyboardHidden"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="com.android.tv.action.LAUNCH_INPUT_SETUP" />
@@ -101,14 +104,17 @@
</activity>
<activity android:name=".SelectInputActivity"
+ android:configChanges="keyboard|keyboardHidden"
android:launchMode="singleTask"
android:theme="@style/Theme.SelectInputActivity" />
<activity android:name=".onboarding.OnboardingActivity"
+ android:configChanges="keyboard|keyboardHidden"
android:launchMode="singleTop"
android:theme="@style/Theme.Setup.GuidedStep" />
<activity android:name=".dvr.ui.DvrActivity"
+ android:configChanges="keyboard|keyboardHidden"
android:launchMode="singleTask"
android:theme="@style/Theme.Leanback.Browse" />
@@ -118,15 +124,22 @@
android:theme="@style/Theme.Leanback" />
<activity android:name=".dvr.ui.DvrDetailsActivity"
+ android:configChanges="keyboard|keyboardHidden"
android:theme="@style/Theme.TV.Dvr.Browse.Details" />
<activity android:name=".dvr.ui.DvrSeriesSettingsActivity"
- android:theme="@style/Theme.TV.Dvr.Settings.GuidedStep" />
+ android:configChanges="keyboard|keyboardHidden"
+ android:theme="@style/Theme.TV.Dvr.Series.Settings.GuidedStep" />
<activity android:name=".dvr.ui.DvrSeriesDeletionActivity"
+ android:configChanges="keyboard|keyboardHidden"
android:theme="@style/Theme.TV.Dvr.Series.Deletion.GuidedStep" />
+ <activity android:name=".dvr.ui.DvrSeriesScheduledDialogActivity"
+ android:theme="@style/Theme.TV.dialog.HalfSizedDialog"/>
+
<activity android:name=".dvr.ui.DvrSchedulesActivity"
+ android:configChanges="keyboard|keyboardHidden"
android:theme="@style/Theme.Leanback.Details" />
<provider android:name="com.android.tv.search.LocalSearchProvider"
@@ -172,6 +185,7 @@
<!-- USB tuner components definition -->
<activity android:name="com.android.tv.tuner.setup.TunerSetupActivity"
+ android:configChanges="keyboard|keyboardHidden"
android:label="@string/bt_app_name"
android:launchMode="singleInstance"
android:process="com.android.tv.tuner"
@@ -196,6 +210,17 @@
android:authorities="com.android.tv.tuner.preferences"
android:process="com.android.tv.tuner"
android:exported="false" />
+ <!-- System initial setup component definition -->
+ <activity android:name=".setup.SystemSetupActivity"
+ android:configChanges="keyboard|keyboardHidden"
+ android:label="@string/bt_app_name"
+ android:launchMode="singleInstance"
+ android:theme="@style/Theme.Setup.GuidedStep" >
+ <intent-filter>
+ <action android:name="com.android.tv.action.LAUNCH_SYSTEM_SETUP" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
<!-- TunerInputController should be the same process with MainActivity to check status of MainActivity -->
<receiver android:name=".tuner.TunerInputController"
android:exported="false">
@@ -211,5 +236,10 @@
<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"
+ android:process="com.android.tv.tuner"
+ android:exported="true" />
+
</application>
</manifest>
diff --git a/common/res/values-af/strings.xml b/common/res/values-af/strings.xml
index 0fdd75f4..7a114849 100644
--- a/common/res/values-af/strings.xml
+++ b/common/res/values-af/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S.<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-am/strings.xml b/common/res/values-am/strings.xml
index 22615319..45a1b7cb 100644
--- a/common/res/values-am/strings.xml
+++ b/common/res/values-am/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"ክፍል <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ም<xliff:g id="SEASONNUMBER">%2$s</xliff:g>፦ ክፍል <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ar/strings.xml b/common/res/values-ar/strings.xml
index e3089d20..bedd137b 100644
--- a/common/res/values-ar/strings.xml
+++ b/common/res/values-ar/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"الحلقة <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> الموسم رقم <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: الحلقة رقم <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-az-rAZ/strings.xml b/common/res/values-az-rAZ/strings.xml
index 96f575ab..c844cd60 100644
--- a/common/res/values-az-rAZ/strings.xml
+++ b/common/res/values-az-rAZ/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-bg/strings.xml b/common/res/values-bg/strings.xml
index ac61825e..264a1118 100644
--- a/common/res/values-bg/strings.xml
+++ b/common/res/values-bg/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Еп. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> – „<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>“"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"„<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“, сезон <xliff:g id="SEASONNUMBER">%2$s</xliff:g>, епизод <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-bn-rBD/strings.xml b/common/res/values-bn-rBD/strings.xml
index d2ee5010..836a62a5 100644
--- a/common/res/values-bn-rBD/strings.xml
+++ b/common/res/values-bn-rBD/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"এপিঃ <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> সিজিন<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: পর্ব <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ca/strings.xml b/common/res/values-ca/strings.xml
index e48259ab..6382648e 100644
--- a/common/res/values-ca/strings.xml
+++ b/common/res/values-ca/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Episodi <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>: temporada <xliff:g id="SEASONNUMBER">%2$s</xliff:g>, episodi <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-cs/strings.xml b/common/res/values-cs/strings.xml
index 2a64d6b2..0be8026c 100644
--- a/common/res/values-cs/strings.xml
+++ b/common/res/values-cs/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> – <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-da/strings.xml b/common/res/values-da/strings.xml
index ac43906f..4685b818 100644
--- a/common/res/values-da/strings.xml
+++ b/common/res/values-da/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Afsnit <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S. <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Afsn. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-de/strings.xml b/common/res/values-de/strings.xml
index 8f7d03f6..a487ff8a 100644
--- a/common/res/values-de/strings.xml
+++ b/common/res/values-de/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Folge <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>, <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>, Staffel <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Folge <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-el/strings.xml b/common/res/values-el/strings.xml
index a825312b..dba894cb 100644
--- a/common/res/values-el/strings.xml
+++ b/common/res/values-el/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Επ. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> Σεζόν<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Επ. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-en-rAU/strings.xml b/common/res/values-en-rAU/strings.xml
index 7fc3313d..0ea27edc 100644
--- a/common/res/values-en-rAU/strings.xml
+++ b/common/res/values-en-rAU/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-en-rGB/strings.xml b/common/res/values-en-rGB/strings.xml
index 7fc3313d..0ea27edc 100644
--- a/common/res/values-en-rGB/strings.xml
+++ b/common/res/values-en-rGB/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-en-rIN/strings.xml b/common/res/values-en-rIN/strings.xml
index 7fc3313d..0ea27edc 100644
--- a/common/res/values-en-rIN/strings.xml
+++ b/common/res/values-en-rIN/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-es-rUS/strings.xml b/common/res/values-es-rUS/strings.xml
index 382e6cd5..87c881b8 100644
--- a/common/res/values-es-rUS/strings.xml
+++ b/common/res/values-es-rUS/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Episodio <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>: T<xliff:g id="SEASONNUMBER">%2$s</xliff:g>, episodio <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-es/strings.xml b/common/res/values-es/strings.xml
index 13b8fbae..32536d93 100644
--- a/common/res/values-es/strings.xml
+++ b/common/res/values-es/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Episodio <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"Temporada <xliff:g id="SEASONNUMBER">%2$s</xliff:g> de <xliff:g id="PROGRAMNAME">%1$s</xliff:g>, episodio <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-et-rEE/strings.xml b/common/res/values-et-rEE/strings.xml
index 844f1e7e..9052178a 100644
--- a/common/res/values-et-rEE/strings.xml
+++ b/common/res/values-et-rEE/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. jagu – <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> – <xliff:g id="SEASONNUMBER">%2$s</xliff:g>. hooaeg, <xliff:g id="EPISODENUMBER">%3$s</xliff:g>. jagu"</string>
diff --git a/common/res/values-eu-rES/strings.xml b/common/res/values-eu-rES/strings.xml
index 5341da33..d7ab52a8 100644
--- a/common/res/values-eu-rES/strings.xml
+++ b/common/res/values-eu-rES/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. atala: <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>, <xliff:g id="SEASONNUMBER">%2$s</xliff:g>. denboraldia: <xliff:g id="EPISODENUMBER">%3$s</xliff:g>. atala"</string>
diff --git a/common/res/values-fa/strings.xml b/common/res/values-fa/strings.xml
index efa46b6a..67e9c4e6 100644
--- a/common/res/values-fa/strings.xml
+++ b/common/res/values-fa/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"ق. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> فصل <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: قسمت <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-fi/strings.xml b/common/res/values-fi/strings.xml
index af6c8578..8c6b99bf 100644
--- a/common/res/values-fi/strings.xml
+++ b/common/res/values-fi/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Jakso <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> kausi <xliff:g id="SEASONNUMBER">%2$s</xliff:g>, jakso <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-fr-rCA/strings.xml b/common/res/values-fr-rCA/strings.xml
index 4bd4fa84..ed5678e2 100644
--- a/common/res/values-fr-rCA/strings.xml
+++ b/common/res/values-fr-rCA/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Épisode <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>, « <xliff:g id="EPISODE_TITLE">%2$s</xliff:g> »"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>, saison <xliff:g id="SEASONNUMBER">%2$s</xliff:g> : épisode <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-fr/strings.xml b/common/res/values-fr/strings.xml
index 0decc4f2..b5b28104 100644
--- a/common/res/values-fr/strings.xml
+++ b/common/res/values-fr/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ép. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> : <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> – S <xliff:g id="SEASONNUMBER">%2$s</xliff:g>, ép. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-gl-rES/strings.xml b/common/res/values-gl-rES/strings.xml
index 6e24457e..356ac562 100644
--- a/common/res/values-gl-rES/strings.xml
+++ b/common/res/values-gl-rES/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> T<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-hi/strings.xml b/common/res/values-hi/strings.xml
index f5f33838..27cae84d 100644
--- a/common/res/values-hi/strings.xml
+++ b/common/res/values-hi/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"एपिसोड <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> सीज़न<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: एपिसोड <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-hr/strings.xml b/common/res/values-hr/strings.xml
index 5bff1614..66127784 100644
--- a/common/res/values-hr/strings.xml
+++ b/common/res/values-hr/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> <xliff:g id="SEASONNUMBER">%2$s</xliff:g>. s.: <xliff:g id="EPISODENUMBER">%3$s</xliff:g>. ep."</string>
diff --git a/common/res/values-hu/strings.xml b/common/res/values-hu/strings.xml
index 645aadd5..138ad857 100644
--- a/common/res/values-hu/strings.xml
+++ b/common/res/values-hu/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. rész: <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> – <xliff:g id="SEASONNUMBER">%2$s</xliff:g>. évad, <xliff:g id="EPISODENUMBER">%3$s</xliff:g>. epizód"</string>
diff --git a/common/res/values-hy-rAM/strings.xml b/common/res/values-hy-rAM/strings.xml
index 2fb2dc80..aaa7470f 100644
--- a/common/res/values-hy-rAM/strings.xml
+++ b/common/res/values-hy-rAM/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Դրվ. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> Ե<xliff:g id="SEASONNUMBER">%2$s</xliff:g>՝ Դրվ. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-in/strings.xml b/common/res/values-in/strings.xml
index 0dab629a..da4b8203 100644
--- a/common/res/values-in/strings.xml
+++ b/common/res/values-in/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-is-rIS/strings.xml b/common/res/values-is-rIS/strings.xml
index 9e8115cc..47529403 100644
--- a/common/res/values-is-rIS/strings.xml
+++ b/common/res/values-is-rIS/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Þ. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S.<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Þ. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-it/strings.xml b/common/res/values-it/strings.xml
index e1329395..f61e02f7 100644
--- a/common/res/values-it/strings.xml
+++ b/common/res/values-it/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Punt. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> Stag. <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: punt. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-iw/strings.xml b/common/res/values-iw/strings.xml
index fded886c..7ad220ad 100644
--- a/common/res/values-iw/strings.xml
+++ b/common/res/values-iw/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"פרק <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> עונה <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: פרק <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ja/strings.xml b/common/res/values-ja/strings.xml
index 65493625..682fd0d8 100644
--- a/common/res/values-ja/strings.xml
+++ b/common/res/values-ja/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"エピソード <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>「<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>」"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>、シーズン <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: エピソード <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ka-rGE/strings.xml b/common/res/values-ka-rGE/strings.xml
index ff21cf86..3c7062ff 100644
--- a/common/res/values-ka-rGE/strings.xml
+++ b/common/res/values-ka-rGE/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"ეპ. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> — <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>: სეზ. <xliff:g id="SEASONNUMBER">%2$s</xliff:g>, ეპ. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-kk-rKZ/strings.xml b/common/res/values-kk-rKZ/strings.xml
index 98dd36b5..12de7d34 100644
--- a/common/res/values-kk-rKZ/strings.xml
+++ b/common/res/values-kk-rKZ/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>-серия, \"<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>\""</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>, <xliff:g id="SEASONNUMBER">%2$s</xliff:g>-маусым, <xliff:g id="EPISODENUMBER">%3$s</xliff:g>-серия"</string>
diff --git a/common/res/values-km-rKH/strings.xml b/common/res/values-km-rKH/strings.xml
index 59e235ab..b8353897 100644
--- a/common/res/values-km-rKH/strings.xml
+++ b/common/res/values-km-rKH/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"វគ្គ <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> រដូវ<xliff:g id="SEASONNUMBER">%2$s</xliff:g>៖ ភាគ <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-kn-rIN/strings.xml b/common/res/values-kn-rIN/strings.xml
index 2c43735d..7cb096b7 100644
--- a/common/res/values-kn-rIN/strings.xml
+++ b/common/res/values-kn-rIN/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"ಸಂ. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ಸೀ<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: ಸಂ. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ko/strings.xml b/common/res/values-ko/strings.xml
index 5c4f190b..923831f3 100644
--- a/common/res/values-ko/strings.xml
+++ b/common/res/values-ko/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"에피소드 <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> \'<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>\'"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> 시즌 <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: 에피소드 <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ky-rKG/strings.xml b/common/res/values-ky-rKG/strings.xml
index 00d7a018..8bdfadde 100644
--- a/common/res/values-ky-rKG/strings.xml
+++ b/common/res/values-ky-rKG/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_TITLE">%2$s</xliff:g> <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>-серия"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: <xliff:g id="EPISODENUMBER">%3$s</xliff:g>-эпизод"</string>
diff --git a/common/res/values-lo-rLA/strings.xml b/common/res/values-lo-rLA/strings.xml
index 25c0e5b5..a6dad515 100644
--- a/common/res/values-lo-rLA/strings.xml
+++ b/common/res/values-lo-rLA/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-lt/strings.xml b/common/res/values-lt/strings.xml
index 3354f769..6d6c0ee8 100644
--- a/common/res/values-lt/strings.xml
+++ b/common/res/values-lt/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> serija „<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>“"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"Programos „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ <xliff:g id="SEASONNUMBER">%2$s</xliff:g> sezonas: <xliff:g id="EPISODENUMBER">%3$s</xliff:g> serija"</string>
diff --git a/common/res/values-lv/strings.xml b/common/res/values-lv/strings.xml
index 46c8aa7e..f0366a48 100644
--- a/common/res/values-lv/strings.xml
+++ b/common/res/values-lv/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. sērija “<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>”"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>: <xliff:g id="SEASONNUMBER">%2$s</xliff:g>. sezona, <xliff:g id="EPISODENUMBER">%3$s</xliff:g>. sērija"</string>
diff --git a/common/res/values-mk-rMK/strings.xml b/common/res/values-mk-rMK/strings.xml
index 5853f362..73045d3d 100644
--- a/common/res/values-mk-rMK/strings.xml
+++ b/common/res/values-mk-rMK/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Еп. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> Сез.<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Еп.. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ml-rIN/strings.xml b/common/res/values-ml-rIN/strings.xml
index 68f8b885..07727684 100644
--- a/common/res/values-ml-rIN/strings.xml
+++ b/common/res/values-ml-rIN/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"എപ്പിസോഡ് <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> സീരിയൽ<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: എപ്പിസോഡ് <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-mn-rMN/strings.xml b/common/res/values-mn-rMN/strings.xml
index 5ed326d8..ff1552e0 100644
--- a/common/res/values-mn-rMN/strings.xml
+++ b/common/res/values-mn-rMN/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Анги. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> Бүлэг<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Анги. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-mr-rIN/strings.xml b/common/res/values-mr-rIN/strings.xml
index 8cda69f4..adc669ae 100644
--- a/common/res/values-mr-rIN/strings.xml
+++ b/common/res/values-mr-rIN/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"भाग. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> सत्र<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: भाग <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ms-rMY/strings.xml b/common/res/values-ms-rMY/strings.xml
index d815b47d..06eb6173 100644
--- a/common/res/values-ms-rMY/strings.xml
+++ b/common/res/values-ms-rMY/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-my-rMM/strings.xml b/common/res/values-my-rMM/strings.xml
index 605b5e93..977c4315 100644
--- a/common/res/values-my-rMM/strings.xml
+++ b/common/res/values-my-rMM/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"အပိုင်း <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> အတွဲ<xliff:g id="SEASONNUMBER">%2$s</xliff:g>− အပိုင်း <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-nb/strings.xml b/common/res/values-nb/strings.xml
index aaf3e04c..8344a76b 100644
--- a/common/res/values-nb/strings.xml
+++ b/common/res/values-nb/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Episode <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> – <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> Sesong <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Episode <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ne-rNP/strings.xml b/common/res/values-ne-rNP/strings.xml
index 88445690..4f3d24c1 100644
--- a/common/res/values-ne-rNP/strings.xml
+++ b/common/res/values-ne-rNP/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"एपिसोड <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> सिजन <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: एपिसोड <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-nl/strings.xml b/common/res/values-nl/strings.xml
index fc190cc4..4e5a1011 100644
--- a/common/res/values-nl/strings.xml
+++ b/common/res/values-nl/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Afl. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Afl. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-pl/strings.xml b/common/res/values-pl/strings.xml
index 073d9b24..5161e3ba 100644
--- a/common/res/values-pl/strings.xml
+++ b/common/res/values-pl/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Odc. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> – sez. <xliff:g id="SEASONNUMBER">%2$s</xliff:g>, odc. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-pt-rPT/strings.xml b/common/res/values-pt-rPT/strings.xml
index 3344fa98..badaae27 100644
--- a/common/res/values-pt-rPT/strings.xml
+++ b/common/res/values-pt-rPT/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> T<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-pt/strings.xml b/common/res/values-pt/strings.xml
index b38019c9..0fc3e097 100644
--- a/common/res/values-pt/strings.xml
+++ b/common/res/values-pt/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> T<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ro/strings.xml b/common/res/values-ro/strings.xml
index 1885733e..ae6fc497 100644
--- a/common/res/values-ro/strings.xml
+++ b/common/res/values-ro/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Episodul <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>: <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>, sezonul <xliff:g id="SEASONNUMBER">%2$s</xliff:g>, episodul <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ru/strings.xml b/common/res/values-ru/strings.xml
index d107c101..53c341aa 100644
--- a/common/res/values-ru/strings.xml
+++ b/common/res/values-ru/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Серия <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>, \"<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>\""</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>, сезон <xliff:g id="SEASONNUMBER">%2$s</xliff:g>, серия <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-si-rLK/strings.xml b/common/res/values-si-rLK/strings.xml
index 73065f78..85fc1f94 100644
--- a/common/res/values-si-rLK/strings.xml
+++ b/common/res/values-si-rLK/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"කථාංගය <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> වාරය<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: කථාංගය. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-sk/strings.xml b/common/res/values-sk/strings.xml
index b8185b98..1d1a673f 100644
--- a/common/res/values-sk/strings.xml
+++ b/common/res/values-sk/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> – <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> <xliff:g id="SEASONNUMBER">%2$s</xliff:g>. sezóna: <xliff:g id="EPISODENUMBER">%3$s</xliff:g>. epizóda"</string>
diff --git a/common/res/values-sl/strings.xml b/common/res/values-sl/strings.xml
index 70419855..26ec614d 100644
--- a/common/res/values-sl/strings.xml
+++ b/common/res/values-sl/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. epizoda: <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> – <xliff:g id="SEASONNUMBER">%2$s</xliff:g>. sezona: <xliff:g id="EPISODENUMBER">%3$s</xliff:g>. epizoda"</string>
diff --git a/common/res/values-sr/strings.xml b/common/res/values-sr/strings.xml
index 9c2c20e0..ef7f9ee5 100644
--- a/common/res/values-sr/strings.xml
+++ b/common/res/values-sr/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. епизода, <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> <xliff:g id="SEASONNUMBER">%2$s</xliff:g>. серијал: <xliff:g id="EPISODENUMBER">%3$s</xliff:g>. епизода"</string>
diff --git a/common/res/values-sv/strings.xml b/common/res/values-sv/strings.xml
index c556437f..9911a0de 100644
--- a/common/res/values-sv/strings.xml
+++ b/common/res/values-sv/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Avsnitt <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> – <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> Säsong<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: avsnitt <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-sw/strings.xml b/common/res/values-sw/strings.xml
index 78d58979..7d44cedf 100644
--- a/common/res/values-sw/strings.xml
+++ b/common/res/values-sw/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Kipindi cha <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>Msimu wa <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Kipindi cha <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ta-rIN/strings.xml b/common/res/values-ta-rIN/strings.xml
index aea006c7..bc2eed62 100644
--- a/common/res/values-ta-rIN/strings.xml
+++ b/common/res/values-ta-rIN/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"எபி. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> சீ<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: எபி. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-te-rIN/strings.xml b/common/res/values-te-rIN/strings.xml
index 92562718..80df229d 100644
--- a/common/res/values-te-rIN/strings.xml
+++ b/common/res/values-te-rIN/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"ఎపి. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> సీ<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: ఎపి. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-th/strings.xml b/common/res/values-th/strings.xml
index 7ff4baab..5ff9f1ff 100644
--- a/common/res/values-th/strings.xml
+++ b/common/res/values-th/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"ตอนที่ <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ซีซัน <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: ตอน <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-tl/strings.xml b/common/res/values-tl/strings.xml
index b391fe22..e6b8bbbc 100644
--- a/common/res/values-tl/strings.xml
+++ b/common/res/values-tl/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-tr/strings.xml b/common/res/values-tr/strings.xml
index a7ec0bc0..c25c834f 100644
--- a/common/res/values-tr/strings.xml
+++ b/common/res/values-tr/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>. Bölüm <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> <xliff:g id="SEASONNUMBER">%2$s</xliff:g>.S: <xliff:g id="EPISODENUMBER">%3$s</xliff:g>. Böl."</string>
diff --git a/common/res/values-uk/strings.xml b/common/res/values-uk/strings.xml
index d754ea4d..9b67cf4a 100644
--- a/common/res/values-uk/strings.xml
+++ b/common/res/values-uk/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Серія <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> \"<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>\""</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"\"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\": сезон <xliff:g id="SEASONNUMBER">%2$s</xliff:g>, серія <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-ur-rPK/strings.xml b/common/res/values-ur-rPK/strings.xml
index a6bd6a62..b04fb3c3 100644
--- a/common/res/values-ur-rPK/strings.xml
+++ b/common/res/values-ur-rPK/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"ایپی سوڈ <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> سیزن <xliff:g id="SEASONNUMBER">%2$s</xliff:g>: ایپی سوڈ <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-uz-rUZ/strings.xml b/common/res/values-uz-rUZ/strings.xml
index 430167d0..ffa1cf9c 100644
--- a/common/res/values-uz-rUZ/strings.xml
+++ b/common/res/values-uz-rUZ/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"<xliff:g id="EPISODE_NUMBER">%1$s</xliff:g>-qism – “<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>”"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>, <xliff:g id="SEASONNUMBER">%2$s</xliff:g>-fasl <xliff:g id="EPISODENUMBER">%3$s</xliff:g>-qism"</string>
diff --git a/common/res/values-vi/strings.xml b/common/res/values-vi/strings.xml
index 72c64cbc..2852bb10 100644
--- a/common/res/values-vi/strings.xml
+++ b/common/res/values-vi/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Tập <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> P<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Tập <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values-zh-rCN/strings.xml b/common/res/values-zh-rCN/strings.xml
index f412fa03..25e13379 100644
--- a/common/res/values-zh-rCN/strings.xml
+++ b/common/res/values-zh-rCN/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"第 <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> 集:<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》第 <xliff:g id="SEASONNUMBER">%2$s</xliff:g> 季:第 <xliff:g id="EPISODENUMBER">%3$s</xliff:g> 集"</string>
diff --git a/common/res/values-zh-rHK/strings.xml b/common/res/values-zh-rHK/strings.xml
index 91611145..ed323c6a 100644
--- a/common/res/values-zh-rHK/strings.xml
+++ b/common/res/values-zh-rHK/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"第 <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> 集 <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》第 <xliff:g id="SEASONNUMBER">%2$s</xliff:g> 季:第 <xliff:g id="EPISODENUMBER">%3$s</xliff:g> 集"</string>
diff --git a/common/res/values-zh-rTW/strings.xml b/common/res/values-zh-rTW/strings.xml
index f412fa03..25e13379 100644
--- a/common/res/values-zh-rTW/strings.xml
+++ b/common/res/values-zh-rTW/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"第 <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> 集:<xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》第 <xliff:g id="SEASONNUMBER">%2$s</xliff:g> 季:第 <xliff:g id="EPISODENUMBER">%3$s</xliff:g> 集"</string>
diff --git a/common/res/values-zu/strings.xml b/common/res/values-zu/strings.xml
index 6f8a6f7f..4574ac01 100644
--- a/common/res/values-zu/strings.xml
+++ b/common/res/values-zu/strings.xml
@@ -18,6 +18,8 @@
<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="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>
<string name="display_episode_title_format_no_season_number" msgid="4558449786705748989">"Ep. <xliff:g id="EPISODE_NUMBER">%1$s</xliff:g> <xliff:g id="EPISODE_TITLE">%2$s</xliff:g>"</string>
<string name="program_title_with_episode_number" msgid="5708628769757639737">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> S<xliff:g id="SEASONNUMBER">%2$s</xliff:g>: Ep. <xliff:g id="EPISODENUMBER">%3$s</xliff:g>"</string>
diff --git a/common/res/values/dimens.xml b/common/res/values/dimens.xml
index 4d8286cd..9d6e0e67 100644
--- a/common/res/values/dimens.xml
+++ b/common/res/values/dimens.xml
@@ -26,7 +26,7 @@
<dimen name="setup_done_button_container_width">138dp</dimen>
<dimen name="setup_guidedactions_selector_margin_start">24dp</dimen>
<dimen name="setup_guidedactions_selector_margin_end">24dp</dimen>
- <dimen name="setup_guidedactions_selector_margin_top">190dp</dimen>
+ <dimen name="setup_guidedactions_selector_margin_top">220dp</dimen>
<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>
diff --git a/common/res/values/strings.xml b/common/res/values/strings.xml
index 7c14ce39..e5b9b625 100644
--- a/common/res/values/strings.xml
+++ b/common/res/values/strings.xml
@@ -17,6 +17,10 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_text_done">Done</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. -->
+ <string name="display_episode_number_format_no_season_number">Ep.<xliff:g id="episode_number" example="1">%1$s</xliff:g></string>
<!-- The episode title format displayed on the info banner. For example, "S1: Ep. 1 Winter is coming". -->
<string name="display_episode_title_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> <xliff:g id="episode_title" example="Winter is Coming">%3$s</xliff:g></string>
<!-- The episode title format displayed on the info banner when the season number is not available. For example, "Ep. 1807 Headline News". -->
diff --git a/common/src/com/android/tv/common/CollectionUtils.java b/common/src/com/android/tv/common/CollectionUtils.java
index 294159c7..300ad8f2 100644
--- a/common/src/com/android/tv/common/CollectionUtils.java
+++ b/common/src/com/android/tv/common/CollectionUtils.java
@@ -60,7 +60,7 @@ public class CollectionUtils {
Collections.sort(result, comparator);
List<T> resultToAdd = new ArrayList<>();
for (T toAdd : toAdds) {
- if (Collections.binarySearch(result, toAdd, comparator) != 0) {
+ if (Collections.binarySearch(result, toAdd, comparator) < 0) {
resultToAdd.add(toAdd);
}
}
@@ -77,7 +77,7 @@ public class CollectionUtils {
Collections.sort(result, comparator);
for (T toSubtract : toSubtracts) {
int index = Collections.binarySearch(result, toSubtract, comparator);
- if (index != -1) {
+ if (index >= 0) {
result.remove(index);
}
}
@@ -92,7 +92,7 @@ public class CollectionUtils {
List<T> contains = new ArrayList<>(c1);
Collections.sort(contains, comparator);
for (T iterate : c2) {
- if (Collections.binarySearch(contains, iterate, comparator) != -1) {
+ if (Collections.binarySearch(contains, iterate, comparator) >= 0) {
return true;
}
}
diff --git a/common/src/com/android/tv/common/feature/CommonFeatures.java b/common/src/com/android/tv/common/feature/CommonFeatures.java
index dfaa527c..d47aa603 100644
--- a/common/src/com/android/tv/common/feature/CommonFeatures.java
+++ b/common/src/com/android/tv/common/feature/CommonFeatures.java
@@ -16,6 +16,7 @@
package com.android.tv.common.feature;
+import static com.android.tv.common.feature.FeatureUtils.AND;
import static com.android.tv.common.feature.FeatureUtils.OR;
import static com.android.tv.common.feature.TestableFeature.createTestableFeature;
@@ -30,12 +31,10 @@ public class CommonFeatures {
*
* <p>See <a href="https://goto.google.com/atv-dvr-onepager">go/atv-dvr-onepager</a>
*
- * DVR API is introduced in N.
- *
- * STOPSHIP: Double-check of DVR is a part of the release before launching.
+ * DVR API is introduced in N, it only works when app runs as a system app.
*/
- public static final TestableFeature DVR =
- createTestableFeature(OR(Sdk.N_PRE_2_OR_HIGHER, Sdk.AT_LEAST_N));
+ public static final TestableFeature DVR = createTestableFeature(
+ AND(OR(Sdk.N_PRE_2_OR_HIGHER, Sdk.AT_LEAST_N), SystemAppFeature.SYSTEM_APP_FEATURE));
/**
* ENABLE_RECORDING_REGARDLESS_OF_STORAGE_STATUS
diff --git a/src/com/android/tv/tuner/TunerFlags.java b/common/src/com/android/tv/common/feature/SystemAppFeature.java
index 9370b092..79fd32f3 100644
--- a/src/com/android/tv/tuner/TunerFlags.java
+++ b/common/src/com/android/tv/common/feature/SystemAppFeature.java
@@ -11,14 +11,24 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
- * limitations under the License.
+ * limitations under the License
*/
-package com.android.tv.tuner;
+package com.android.tv.common.feature;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
/**
- * Defines flags which are useful for experimenting new feature on tuner implementation.
+ * A feature that is for system App.
*/
-public final class TunerFlags {
- public static final boolean USE_EXTRACTOR_IN_EXOPLAYER = false;
+public final class SystemAppFeature implements Feature {
+ public static final Feature SYSTEM_APP_FEATURE = new SystemAppFeature();
+
+ private SystemAppFeature() { }
+
+ @Override
+ public boolean isEnabled(Context context) {
+ return (context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) != 0;
+ }
}
diff --git a/common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java b/common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java
index 3eb9ebf2..bcaefec9 100644
--- a/common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java
+++ b/common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java
@@ -57,9 +57,7 @@ public abstract class SetupGuidedStepFragment extends GuidedStepFragment {
R.dimen.setup_done_button_container_width);
// Guided actions list
View list = view.findViewById(R.id.guidedactions_list);
- View list2 = view.findViewById(R.id.guidedactions_list2);
- MarginLayoutParams marginLayoutParams = (MarginLayoutParams) view.findViewById(
- R.id.guidedactions_list).getLayoutParams();
+ MarginLayoutParams marginLayoutParams = (MarginLayoutParams) list.getLayoutParams();
// Use content view to check layout direction while view is being created.
if (getResources().getConfiguration().getLayoutDirection()
== View.LAYOUT_DIRECTION_LTR) {
diff --git a/libs/exoplayer.jar b/libs/exoplayer.jar
index 33a6c480..43aea971 100644
--- a/libs/exoplayer.jar
+++ b/libs/exoplayer.jar
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_00.png b/res/drawable-xhdpi/arrow_blue_00.png
index 96ea4bdc..46a1219d 100644
--- a/res/drawable-xhdpi/arrow_blue_00.png
+++ b/res/drawable-xhdpi/arrow_blue_00.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_01.png b/res/drawable-xhdpi/arrow_blue_01.png
index 36a3ec1f..e195f402 100644
--- a/res/drawable-xhdpi/arrow_blue_01.png
+++ b/res/drawable-xhdpi/arrow_blue_01.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_02.png b/res/drawable-xhdpi/arrow_blue_02.png
index bca40975..91421fc5 100644
--- a/res/drawable-xhdpi/arrow_blue_02.png
+++ b/res/drawable-xhdpi/arrow_blue_02.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_03.png b/res/drawable-xhdpi/arrow_blue_03.png
index 00f0e51f..076296c3 100644
--- a/res/drawable-xhdpi/arrow_blue_03.png
+++ b/res/drawable-xhdpi/arrow_blue_03.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_04.png b/res/drawable-xhdpi/arrow_blue_04.png
index 6848dcee..98b7c9c1 100644
--- a/res/drawable-xhdpi/arrow_blue_04.png
+++ b/res/drawable-xhdpi/arrow_blue_04.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_05.png b/res/drawable-xhdpi/arrow_blue_05.png
index 3afd0ce3..a2793026 100644
--- a/res/drawable-xhdpi/arrow_blue_05.png
+++ b/res/drawable-xhdpi/arrow_blue_05.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_06.png b/res/drawable-xhdpi/arrow_blue_06.png
index b805f3b6..fe47e124 100644
--- a/res/drawable-xhdpi/arrow_blue_06.png
+++ b/res/drawable-xhdpi/arrow_blue_06.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_07.png b/res/drawable-xhdpi/arrow_blue_07.png
index 53f25dd1..54443476 100644
--- a/res/drawable-xhdpi/arrow_blue_07.png
+++ b/res/drawable-xhdpi/arrow_blue_07.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_08.png b/res/drawable-xhdpi/arrow_blue_08.png
index ca4191d9..79645ad1 100644
--- a/res/drawable-xhdpi/arrow_blue_08.png
+++ b/res/drawable-xhdpi/arrow_blue_08.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_09.png b/res/drawable-xhdpi/arrow_blue_09.png
index adea3674..4ae12fe8 100644
--- a/res/drawable-xhdpi/arrow_blue_09.png
+++ b/res/drawable-xhdpi/arrow_blue_09.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_10.png b/res/drawable-xhdpi/arrow_blue_10.png
index 342f8a3c..6b44f5c6 100644
--- a/res/drawable-xhdpi/arrow_blue_10.png
+++ b/res/drawable-xhdpi/arrow_blue_10.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_11.png b/res/drawable-xhdpi/arrow_blue_11.png
index 7758e3fd..b5e9c41c 100644
--- a/res/drawable-xhdpi/arrow_blue_11.png
+++ b/res/drawable-xhdpi/arrow_blue_11.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_12.png b/res/drawable-xhdpi/arrow_blue_12.png
index be85b4d4..12e9d411 100644
--- a/res/drawable-xhdpi/arrow_blue_12.png
+++ b/res/drawable-xhdpi/arrow_blue_12.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_13.png b/res/drawable-xhdpi/arrow_blue_13.png
index 4327fdbb..162a6903 100644
--- a/res/drawable-xhdpi/arrow_blue_13.png
+++ b/res/drawable-xhdpi/arrow_blue_13.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_14.png b/res/drawable-xhdpi/arrow_blue_14.png
index 2a1f95ab..8ba300a9 100644
--- a/res/drawable-xhdpi/arrow_blue_14.png
+++ b/res/drawable-xhdpi/arrow_blue_14.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_15.png b/res/drawable-xhdpi/arrow_blue_15.png
index ac2efad9..2df2906f 100644
--- a/res/drawable-xhdpi/arrow_blue_15.png
+++ b/res/drawable-xhdpi/arrow_blue_15.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_16.png b/res/drawable-xhdpi/arrow_blue_16.png
index 2f005c21..e9f62aae 100644
--- a/res/drawable-xhdpi/arrow_blue_16.png
+++ b/res/drawable-xhdpi/arrow_blue_16.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_17.png b/res/drawable-xhdpi/arrow_blue_17.png
index 3ecf08b7..f107edc8 100644
--- a/res/drawable-xhdpi/arrow_blue_17.png
+++ b/res/drawable-xhdpi/arrow_blue_17.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_18.png b/res/drawable-xhdpi/arrow_blue_18.png
index 1a4e5efc..3323ae3e 100644
--- a/res/drawable-xhdpi/arrow_blue_18.png
+++ b/res/drawable-xhdpi/arrow_blue_18.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_19.png b/res/drawable-xhdpi/arrow_blue_19.png
index a6958061..705f7d60 100644
--- a/res/drawable-xhdpi/arrow_blue_19.png
+++ b/res/drawable-xhdpi/arrow_blue_19.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_20.png b/res/drawable-xhdpi/arrow_blue_20.png
index e5b90d5a..52c14617 100644
--- a/res/drawable-xhdpi/arrow_blue_20.png
+++ b/res/drawable-xhdpi/arrow_blue_20.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_21.png b/res/drawable-xhdpi/arrow_blue_21.png
index d78b8499..716854fb 100644
--- a/res/drawable-xhdpi/arrow_blue_21.png
+++ b/res/drawable-xhdpi/arrow_blue_21.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_22.png b/res/drawable-xhdpi/arrow_blue_22.png
index ad9ce088..a0917371 100644
--- a/res/drawable-xhdpi/arrow_blue_22.png
+++ b/res/drawable-xhdpi/arrow_blue_22.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_23.png b/res/drawable-xhdpi/arrow_blue_23.png
index ec1860fb..7a0319b6 100644
--- a/res/drawable-xhdpi/arrow_blue_23.png
+++ b/res/drawable-xhdpi/arrow_blue_23.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_24.png b/res/drawable-xhdpi/arrow_blue_24.png
index dcc24816..6de55ad2 100644
--- a/res/drawable-xhdpi/arrow_blue_24.png
+++ b/res/drawable-xhdpi/arrow_blue_24.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_25.png b/res/drawable-xhdpi/arrow_blue_25.png
index 8df34eaf..2e3e3e31 100644
--- a/res/drawable-xhdpi/arrow_blue_25.png
+++ b/res/drawable-xhdpi/arrow_blue_25.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_26.png b/res/drawable-xhdpi/arrow_blue_26.png
index 24cf731b..52e3b943 100644
--- a/res/drawable-xhdpi/arrow_blue_26.png
+++ b/res/drawable-xhdpi/arrow_blue_26.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_27.png b/res/drawable-xhdpi/arrow_blue_27.png
index 2ca7ecc1..80912bef 100644
--- a/res/drawable-xhdpi/arrow_blue_27.png
+++ b/res/drawable-xhdpi/arrow_blue_27.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_28.png b/res/drawable-xhdpi/arrow_blue_28.png
index 495a23d2..3ea1a7c3 100644
--- a/res/drawable-xhdpi/arrow_blue_28.png
+++ b/res/drawable-xhdpi/arrow_blue_28.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_29.png b/res/drawable-xhdpi/arrow_blue_29.png
index c4b5e05b..d36743e1 100644
--- a/res/drawable-xhdpi/arrow_blue_29.png
+++ b/res/drawable-xhdpi/arrow_blue_29.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_30.png b/res/drawable-xhdpi/arrow_blue_30.png
index 5615b355..666c6b32 100644
--- a/res/drawable-xhdpi/arrow_blue_30.png
+++ b/res/drawable-xhdpi/arrow_blue_30.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_31.png b/res/drawable-xhdpi/arrow_blue_31.png
index 16cc053b..88da80fd 100644
--- a/res/drawable-xhdpi/arrow_blue_31.png
+++ b/res/drawable-xhdpi/arrow_blue_31.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_32.png b/res/drawable-xhdpi/arrow_blue_32.png
index ec2df776..63f0d508 100644
--- a/res/drawable-xhdpi/arrow_blue_32.png
+++ b/res/drawable-xhdpi/arrow_blue_32.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_33.png b/res/drawable-xhdpi/arrow_blue_33.png
index 34cdd2b1..607ed35b 100644
--- a/res/drawable-xhdpi/arrow_blue_33.png
+++ b/res/drawable-xhdpi/arrow_blue_33.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_34.png b/res/drawable-xhdpi/arrow_blue_34.png
index 1295daa0..92e7132a 100644
--- a/res/drawable-xhdpi/arrow_blue_34.png
+++ b/res/drawable-xhdpi/arrow_blue_34.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_35.png b/res/drawable-xhdpi/arrow_blue_35.png
index 627f2326..c76f825a 100644
--- a/res/drawable-xhdpi/arrow_blue_35.png
+++ b/res/drawable-xhdpi/arrow_blue_35.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_36.png b/res/drawable-xhdpi/arrow_blue_36.png
index 2153aeab..02740270 100644
--- a/res/drawable-xhdpi/arrow_blue_36.png
+++ b/res/drawable-xhdpi/arrow_blue_36.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_37.png b/res/drawable-xhdpi/arrow_blue_37.png
index 2b3c3066..492df97b 100644
--- a/res/drawable-xhdpi/arrow_blue_37.png
+++ b/res/drawable-xhdpi/arrow_blue_37.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_38.png b/res/drawable-xhdpi/arrow_blue_38.png
index 602accf5..733e547a 100644
--- a/res/drawable-xhdpi/arrow_blue_38.png
+++ b/res/drawable-xhdpi/arrow_blue_38.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_39.png b/res/drawable-xhdpi/arrow_blue_39.png
index d50eda53..6b39cb08 100644
--- a/res/drawable-xhdpi/arrow_blue_39.png
+++ b/res/drawable-xhdpi/arrow_blue_39.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_40.png b/res/drawable-xhdpi/arrow_blue_40.png
index c4467985..35716982 100644
--- a/res/drawable-xhdpi/arrow_blue_40.png
+++ b/res/drawable-xhdpi/arrow_blue_40.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_41.png b/res/drawable-xhdpi/arrow_blue_41.png
index 8095770a..a7013437 100644
--- a/res/drawable-xhdpi/arrow_blue_41.png
+++ b/res/drawable-xhdpi/arrow_blue_41.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_42.png b/res/drawable-xhdpi/arrow_blue_42.png
index 6ea5f257..3cf53241 100644
--- a/res/drawable-xhdpi/arrow_blue_42.png
+++ b/res/drawable-xhdpi/arrow_blue_42.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_43.png b/res/drawable-xhdpi/arrow_blue_43.png
index 085e588c..5e338758 100644
--- a/res/drawable-xhdpi/arrow_blue_43.png
+++ b/res/drawable-xhdpi/arrow_blue_43.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_44.png b/res/drawable-xhdpi/arrow_blue_44.png
index 1d6f9ebd..75ca12b2 100644
--- a/res/drawable-xhdpi/arrow_blue_44.png
+++ b/res/drawable-xhdpi/arrow_blue_44.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_45.png b/res/drawable-xhdpi/arrow_blue_45.png
index 19f40c2a..f48e275e 100644
--- a/res/drawable-xhdpi/arrow_blue_45.png
+++ b/res/drawable-xhdpi/arrow_blue_45.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_46.png b/res/drawable-xhdpi/arrow_blue_46.png
index 21c40cd2..27beb9bc 100644
--- a/res/drawable-xhdpi/arrow_blue_46.png
+++ b/res/drawable-xhdpi/arrow_blue_46.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_47.png b/res/drawable-xhdpi/arrow_blue_47.png
index 0e17879d..972f70dc 100644
--- a/res/drawable-xhdpi/arrow_blue_47.png
+++ b/res/drawable-xhdpi/arrow_blue_47.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_48.png b/res/drawable-xhdpi/arrow_blue_48.png
index e09a6ea1..ee67d479 100644
--- a/res/drawable-xhdpi/arrow_blue_48.png
+++ b/res/drawable-xhdpi/arrow_blue_48.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_49.png b/res/drawable-xhdpi/arrow_blue_49.png
index cd62e76c..2a2f909f 100644
--- a/res/drawable-xhdpi/arrow_blue_49.png
+++ b/res/drawable-xhdpi/arrow_blue_49.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_50.png b/res/drawable-xhdpi/arrow_blue_50.png
index 369bc2e5..2d0e85cf 100644
--- a/res/drawable-xhdpi/arrow_blue_50.png
+++ b/res/drawable-xhdpi/arrow_blue_50.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_51.png b/res/drawable-xhdpi/arrow_blue_51.png
index 37385c20..5a722324 100644
--- a/res/drawable-xhdpi/arrow_blue_51.png
+++ b/res/drawable-xhdpi/arrow_blue_51.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_52.png b/res/drawable-xhdpi/arrow_blue_52.png
index f9067125..95a5fe14 100644
--- a/res/drawable-xhdpi/arrow_blue_52.png
+++ b/res/drawable-xhdpi/arrow_blue_52.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_53.png b/res/drawable-xhdpi/arrow_blue_53.png
index 63bbe839..0f3880ac 100644
--- a/res/drawable-xhdpi/arrow_blue_53.png
+++ b/res/drawable-xhdpi/arrow_blue_53.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_54.png b/res/drawable-xhdpi/arrow_blue_54.png
index 19566f2d..0f0f6cb7 100644
--- a/res/drawable-xhdpi/arrow_blue_54.png
+++ b/res/drawable-xhdpi/arrow_blue_54.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_55.png b/res/drawable-xhdpi/arrow_blue_55.png
index 40fab462..8ae2cbdc 100644
--- a/res/drawable-xhdpi/arrow_blue_55.png
+++ b/res/drawable-xhdpi/arrow_blue_55.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_56.png b/res/drawable-xhdpi/arrow_blue_56.png
index 73711aac..8649c6e5 100644
--- a/res/drawable-xhdpi/arrow_blue_56.png
+++ b/res/drawable-xhdpi/arrow_blue_56.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_57.png b/res/drawable-xhdpi/arrow_blue_57.png
index 520aebee..7c2b79c9 100644
--- a/res/drawable-xhdpi/arrow_blue_57.png
+++ b/res/drawable-xhdpi/arrow_blue_57.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_58.png b/res/drawable-xhdpi/arrow_blue_58.png
index 39cdbc69..ee358066 100644
--- a/res/drawable-xhdpi/arrow_blue_58.png
+++ b/res/drawable-xhdpi/arrow_blue_58.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_59.png b/res/drawable-xhdpi/arrow_blue_59.png
index aa9f0ba7..26f14e5b 100644
--- a/res/drawable-xhdpi/arrow_blue_59.png
+++ b/res/drawable-xhdpi/arrow_blue_59.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_blue_60.png b/res/drawable-xhdpi/arrow_blue_60.png
index 96ea4bdc..46a1219d 100644
--- a/res/drawable-xhdpi/arrow_blue_60.png
+++ b/res/drawable-xhdpi/arrow_blue_60.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_180.png b/res/drawable-xhdpi/arrow_orange_180.png
index 96ea4bdc..46a1219d 100644
--- a/res/drawable-xhdpi/arrow_orange_180.png
+++ b/res/drawable-xhdpi/arrow_orange_180.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_181.png b/res/drawable-xhdpi/arrow_orange_181.png
index 15639947..f843d3a6 100644
--- a/res/drawable-xhdpi/arrow_orange_181.png
+++ b/res/drawable-xhdpi/arrow_orange_181.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_182.png b/res/drawable-xhdpi/arrow_orange_182.png
index aef1025d..7e626150 100644
--- a/res/drawable-xhdpi/arrow_orange_182.png
+++ b/res/drawable-xhdpi/arrow_orange_182.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_183.png b/res/drawable-xhdpi/arrow_orange_183.png
index fa644665..9e394fb7 100644
--- a/res/drawable-xhdpi/arrow_orange_183.png
+++ b/res/drawable-xhdpi/arrow_orange_183.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_184.png b/res/drawable-xhdpi/arrow_orange_184.png
index ebfd093c..f876774e 100644
--- a/res/drawable-xhdpi/arrow_orange_184.png
+++ b/res/drawable-xhdpi/arrow_orange_184.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_185.png b/res/drawable-xhdpi/arrow_orange_185.png
index 50d50236..6f881c24 100644
--- a/res/drawable-xhdpi/arrow_orange_185.png
+++ b/res/drawable-xhdpi/arrow_orange_185.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_186.png b/res/drawable-xhdpi/arrow_orange_186.png
index a14862ed..2a570507 100644
--- a/res/drawable-xhdpi/arrow_orange_186.png
+++ b/res/drawable-xhdpi/arrow_orange_186.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_187.png b/res/drawable-xhdpi/arrow_orange_187.png
index 21a00ee3..d4172258 100644
--- a/res/drawable-xhdpi/arrow_orange_187.png
+++ b/res/drawable-xhdpi/arrow_orange_187.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_188.png b/res/drawable-xhdpi/arrow_orange_188.png
index d8062abf..c4ce697b 100644
--- a/res/drawable-xhdpi/arrow_orange_188.png
+++ b/res/drawable-xhdpi/arrow_orange_188.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_189.png b/res/drawable-xhdpi/arrow_orange_189.png
index 35880017..a82623d1 100644
--- a/res/drawable-xhdpi/arrow_orange_189.png
+++ b/res/drawable-xhdpi/arrow_orange_189.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_190.png b/res/drawable-xhdpi/arrow_orange_190.png
index f0ba5735..1116527f 100644
--- a/res/drawable-xhdpi/arrow_orange_190.png
+++ b/res/drawable-xhdpi/arrow_orange_190.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_191.png b/res/drawable-xhdpi/arrow_orange_191.png
index 8b4f6e45..60620fcd 100644
--- a/res/drawable-xhdpi/arrow_orange_191.png
+++ b/res/drawable-xhdpi/arrow_orange_191.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_192.png b/res/drawable-xhdpi/arrow_orange_192.png
index 9ad8f726..3ac8d9bc 100644
--- a/res/drawable-xhdpi/arrow_orange_192.png
+++ b/res/drawable-xhdpi/arrow_orange_192.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_193.png b/res/drawable-xhdpi/arrow_orange_193.png
index eef2273c..db1eb6d7 100644
--- a/res/drawable-xhdpi/arrow_orange_193.png
+++ b/res/drawable-xhdpi/arrow_orange_193.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_194.png b/res/drawable-xhdpi/arrow_orange_194.png
index 0ca1b65d..3575e11e 100644
--- a/res/drawable-xhdpi/arrow_orange_194.png
+++ b/res/drawable-xhdpi/arrow_orange_194.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_195.png b/res/drawable-xhdpi/arrow_orange_195.png
index 7076b2f2..8fd0a369 100644
--- a/res/drawable-xhdpi/arrow_orange_195.png
+++ b/res/drawable-xhdpi/arrow_orange_195.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_196.png b/res/drawable-xhdpi/arrow_orange_196.png
index 2eb0222e..adc84811 100644
--- a/res/drawable-xhdpi/arrow_orange_196.png
+++ b/res/drawable-xhdpi/arrow_orange_196.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_197.png b/res/drawable-xhdpi/arrow_orange_197.png
index b3fb2de9..38a3b831 100644
--- a/res/drawable-xhdpi/arrow_orange_197.png
+++ b/res/drawable-xhdpi/arrow_orange_197.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_198.png b/res/drawable-xhdpi/arrow_orange_198.png
index c55b3776..638e4182 100644
--- a/res/drawable-xhdpi/arrow_orange_198.png
+++ b/res/drawable-xhdpi/arrow_orange_198.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_199.png b/res/drawable-xhdpi/arrow_orange_199.png
index 429f672c..439d710d 100644
--- a/res/drawable-xhdpi/arrow_orange_199.png
+++ b/res/drawable-xhdpi/arrow_orange_199.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_200.png b/res/drawable-xhdpi/arrow_orange_200.png
index 76147ae8..7c93e7ff 100644
--- a/res/drawable-xhdpi/arrow_orange_200.png
+++ b/res/drawable-xhdpi/arrow_orange_200.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_201.png b/res/drawable-xhdpi/arrow_orange_201.png
index dae66b75..7604ea5e 100644
--- a/res/drawable-xhdpi/arrow_orange_201.png
+++ b/res/drawable-xhdpi/arrow_orange_201.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_202.png b/res/drawable-xhdpi/arrow_orange_202.png
index de518c74..19994a04 100644
--- a/res/drawable-xhdpi/arrow_orange_202.png
+++ b/res/drawable-xhdpi/arrow_orange_202.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_203.png b/res/drawable-xhdpi/arrow_orange_203.png
index 38ab2ae4..1cbcc8ff 100644
--- a/res/drawable-xhdpi/arrow_orange_203.png
+++ b/res/drawable-xhdpi/arrow_orange_203.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_204.png b/res/drawable-xhdpi/arrow_orange_204.png
index e883d2a5..eeae18c8 100644
--- a/res/drawable-xhdpi/arrow_orange_204.png
+++ b/res/drawable-xhdpi/arrow_orange_204.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_205.png b/res/drawable-xhdpi/arrow_orange_205.png
index ecc1f4b9..4d0ca76d 100644
--- a/res/drawable-xhdpi/arrow_orange_205.png
+++ b/res/drawable-xhdpi/arrow_orange_205.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_206.png b/res/drawable-xhdpi/arrow_orange_206.png
index 49dd52b1..ca2ddbb5 100644
--- a/res/drawable-xhdpi/arrow_orange_206.png
+++ b/res/drawable-xhdpi/arrow_orange_206.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_207.png b/res/drawable-xhdpi/arrow_orange_207.png
index 474b4dfe..5a03de6d 100644
--- a/res/drawable-xhdpi/arrow_orange_207.png
+++ b/res/drawable-xhdpi/arrow_orange_207.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_208.png b/res/drawable-xhdpi/arrow_orange_208.png
index 738e4599..c371edcd 100644
--- a/res/drawable-xhdpi/arrow_orange_208.png
+++ b/res/drawable-xhdpi/arrow_orange_208.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_209.png b/res/drawable-xhdpi/arrow_orange_209.png
index d764a009..8892697e 100644
--- a/res/drawable-xhdpi/arrow_orange_209.png
+++ b/res/drawable-xhdpi/arrow_orange_209.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_210.png b/res/drawable-xhdpi/arrow_orange_210.png
index a129e019..4f836af7 100644
--- a/res/drawable-xhdpi/arrow_orange_210.png
+++ b/res/drawable-xhdpi/arrow_orange_210.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_211.png b/res/drawable-xhdpi/arrow_orange_211.png
index 8166909d..b0900065 100644
--- a/res/drawable-xhdpi/arrow_orange_211.png
+++ b/res/drawable-xhdpi/arrow_orange_211.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_212.png b/res/drawable-xhdpi/arrow_orange_212.png
index 3a2463bb..9d4d92fd 100644
--- a/res/drawable-xhdpi/arrow_orange_212.png
+++ b/res/drawable-xhdpi/arrow_orange_212.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_213.png b/res/drawable-xhdpi/arrow_orange_213.png
index 15b17ef1..0cce209a 100644
--- a/res/drawable-xhdpi/arrow_orange_213.png
+++ b/res/drawable-xhdpi/arrow_orange_213.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_214.png b/res/drawable-xhdpi/arrow_orange_214.png
index b945ccf0..35957014 100644
--- a/res/drawable-xhdpi/arrow_orange_214.png
+++ b/res/drawable-xhdpi/arrow_orange_214.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_215.png b/res/drawable-xhdpi/arrow_orange_215.png
index 94e3379c..d08c2896 100644
--- a/res/drawable-xhdpi/arrow_orange_215.png
+++ b/res/drawable-xhdpi/arrow_orange_215.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_216.png b/res/drawable-xhdpi/arrow_orange_216.png
index 1ff40753..9a0231de 100644
--- a/res/drawable-xhdpi/arrow_orange_216.png
+++ b/res/drawable-xhdpi/arrow_orange_216.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_217.png b/res/drawable-xhdpi/arrow_orange_217.png
index d19fe4e4..91fe5366 100644
--- a/res/drawable-xhdpi/arrow_orange_217.png
+++ b/res/drawable-xhdpi/arrow_orange_217.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_218.png b/res/drawable-xhdpi/arrow_orange_218.png
index 2804ee31..ae9cd6ce 100644
--- a/res/drawable-xhdpi/arrow_orange_218.png
+++ b/res/drawable-xhdpi/arrow_orange_218.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_219.png b/res/drawable-xhdpi/arrow_orange_219.png
index a6c33676..70723d95 100644
--- a/res/drawable-xhdpi/arrow_orange_219.png
+++ b/res/drawable-xhdpi/arrow_orange_219.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_220.png b/res/drawable-xhdpi/arrow_orange_220.png
index 97f2f6fb..699bb862 100644
--- a/res/drawable-xhdpi/arrow_orange_220.png
+++ b/res/drawable-xhdpi/arrow_orange_220.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_221.png b/res/drawable-xhdpi/arrow_orange_221.png
index bfb808a2..6ab0b07f 100644
--- a/res/drawable-xhdpi/arrow_orange_221.png
+++ b/res/drawable-xhdpi/arrow_orange_221.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_222.png b/res/drawable-xhdpi/arrow_orange_222.png
index 087446ea..ed86933e 100644
--- a/res/drawable-xhdpi/arrow_orange_222.png
+++ b/res/drawable-xhdpi/arrow_orange_222.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_223.png b/res/drawable-xhdpi/arrow_orange_223.png
index 3eaf81f2..59bb7760 100644
--- a/res/drawable-xhdpi/arrow_orange_223.png
+++ b/res/drawable-xhdpi/arrow_orange_223.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_224.png b/res/drawable-xhdpi/arrow_orange_224.png
index e5d173d0..606608aa 100644
--- a/res/drawable-xhdpi/arrow_orange_224.png
+++ b/res/drawable-xhdpi/arrow_orange_224.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_225.png b/res/drawable-xhdpi/arrow_orange_225.png
index 4eab8f89..3f0638ac 100644
--- a/res/drawable-xhdpi/arrow_orange_225.png
+++ b/res/drawable-xhdpi/arrow_orange_225.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_226.png b/res/drawable-xhdpi/arrow_orange_226.png
index 3354eb9e..2abb186b 100644
--- a/res/drawable-xhdpi/arrow_orange_226.png
+++ b/res/drawable-xhdpi/arrow_orange_226.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_227.png b/res/drawable-xhdpi/arrow_orange_227.png
index 8de9b894..3ee5f45d 100644
--- a/res/drawable-xhdpi/arrow_orange_227.png
+++ b/res/drawable-xhdpi/arrow_orange_227.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_228.png b/res/drawable-xhdpi/arrow_orange_228.png
index 8718c4e4..a40f48e0 100644
--- a/res/drawable-xhdpi/arrow_orange_228.png
+++ b/res/drawable-xhdpi/arrow_orange_228.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_229.png b/res/drawable-xhdpi/arrow_orange_229.png
index 834ae57c..dd0fac79 100644
--- a/res/drawable-xhdpi/arrow_orange_229.png
+++ b/res/drawable-xhdpi/arrow_orange_229.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_230.png b/res/drawable-xhdpi/arrow_orange_230.png
index c06cb457..397e36f7 100644
--- a/res/drawable-xhdpi/arrow_orange_230.png
+++ b/res/drawable-xhdpi/arrow_orange_230.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_231.png b/res/drawable-xhdpi/arrow_orange_231.png
index c38edb86..ef61d8cd 100644
--- a/res/drawable-xhdpi/arrow_orange_231.png
+++ b/res/drawable-xhdpi/arrow_orange_231.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_232.png b/res/drawable-xhdpi/arrow_orange_232.png
index c3a036a7..5d75f753 100644
--- a/res/drawable-xhdpi/arrow_orange_232.png
+++ b/res/drawable-xhdpi/arrow_orange_232.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_233.png b/res/drawable-xhdpi/arrow_orange_233.png
index 7cd3abe4..d95d6226 100644
--- a/res/drawable-xhdpi/arrow_orange_233.png
+++ b/res/drawable-xhdpi/arrow_orange_233.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_234.png b/res/drawable-xhdpi/arrow_orange_234.png
index 8e886ad7..d6e034d6 100644
--- a/res/drawable-xhdpi/arrow_orange_234.png
+++ b/res/drawable-xhdpi/arrow_orange_234.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_235.png b/res/drawable-xhdpi/arrow_orange_235.png
index 54031a24..297e04bd 100644
--- a/res/drawable-xhdpi/arrow_orange_235.png
+++ b/res/drawable-xhdpi/arrow_orange_235.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_236.png b/res/drawable-xhdpi/arrow_orange_236.png
index d39bdd21..62d1223f 100644
--- a/res/drawable-xhdpi/arrow_orange_236.png
+++ b/res/drawable-xhdpi/arrow_orange_236.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_237.png b/res/drawable-xhdpi/arrow_orange_237.png
index 5e20da64..e473441e 100644
--- a/res/drawable-xhdpi/arrow_orange_237.png
+++ b/res/drawable-xhdpi/arrow_orange_237.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_238.png b/res/drawable-xhdpi/arrow_orange_238.png
index f0e19b2f..af4c831c 100644
--- a/res/drawable-xhdpi/arrow_orange_238.png
+++ b/res/drawable-xhdpi/arrow_orange_238.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_239.png b/res/drawable-xhdpi/arrow_orange_239.png
index edaf237b..8e82c050 100644
--- a/res/drawable-xhdpi/arrow_orange_239.png
+++ b/res/drawable-xhdpi/arrow_orange_239.png
Binary files differ
diff --git a/res/drawable-xhdpi/arrow_orange_240.png b/res/drawable-xhdpi/arrow_orange_240.png
index 96ea4bdc..46a1219d 100644
--- a/res/drawable-xhdpi/arrow_orange_240.png
+++ b/res/drawable-xhdpi/arrow_orange_240.png
Binary files differ
diff --git a/res/drawable-xhdpi/banner.png b/res/drawable-xhdpi/banner.png
index 95049156..57dbb05e 100644
--- a/res/drawable-xhdpi/banner.png
+++ b/res/drawable-xhdpi/banner.png
Binary files differ
diff --git a/res/drawable-xhdpi/bg_protection.png b/res/drawable-xhdpi/bg_protection.png
index a7ada6ab..02df25ae 100644
--- a/res/drawable-xhdpi/bg_protection.png
+++ b/res/drawable-xhdpi/bg_protection.png
Binary files differ
diff --git a/res/drawable-xhdpi/cloud01.png b/res/drawable-xhdpi/cloud01.png
index eec4ea96..2bb6a2aa 100644
--- a/res/drawable-xhdpi/cloud01.png
+++ b/res/drawable-xhdpi/cloud01.png
Binary files differ
diff --git a/res/drawable-xhdpi/cloud02.png b/res/drawable-xhdpi/cloud02.png
index 1df3ce96..35c97466 100644
--- a/res/drawable-xhdpi/cloud02.png
+++ b/res/drawable-xhdpi/cloud02.png
Binary files differ
diff --git a/res/drawable-xhdpi/default_now_card.png b/res/drawable-xhdpi/default_now_card.png
index b73874ee..95deb5b3 100644
--- a/res/drawable-xhdpi/default_now_card.png
+++ b/res/drawable-xhdpi/default_now_card.png
Binary files differ
diff --git a/res/drawable-xhdpi/dvr_default_poster.png b/res/drawable-xhdpi/dvr_default_poster.png
index 6a7abc6a..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
index ace0c1b7..6a8d68ee 100644
--- a/res/drawable-xhdpi/dvr_default_program_art.png
+++ b/res/drawable-xhdpi/dvr_default_program_art.png
Binary files differ
diff --git a/res/drawable-xhdpi/dvr_full_schedule.png b/res/drawable-xhdpi/dvr_full_schedule.png
index 93940639..e9f59ad4 100644
--- a/res/drawable-xhdpi/dvr_full_schedule.png
+++ b/res/drawable-xhdpi/dvr_full_schedule.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_channel_guide.png b/res/drawable-xhdpi/ic_channel_guide.png
index 28f3ef8e..526b2f6e 100644
--- a/res/drawable-xhdpi/ic_channel_guide.png
+++ b/res/drawable-xhdpi/ic_channel_guide.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_check_circle_white_48dp.png b/res/drawable-xhdpi/ic_check_circle_white_48dp.png
new file mode 100644
index 00000000..a1cf83e6
--- /dev/null
+++ b/res/drawable-xhdpi/ic_check_circle_white_48dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_delete_32dp.png b/res/drawable-xhdpi/ic_delete_32dp.png
index 8d2b0245..b3e9754c 100644
--- a/res/drawable-xhdpi/ic_delete_32dp.png
+++ b/res/drawable-xhdpi/ic_delete_32dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_developer_mode_tv_white_48dp.png b/res/drawable-xhdpi/ic_developer_mode_tv_white_48dp.png
index 1336147d..ab2949b7 100755
--- a/res/drawable-xhdpi/ic_developer_mode_tv_white_48dp.png
+++ b/res/drawable-xhdpi/ic_developer_mode_tv_white_48dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_draggable_white.png b/res/drawable-xhdpi/ic_draggable_white.png
index 02bf7f2b..37d69506 100644
--- a/res/drawable-xhdpi/ic_draggable_white.png
+++ b/res/drawable-xhdpi/ic_draggable_white.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_dragging_grey.png b/res/drawable-xhdpi/ic_dragging_grey.png
index 03d30056..5ddb2ad4 100644
--- a/res/drawable-xhdpi/ic_dragging_grey.png
+++ b/res/drawable-xhdpi/ic_dragging_grey.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_dvr.png b/res/drawable-xhdpi/ic_dvr.png
index c8c84f37..347db044 100644
--- a/res/drawable-xhdpi/ic_dvr.png
+++ b/res/drawable-xhdpi/ic_dvr.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_dvr_cancel.png b/res/drawable-xhdpi/ic_dvr_cancel.png
index 73f5116b..bc761c70 100644
--- a/res/drawable-xhdpi/ic_dvr_cancel.png
+++ b/res/drawable-xhdpi/ic_dvr_cancel.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_dvr_cancel_32dp.png b/res/drawable-xhdpi/ic_dvr_cancel_32dp.png
index 2c957378..339247ef 100644
--- a/res/drawable-xhdpi/ic_dvr_cancel_32dp.png
+++ b/res/drawable-xhdpi/ic_dvr_cancel_32dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_dvr_cancel_large.png b/res/drawable-xhdpi/ic_dvr_cancel_large.png
index dc32a14f..f3686d05 100644
--- a/res/drawable-xhdpi/ic_dvr_cancel_large.png
+++ b/res/drawable-xhdpi/ic_dvr_cancel_large.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_dvr_delete.png b/res/drawable-xhdpi/ic_dvr_delete.png
index a0ac7063..bcdca673 100644
--- a/res/drawable-xhdpi/ic_dvr_delete.png
+++ b/res/drawable-xhdpi/ic_dvr_delete.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_error_recording.png b/res/drawable-xhdpi/ic_error_recording.png
index 00d5646e..5878c3b3 100644
--- a/res/drawable-xhdpi/ic_error_recording.png
+++ b/res/drawable-xhdpi/ic_error_recording.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_error_white_48dp.png b/res/drawable-xhdpi/ic_error_white_48dp.png
index d038d4c4..e8e8ab5a 100644
--- a/res/drawable-xhdpi/ic_error_white_48dp.png
+++ b/res/drawable-xhdpi/ic_error_white_48dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_guide_lock.png b/res/drawable-xhdpi/ic_guide_lock.png
index b29c2e37..e36bd12d 100644
--- a/res/drawable-xhdpi/ic_guide_lock.png
+++ b/res/drawable-xhdpi/ic_guide_lock.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_launcher.png
index 51423ae5..7f4eb10d 100644
--- a/res/drawable-xhdpi/ic_launcher.png
+++ b/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_message_lock.png b/res/drawable-xhdpi/ic_message_lock.png
index b39748c0..96d0af49 100644
--- a/res/drawable-xhdpi/ic_message_lock.png
+++ b/res/drawable-xhdpi/ic_message_lock.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_message_lock_no_permission.png b/res/drawable-xhdpi/ic_message_lock_no_permission.png
index 4d53726b..bb996971 100644
--- a/res/drawable-xhdpi/ic_message_lock_no_permission.png
+++ b/res/drawable-xhdpi/ic_message_lock_no_permission.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_message_lock_preview.png b/res/drawable-xhdpi/ic_message_lock_preview.png
index 8c828b40..69a5eedf 100644
--- a/res/drawable-xhdpi/ic_message_lock_preview.png
+++ b/res/drawable-xhdpi/ic_message_lock_preview.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pip_option_input.png b/res/drawable-xhdpi/ic_pip_option_input.png
index 2638b67b..47c5006f 100644
--- a/res/drawable-xhdpi/ic_pip_option_input.png
+++ 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
index ade3cfc5..14b2602a 100644
--- a/res/drawable-xhdpi/ic_pip_option_layout1.png
+++ 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
index 1a59e474..e5d77278 100644
--- a/res/drawable-xhdpi/ic_pip_option_layout2.png
+++ 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
index f43a57ed..dfe110d0 100644
--- a/res/drawable-xhdpi/ic_pip_option_layout3.png
+++ 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
index bdf3f065..8ab5fa45 100644
--- a/res/drawable-xhdpi/ic_pip_option_layout4.png
+++ 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
index 4868c9f0..d6b53641 100644
--- a/res/drawable-xhdpi/ic_pip_option_layout5.png
+++ 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
index f7e32591..96fb0b0c 100644
--- a/res/drawable-xhdpi/ic_pip_option_size.png
+++ 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
index 4a31ef1d..fa2088ed 100644
--- a/res/drawable-xhdpi/ic_pip_option_swap.png
+++ 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
index 8f62ab0c..a5f5431b 100644
--- a/res/drawable-xhdpi/ic_pip_option_swap_audio.png
+++ b/res/drawable-xhdpi/ic_pip_option_swap_audio.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_recent_thumbnail_default.png b/res/drawable-xhdpi/ic_recent_thumbnail_default.png
index 9604888b..7007ee31 100644
--- a/res/drawable-xhdpi/ic_recent_thumbnail_default.png
+++ b/res/drawable-xhdpi/ic_recent_thumbnail_default.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_record_start.png b/res/drawable-xhdpi/ic_record_start.png
index 6017d0c8..53e3f03f 100644
--- a/res/drawable-xhdpi/ic_record_start.png
+++ b/res/drawable-xhdpi/ic_record_start.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_record_stop.png b/res/drawable-xhdpi/ic_record_stop.png
index 5dcd1ee2..5ad9aa25 100644
--- a/res/drawable-xhdpi/ic_record_stop.png
+++ b/res/drawable-xhdpi/ic_record_stop.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_recorded_program.png b/res/drawable-xhdpi/ic_recorded_program.png
index 74efe263..fe22714e 100644
--- a/res/drawable-xhdpi/ic_recorded_program.png
+++ b/res/drawable-xhdpi/ic_recorded_program.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_recording_program.png b/res/drawable-xhdpi/ic_recording_program.png
index c6b33f6c..c9900e45 100644
--- a/res/drawable-xhdpi/ic_recording_program.png
+++ b/res/drawable-xhdpi/ic_recording_program.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_rotten.png b/res/drawable-xhdpi/ic_rotten.png
deleted file mode 100644
index 05390e1e..00000000
--- a/res/drawable-xhdpi/ic_rotten.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_sad_cloud.png b/res/drawable-xhdpi/ic_sad_cloud.png
index af9e19d7..c20d03a4 100644
--- a/res/drawable-xhdpi/ic_sad_cloud.png
+++ b/res/drawable-xhdpi/ic_sad_cloud.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_schedule_32dp.png b/res/drawable-xhdpi/ic_schedule_32dp.png
index beef1764..b3e4bb5a 100644
--- a/res/drawable-xhdpi/ic_schedule_32dp.png
+++ b/res/drawable-xhdpi/ic_schedule_32dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_scheduled_recording.png b/res/drawable-xhdpi/ic_scheduled_recording.png
index beb14870..520823a2 100644
--- a/res/drawable-xhdpi/ic_scheduled_recording.png
+++ b/res/drawable-xhdpi/ic_scheduled_recording.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_scheduled_white.png b/res/drawable-xhdpi/ic_scheduled_white.png
index 8d3c2587..49778def 100644
--- a/res/drawable-xhdpi/ic_scheduled_white.png
+++ b/res/drawable-xhdpi/ic_scheduled_white.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings.png b/res/drawable-xhdpi/ic_settings.png
index 82b7537d..75c65b7f 100644
--- a/res/drawable-xhdpi/ic_settings.png
+++ b/res/drawable-xhdpi/ic_settings.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_setup_antenna.png b/res/drawable-xhdpi/ic_setup_antenna.png
index 1f9e0673..bb6d416e 100644
--- a/res/drawable-xhdpi/ic_setup_antenna.png
+++ b/res/drawable-xhdpi/ic_setup_antenna.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_store.png b/res/drawable-xhdpi/ic_store.png
index bfa42f0e..767b8b64 100644
--- a/res/drawable-xhdpi/ic_store.png
+++ b/res/drawable-xhdpi/ic_store.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvoption_aspect.png b/res/drawable-xhdpi/ic_tvoption_aspect.png
index 526908f8..618af666 100644
--- a/res/drawable-xhdpi/ic_tvoption_aspect.png
+++ b/res/drawable-xhdpi/ic_tvoption_aspect.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvoption_cc.png b/res/drawable-xhdpi/ic_tvoption_cc.png
index 2c7ce075..0354f610 100644
--- a/res/drawable-xhdpi/ic_tvoption_cc.png
+++ b/res/drawable-xhdpi/ic_tvoption_cc.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvoption_channel_sources.png b/res/drawable-xhdpi/ic_tvoption_channel_sources.png
index f5df5bcd..29be7c49 100644
--- a/res/drawable-xhdpi/ic_tvoption_channel_sources.png
+++ b/res/drawable-xhdpi/ic_tvoption_channel_sources.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvoption_multi_track.png b/res/drawable-xhdpi/ic_tvoption_multi_track.png
index 627451c5..d1aff333 100644
--- a/res/drawable-xhdpi/ic_tvoption_multi_track.png
+++ b/res/drawable-xhdpi/ic_tvoption_multi_track.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvoption_pip.png b/res/drawable-xhdpi/ic_tvoption_pip.png
index 59b972e1..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
index d5f3c465..6001677b 100644
--- a/res/drawable-xhdpi/ic_tvoption_pip_off.png
+++ b/res/drawable-xhdpi/ic_tvoption_pip_off.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_009.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_009.png
index 7ac50e52..3634be7e 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_009.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_009.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_013.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_013.png
index a22926dc..2b85890b 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_013.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_013.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_014.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_014.png
index 257d78fd..7f792140 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_014.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_off_014.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_001.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_001.png
index bd496be3..26795600 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_001.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_001.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_006.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_006.png
index 572daca7..e65a0a6d 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_006.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_006.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_007.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_007.png
index 7a88741c..f06b1c13 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_007.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_007.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_008.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_008.png
index 7ddc977c..5e2d15a6 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_008.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_008.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_009.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_009.png
index 2ff73191..e10651d5 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_009.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_009.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_011.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_011.png
index d5bcc466..049007c2 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_011.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_011.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_012.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_012.png
index 7b87adaa..7a9ace53 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_012.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_012.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_013.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_013.png
index d714eb25..8069a5d4 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_013.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_013.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_015.png b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_015.png
index 0cc4adbd..fd5111ee 100644
--- a/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_015.png
+++ b/res/drawable-xhdpi/ic_tvsidepanel_lock_to_on_015.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_warning_white_12dp.png b/res/drawable-xhdpi/ic_warning_white_12dp.png
new file mode 100644
index 00000000..7123470a
--- /dev/null
+++ b/res/drawable-xhdpi/ic_warning_white_12dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_warning_white_18dp.png b/res/drawable-xhdpi/ic_warning_white_18dp.png
new file mode 100644
index 00000000..1e69e397
--- /dev/null
+++ b/res/drawable-xhdpi/ic_warning_white_18dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_warning_white_24dp.png b/res/drawable-xhdpi/ic_warning_white_24dp.png
deleted file mode 100644
index f90dc48f..00000000
--- a/res/drawable-xhdpi/ic_warning_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_warning_white_32dp.png b/res/drawable-xhdpi/ic_warning_white_32dp.png
new file mode 100644
index 00000000..f5267b5a
--- /dev/null
+++ b/res/drawable-xhdpi/ic_warning_white_32dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_warning_white_36dp.png b/res/drawable-xhdpi/ic_warning_white_36dp.png
deleted file mode 100644
index 55c68431..00000000
--- a/res/drawable-xhdpi/ic_warning_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_warning_white_96dp.png b/res/drawable-xhdpi/ic_warning_white_96dp.png
index 23e6d932..de684e4e 100644
--- a/res/drawable-xhdpi/ic_warning_white_96dp.png
+++ b/res/drawable-xhdpi/ic_warning_white_96dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_remote.png b/res/drawable-xhdpi/ic_welcome_remote.png
index e4dee093..1a46d3f6 100644
--- a/res/drawable-xhdpi/ic_welcome_remote.png
+++ b/res/drawable-xhdpi/ic_welcome_remote.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_000.png b/res/drawable-xhdpi/ic_welcome_ripple_000.png
index 3a895e06..c4aac06c 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_000.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_000.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_001.png b/res/drawable-xhdpi/ic_welcome_ripple_001.png
index 04b1d4b3..6b11f82d 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_001.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_001.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_002.png b/res/drawable-xhdpi/ic_welcome_ripple_002.png
index 7e9ecf26..a8831bbf 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_002.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_002.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_003.png b/res/drawable-xhdpi/ic_welcome_ripple_003.png
index 25c2ce5c..65eaa5af 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_003.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_003.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_004.png b/res/drawable-xhdpi/ic_welcome_ripple_004.png
index e18936c4..9cfcce52 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_004.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_004.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_005.png b/res/drawable-xhdpi/ic_welcome_ripple_005.png
index 70c54176..28564500 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_005.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_005.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_006.png b/res/drawable-xhdpi/ic_welcome_ripple_006.png
index 29b290c6..5312045c 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_006.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_006.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_007.png b/res/drawable-xhdpi/ic_welcome_ripple_007.png
index 28c91fe4..25b0aadd 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_007.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_007.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_008.png b/res/drawable-xhdpi/ic_welcome_ripple_008.png
index 52e13c0a..3a1b5852 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_008.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_008.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_009.png b/res/drawable-xhdpi/ic_welcome_ripple_009.png
index b7dc9eb0..c279671e 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_009.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_009.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_010.png b/res/drawable-xhdpi/ic_welcome_ripple_010.png
index 6bc277b0..6513aec3 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_010.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_010.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_011.png b/res/drawable-xhdpi/ic_welcome_ripple_011.png
index 88ec07b6..fef25e60 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_011.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_011.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_012.png b/res/drawable-xhdpi/ic_welcome_ripple_012.png
index 11c9b354..d38643fb 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_012.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_012.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_013.png b/res/drawable-xhdpi/ic_welcome_ripple_013.png
index ba7d171e..514e4158 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_013.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_013.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_014.png b/res/drawable-xhdpi/ic_welcome_ripple_014.png
index 7e35807b..cd3670fb 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_014.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_014.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_015.png b/res/drawable-xhdpi/ic_welcome_ripple_015.png
index e666d09c..1a149bfd 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_015.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_015.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_016.png b/res/drawable-xhdpi/ic_welcome_ripple_016.png
index ed575d24..2933c7b9 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_016.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_016.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_017.png b/res/drawable-xhdpi/ic_welcome_ripple_017.png
index 796de58f..b270c000 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_017.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_017.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_018.png b/res/drawable-xhdpi/ic_welcome_ripple_018.png
index b771578a..c2e84552 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_018.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_018.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_019.png b/res/drawable-xhdpi/ic_welcome_ripple_019.png
index 11caa031..f88d98f3 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_019.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_019.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_020.png b/res/drawable-xhdpi/ic_welcome_ripple_020.png
index ccb44f97..e35edd02 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_020.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_020.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_021.png b/res/drawable-xhdpi/ic_welcome_ripple_021.png
index 3e28479a..3ac9033e 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_021.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_021.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_022.png b/res/drawable-xhdpi/ic_welcome_ripple_022.png
index b23e9b68..fa08dd82 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_022.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_022.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_023.png b/res/drawable-xhdpi/ic_welcome_ripple_023.png
index ff245dba..f843499d 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_023.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_023.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_024.png b/res/drawable-xhdpi/ic_welcome_ripple_024.png
index 5e757cb4..af557d82 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_024.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_024.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_025.png b/res/drawable-xhdpi/ic_welcome_ripple_025.png
index f30e7442..e0a720d3 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_025.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_025.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_026.png b/res/drawable-xhdpi/ic_welcome_ripple_026.png
index cb91962c..380c8124 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_026.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_026.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_027.png b/res/drawable-xhdpi/ic_welcome_ripple_027.png
index d7cbafaa..2ed6ddc2 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_027.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_027.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_028.png b/res/drawable-xhdpi/ic_welcome_ripple_028.png
index e950fd02..ca74c3af 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_028.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_028.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_welcome_ripple_029.png b/res/drawable-xhdpi/ic_welcome_ripple_029.png
index f44d7588..f35566f7 100644
--- a/res/drawable-xhdpi/ic_welcome_ripple_029.png
+++ b/res/drawable-xhdpi/ic_welcome_ripple_029.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_youtube.png b/res/drawable-xhdpi/ic_youtube.png
deleted file mode 100644
index 653b270d..00000000
--- a/res/drawable-xhdpi/ic_youtube.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/splash_logo.png b/res/drawable-xhdpi/splash_logo.png
index ace0c1b7..6a8d68ee 100644
--- a/res/drawable-xhdpi/splash_logo.png
+++ b/res/drawable-xhdpi/splash_logo.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_03.png b/res/drawable-xhdpi/tv_1a_03.png
index d3963d1f..490081c3 100644
--- a/res/drawable-xhdpi/tv_1a_03.png
+++ b/res/drawable-xhdpi/tv_1a_03.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_04.png b/res/drawable-xhdpi/tv_1a_04.png
index 42c14c54..20dd2b33 100644
--- a/res/drawable-xhdpi/tv_1a_04.png
+++ b/res/drawable-xhdpi/tv_1a_04.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_06.png b/res/drawable-xhdpi/tv_1a_06.png
index e8a128e4..eb31a31c 100644
--- a/res/drawable-xhdpi/tv_1a_06.png
+++ b/res/drawable-xhdpi/tv_1a_06.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_07.png b/res/drawable-xhdpi/tv_1a_07.png
index 893a37c6..b47fa761 100644
--- a/res/drawable-xhdpi/tv_1a_07.png
+++ b/res/drawable-xhdpi/tv_1a_07.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_08.png b/res/drawable-xhdpi/tv_1a_08.png
index 935320c4..b96c5816 100644
--- a/res/drawable-xhdpi/tv_1a_08.png
+++ b/res/drawable-xhdpi/tv_1a_08.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_09.png b/res/drawable-xhdpi/tv_1a_09.png
index 7da4aa15..bd438bd0 100644
--- a/res/drawable-xhdpi/tv_1a_09.png
+++ b/res/drawable-xhdpi/tv_1a_09.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_10.png b/res/drawable-xhdpi/tv_1a_10.png
index b4be66b7..6842ca5f 100644
--- a/res/drawable-xhdpi/tv_1a_10.png
+++ b/res/drawable-xhdpi/tv_1a_10.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_11.png b/res/drawable-xhdpi/tv_1a_11.png
index 06dc5ef5..211274e7 100644
--- a/res/drawable-xhdpi/tv_1a_11.png
+++ b/res/drawable-xhdpi/tv_1a_11.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_13.png b/res/drawable-xhdpi/tv_1a_13.png
index aecfee3c..c39a78e4 100644
--- a/res/drawable-xhdpi/tv_1a_13.png
+++ b/res/drawable-xhdpi/tv_1a_13.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_14.png b/res/drawable-xhdpi/tv_1a_14.png
index 4693c792..b90df8ff 100644
--- a/res/drawable-xhdpi/tv_1a_14.png
+++ b/res/drawable-xhdpi/tv_1a_14.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_15.png b/res/drawable-xhdpi/tv_1a_15.png
index 08bd2569..8d73ecca 100644
--- a/res/drawable-xhdpi/tv_1a_15.png
+++ b/res/drawable-xhdpi/tv_1a_15.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_16.png b/res/drawable-xhdpi/tv_1a_16.png
index fa4794a8..029b4002 100644
--- a/res/drawable-xhdpi/tv_1a_16.png
+++ b/res/drawable-xhdpi/tv_1a_16.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_17.png b/res/drawable-xhdpi/tv_1a_17.png
index 6bcf0e9d..a65e97c1 100644
--- a/res/drawable-xhdpi/tv_1a_17.png
+++ b/res/drawable-xhdpi/tv_1a_17.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_18.png b/res/drawable-xhdpi/tv_1a_18.png
index 533b5c63..91925ba4 100644
--- a/res/drawable-xhdpi/tv_1a_18.png
+++ b/res/drawable-xhdpi/tv_1a_18.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_19.png b/res/drawable-xhdpi/tv_1a_19.png
index 27c982df..81b5b327 100644
--- a/res/drawable-xhdpi/tv_1a_19.png
+++ b/res/drawable-xhdpi/tv_1a_19.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1a_20.png b/res/drawable-xhdpi/tv_1a_20.png
index 8ece6ff3..1f429a16 100644
--- a/res/drawable-xhdpi/tv_1a_20.png
+++ b/res/drawable-xhdpi/tv_1a_20.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1b_01.png b/res/drawable-xhdpi/tv_1b_01.png
index 48a278d6..d7307343 100644
--- a/res/drawable-xhdpi/tv_1b_01.png
+++ b/res/drawable-xhdpi/tv_1b_01.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1b_02.png b/res/drawable-xhdpi/tv_1b_02.png
index e8d197d2..b36e1f03 100644
--- a/res/drawable-xhdpi/tv_1b_02.png
+++ b/res/drawable-xhdpi/tv_1b_02.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1b_03.png b/res/drawable-xhdpi/tv_1b_03.png
index df703808..b94fb62d 100644
--- a/res/drawable-xhdpi/tv_1b_03.png
+++ b/res/drawable-xhdpi/tv_1b_03.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1b_05.png b/res/drawable-xhdpi/tv_1b_05.png
index 6bd6e1cb..080d401b 100644
--- a/res/drawable-xhdpi/tv_1b_05.png
+++ b/res/drawable-xhdpi/tv_1b_05.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1b_06.png b/res/drawable-xhdpi/tv_1b_06.png
index bbe2772e..079d83cb 100644
--- a/res/drawable-xhdpi/tv_1b_06.png
+++ b/res/drawable-xhdpi/tv_1b_06.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_1b_08.png b/res/drawable-xhdpi/tv_1b_08.png
index d49e7435..5d4d5ab7 100644
--- a/res/drawable-xhdpi/tv_1b_08.png
+++ b/res/drawable-xhdpi/tv_1b_08.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_03.png b/res/drawable-xhdpi/tv_2a_03.png
index 205c6cde..d404c31c 100644
--- a/res/drawable-xhdpi/tv_2a_03.png
+++ b/res/drawable-xhdpi/tv_2a_03.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_04.png b/res/drawable-xhdpi/tv_2a_04.png
index 934ba517..07d2367c 100644
--- a/res/drawable-xhdpi/tv_2a_04.png
+++ b/res/drawable-xhdpi/tv_2a_04.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_05.png b/res/drawable-xhdpi/tv_2a_05.png
index fd2d3ee2..f7c262bd 100644
--- a/res/drawable-xhdpi/tv_2a_05.png
+++ b/res/drawable-xhdpi/tv_2a_05.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_06.png b/res/drawable-xhdpi/tv_2a_06.png
index 4db532da..32cf47c4 100644
--- a/res/drawable-xhdpi/tv_2a_06.png
+++ b/res/drawable-xhdpi/tv_2a_06.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_07.png b/res/drawable-xhdpi/tv_2a_07.png
index b7970fe2..87c5dff4 100644
--- a/res/drawable-xhdpi/tv_2a_07.png
+++ b/res/drawable-xhdpi/tv_2a_07.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_08.png b/res/drawable-xhdpi/tv_2a_08.png
index 1889273a..2e5de8af 100644
--- a/res/drawable-xhdpi/tv_2a_08.png
+++ b/res/drawable-xhdpi/tv_2a_08.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_09.png b/res/drawable-xhdpi/tv_2a_09.png
index a6a4056f..21c3ee6d 100644
--- a/res/drawable-xhdpi/tv_2a_09.png
+++ b/res/drawable-xhdpi/tv_2a_09.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_10.png b/res/drawable-xhdpi/tv_2a_10.png
index 58d53e4e..5d3daf78 100644
--- a/res/drawable-xhdpi/tv_2a_10.png
+++ b/res/drawable-xhdpi/tv_2a_10.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_11.png b/res/drawable-xhdpi/tv_2a_11.png
index 999e3936..1b7740aa 100644
--- a/res/drawable-xhdpi/tv_2a_11.png
+++ b/res/drawable-xhdpi/tv_2a_11.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_12.png b/res/drawable-xhdpi/tv_2a_12.png
index 5e7d7cb7..d8a26f00 100644
--- a/res/drawable-xhdpi/tv_2a_12.png
+++ b/res/drawable-xhdpi/tv_2a_12.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_13.png b/res/drawable-xhdpi/tv_2a_13.png
index 938083cc..f847a055 100644
--- a/res/drawable-xhdpi/tv_2a_13.png
+++ b/res/drawable-xhdpi/tv_2a_13.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_14.png b/res/drawable-xhdpi/tv_2a_14.png
index 493ab110..7503a74e 100644
--- a/res/drawable-xhdpi/tv_2a_14.png
+++ b/res/drawable-xhdpi/tv_2a_14.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2a_16.png b/res/drawable-xhdpi/tv_2a_16.png
index ce46007e..a2a12002 100644
--- a/res/drawable-xhdpi/tv_2a_16.png
+++ b/res/drawable-xhdpi/tv_2a_16.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_02.png b/res/drawable-xhdpi/tv_2b_02.png
index 79928ac9..5c4468f1 100644
--- a/res/drawable-xhdpi/tv_2b_02.png
+++ b/res/drawable-xhdpi/tv_2b_02.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_03.png b/res/drawable-xhdpi/tv_2b_03.png
index 896b092a..de7f1869 100644
--- a/res/drawable-xhdpi/tv_2b_03.png
+++ b/res/drawable-xhdpi/tv_2b_03.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_07.png b/res/drawable-xhdpi/tv_2b_07.png
index b2acf5dc..bf0e9950 100644
--- a/res/drawable-xhdpi/tv_2b_07.png
+++ b/res/drawable-xhdpi/tv_2b_07.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_08.png b/res/drawable-xhdpi/tv_2b_08.png
index 71c266c7..87b6a0ef 100644
--- a/res/drawable-xhdpi/tv_2b_08.png
+++ b/res/drawable-xhdpi/tv_2b_08.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_11.png b/res/drawable-xhdpi/tv_2b_11.png
index 2423f70f..af266e08 100644
--- a/res/drawable-xhdpi/tv_2b_11.png
+++ b/res/drawable-xhdpi/tv_2b_11.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_12.png b/res/drawable-xhdpi/tv_2b_12.png
index 949eedf1..d000df07 100644
--- a/res/drawable-xhdpi/tv_2b_12.png
+++ b/res/drawable-xhdpi/tv_2b_12.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_13.png b/res/drawable-xhdpi/tv_2b_13.png
index 3879ed0b..52d272f1 100644
--- a/res/drawable-xhdpi/tv_2b_13.png
+++ b/res/drawable-xhdpi/tv_2b_13.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_16.png b/res/drawable-xhdpi/tv_2b_16.png
index 2162c464..9ed3512f 100644
--- a/res/drawable-xhdpi/tv_2b_16.png
+++ b/res/drawable-xhdpi/tv_2b_16.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_17.png b/res/drawable-xhdpi/tv_2b_17.png
index 84f80253..2cf798c8 100644
--- a/res/drawable-xhdpi/tv_2b_17.png
+++ b/res/drawable-xhdpi/tv_2b_17.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2b_18.png b/res/drawable-xhdpi/tv_2b_18.png
index d3b142db..1c230064 100644
--- a/res/drawable-xhdpi/tv_2b_18.png
+++ b/res/drawable-xhdpi/tv_2b_18.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2c_03.png b/res/drawable-xhdpi/tv_2c_03.png
index 237d8259..61ede2d0 100644
--- a/res/drawable-xhdpi/tv_2c_03.png
+++ b/res/drawable-xhdpi/tv_2c_03.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2c_04.png b/res/drawable-xhdpi/tv_2c_04.png
index 605aa275..8eb9b6e8 100644
--- a/res/drawable-xhdpi/tv_2c_04.png
+++ b/res/drawable-xhdpi/tv_2c_04.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2c_07.png b/res/drawable-xhdpi/tv_2c_07.png
index c64c58f2..91024a62 100644
--- a/res/drawable-xhdpi/tv_2c_07.png
+++ b/res/drawable-xhdpi/tv_2c_07.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2c_10.png b/res/drawable-xhdpi/tv_2c_10.png
index 3ef4cdff..ee1a1e36 100644
--- a/res/drawable-xhdpi/tv_2c_10.png
+++ b/res/drawable-xhdpi/tv_2c_10.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2c_11.png b/res/drawable-xhdpi/tv_2c_11.png
index e09fd5d5..9b74ba74 100644
--- a/res/drawable-xhdpi/tv_2c_11.png
+++ b/res/drawable-xhdpi/tv_2c_11.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2c_12.png b/res/drawable-xhdpi/tv_2c_12.png
index 1b4559c1..a3f266cf 100644
--- a/res/drawable-xhdpi/tv_2c_12.png
+++ b/res/drawable-xhdpi/tv_2c_12.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_2c_13.png b/res/drawable-xhdpi/tv_2c_13.png
index dcc1bbad..63a764c4 100644
--- a/res/drawable-xhdpi/tv_2c_13.png
+++ b/res/drawable-xhdpi/tv_2c_13.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3a_02.png b/res/drawable-xhdpi/tv_3a_02.png
index eeef4884..e2b93c34 100644
--- a/res/drawable-xhdpi/tv_3a_02.png
+++ b/res/drawable-xhdpi/tv_3a_02.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3a_03.png b/res/drawable-xhdpi/tv_3a_03.png
index ab5a6fc7..9ff35c11 100644
--- a/res/drawable-xhdpi/tv_3a_03.png
+++ b/res/drawable-xhdpi/tv_3a_03.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3a_05.png b/res/drawable-xhdpi/tv_3a_05.png
index 398d0d24..d459755a 100644
--- a/res/drawable-xhdpi/tv_3a_05.png
+++ b/res/drawable-xhdpi/tv_3a_05.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3a_06.png b/res/drawable-xhdpi/tv_3a_06.png
index f85daa20..fa9ab2f8 100644
--- a/res/drawable-xhdpi/tv_3a_06.png
+++ b/res/drawable-xhdpi/tv_3a_06.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3a_14.png b/res/drawable-xhdpi/tv_3a_14.png
index 01622dd1..22e17458 100644
--- a/res/drawable-xhdpi/tv_3a_14.png
+++ b/res/drawable-xhdpi/tv_3a_14.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3a_15.png b/res/drawable-xhdpi/tv_3a_15.png
index 72b0ae24..9bb72b52 100644
--- a/res/drawable-xhdpi/tv_3a_15.png
+++ b/res/drawable-xhdpi/tv_3a_15.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_101.png b/res/drawable-xhdpi/tv_3b_101.png
index c39f8f1c..f89d72c9 100644
--- a/res/drawable-xhdpi/tv_3b_101.png
+++ b/res/drawable-xhdpi/tv_3b_101.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_102.png b/res/drawable-xhdpi/tv_3b_102.png
index 2e07f65f..46acde77 100644
--- a/res/drawable-xhdpi/tv_3b_102.png
+++ b/res/drawable-xhdpi/tv_3b_102.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_103.png b/res/drawable-xhdpi/tv_3b_103.png
index 82c52cc7..872c1031 100644
--- a/res/drawable-xhdpi/tv_3b_103.png
+++ b/res/drawable-xhdpi/tv_3b_103.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_108.png b/res/drawable-xhdpi/tv_3b_108.png
index fa43bea1..7dd2e706 100644
--- a/res/drawable-xhdpi/tv_3b_108.png
+++ b/res/drawable-xhdpi/tv_3b_108.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_109.png b/res/drawable-xhdpi/tv_3b_109.png
index 90723eb2..f1442a63 100644
--- a/res/drawable-xhdpi/tv_3b_109.png
+++ b/res/drawable-xhdpi/tv_3b_109.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_111.png b/res/drawable-xhdpi/tv_3b_111.png
index 0b1c1a74..b4de10d4 100644
--- a/res/drawable-xhdpi/tv_3b_111.png
+++ b/res/drawable-xhdpi/tv_3b_111.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_114.png b/res/drawable-xhdpi/tv_3b_114.png
index 551ff6f1..e4e9b2fb 100644
--- a/res/drawable-xhdpi/tv_3b_114.png
+++ b/res/drawable-xhdpi/tv_3b_114.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_115.png b/res/drawable-xhdpi/tv_3b_115.png
index 13890695..40590fff 100644
--- a/res/drawable-xhdpi/tv_3b_115.png
+++ b/res/drawable-xhdpi/tv_3b_115.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_116.png b/res/drawable-xhdpi/tv_3b_116.png
index eb277d4f..c998384c 100644
--- a/res/drawable-xhdpi/tv_3b_116.png
+++ b/res/drawable-xhdpi/tv_3b_116.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_117.png b/res/drawable-xhdpi/tv_3b_117.png
index 1e91ca35..fb93500e 100644
--- a/res/drawable-xhdpi/tv_3b_117.png
+++ b/res/drawable-xhdpi/tv_3b_117.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_118.png b/res/drawable-xhdpi/tv_3b_118.png
index 9d712289..37b6f3b7 100644
--- a/res/drawable-xhdpi/tv_3b_118.png
+++ b/res/drawable-xhdpi/tv_3b_118.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_78.png b/res/drawable-xhdpi/tv_3b_78.png
index b414bb45..4f0dd172 100644
--- a/res/drawable-xhdpi/tv_3b_78.png
+++ b/res/drawable-xhdpi/tv_3b_78.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_82.png b/res/drawable-xhdpi/tv_3b_82.png
index 689d2d72..04c116fd 100644
--- a/res/drawable-xhdpi/tv_3b_82.png
+++ b/res/drawable-xhdpi/tv_3b_82.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_83.png b/res/drawable-xhdpi/tv_3b_83.png
index 18d1f3a3..b63b7516 100644
--- a/res/drawable-xhdpi/tv_3b_83.png
+++ b/res/drawable-xhdpi/tv_3b_83.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_84.png b/res/drawable-xhdpi/tv_3b_84.png
index 85b03413..580f6bc7 100644
--- a/res/drawable-xhdpi/tv_3b_84.png
+++ b/res/drawable-xhdpi/tv_3b_84.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_87.png b/res/drawable-xhdpi/tv_3b_87.png
index 3810362f..138d6d37 100644
--- a/res/drawable-xhdpi/tv_3b_87.png
+++ b/res/drawable-xhdpi/tv_3b_87.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_88.png b/res/drawable-xhdpi/tv_3b_88.png
index c78dcd53..21562493 100644
--- a/res/drawable-xhdpi/tv_3b_88.png
+++ b/res/drawable-xhdpi/tv_3b_88.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_89.png b/res/drawable-xhdpi/tv_3b_89.png
index f0a4d696..30a908c1 100644
--- a/res/drawable-xhdpi/tv_3b_89.png
+++ b/res/drawable-xhdpi/tv_3b_89.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_90.png b/res/drawable-xhdpi/tv_3b_90.png
index d78408c0..ac06bb4b 100644
--- a/res/drawable-xhdpi/tv_3b_90.png
+++ b/res/drawable-xhdpi/tv_3b_90.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_91.png b/res/drawable-xhdpi/tv_3b_91.png
index 977d290e..19848516 100644
--- a/res/drawable-xhdpi/tv_3b_91.png
+++ b/res/drawable-xhdpi/tv_3b_91.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_92.png b/res/drawable-xhdpi/tv_3b_92.png
index 09e53730..dbf1012b 100644
--- a/res/drawable-xhdpi/tv_3b_92.png
+++ b/res/drawable-xhdpi/tv_3b_92.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_93.png b/res/drawable-xhdpi/tv_3b_93.png
index c55bfc4d..fac169dc 100644
--- a/res/drawable-xhdpi/tv_3b_93.png
+++ b/res/drawable-xhdpi/tv_3b_93.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_95.png b/res/drawable-xhdpi/tv_3b_95.png
index 46a6f6b5..4196da12 100644
--- a/res/drawable-xhdpi/tv_3b_95.png
+++ b/res/drawable-xhdpi/tv_3b_95.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_96.png b/res/drawable-xhdpi/tv_3b_96.png
index 6ac190ef..96d9eee3 100644
--- a/res/drawable-xhdpi/tv_3b_96.png
+++ b/res/drawable-xhdpi/tv_3b_96.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_3b_97.png b/res/drawable-xhdpi/tv_3b_97.png
index b8935983..82e92f23 100644
--- a/res/drawable-xhdpi/tv_3b_97.png
+++ b/res/drawable-xhdpi/tv_3b_97.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_10.png b/res/drawable-xhdpi/tv_5a_10.png
index 122eb47a..e1d28897 100644
--- a/res/drawable-xhdpi/tv_5a_10.png
+++ b/res/drawable-xhdpi/tv_5a_10.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_101.png b/res/drawable-xhdpi/tv_5a_101.png
index 68f46824..a2e33138 100644
--- a/res/drawable-xhdpi/tv_5a_101.png
+++ b/res/drawable-xhdpi/tv_5a_101.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_104.png b/res/drawable-xhdpi/tv_5a_104.png
index f0352d09..4d069b91 100644
--- a/res/drawable-xhdpi/tv_5a_104.png
+++ b/res/drawable-xhdpi/tv_5a_104.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_105.png b/res/drawable-xhdpi/tv_5a_105.png
index 695dd905..5d92e53c 100644
--- a/res/drawable-xhdpi/tv_5a_105.png
+++ b/res/drawable-xhdpi/tv_5a_105.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_107.png b/res/drawable-xhdpi/tv_5a_107.png
index 84290e64..828f0bda 100644
--- a/res/drawable-xhdpi/tv_5a_107.png
+++ b/res/drawable-xhdpi/tv_5a_107.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_108.png b/res/drawable-xhdpi/tv_5a_108.png
index 4587f791..e146476e 100644
--- a/res/drawable-xhdpi/tv_5a_108.png
+++ b/res/drawable-xhdpi/tv_5a_108.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_109.png b/res/drawable-xhdpi/tv_5a_109.png
index c717b4cb..a2de015a 100644
--- a/res/drawable-xhdpi/tv_5a_109.png
+++ b/res/drawable-xhdpi/tv_5a_109.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_110.png b/res/drawable-xhdpi/tv_5a_110.png
index cc6b02a6..ba7a062a 100644
--- a/res/drawable-xhdpi/tv_5a_110.png
+++ b/res/drawable-xhdpi/tv_5a_110.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_111.png b/res/drawable-xhdpi/tv_5a_111.png
index c1b896fe..9c73e146 100644
--- a/res/drawable-xhdpi/tv_5a_111.png
+++ b/res/drawable-xhdpi/tv_5a_111.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_112.png b/res/drawable-xhdpi/tv_5a_112.png
index 80d90c19..ff25996a 100644
--- a/res/drawable-xhdpi/tv_5a_112.png
+++ b/res/drawable-xhdpi/tv_5a_112.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_113.png b/res/drawable-xhdpi/tv_5a_113.png
index 595fc01d..e0f5976e 100644
--- a/res/drawable-xhdpi/tv_5a_113.png
+++ b/res/drawable-xhdpi/tv_5a_113.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_114.png b/res/drawable-xhdpi/tv_5a_114.png
index 42dc7e00..6cbbe628 100644
--- a/res/drawable-xhdpi/tv_5a_114.png
+++ b/res/drawable-xhdpi/tv_5a_114.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_115.png b/res/drawable-xhdpi/tv_5a_115.png
index 70e63d1f..91ee15f4 100644
--- a/res/drawable-xhdpi/tv_5a_115.png
+++ b/res/drawable-xhdpi/tv_5a_115.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_118.png b/res/drawable-xhdpi/tv_5a_118.png
index 23efc62c..7b02a8ec 100644
--- a/res/drawable-xhdpi/tv_5a_118.png
+++ b/res/drawable-xhdpi/tv_5a_118.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_119.png b/res/drawable-xhdpi/tv_5a_119.png
index 0bef996e..5f6ecb25 100644
--- a/res/drawable-xhdpi/tv_5a_119.png
+++ b/res/drawable-xhdpi/tv_5a_119.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_12.png b/res/drawable-xhdpi/tv_5a_12.png
index 3a22c15d..3d781aff 100644
--- a/res/drawable-xhdpi/tv_5a_12.png
+++ b/res/drawable-xhdpi/tv_5a_12.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_122.png b/res/drawable-xhdpi/tv_5a_122.png
index 17445e9a..6ef694ac 100644
--- a/res/drawable-xhdpi/tv_5a_122.png
+++ b/res/drawable-xhdpi/tv_5a_122.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_123.png b/res/drawable-xhdpi/tv_5a_123.png
index 21df28a7..587e8c98 100644
--- a/res/drawable-xhdpi/tv_5a_123.png
+++ b/res/drawable-xhdpi/tv_5a_123.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_124.png b/res/drawable-xhdpi/tv_5a_124.png
index 2923a2a8..d3ab882c 100644
--- a/res/drawable-xhdpi/tv_5a_124.png
+++ b/res/drawable-xhdpi/tv_5a_124.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_125.png b/res/drawable-xhdpi/tv_5a_125.png
index 9bf8cd1e..ce153872 100644
--- a/res/drawable-xhdpi/tv_5a_125.png
+++ b/res/drawable-xhdpi/tv_5a_125.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_126.png b/res/drawable-xhdpi/tv_5a_126.png
index e63500dc..5162e697 100644
--- a/res/drawable-xhdpi/tv_5a_126.png
+++ b/res/drawable-xhdpi/tv_5a_126.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_128.png b/res/drawable-xhdpi/tv_5a_128.png
index fa49cf03..91be8872 100644
--- a/res/drawable-xhdpi/tv_5a_128.png
+++ b/res/drawable-xhdpi/tv_5a_128.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_129.png b/res/drawable-xhdpi/tv_5a_129.png
index 022bcd3c..49a4c942 100644
--- a/res/drawable-xhdpi/tv_5a_129.png
+++ b/res/drawable-xhdpi/tv_5a_129.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_131.png b/res/drawable-xhdpi/tv_5a_131.png
index 24c3e11a..6bbc8018 100644
--- a/res/drawable-xhdpi/tv_5a_131.png
+++ b/res/drawable-xhdpi/tv_5a_131.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_135.png b/res/drawable-xhdpi/tv_5a_135.png
index ffbf41a1..15c0a48e 100644
--- a/res/drawable-xhdpi/tv_5a_135.png
+++ b/res/drawable-xhdpi/tv_5a_135.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_136.png b/res/drawable-xhdpi/tv_5a_136.png
index cecf8ac5..3c1ef38a 100644
--- a/res/drawable-xhdpi/tv_5a_136.png
+++ b/res/drawable-xhdpi/tv_5a_136.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_137.png b/res/drawable-xhdpi/tv_5a_137.png
index 8b1a4383..5d36c581 100644
--- a/res/drawable-xhdpi/tv_5a_137.png
+++ b/res/drawable-xhdpi/tv_5a_137.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_139.png b/res/drawable-xhdpi/tv_5a_139.png
index a2f4d033..8958aa2c 100644
--- a/res/drawable-xhdpi/tv_5a_139.png
+++ b/res/drawable-xhdpi/tv_5a_139.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_14.png b/res/drawable-xhdpi/tv_5a_14.png
index 5fb9f716..e2805814 100644
--- a/res/drawable-xhdpi/tv_5a_14.png
+++ b/res/drawable-xhdpi/tv_5a_14.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_140.png b/res/drawable-xhdpi/tv_5a_140.png
index e7ac42c2..5fc33b72 100644
--- a/res/drawable-xhdpi/tv_5a_140.png
+++ b/res/drawable-xhdpi/tv_5a_140.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_141.png b/res/drawable-xhdpi/tv_5a_141.png
index fef43693..c213b093 100644
--- a/res/drawable-xhdpi/tv_5a_141.png
+++ b/res/drawable-xhdpi/tv_5a_141.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_142.png b/res/drawable-xhdpi/tv_5a_142.png
index 1f7ae4e3..d2d85077 100644
--- a/res/drawable-xhdpi/tv_5a_142.png
+++ b/res/drawable-xhdpi/tv_5a_142.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_143.png b/res/drawable-xhdpi/tv_5a_143.png
index 8d5e025a..9cf8e4e6 100644
--- a/res/drawable-xhdpi/tv_5a_143.png
+++ b/res/drawable-xhdpi/tv_5a_143.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_144.png b/res/drawable-xhdpi/tv_5a_144.png
index 0d052f7a..8deb2cc6 100644
--- a/res/drawable-xhdpi/tv_5a_144.png
+++ b/res/drawable-xhdpi/tv_5a_144.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_146.png b/res/drawable-xhdpi/tv_5a_146.png
index 80cdbe64..05fc7075 100644
--- a/res/drawable-xhdpi/tv_5a_146.png
+++ b/res/drawable-xhdpi/tv_5a_146.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_147.png b/res/drawable-xhdpi/tv_5a_147.png
index b4d25728..d78cde50 100644
--- a/res/drawable-xhdpi/tv_5a_147.png
+++ b/res/drawable-xhdpi/tv_5a_147.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_149.png b/res/drawable-xhdpi/tv_5a_149.png
index 623d2b28..8473ab38 100644
--- a/res/drawable-xhdpi/tv_5a_149.png
+++ b/res/drawable-xhdpi/tv_5a_149.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_151.png b/res/drawable-xhdpi/tv_5a_151.png
index e8c1e883..8535b479 100644
--- a/res/drawable-xhdpi/tv_5a_151.png
+++ b/res/drawable-xhdpi/tv_5a_151.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_153.png b/res/drawable-xhdpi/tv_5a_153.png
index 81785bc7..491b1702 100644
--- a/res/drawable-xhdpi/tv_5a_153.png
+++ b/res/drawable-xhdpi/tv_5a_153.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_155.png b/res/drawable-xhdpi/tv_5a_155.png
index 2be2a2f5..56b79721 100644
--- a/res/drawable-xhdpi/tv_5a_155.png
+++ b/res/drawable-xhdpi/tv_5a_155.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_157.png b/res/drawable-xhdpi/tv_5a_157.png
index dc6a8bf4..345501ce 100644
--- a/res/drawable-xhdpi/tv_5a_157.png
+++ b/res/drawable-xhdpi/tv_5a_157.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_158.png b/res/drawable-xhdpi/tv_5a_158.png
index 4a5cf1f5..17938dbc 100644
--- a/res/drawable-xhdpi/tv_5a_158.png
+++ b/res/drawable-xhdpi/tv_5a_158.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_159.png b/res/drawable-xhdpi/tv_5a_159.png
index bb7582be..16f2c6ef 100644
--- a/res/drawable-xhdpi/tv_5a_159.png
+++ b/res/drawable-xhdpi/tv_5a_159.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_16.png b/res/drawable-xhdpi/tv_5a_16.png
index 6d97a158..c613f64f 100644
--- a/res/drawable-xhdpi/tv_5a_16.png
+++ b/res/drawable-xhdpi/tv_5a_16.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_160.png b/res/drawable-xhdpi/tv_5a_160.png
index 5d774668..8276e924 100644
--- a/res/drawable-xhdpi/tv_5a_160.png
+++ b/res/drawable-xhdpi/tv_5a_160.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_161.png b/res/drawable-xhdpi/tv_5a_161.png
index bf8acb66..fcfa08a5 100644
--- a/res/drawable-xhdpi/tv_5a_161.png
+++ b/res/drawable-xhdpi/tv_5a_161.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_162.png b/res/drawable-xhdpi/tv_5a_162.png
index 96e2cc33..45e6840f 100644
--- a/res/drawable-xhdpi/tv_5a_162.png
+++ b/res/drawable-xhdpi/tv_5a_162.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_163.png b/res/drawable-xhdpi/tv_5a_163.png
index 9649ee0a..3eb76cbb 100644
--- a/res/drawable-xhdpi/tv_5a_163.png
+++ b/res/drawable-xhdpi/tv_5a_163.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_169.png b/res/drawable-xhdpi/tv_5a_169.png
index 6530569d..9ed66682 100644
--- a/res/drawable-xhdpi/tv_5a_169.png
+++ b/res/drawable-xhdpi/tv_5a_169.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_17.png b/res/drawable-xhdpi/tv_5a_17.png
index bf69a10f..5a9d4b02 100644
--- a/res/drawable-xhdpi/tv_5a_17.png
+++ b/res/drawable-xhdpi/tv_5a_17.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_171.png b/res/drawable-xhdpi/tv_5a_171.png
index 7bf47c7d..3ec0de0b 100644
--- a/res/drawable-xhdpi/tv_5a_171.png
+++ b/res/drawable-xhdpi/tv_5a_171.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_172.png b/res/drawable-xhdpi/tv_5a_172.png
index 4913288a..d514c014 100644
--- a/res/drawable-xhdpi/tv_5a_172.png
+++ b/res/drawable-xhdpi/tv_5a_172.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_177.png b/res/drawable-xhdpi/tv_5a_177.png
index 94cc5bd3..a3c892fd 100644
--- a/res/drawable-xhdpi/tv_5a_177.png
+++ b/res/drawable-xhdpi/tv_5a_177.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_178.png b/res/drawable-xhdpi/tv_5a_178.png
index 060d4fc8..b6c6fded 100644
--- a/res/drawable-xhdpi/tv_5a_178.png
+++ b/res/drawable-xhdpi/tv_5a_178.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_179.png b/res/drawable-xhdpi/tv_5a_179.png
index 0c92a097..f3e643c7 100644
--- a/res/drawable-xhdpi/tv_5a_179.png
+++ b/res/drawable-xhdpi/tv_5a_179.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_181.png b/res/drawable-xhdpi/tv_5a_181.png
index 50a0e0e7..6d2a1cbe 100644
--- a/res/drawable-xhdpi/tv_5a_181.png
+++ b/res/drawable-xhdpi/tv_5a_181.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_182.png b/res/drawable-xhdpi/tv_5a_182.png
index 904afbc5..65ad16f9 100644
--- a/res/drawable-xhdpi/tv_5a_182.png
+++ b/res/drawable-xhdpi/tv_5a_182.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_183.png b/res/drawable-xhdpi/tv_5a_183.png
index a090e88e..a8a043a8 100644
--- a/res/drawable-xhdpi/tv_5a_183.png
+++ b/res/drawable-xhdpi/tv_5a_183.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_184.png b/res/drawable-xhdpi/tv_5a_184.png
index c16eba97..a52a749d 100644
--- a/res/drawable-xhdpi/tv_5a_184.png
+++ b/res/drawable-xhdpi/tv_5a_184.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_185.png b/res/drawable-xhdpi/tv_5a_185.png
index 2c3e9bbf..4304a690 100644
--- a/res/drawable-xhdpi/tv_5a_185.png
+++ b/res/drawable-xhdpi/tv_5a_185.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_187.png b/res/drawable-xhdpi/tv_5a_187.png
index e52917f7..4653cc1f 100644
--- a/res/drawable-xhdpi/tv_5a_187.png
+++ b/res/drawable-xhdpi/tv_5a_187.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_188.png b/res/drawable-xhdpi/tv_5a_188.png
index 065396c9..08f44331 100644
--- a/res/drawable-xhdpi/tv_5a_188.png
+++ b/res/drawable-xhdpi/tv_5a_188.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_190.png b/res/drawable-xhdpi/tv_5a_190.png
index 9b23827c..f4ca0c90 100644
--- a/res/drawable-xhdpi/tv_5a_190.png
+++ b/res/drawable-xhdpi/tv_5a_190.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_191.png b/res/drawable-xhdpi/tv_5a_191.png
index 5a563261..534cbdbe 100644
--- a/res/drawable-xhdpi/tv_5a_191.png
+++ b/res/drawable-xhdpi/tv_5a_191.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_192.png b/res/drawable-xhdpi/tv_5a_192.png
index 15610eb4..7b5937d3 100644
--- a/res/drawable-xhdpi/tv_5a_192.png
+++ b/res/drawable-xhdpi/tv_5a_192.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_193.png b/res/drawable-xhdpi/tv_5a_193.png
index 8dc9f245..bf00c5e8 100644
--- a/res/drawable-xhdpi/tv_5a_193.png
+++ b/res/drawable-xhdpi/tv_5a_193.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_194.png b/res/drawable-xhdpi/tv_5a_194.png
index f77997f5..2e6348e3 100644
--- a/res/drawable-xhdpi/tv_5a_194.png
+++ b/res/drawable-xhdpi/tv_5a_194.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_196.png b/res/drawable-xhdpi/tv_5a_196.png
index 97bd77d0..32cbd20f 100644
--- a/res/drawable-xhdpi/tv_5a_196.png
+++ b/res/drawable-xhdpi/tv_5a_196.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_197.png b/res/drawable-xhdpi/tv_5a_197.png
index 4615f9ee..7ce50b64 100644
--- a/res/drawable-xhdpi/tv_5a_197.png
+++ b/res/drawable-xhdpi/tv_5a_197.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_198.png b/res/drawable-xhdpi/tv_5a_198.png
index d9680539..8ad657f9 100644
--- a/res/drawable-xhdpi/tv_5a_198.png
+++ b/res/drawable-xhdpi/tv_5a_198.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_199.png b/res/drawable-xhdpi/tv_5a_199.png
index e58e19c2..e035151d 100644
--- a/res/drawable-xhdpi/tv_5a_199.png
+++ b/res/drawable-xhdpi/tv_5a_199.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_20.png b/res/drawable-xhdpi/tv_5a_20.png
index b3536f1f..e96b0235 100644
--- a/res/drawable-xhdpi/tv_5a_20.png
+++ b/res/drawable-xhdpi/tv_5a_20.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_200.png b/res/drawable-xhdpi/tv_5a_200.png
index 2bde45b9..8f198461 100644
--- a/res/drawable-xhdpi/tv_5a_200.png
+++ b/res/drawable-xhdpi/tv_5a_200.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_203.png b/res/drawable-xhdpi/tv_5a_203.png
index 122553e7..77eaaf63 100644
--- a/res/drawable-xhdpi/tv_5a_203.png
+++ b/res/drawable-xhdpi/tv_5a_203.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_204.png b/res/drawable-xhdpi/tv_5a_204.png
index 049a1134..30a32018 100644
--- a/res/drawable-xhdpi/tv_5a_204.png
+++ b/res/drawable-xhdpi/tv_5a_204.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_205.png b/res/drawable-xhdpi/tv_5a_205.png
index 59c7e840..a9e91ffa 100644
--- a/res/drawable-xhdpi/tv_5a_205.png
+++ b/res/drawable-xhdpi/tv_5a_205.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_206.png b/res/drawable-xhdpi/tv_5a_206.png
index 515a121a..9e02950a 100644
--- a/res/drawable-xhdpi/tv_5a_206.png
+++ b/res/drawable-xhdpi/tv_5a_206.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_207.png b/res/drawable-xhdpi/tv_5a_207.png
index 73fc04fc..1a928157 100644
--- a/res/drawable-xhdpi/tv_5a_207.png
+++ b/res/drawable-xhdpi/tv_5a_207.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_208.png b/res/drawable-xhdpi/tv_5a_208.png
index fc54c1e7..babffa54 100644
--- a/res/drawable-xhdpi/tv_5a_208.png
+++ b/res/drawable-xhdpi/tv_5a_208.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_209.png b/res/drawable-xhdpi/tv_5a_209.png
index f33cdb1a..bef3cd49 100644
--- a/res/drawable-xhdpi/tv_5a_209.png
+++ b/res/drawable-xhdpi/tv_5a_209.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_21.png b/res/drawable-xhdpi/tv_5a_21.png
index 3d5b3ea5..fc40e7a2 100644
--- a/res/drawable-xhdpi/tv_5a_21.png
+++ b/res/drawable-xhdpi/tv_5a_21.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_210.png b/res/drawable-xhdpi/tv_5a_210.png
index b9dc6af8..5a7e118a 100644
--- a/res/drawable-xhdpi/tv_5a_210.png
+++ b/res/drawable-xhdpi/tv_5a_210.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_212.png b/res/drawable-xhdpi/tv_5a_212.png
index c238968f..e8a80ea4 100644
--- a/res/drawable-xhdpi/tv_5a_212.png
+++ b/res/drawable-xhdpi/tv_5a_212.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_216.png b/res/drawable-xhdpi/tv_5a_216.png
index 2beb399c..9733b9d6 100644
--- a/res/drawable-xhdpi/tv_5a_216.png
+++ b/res/drawable-xhdpi/tv_5a_216.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_217.png b/res/drawable-xhdpi/tv_5a_217.png
index 26ba41f6..a50e4078 100644
--- a/res/drawable-xhdpi/tv_5a_217.png
+++ b/res/drawable-xhdpi/tv_5a_217.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_218.png b/res/drawable-xhdpi/tv_5a_218.png
index e8971023..0419d7ea 100644
--- a/res/drawable-xhdpi/tv_5a_218.png
+++ b/res/drawable-xhdpi/tv_5a_218.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_22.png b/res/drawable-xhdpi/tv_5a_22.png
index cbaaaa34..0a46fe4c 100644
--- a/res/drawable-xhdpi/tv_5a_22.png
+++ b/res/drawable-xhdpi/tv_5a_22.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_221.png b/res/drawable-xhdpi/tv_5a_221.png
index cf338726..6d5568b9 100644
--- a/res/drawable-xhdpi/tv_5a_221.png
+++ b/res/drawable-xhdpi/tv_5a_221.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_222.png b/res/drawable-xhdpi/tv_5a_222.png
index 12be8603..092862f4 100644
--- a/res/drawable-xhdpi/tv_5a_222.png
+++ b/res/drawable-xhdpi/tv_5a_222.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_223.png b/res/drawable-xhdpi/tv_5a_223.png
index 03342146..4d1086ae 100644
--- a/res/drawable-xhdpi/tv_5a_223.png
+++ b/res/drawable-xhdpi/tv_5a_223.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_224.png b/res/drawable-xhdpi/tv_5a_224.png
index f44f3b31..dad1878c 100644
--- a/res/drawable-xhdpi/tv_5a_224.png
+++ b/res/drawable-xhdpi/tv_5a_224.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_25.png b/res/drawable-xhdpi/tv_5a_25.png
index 2ced0a02..946a586a 100644
--- a/res/drawable-xhdpi/tv_5a_25.png
+++ b/res/drawable-xhdpi/tv_5a_25.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_29.png b/res/drawable-xhdpi/tv_5a_29.png
index 9bac9da3..e13eaba4 100644
--- a/res/drawable-xhdpi/tv_5a_29.png
+++ b/res/drawable-xhdpi/tv_5a_29.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_30.png b/res/drawable-xhdpi/tv_5a_30.png
index 2c54f564..48688fa0 100644
--- a/res/drawable-xhdpi/tv_5a_30.png
+++ b/res/drawable-xhdpi/tv_5a_30.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_31.png b/res/drawable-xhdpi/tv_5a_31.png
index f57180e8..4e1fd2cc 100644
--- a/res/drawable-xhdpi/tv_5a_31.png
+++ b/res/drawable-xhdpi/tv_5a_31.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_32.png b/res/drawable-xhdpi/tv_5a_32.png
index cc325229..c9a757f0 100644
--- a/res/drawable-xhdpi/tv_5a_32.png
+++ b/res/drawable-xhdpi/tv_5a_32.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_33.png b/res/drawable-xhdpi/tv_5a_33.png
index 8c69ee85..328cb2a0 100644
--- a/res/drawable-xhdpi/tv_5a_33.png
+++ b/res/drawable-xhdpi/tv_5a_33.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_36.png b/res/drawable-xhdpi/tv_5a_36.png
index 20c20db8..8a1572ec 100644
--- a/res/drawable-xhdpi/tv_5a_36.png
+++ b/res/drawable-xhdpi/tv_5a_36.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_37.png b/res/drawable-xhdpi/tv_5a_37.png
index 683d659f..f95f14fa 100644
--- a/res/drawable-xhdpi/tv_5a_37.png
+++ b/res/drawable-xhdpi/tv_5a_37.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_38.png b/res/drawable-xhdpi/tv_5a_38.png
index 0e94e42c..02ee5669 100644
--- a/res/drawable-xhdpi/tv_5a_38.png
+++ b/res/drawable-xhdpi/tv_5a_38.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_40.png b/res/drawable-xhdpi/tv_5a_40.png
index ee78ccc4..84c02967 100644
--- a/res/drawable-xhdpi/tv_5a_40.png
+++ b/res/drawable-xhdpi/tv_5a_40.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_41.png b/res/drawable-xhdpi/tv_5a_41.png
index 0d849949..867d64e7 100644
--- a/res/drawable-xhdpi/tv_5a_41.png
+++ b/res/drawable-xhdpi/tv_5a_41.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_42.png b/res/drawable-xhdpi/tv_5a_42.png
index d7ab63d6..9fc75557 100644
--- a/res/drawable-xhdpi/tv_5a_42.png
+++ b/res/drawable-xhdpi/tv_5a_42.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_43.png b/res/drawable-xhdpi/tv_5a_43.png
index 8ebb2251..e87f8950 100644
--- a/res/drawable-xhdpi/tv_5a_43.png
+++ b/res/drawable-xhdpi/tv_5a_43.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_45.png b/res/drawable-xhdpi/tv_5a_45.png
index bfd189bc..52f5a9dd 100644
--- a/res/drawable-xhdpi/tv_5a_45.png
+++ b/res/drawable-xhdpi/tv_5a_45.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_46.png b/res/drawable-xhdpi/tv_5a_46.png
index 9184ed54..59caf0b4 100644
--- a/res/drawable-xhdpi/tv_5a_46.png
+++ b/res/drawable-xhdpi/tv_5a_46.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_47.png b/res/drawable-xhdpi/tv_5a_47.png
index f0991ae9..0a1e6e2d 100644
--- a/res/drawable-xhdpi/tv_5a_47.png
+++ b/res/drawable-xhdpi/tv_5a_47.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_48.png b/res/drawable-xhdpi/tv_5a_48.png
index 94a2aa1f..e4a0b400 100644
--- a/res/drawable-xhdpi/tv_5a_48.png
+++ b/res/drawable-xhdpi/tv_5a_48.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_5.png b/res/drawable-xhdpi/tv_5a_5.png
index ad1e83f7..8b13e614 100644
--- a/res/drawable-xhdpi/tv_5a_5.png
+++ b/res/drawable-xhdpi/tv_5a_5.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_50.png b/res/drawable-xhdpi/tv_5a_50.png
index 68a7929b..2f6d214e 100644
--- a/res/drawable-xhdpi/tv_5a_50.png
+++ b/res/drawable-xhdpi/tv_5a_50.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_51.png b/res/drawable-xhdpi/tv_5a_51.png
index 6ec0a762..7733da0a 100644
--- a/res/drawable-xhdpi/tv_5a_51.png
+++ b/res/drawable-xhdpi/tv_5a_51.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_52.png b/res/drawable-xhdpi/tv_5a_52.png
index a2304979..3d7f6336 100644
--- a/res/drawable-xhdpi/tv_5a_52.png
+++ b/res/drawable-xhdpi/tv_5a_52.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_54.png b/res/drawable-xhdpi/tv_5a_54.png
index 34972c9d..0e4b9bf7 100644
--- a/res/drawable-xhdpi/tv_5a_54.png
+++ b/res/drawable-xhdpi/tv_5a_54.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_57.png b/res/drawable-xhdpi/tv_5a_57.png
index f5e49286..6baa56d5 100644
--- a/res/drawable-xhdpi/tv_5a_57.png
+++ b/res/drawable-xhdpi/tv_5a_57.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_58.png b/res/drawable-xhdpi/tv_5a_58.png
index 46fe471c..1dd6d001 100644
--- a/res/drawable-xhdpi/tv_5a_58.png
+++ b/res/drawable-xhdpi/tv_5a_58.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_59.png b/res/drawable-xhdpi/tv_5a_59.png
index 591400fe..7a3060a3 100644
--- a/res/drawable-xhdpi/tv_5a_59.png
+++ b/res/drawable-xhdpi/tv_5a_59.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_6.png b/res/drawable-xhdpi/tv_5a_6.png
index e8f1b4ad..7ca6df84 100644
--- a/res/drawable-xhdpi/tv_5a_6.png
+++ b/res/drawable-xhdpi/tv_5a_6.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_60.png b/res/drawable-xhdpi/tv_5a_60.png
index a5df4dcb..637c6f13 100644
--- a/res/drawable-xhdpi/tv_5a_60.png
+++ b/res/drawable-xhdpi/tv_5a_60.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_61.png b/res/drawable-xhdpi/tv_5a_61.png
index 4253871d..1b765930 100644
--- a/res/drawable-xhdpi/tv_5a_61.png
+++ b/res/drawable-xhdpi/tv_5a_61.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_63.png b/res/drawable-xhdpi/tv_5a_63.png
index fb8fd03c..9fbd3061 100644
--- a/res/drawable-xhdpi/tv_5a_63.png
+++ b/res/drawable-xhdpi/tv_5a_63.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_64.png b/res/drawable-xhdpi/tv_5a_64.png
index 88cd8b35..d3c0c613 100644
--- a/res/drawable-xhdpi/tv_5a_64.png
+++ b/res/drawable-xhdpi/tv_5a_64.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_65.png b/res/drawable-xhdpi/tv_5a_65.png
index 8a1633d7..51ae5ea5 100644
--- a/res/drawable-xhdpi/tv_5a_65.png
+++ b/res/drawable-xhdpi/tv_5a_65.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_66.png b/res/drawable-xhdpi/tv_5a_66.png
index d61dc6f6..040c7c98 100644
--- a/res/drawable-xhdpi/tv_5a_66.png
+++ b/res/drawable-xhdpi/tv_5a_66.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_68.png b/res/drawable-xhdpi/tv_5a_68.png
index c405ecff..9c5c2031 100644
--- a/res/drawable-xhdpi/tv_5a_68.png
+++ b/res/drawable-xhdpi/tv_5a_68.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_69.png b/res/drawable-xhdpi/tv_5a_69.png
index 21321a54..ce310728 100644
--- a/res/drawable-xhdpi/tv_5a_69.png
+++ b/res/drawable-xhdpi/tv_5a_69.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_70.png b/res/drawable-xhdpi/tv_5a_70.png
index ef4f9172..baaf3c20 100644
--- a/res/drawable-xhdpi/tv_5a_70.png
+++ b/res/drawable-xhdpi/tv_5a_70.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_71.png b/res/drawable-xhdpi/tv_5a_71.png
index 09142be4..4ea413d7 100644
--- a/res/drawable-xhdpi/tv_5a_71.png
+++ b/res/drawable-xhdpi/tv_5a_71.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_72.png b/res/drawable-xhdpi/tv_5a_72.png
index 13fc5786..1c4fbe63 100644
--- a/res/drawable-xhdpi/tv_5a_72.png
+++ b/res/drawable-xhdpi/tv_5a_72.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_73.png b/res/drawable-xhdpi/tv_5a_73.png
index 4eadcd31..1bc9d343 100644
--- a/res/drawable-xhdpi/tv_5a_73.png
+++ b/res/drawable-xhdpi/tv_5a_73.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_74.png b/res/drawable-xhdpi/tv_5a_74.png
index 9b9b8893..cf850749 100644
--- a/res/drawable-xhdpi/tv_5a_74.png
+++ b/res/drawable-xhdpi/tv_5a_74.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_75.png b/res/drawable-xhdpi/tv_5a_75.png
index f8b5014e..9628e04c 100644
--- a/res/drawable-xhdpi/tv_5a_75.png
+++ b/res/drawable-xhdpi/tv_5a_75.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_76.png b/res/drawable-xhdpi/tv_5a_76.png
index 98365aab..4c3515e6 100644
--- a/res/drawable-xhdpi/tv_5a_76.png
+++ b/res/drawable-xhdpi/tv_5a_76.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_77.png b/res/drawable-xhdpi/tv_5a_77.png
index 46d14edc..23e883e2 100644
--- a/res/drawable-xhdpi/tv_5a_77.png
+++ b/res/drawable-xhdpi/tv_5a_77.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_78.png b/res/drawable-xhdpi/tv_5a_78.png
index 233a27e5..2d92ff4a 100644
--- a/res/drawable-xhdpi/tv_5a_78.png
+++ b/res/drawable-xhdpi/tv_5a_78.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_79.png b/res/drawable-xhdpi/tv_5a_79.png
index 49da47db..1f5af668 100644
--- a/res/drawable-xhdpi/tv_5a_79.png
+++ b/res/drawable-xhdpi/tv_5a_79.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_80.png b/res/drawable-xhdpi/tv_5a_80.png
index c7ece18a..101305ef 100644
--- a/res/drawable-xhdpi/tv_5a_80.png
+++ b/res/drawable-xhdpi/tv_5a_80.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_81.png b/res/drawable-xhdpi/tv_5a_81.png
index fa8e5500..70f39d00 100644
--- a/res/drawable-xhdpi/tv_5a_81.png
+++ b/res/drawable-xhdpi/tv_5a_81.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_82.png b/res/drawable-xhdpi/tv_5a_82.png
index 207302cd..4a5c099d 100644
--- a/res/drawable-xhdpi/tv_5a_82.png
+++ b/res/drawable-xhdpi/tv_5a_82.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_83.png b/res/drawable-xhdpi/tv_5a_83.png
index af171ca9..eec16527 100644
--- a/res/drawable-xhdpi/tv_5a_83.png
+++ b/res/drawable-xhdpi/tv_5a_83.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_87.png b/res/drawable-xhdpi/tv_5a_87.png
index e5925247..dddae79c 100644
--- a/res/drawable-xhdpi/tv_5a_87.png
+++ b/res/drawable-xhdpi/tv_5a_87.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_88.png b/res/drawable-xhdpi/tv_5a_88.png
index 620cb3e0..a3a34877 100644
--- a/res/drawable-xhdpi/tv_5a_88.png
+++ b/res/drawable-xhdpi/tv_5a_88.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_89.png b/res/drawable-xhdpi/tv_5a_89.png
index f86d197f..9786fbaa 100644
--- a/res/drawable-xhdpi/tv_5a_89.png
+++ b/res/drawable-xhdpi/tv_5a_89.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_9.png b/res/drawable-xhdpi/tv_5a_9.png
index 05b819b3..b4fee41b 100644
--- a/res/drawable-xhdpi/tv_5a_9.png
+++ b/res/drawable-xhdpi/tv_5a_9.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_91.png b/res/drawable-xhdpi/tv_5a_91.png
index 8aae4a32..afb67ec2 100644
--- a/res/drawable-xhdpi/tv_5a_91.png
+++ b/res/drawable-xhdpi/tv_5a_91.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_94.png b/res/drawable-xhdpi/tv_5a_94.png
index 05bb2337..5935a8fa 100644
--- a/res/drawable-xhdpi/tv_5a_94.png
+++ b/res/drawable-xhdpi/tv_5a_94.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_95.png b/res/drawable-xhdpi/tv_5a_95.png
index c49e881f..bbceef5e 100644
--- a/res/drawable-xhdpi/tv_5a_95.png
+++ b/res/drawable-xhdpi/tv_5a_95.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_96.png b/res/drawable-xhdpi/tv_5a_96.png
index 5d218bc3..6b877056 100644
--- a/res/drawable-xhdpi/tv_5a_96.png
+++ b/res/drawable-xhdpi/tv_5a_96.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_5a_99.png b/res/drawable-xhdpi/tv_5a_99.png
index 9442a226..12fb1822 100644
--- a/res/drawable-xhdpi/tv_5a_99.png
+++ b/res/drawable-xhdpi/tv_5a_99.png
Binary files differ
diff --git a/res/drawable-xhdpi/tv_error.png b/res/drawable-xhdpi/tv_error.png
index f6107f03..718f203b 100644
--- a/res/drawable-xhdpi/tv_error.png
+++ 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
index 1aef4981..ff6c5cc1 100644
--- a/res/drawable-xhdpi/tv_usb_antenna.png
+++ b/res/drawable-xhdpi/tv_usb_antenna.png
Binary files differ
diff --git a/res/drawable-xhdpi/usb_antenna.png b/res/drawable-xhdpi/usb_antenna.png
index ba7bde19..ca5b2d72 100644
--- a/res/drawable-xhdpi/usb_antenna.png
+++ b/res/drawable-xhdpi/usb_antenna.png
Binary files differ
diff --git a/res/layout/dvr_details_description.xml b/res/layout/dvr_details_description.xml
new file mode 100644
index 00000000..c5db470f
--- /dev/null
+++ b/res/layout/dvr_details_description.xml
@@ -0,0 +1,69 @@
+<?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:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <!-- Top margins are set programatically -->
+ <android.support.v17.leanback.widget.ResizingTextView
+ android:id="@+id/dvr_details_description_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="12dp"
+ android:paddingRight="12dp"
+ style="?attr/detailsDescriptionTitleStyle" />
+
+ <TextView android:id="@+id/dvr_details_description_subtitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="12dp"
+ android:paddingRight="12dp"
+ style="?attr/detailsDescriptionSubtitleStyle" />
+
+ <LinearLayout android:id="@+id/dvr_details_description_container"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:background="?android:attr/selectableItemBackground"
+ android:clickable="true">
+
+ <TextView android:id="@+id/dvr_details_description_body"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="9dp"
+ android:paddingLeft="12dp"
+ android:paddingRight="12dp"
+ style="?attr/detailsDescriptionBodyStyle" />
+
+ <TextView android:id="@+id/dvr_details_description_read_more"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:text="@string/dvr_detail_read_more"
+ android:textColor="@color/lb_details_description_color"
+ android:textSize="16sp"
+ android:height="29dp"
+ android:layout_marginTop="3dp"
+ android:paddingLeft="12dp"
+ android:paddingRight="12dp"
+ android:paddingBottom="9dp"
+ android:textAllCaps="true" />
+
+ </LinearLayout>
+</LinearLayout> \ 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 0e29f9d2..d3808a31 100644
--- a/res/layout/dvr_recording_card_view.xml
+++ b/res/layout/dvr_recording_card_view.xml
@@ -43,6 +43,20 @@
android:visibility="gone"
android:max="100"
android:layout_gravity="bottom" />
+
+ <FrameLayout android:id="@+id/affiliated_icon_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/card_image_gradient"
+ android:visibility="invisible">
+
+ <ImageView android:id="@+id/affiliated_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|right"
+ android:layout_margin="12dp" />
+
+ </FrameLayout>
</FrameLayout>
<LinearLayout android:id="@+id/info_area"
diff --git a/res/layout/dvr_schedules_header.xml b/res/layout/dvr_schedules_header.xml
index e0bc127f..0a643bef 100644
--- a/res/layout/dvr_schedules_header.xml
+++ b/res/layout/dvr_schedules_header.xml
@@ -29,21 +29,26 @@
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:layout_alignParentStart="true">
+ android:layout_alignParentStart="true"
+ android:layout_toStartOf="@+id/button_container">
<TextView android:id="@+id/header_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:singleLine="true"
android:textSize="20sp"
android:textColor="@color/dvr_schedules_item_main"/>
<TextView android:id="@+id/header_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dvr_schedules_header_subtitle_margin_top"
+ android:ellipsize="end"
+ android:singleLine="true"
android:textSize="14sp"
android:textColor="@color/dvr_schedules_header_description"/>
</LinearLayout>
- <FrameLayout android:id="@+id/button_container"
+ <FrameLayout android:id="@id/button_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
@@ -60,7 +65,7 @@
android:orientation="horizontal">
<include android:id="@+id/series_settings"
layout="@layout/dvr_schedules_header_button" />
- <include android:id="@+id/series_toggle_pause"
+ <include android:id="@+id/series_toggle_start_stop"
layout="@layout/dvr_schedules_header_button" />
</LinearLayout>
</FrameLayout>
diff --git a/res/layout/dvr_schedules_item.xml b/res/layout/dvr_schedules_item.xml
index 1d65a541..1d97cb98 100644
--- a/res/layout/dvr_schedules_item.xml
+++ b/res/layout/dvr_schedules_item.xml
@@ -15,21 +15,23 @@
~ limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dvr_schedules_item_width"
android:layout_height="wrap_content"
- android:paddingStart="@dimen/dvr_schedules_layout_padding"
- android:paddingEnd="@dimen/dvr_schedules_layout_padding"
android:elevation="@dimen/card_elevation_normal"
+ android:orientation="vertical"
android:outlineProvider="paddedBounds"
- android:orientation="vertical">
+ android:paddingStart="@dimen/dvr_schedules_layout_padding"
+ android:paddingEnd="@dimen/dvr_schedules_layout_padding">
<ImageView
android:id="@+id/schedule_row_separator"
android:layout_width="match_parent"
android:layout_height="@dimen/dvr_schedules_row_divider_height"
android:background="@color/dvr_schedules_item_background"
- android:src="@color/dvr_schedules_list_item_selector" />
+ android:src="@color/dvr_schedules_list_item_selector"
+ android:contentDescription="@null"/>
<FrameLayout
android:layout_width="match_parent"
@@ -50,6 +52,7 @@
<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:focusableInTouchMode="true"
@@ -67,28 +70,32 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
- <RelativeLayout android:layout_width="match_parent"
+ <LinearLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:orientation="horizontal"
android:layout_marginTop="@dimen/dvr_schedules_item_info_top_margin">
<TextView android:id="@+id/program_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="start"
android:lines="1"
android:ellipsize="end"
android:textColor="@color/dvr_schedules_item_main"/>
<TextView android:id="@+id/info_separator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_toEndOf="@id/program_title"
+ android:gravity="start"
android:text="@string/dvr_schedules_information_separator"
android:textColor="@color/dvr_schedules_item_info"/>
<TextView android:id="@+id/channel_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_toEndOf="@id/info_separator"
+ android:gravity="start"
+ android:ellipsize="end"
android:lines="1"
android:textColor="@color/dvr_schedules_item_info"/>
- </RelativeLayout>
+ </LinearLayout>
<TextView android:id="@+id/conflict_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -100,34 +107,34 @@
</LinearLayout>
</LinearLayout>
- <RelativeLayout android:id="@+id/action_schedule_container"
- android:layout_width="@dimen/dvr_schedules_item_schedule_width"
+ <RelativeLayout android:id="@+id/action_second_container"
+ android:layout_width="@dimen/dvr_schedules_item_icon_size"
android:layout_height="match_parent"
+ android:layout_marginEnd="@dimen/dvr_schedules_item_section_margin"
android:clickable="true"
android:focusableInTouchMode="true"
android:focusable="true"
android:visibility="gone">
- <ImageView android:id="@+id/action_schedule"
+ <ImageView android:id="@+id/action_second"
android:layout_width="@dimen/dvr_schedules_item_icon_size"
android:layout_height="@dimen/dvr_schedules_item_icon_size"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
- <RelativeLayout android:id="@+id/action_delete_container"
+ <RelativeLayout android:id="@+id/action_first_container"
android:layout_width="@dimen/dvr_schedules_item_delete_width"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:clickable="true"
android:focusableInTouchMode="true"
android:focusable="true"
- android:paddingEnd="@dimen/dvr_schedules_item_delete_right_padding"
android:visibility="gone">
- <ImageView android:id="@+id/action_delete"
+ <ImageView android:id="@+id/action_first"
android:layout_width="@dimen/dvr_schedules_item_icon_size"
android:layout_height="@dimen/dvr_schedules_item_icon_size"
- android:layout_alignParentEnd="true"
- android:layout_centerHorizontal="true"/>
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"/>
</RelativeLayout>
</LinearLayout>
</FrameLayout>
diff --git a/res/layout/lb_details_overview.xml b/res/layout/lb_details_overview.xml
new file mode 100644
index 00000000..dbcf2055
--- /dev/null
+++ b/res/layout/lb_details_overview.xml
@@ -0,0 +1,89 @@
+<?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.
+ -->
+
+<!-- This layout file is copied from Leanback library and used to override the original layout.
+ Be cautious to change this layout to prevent weird UI behavior -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:lb="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/lb_details_overview_margin_start"
+ android:paddingEnd="@dimen/lb_details_overview_margin_end"
+ android:paddingBottom="@dimen/lb_details_overview_margin_bottom"
+ android:clipToPadding="false"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:descendantFocusability="afterDescendants">
+
+ <!-- Used for dimming -->
+ <FrameLayout android:id="@+id/details_frame"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/lb_details_overview_height_large"
+ android:foreground="#ffffff"
+ android:elevation="@dimen/lb_details_overview_z">
+
+ <!-- Background is applied to this inner layout -->
+ <LinearLayout android:id="@+id/details_overview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+
+ <ImageView android:id="@+id/details_overview_image"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:adjustViewBounds="true"
+ android:scaleType="fitStart" />
+
+ <LinearLayout android:id="@+id/details_overview_right_panel"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingBottom="@dimen/lb_details_overview_description_margin_bottom"
+ android:orientation="vertical" >
+
+ <!-- layout_marginStart and layout_marginEnd are overridden -->
+ <android.support.v17.leanback.widget.NonOverlappingFrameLayout
+ android:id="@+id/details_overview_description"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="top"
+ android:layout_marginStart="@dimen/dvr_details_overview_description_margin_start"
+ android:layout_marginEnd="@dimen/dvr_details_overview_description_margin_end"
+ android:paddingTop="@dimen/lb_details_overview_description_margin_top"
+ android:clipToPadding="false"
+ android:clipChildren="false" />
+
+ <!-- horizontalSpacing is defined as @dimen/lb_details_overview_action_items_spacing
+ in newer versions of Leanback Library than LC uses. -->
+ <android.support.v17.leanback.widget.HorizontalGridView
+ android:id="@+id/details_overview_actions"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:paddingStart="@dimen/lb_details_overview_description_margin_start"
+ android:paddingEnd="@dimen/lb_details_overview_description_margin_end"
+ android:horizontalSpacing="16dp"
+ lb:rowHeight="@dimen/lb_details_overview_actions_height" />
+
+ </LinearLayout>
+ </LinearLayout>
+ </FrameLayout>
+</FrameLayout> \ No newline at end of file
diff --git a/res/layout/menu_card_app_link.xml b/res/layout/menu_card_app_link.xml
index 631b5fbb..918cb788 100644
--- a/res/layout/menu_card_app_link.xml
+++ b/res/layout/menu_card_app_link.xml
@@ -56,31 +56,7 @@
<FrameLayout android:id="@+id/app_link_text_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content">
-
- <TextView android:id="@+id/app_link_text_focused"
- android:layout_width="match_parent"
- android:layout_height="@dimen/card_meta_layout_height"
- android:paddingStart="12dp"
- android:paddingEnd="12dp"
- android:paddingTop="@dimen/card_meta_padding_top"
- android:ellipsize="end"
- android:fontFamily="@string/condensed_font"
- android:maxLines="2"
- android:textColor="@color/card_meta_text_color"
- android:textSize="12sp" />
-
- <TextView android:id="@+id/app_link_text_unfocused"
- android:layout_width="match_parent"
- android:layout_height="@dimen/card_meta_layout_height"
- android:paddingStart="12dp"
- android:paddingEnd="12dp"
- android:paddingTop="@dimen/card_meta_padding_top"
- android:ellipsize="end"
- android:fontFamily="@string/condensed_font"
- android:singleLine="true"
- android:textColor="@color/card_meta_text_color"
- android:textSize="12sp" />
-
+ <include layout="@layout/menu_card_text" />
</FrameLayout>
</com.android.tv.menu.AppLinkCardView>
diff --git a/res/layout/menu_card_channel.xml b/res/layout/menu_card_channel.xml
index 42aeb460..4e49636f 100644
--- a/res/layout/menu_card_channel.xml
+++ b/res/layout/menu_card_channel.xml
@@ -72,31 +72,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/channel_card_meta_background">
-
- <TextView android:id="@+id/channel_title_focused"
- android:layout_width="match_parent"
- android:layout_height="@dimen/card_meta_layout_height"
- android:paddingStart="@dimen/card_meta_padding_start"
- android:paddingEnd="@dimen/card_meta_padding_end"
- android:paddingTop="@dimen/card_meta_padding_top"
- android:ellipsize="end"
- android:fontFamily="@string/condensed_font"
- android:maxLines="2"
- android:textColor="@color/card_meta_text_color"
- android:textSize="12sp" />
-
- <TextView android:id="@+id/channel_title_unfocused"
- android:layout_width="match_parent"
- android:layout_height="@dimen/card_meta_layout_height"
- android:paddingStart="@dimen/card_meta_padding_start"
- android:paddingEnd="@dimen/card_meta_padding_end"
- android:paddingTop="@dimen/card_meta_padding_top"
- android:ellipsize="end"
- android:fontFamily="@string/condensed_font"
- android:singleLine="true"
- android:textColor="@color/card_meta_text_color"
- android:textSize="12sp" />
-
+ <include layout="@layout/menu_card_text" />
</FrameLayout>
</com.android.tv.menu.ChannelCardView>
diff --git a/res/layout/menu_card_dvr.xml b/res/layout/menu_card_dvr.xml
index 0ba7131d..cc589775 100644
--- a/res/layout/menu_card_dvr.xml
+++ b/res/layout/menu_card_dvr.xml
@@ -35,18 +35,10 @@
android:layout_gravity="center_horizontal" />
</FrameLayout>
- <TextView
+ <FrameLayout
android:layout_width="match_parent"
- android:layout_height="@dimen/card_meta_layout_height"
- android:paddingStart="@dimen/card_meta_padding_start"
- android:paddingEnd="@dimen/card_meta_padding_end"
- android:paddingTop="@dimen/card_meta_padding_top"
- android:singleLine="true"
- android:ellipsize="end"
- android:fontFamily="@string/condensed_font"
- android:textColor="@color/card_meta_text_color"
- android:background="@color/guide_card_meta_background"
- android:text="@string/channels_item_dvr"
- android:textSize="12sp" />
-
+ android:layout_height="wrap_content"
+ android:background="@color/guide_card_meta_background">
+ <include layout="@layout/menu_card_text" />
+ </FrameLayout>
</com.android.tv.menu.SimpleCardView>
diff --git a/res/layout/menu_card_setup.xml b/res/layout/menu_card_setup.xml
index b495e7ea..38abd4e5 100644
--- a/res/layout/menu_card_setup.xml
+++ b/res/layout/menu_card_setup.xml
@@ -15,7 +15,7 @@
~ limitations under the License.
-->
-<com.android.tv.menu.SetupCardView xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.tv.menu.SimpleCardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/card_layout_width"
android:layout_height="wrap_content"
android:orientation="vertical"
@@ -48,4 +48,4 @@
android:text="@string/channels_item_setup"
android:textSize="12sp" />
-</com.android.tv.menu.SetupCardView>
+</com.android.tv.menu.SimpleCardView>
diff --git a/res/layout/menu_card_text.xml b/res/layout/menu_card_text.xml
new file mode 100644
index 00000000..777b100f
--- /dev/null
+++ b/res/layout/menu_card_text.xml
@@ -0,0 +1,46 @@
+<?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.
+ -->
+
+<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">
+
+ <TextView android:id="@+id/card_text_focused"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/card_meta_layout_height"
+ android:paddingStart="@dimen/card_meta_padding_start"
+ android:paddingEnd="@dimen/card_meta_padding_end"
+ android:paddingTop="@dimen/card_meta_padding_top"
+ android:maxLines="2"
+ android:ellipsize="end"
+ android:fontFamily="@string/condensed_font"
+ android:textColor="@color/card_meta_text_color"
+ android:textSize="12sp" />
+
+ <TextView android:id="@+id/card_text"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/card_meta_layout_height"
+ android:paddingStart="@dimen/card_meta_padding_start"
+ android:paddingEnd="@dimen/card_meta_padding_end"
+ android:paddingTop="@dimen/card_meta_padding_top"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:fontFamily="@string/condensed_font"
+ android:textColor="@color/card_meta_text_color"
+ android:textSize="12sp" />
+</merge>
diff --git a/res/layout/program_guide_table_row.xml b/res/layout/program_guide_table_row.xml
index c6c46e64..63dcf351 100644
--- a/res/layout/program_guide_table_row.xml
+++ b/res/layout/program_guide_table_row.xml
@@ -18,7 +18,9 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
- android:layout_height="wrap_content" >
+ android:layout_height="wrap_content"
+ android:focusable="false" >
+ <!-- focusable is set false to prevent accessibility focus being put on this layout -->
<include layout="@layout/program_guide_table_header_column_item" />
diff --git a/res/layout/program_track_meta.xml b/res/layout/program_track_meta.xml
index ffa9d739..e62427fa 100644
--- a/res/layout/program_track_meta.xml
+++ b/res/layout/program_track_meta.xml
@@ -35,4 +35,16 @@
style="@style/track_meta_text.channel_banner"
android:visibility="gone" />
+ <TextView android:id="@+id/content_ratings_0"
+ style="@style/track_meta_text.channel_banner"
+ android:visibility="gone" />
+
+ <TextView android:id="@+id/content_ratings_1"
+ style="@style/track_meta_text.channel_banner"
+ android:visibility="gone" />
+
+ <TextView android:id="@+id/content_ratings_2"
+ style="@style/track_meta_text.channel_banner"
+ android:visibility="gone" />
+
</LinearLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index ed367f7d..7778e751 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Net oudio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Swak sein"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Geen internetverbinding nie"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Hierdie kanaal kan nie voor <xliff:g id="END_TIME_1">%1$s</xliff:g> gespeel word nie, omdat die seinontvanger tans gebruik word om ander programme op te neem. \n\nDruk Regs om opnameskedule aan te pas.</item>
- <item quantity="one">Hierdie kanaal kan nie voor <xliff:g id="END_TIME_0">%1$s</xliff:g> gespeel word nie, omdat die seinontvanger tans gebruik word om ander programme op te neem. \n\nDruk Regs om opnameskedule aan te pas.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Hierdie kanaal kan nie voor <xliff:g id="END_TIME_1">%1$s</xliff:g> gespeel word nie omdat ander kanale tans opgeneem word. \n\nDruk Regs om die opnameskedule te verstel.</item>
+ <item quantity="one">Hierdie kanaal kan nie voor <xliff:g id="END_TIME_0">%1$s</xliff:g> gespeel word nie omdat \'n ander kanaal tans opgeneem word. \n\nDruk Regs om die opnameskedule te verstel.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Titelloos"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanaal is geblokkeer"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Regstreekse kanale het toestemming nodig om die TV-lysinskrywings te lees."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Stel jou bronne op"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Regstreekse kanale kombineer die ervaring van tradisionele TV-kanale met stroomkanale wat deur programme verskaf word. \n\nBegin deur die kanaalbronne op te stel wat reeds geïnstalleer is. Of blaai deur die Google Play Winkel vir meer programme wat regstreekse kanale bied."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Opnames en skedules"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minute"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minute"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 uur"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Geskeduleer"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Reeks"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Ander"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Die kanaal kan nie opgeneem word nie."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Die program kan nie opgeneem word nie."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> is geskeduleer om opgeneem te word"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Neem <xliff:g id="PROGRAMNAME">%1$s</xliff:g> op van nou af tot <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Volledige skedule"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Speel van begin af"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Speel verder"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Vee uit"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Vee opnames uit"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Hervat"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Seisoen <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Bekyk skedule"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Lees meer"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Vee opnames uit"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Kies die episodes wat jy graag wil uitvee. Sodra hulle uitgevee is, kan hulle nie teruggekry word nie."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Daar is geen opnames om uit te vee nie."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioriteit"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Hoogste"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Laagste"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nr. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanale"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Enige"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Kies prioriteit"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Wanneer daar nie genoeg seinontvangers is om programme op dieselfde tyd op te neem nie, sal net die programme met die hoër prioriteit opgeneem word."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"As daar te veel programme is wat op dieselfde tyd opgeneem moet word, sal net die programme met die hoër prioriteit opgeneem word."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Die opgeneemde deel sal in die DVR-biblioteek gestoor word."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Die opgeneemde inhoud 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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Sal weens seinontvangerkonflikte gedeeltelik opgeneem word."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Sal weens seinontvangerkonflikte nie opgeneem word nie."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Geen opnames is al geskeduleer nie.\nJy kan opnames uit die programgids skeduleer."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Opnameskedule vir die volgende %1$d dae</item>
- <item quantity="one">Opnameskedule vir die volgende %1$d dag</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d opneemkonflikte</item>
+ <item quantity="one">%1$d opneemkonflik</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Instellings"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Terug"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Ontdoen"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Reeks se instellings"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Begin om reeks op te neem"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Stop om reeks op te neem"</string>
+ <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_empty_state" msgid="3407962945399698707">"Geen episodes is beskikbaar nie.\nHulle sal opgeneem word sodra hulle beskikbaar is."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minute)</item>
+ <item quantity="one">(%1$d minuut) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Vandag"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Môre"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Gister"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index f8398b5e..bd63879b 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"ኦዲዮ ብቻ"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"ደካማ ምልክት"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"ምንም የበይነመረብ ግንኙነት የለም"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">ሌሎች መቃኛዎች ሁሉ ሌሎች ፕሮግራሞችን ለመቅረጽ ጥቅም ላይ እየዋሉ ስለሆኑ ይህ ሰርጥ እስከ <xliff:g id="END_TIME_1">%1$s</xliff:g> ድረስ ሊጫወት አይችልም። \n\nየመቅረጫ ጊዜ መርሐግብርን ለማስተካከል ቀኝ ይጫኑ።</item>
- <item quantity="other">ሌሎች መቃኛዎች ሁሉ ሌሎች ፕሮግራሞችን ለመቅረጽ ጥቅም ላይ እየዋሉ ስለሆኑ ይህ ሰርጥ እስከ <xliff:g id="END_TIME_1">%1$s</xliff:g> ድረስ ሊጫወት አይችልም። \n\nየመቅረጫ ጊዜ መርሐግብርን ለማስተካከል ቀኝ ይጫኑ።</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">ሌሎች ጣቢያዎች እየተቀዱ ስለሆኑ ይህ ሰርጥ እስከ <xliff:g id="END_TIME_1">%1$s</xliff:g> ድረስ መጫወት አይችልም፡ \n\nየመቅረጫ ጊዜ መርሐግብርን ለማስተካከል ቀኝ ይጫኑ።</item>
+ <item quantity="other">ሌሎች ጣቢያዎች እየተቀዱ ስለሆኑ ይህ ሰርጥ እስከ <xliff:g id="END_TIME_1">%1$s</xliff:g> ድረስ መጫወት አይችልም፡ \n\nየመቅረጫ ጊዜ መርሐግብርን ለማስተካከል ቀኝ ይጫኑ።</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"ርእስ የለውም"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"ሰርጥ ታግዷል"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"ቀጥተኛ ሰርጦች የቴሌቪዥን ዝርዝሮችን ለማንበብ ፍቃድ ያስፈልጋቸዋል።"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"የእርስዎን ምንጮች ያቀናብሩ"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"የቀጥታ ስርጭት ሰርጦች የተለምዷዊ ቴሌቪዥን ጣቢያዎች እና በመተግበሪያዎች የሚቀርቡ የዥረት ሰርጦች ተሞክሮን ያጣምራሉ። \n\nአስቀድመው የተጫኑ የሰርጥ ምንጮችን በማቀናበር ይጀምሩ። ወይም ደግሞ የቀጥታ ሰርጦችን የሚያቀርቡ ተጨማሪ መተግበሪያዎችን ለማግኘት Google Play መደብርን ያስሱ።"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"ቀረጻዎች እና መርሐግብሮች"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 ደቂቃዎች"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 ደቂቃዎች"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ሰዓት"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"መርሐግብር የተያዘለት"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"ተከታታይ"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"ሌሎች"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"ሰርጡ ሊቀረጽ አልቻለም።"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"ፕሮግራሙ ሊቀረጽ አልቻለም።"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ለምዝገባ መርሐግብር ተይዞለታል"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ከአሁን ወደ <xliff:g id="ENDTIME">%2$s</xliff:g> በመቅረጽ ላይ"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"ሙሉ የጊዜ መርሐግብር"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"ከመጀመሪያው አጫውት"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"ቀረጻዎችን ይሰርዙ"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"ሊሰርዟቸው የሚፈልጓቸውን ክፍሎች ይምረጡ። አንዴ ከተሰረዙ በኋላ ተመልሰው ሊገኙ አይችሉም።"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"ምንም የሚሰረዙ ቀረጻዎች የሉም።"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"ቅድሚያ የሚሰጣቸው"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"በጣም ከፍተኛው"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"ዝቅተኛ"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"አይ። <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"ሰርጦች"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"ማንኛውም"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"ቅድሚያ ተሰጭነትን ይመርጡ"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"በተመሳሳይ ጊዜ ፕሮግራሞችን ለመቅዳት በቂ ቅጂ ማስተካከያዎች ከሌሉ ከፍተኛ ቅድሚያ ተሰጪ የሆኑት ፕሮግራሞች ብቻ ይቀረጻሉ።"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"የተቀረጸው ክፍል በዲቪአር ቤተ-መጽሐፍቱ ውስጥ ይቀመጣል።"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"የተቀረጸው ይዘት ይቀመጣል።"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"በመቃኛ ግጭቶች ምክንያት በከፊል የሚቀዳ ይሆናል።"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"በመቃኛ ግጭቶች ምክንያት ሊቀዳ አይችልም።"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ገና ምንም መርሐግብር የተያዘላቸው ቀረጻዎች የሉም።\nከፕሮግራም መመሪያው ሆነው ቀረጻን መርሐግብር ማስያዝ ይችላሉ።"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">ለሚቀጥሉት %1$d ቀናት የቀረጻ መርሐግብር</item>
- <item quantity="other">ለሚቀጥለው %1$d ቀናት የቀረጻ መርሐግብር</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d የቀረጻ ግጭቶች</item>
+ <item quantity="other">%1$d የቀረጻ ግጭቶች</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"ቅንብሮች"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"ተመለስ"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"ቀልብስ"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"የተከታታዮች ቅንብሮች"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"የተከታታይ ቀረጻን ጀምር"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"የተከታታይ ቀረጻን አቁም"</string>
+ <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_empty_state" msgid="3407962945399698707">"ምንም ክፍሎች አይገኙም።\nልክ የሚገኙ ሲሆኑ ይቀረጻሉ።"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d ደቂቃዎች)</item>
+ <item quantity="other">(%1$d ደቂቃዎች)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"ዛሬ"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"ነገ"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"ትላንት"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 931ac3d2..f91139b9 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -163,13 +163,13 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"الصوت فقط"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"الإشارة ضعيفة"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"عدم توفر اتصال بالإنترنت"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="zero">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> نظرًا لأن جميع الموالفات قيد الاستخدام لتسجيل برامج أخرى. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
- <item quantity="two">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> نظرًا لأن الموالفين كليهما قيد الاستخدام لتسجيل برامج أخرى. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
- <item quantity="few">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> نظرًا لأن جميع الموالفات قيد الاستخدام لتسجيل برامج أخرى. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
- <item quantity="many">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> نظرًا لأن جميع الموالفات قيد الاستخدام لتسجيل برامج أخرى. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
- <item quantity="other">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> نظرًا لأن جميع الموالفات قيد الاستخدام لتسجيل برامج أخرى. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
- <item quantity="one">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_0">%1$s</xliff:g> نظرًا لأن الموالف قيد الاستخدام لتسجيل برامج أخرى. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="zero">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> لأنه يجري تسجيل قنوات أخرى الآن. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
+ <item quantity="two">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> لأنه يجري تسجيل قنوات أخرى الآن. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
+ <item quantity="few">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> لأنه يجري تسجيل قنوات أخرى الآن. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
+ <item quantity="many">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> لأنه يجري تسجيل قنوات أخرى الآن. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
+ <item quantity="other">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_1">%1$s</xliff:g> لأنه يجري تسجيل قنوات أخرى الآن. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
+ <item quantity="one">يتعذر تشغيل هذه القناة حتى <xliff:g id="END_TIME_0">%1$s</xliff:g> لأنه يجري تسجيل قناة أخرى الآن. \n\nيمكنك الضغط على \"اليمين\" لضبط الجدول الزمني للتسجيل.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"بلا عنوان"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"تم حظر القناة"</string>
@@ -208,6 +208,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"‏تحتاج القنوات المباشرة إلى إذن لقراءة قوائم TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"إعداد مصادرك"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"‏تجمع قنوات البث التلفزيوني المباشر بين تجربة قنوات التلفزيون التقليدية وقنوات البث التي توفِّرها التطبيقات. \n\nيمكنك البدء من خلال إعداد مصادر القنوات المثبَّتة حاليًا، أو تصفُّح متجر Google Play للحصول على المزيد من التطبيقات التي توفِّر قنوات بث تلفزيوني مباشر."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"التسجيلات والجداول الزمنية"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 دقائق"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 دقيقة"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"ساعة واحدة"</string>
@@ -216,6 +217,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"مجدولة"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"مسلسلة"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"غير ذلك"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"يتعذر تسجيل القناة."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"يتعذر تسجيل البرنامج."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"تمت إضافة جدول زمني لإجراء تسجيل لبرنامج <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"جارٍ تسجيل <xliff:g id="PROGRAMNAME">%1$s</xliff:g> من الآن حتى <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"الجدول الزمني كاملاً"</string>
@@ -263,9 +266,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"تشغيل من البداية"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"حذف التسجيلات"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"حدِّد الحلقات التي تريد حذفها، علمًا بأنه لا يمكن استردادها بعد الحذف."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"لا تتوفر تسجيلات لحذفها."</string>
@@ -286,17 +291,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"الأولوية"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"الأعلى"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"الأقل"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"رقم <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"القنوات"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"أي مسلسل"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"اختيار الأولوية"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"عند عدم وجود عدد كاف من الموالفات لتسجيل البرامج في نفس الوقت، فسيتم تسجيل البرامج ذات الأولوية الأعلى فقط."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -310,17 +314,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"‏سيتم حفظ الجزء المسجَّل في مكتبة DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"سيتم حفظ المحتوى الذي تم تسجيله."</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>
@@ -342,6 +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>
+ <!-- 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>
@@ -358,19 +374,29 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"سيتم تسجيل جزء من البرنامج بسبب وجود تعارضات في المواقف."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"لن يتم تسجيل البرنامج بسبب وجود تعارضات في المواقف."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ليست هناك أي تسجيلات في هذا الجدول الزمني إلى الآن.\nيمكنك إعداد جدول زمني للتسجيل من دليل البرنامج."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="zero">‏جدول التسجيل لـ %1$d يوم مقبل</item>
- <item quantity="two">‏جدول التسجيل ليومين (%1$d) مقبلين</item>
- <item quantity="few">‏جدول التسجيل لـ %1$d أيام مقبلة</item>
- <item quantity="many">‏جدول التسجيل لـ %1$d يومًا مقبلاً</item>
- <item quantity="other">‏جدول التسجيل لـ %1$d يوم مقبل</item>
- <item quantity="one">‏جدول التسجيل ليوم واحد (%1$d) مقبل</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="zero">‏%1$d تعارض في التسجيل</item>
+ <item quantity="two">‏تعارضان (%1$d) في التسجيل</item>
+ <item quantity="few">‏%1$d تعارضات في التسجيل</item>
+ <item quantity="many">‏%1$d تعارضًا في التسجيل</item>
+ <item quantity="other">‏%1$d تعارض في التسجيل</item>
+ <item quantity="one">‏%1$d تعارض في التسجيل</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"الإعدادات"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"رجوع"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"تراجع"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"إعدادات سلسلة التسجيلات"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"بدء تسجيل السلسلة"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"إيقاف تسجيل السلسلة"</string>
+ <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_empty_state" msgid="3407962945399698707">"لا تتوفر أي حلقات.\nسيتم تسجيلها بعد توفرها."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="zero">‏(%1$d دقيقة)</item>
+ <item quantity="two">(دقيقتان)</item>
+ <item quantity="few">‏(%1$d دقائق)</item>
+ <item quantity="many">‏(%1$d دقيقة)</item>
+ <item quantity="other">‏(%1$d دقيقة)</item>
+ <item quantity="one">‏(%1$d دقيقة) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"اليوم"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"غدًا"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"أمس"</string>
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
index ae65f36d..6ccb6d24 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az-rAZ/strings.xml
@@ -157,9 +157,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Yalnız Audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Zəif siqnal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"İnternet bağlantısı yoxdur"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Bu kanal <xliff:g id="END_TIME_1">%1$s</xliff:g> radələrinə kimi fəaliyyət göstərə bilməz, cünki, kökləyici, proqramları qeydə almaq üçün istifadə edilir. \n\nQeydə alma cədvəlini nizamlamaq üçün Sağı basın.</item>
- <item quantity="one">Bu kanal <xliff:g id="END_TIME_0">%1$s</xliff:g> radələrinə kimi fəaliyyət göstərə bilməz, cünki, kökləyici, proqramları qeydə almaq üçün istifadə edilir. \n\nQeydə alma cədvəlini nizamlamaq üçün Sağı basın.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Bu kanal <xliff:g id="END_TIME_1">%1$s</xliff:g> radələrinə kimi fəaliyyət göstərə bilməz, cünki, digər kanallar qeydə alınır \n\nQeydə alma cədvəlini nizamlamaq üçün Sağı basın.</item>
+ <item quantity="one">Digər kanal qeydə alındığı üçün bu kanal <xliff:g id="END_TIME_0">%1$s</xliff:g> radələrinə kimi fəaliyyət göstərə bilməz. \n\nQeydə alma cədvəlini nizamlamaq üçün Sağı basın.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Başlıq yoxdur"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanal blok edilib"</string>
@@ -194,6 +194,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Canlı Kanallar TV siyahıları oxumaq üçün icazə istəyir."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Mənbələrinizi quraşdırın"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Canlı kanallar tətbiq tərəfindən yayımlanan kanallar ilə ənənəvi TV kanallarının təcrübəsini özündə birləşdirir. \n\n Artıq yüklənmiş kanal mənbələrini quraşdıraraq başlayın. Və ya canlı kanallar təklif edən bir neçə tətbiq üçün Google Play Store\'da axtarış edin."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Qeydə almalar və cədvəllər"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 dəqiqə"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 dəqiqə"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 saat"</string>
@@ -202,6 +203,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Planlaşdırılıb"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Seriyalar"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Digərləri"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Kanal qeydə alına bilməz."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Proqram qeydə alına bilməz."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> tətbiqinin qeydə alınması üçün vaxt təyin edilib"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> bu dəqiqədən etibarən <xliff:g id="ENDTIME">%2$s</xliff:g> radələrinə kimi deydə alınır"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Tam cədvəl"</string>
@@ -229,9 +232,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Əvvəldən oxudun"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Oxutmağa davam edin"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Silin"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Qeydə almaları silin"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Davam edin"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g> mövsüm"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Cədvələ baxın"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Ətraflı məlumat"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Qeydə almaları silin"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Silmək istədiyiniz epizodları seçin. Silinənlər bərpa oluna bilməz."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Silinmək üçün heç bir qeydə alma yoxdur."</string>
@@ -248,17 +253,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritet"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Ən yüksək"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Ən alçaq"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Yox. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanallar"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Hər hansı"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Prioriteti seçin"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Proqramları eyni zamanda qeydə almaq üçün kifayət qədər tuner yoxdursa, yalnız yüksək prioritetli proqramlar qeydə alınacaq."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Eyni anda qeydə alınacaq bir neçə proqram olduqda, yalnız vacib olanlar qeydə alınacaq."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -272,17 +276,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Qeyd edilən hissə DVR kitabxanasında yadda saxlanacaq."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Qeydə alınan 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>
@@ -300,6 +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>
+ <!-- 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>
@@ -312,15 +328,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Kökləyici ziddiyətləri səbəbi ilə qismən qeydə alınacaq."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Kökləyici ziddiyətləri səbəbi ilə qeydə alınmacaq."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Hələ ki cədvəldə heç bir qeydə alma yoxdur.\nProqram bələdçisindən qeydə alma üçün vaxt təyin edə bilərsiniz."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Növbəti %1$d gün üçün cədvəl qeydə alınır</item>
- <item quantity="one">Növbəti %1$d gün üçün cədvəl qeydə alınır</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d qeydə alma münaqişəsi</item>
+ <item quantity="one">%1$d qeydə alma münaqişəsi</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Ayarlar"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Geri"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Geri qaytarın"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Davamlılıq ayarları"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Ardıcıl qeydə almanı başladın"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Ardıcıl qeydə alma dayandırılsın"</string>
+ <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_empty_state" msgid="3407962945399698707">"Heç bir epizod əlçatan deyil.\nOnlar, əlçatan olduqda qeydə alınacaq."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d dəqiqə)</item>
+ <item quantity="one">(%1$d dəqiqə) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Bugün"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Sabah"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Dünən"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 00108956..ab202fe2 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Само аудио"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Слаб сигнал"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Няма връзка с интернет"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Този канал не може да се пусне преди <xliff:g id="END_TIME_1">%1$s</xliff:g>, защото всички тунери се използват за записване на други програми. \n\nНатиснете бутона за надясно, за да коригирате графика за записване.</item>
- <item quantity="one">Този канал не може да се пусне преди <xliff:g id="END_TIME_0">%1$s</xliff:g>, защото тунерът се използва за записване на други програми. \n\nНатиснете бутона за надясно, за да коригирате графика за записване.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Този канал не може да се пусне преди <xliff:g id="END_TIME_1">%1$s</xliff:g>, защото се записват други канали. \n\nНатиснете бутона за надясно, за да коригирате графика за записване.</item>
+ <item quantity="one">Този канал не може да се пусне преди <xliff:g id="END_TIME_0">%1$s</xliff:g>, защото се записва друг канал. \n\nНатиснете бутона за надясно, за да коригирате графика за записване.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Без заглавие"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Каналът е блокиран"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Приложението Live TV се нуждае от разрешение, за да чете телевизионните програми."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Настройте източниците си"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Каналите на живо съчетават традиционните телевизионни канали с поточно предаваните, които се предоставят чрез приложения. \n\nЗапочнете, като настроите вече инсталираните източници на канали. Или разгледайте Google Play Магазин за още приложения, предлагащи канали на живо."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Записи и графици"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 минути"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 минути"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 час"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Насрочени"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Поредица"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Други"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Каналът не може да бъде записан."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Програмата не може да бъде записана."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Насрочено е записване за „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Записване на „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ от този момент до <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Пълен график"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Пускане от началото"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Изтриване на записи"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Изберете епизодите, които искате да изтриете. Няма да можете да ги възстановите след това."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Няма записи за изтриване."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Приоритет"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Най-висок"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Най-нисък"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Не. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Канали"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Всички"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Изберете приоритет"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Когато няма достатъчно тунери за записване на програми по едно и също време, ще бъдат записани само тези с най-висок приоритет."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Записаната част ще бъде запазена в библиотеката на устройството за цифров видеозапис."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Записаното съдържание ще бъде запазено."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Ще се запише частично поради конфликти с тунера."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Няма да се запише поради конфликти с тунера."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Графикът за записване все още е празен.\nМожете да насрочите записване от програмния справочник."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">График за записване за следващите %1$d дни</item>
- <item quantity="one">График за записване за следващия %1$d ден</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d конфликта със записа</item>
+ <item quantity="one">%1$d конфликт със записа</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Настройки"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Назад"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Отмяна"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Настройки за поредицата"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Старт на записа на поредицата"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Спиране на записа на поредицата"</string>
+ <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_empty_state" msgid="3407962945399698707">"Няма налични епизоди.\nТе ще бъдат записани, когато са налице."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d минути)</item>
+ <item quantity="one">(%1$d минута) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Днес"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Утре"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Вчера"</string>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index e1f66d9b..52938ab2 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"কেবলমাত্র অডিও"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"সিগন্যাল দুর্বল"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"কোনো ইন্টারনেট সংযোগ নেই"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one"><xliff:g id="END_TIME_1">%1$s</xliff:g> পর্যন্ত এই চ্যালেনটি চালানো যাবে না কারণ অন্যান্য প্রোগ্রাম রেকর্ড করার জন্য সমস্ত টিউনার ব্যবহার করা হচ্ছে৷ \n\nরেকর্ড করার সময়সূচী অ্যাডজাস্ট করতে ডান দিকে ক্লিক করুন৷</item>
- <item quantity="other"><xliff:g id="END_TIME_1">%1$s</xliff:g> পর্যন্ত এই চ্যালেনটি চালানো যাবে না কারণ অন্যান্য প্রোগ্রাম রেকর্ড করার জন্য সমস্ত টিউনার ব্যবহার করা হচ্ছে৷ \n\nরেকর্ড করার সময়সূচী ঠিক করতে ডান দিকে ক্লিক করুন৷</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one"><xliff:g id="END_TIME_1">%1$s</xliff:g>পর্যন্ত এই চ্যালেনটি চালানো যাবে না কারণ অন্যান্য চ্যানেলগুলি রেকর্ড করা হচ্ছে৷ \n\nরেকর্ড করার সময়সূচী সামঞ্জস্য করতে ডান দিকে ক্লিক করুন৷</item>
+ <item quantity="other"><xliff:g id="END_TIME_1">%1$s</xliff:g>পর্যন্ত এই চ্যালেনটি চালানো যাবে না কারণ অন্যান্য চ্যানেলগুলি রেকর্ড করা হচ্ছে৷ \n\nরেকর্ড করার সময়সূচী সামঞ্জস্য করতে ডান দিকে ক্লিক করুন৷</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"কোনো শিরোনাম নেই"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"চ্যানেল অবরুদ্ধ করা হয়েছে"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"টিভির তালিকাগুলি পড়ার জন্য লাইভ চ্যানেলগুলিকে অনুমতি নিতে হবে।"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"আপনার উৎসগুলি সেট আপ করুন"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"লাইভ চ্যানেলগুলি অ্যাপ্লিকেশানগুলির দ্বারা সরবরাহ করা স্ট্রিমিং চ্যানেলের সঙ্গে ঐতিহ্যগত টিভি চ্যানেলের সম্মিলিত অভিজ্ঞতা প্রদান করে৷ \n\nইতিমধ্যেই ইনস্টল থাকা চ্যানেল উৎসগুলি সেট আপ করার মাধ্যেমে শুরু করুন৷ অথবা লাইভ চ্যানেলগুলি অফার করে এমন অ্যাপ্লিকেশানগুলি পেতে Google Play স্টোর ব্রাউজ করুন৷"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"রেকডিং &amp; সময়সূচী"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"১০ মিনিট"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"৩০ মিনিট"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"১ ঘণ্টা"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"নির্ধারিত"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"সিরিজ"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"অন্যরা"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"চ্যানেলটি রেকর্ড করা যাবে না৷"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"প্রোগ্রামটি রেকর্ড করা যাবে না৷"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> রেকর্ড করার সময় নির্ধারিত হয়েছে"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>কে এখান থেকে <xliff:g id="ENDTIME">%2$s</xliff:g> পর্যন্ত রেকর্ড করা হচ্ছে"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"সম্পূর্ণ সময়সূচী"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"শুরু থেকে প্লে করুন"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"রেকডিংগুলি মুছুন"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"আপনি যে পর্বগুলিকে মুছতে চান সেগুলিকে নির্বাচন করুন। একবার মোছা হলে সেগুলিকে পুনরুদ্ধার করা যাবে না।"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"মোছার জন্য সেখানে কোনো রেকডিং নেই।"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"অগ্রাধিকার"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"সর্বোচ্চ"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"সর্বনিম্ন"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"না৷ <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"চ্যানেল"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"যে কোনো"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"অগ্রাধিকার চয়ন করুন"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"যখন একই সময়ে প্রোগ্রামগুলিকে রেকর্ড করার জন্য যথেষ্ট টিউনার উপলব্ধ থাকে না, তখন শুধুমাত্র উচ্চ অগ্রাধিকারযুক্ত প্রোগ্রামগুলিকে রেকর্ড করা হবে৷"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"রেকর্ড করা অংশটি DVR লাইব্রেরিতে সংরক্ষণ করা হবে৷"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"রেকর্ড করা সামগ্রী সংরক্ষণ করা হবে৷"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"টিউনার না থাকার কারণে আংশিকভাবে রেকর্ড করা হবে৷"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"টিউনার না থাকার কারণে রেকর্ড করা হবে না৷"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"এখনো পর্যন্ত কোনো রেকর্ডিংয়ের জন্য সময়সূচী নির্ধারণ করা হয়নি।\nআপনি প্রোগ্রাম গাইড থেকে রেকর্ডিংয়ের সময়সূচী নির্ধারণ করতে পারেন।"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">পরবর্তী %1$d দিনের রেকর্ডিংয়ের সয়মসূচি</item>
- <item quantity="other">পরবর্তী %1$d দিনের রেকর্ডিংয়ের সয়মসূচি</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$dটি রেকডিং দ্বন্দ্ব</item>
+ <item quantity="other">%1$dটি রেকডিং দ্বন্দ্ব</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"সেটিংস"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"ফিরুন"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"পূর্বাবস্থায় ফিরুন"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"সিরিজ সেটিংস"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"সিরিজ রেকডিং শুরু করুন"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"সিরিজ রেকডিং বন্ধ করুন"</string>
+ <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_empty_state" msgid="3407962945399698707">"কোনো পর্ব উপলব্ধ নেই।\nএকবার উপলব্ধ হলে সেগুলিকে রেকর্ড করা হবে।"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d মিনিট)</item>
+ <item quantity="other">(%1$d মিনিট)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"আজ"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"আগামীকাল"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"গতকাল"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index c218ff82..3ab61ffb 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -78,9 +78,9 @@
<string name="edit_channels_item_deselect_group" msgid="5092649099546997807">"Anul·la la selecció"</string>
<string name="edit_channels_item_group_by" msgid="7794571851966798199">"Agrupa per"</string>
<string name="edit_channels_group_by_sources" msgid="5481053601210461217">"Font del canal"</string>
- <string name="edit_channels_group_by_hd_sd" msgid="5582719665718278819">"Alta definició/definició estàndard"</string>
+ <string name="edit_channels_group_by_hd_sd" msgid="5582719665718278819">"HD/SD"</string>
<string name="edit_channels_group_divider_for_hd" msgid="5311355566660389423">"Alta definició"</string>
- <string name="edit_channels_group_divider_for_sd" msgid="5846195382266436167">"Definició estàndard"</string>
+ <string name="edit_channels_group_divider_for_sd" msgid="5846195382266436167">"SD"</string>
<string name="side_panel_title_group_by" msgid="1783176601425788939">"Agrupa per"</string>
<string name="program_guide_content_locked" msgid="198056836554559553">"Aquest programa està bloquejat"</string>
<string name="program_guide_content_locked_format" msgid="514915272862967389">"Aquest programa està classificat com a <xliff:g id="RATING">%1$s</xliff:g>"</string>
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Només àudio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"El senyal és feble"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"No hi ha connexió a Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Aquest canal no es podrà reproduir fins a les <xliff:g id="END_TIME_1">%1$s</xliff:g> perquè tots els sintonitzadors s\'estan utilitzant per enregistrar altres programes. \n\nPrem la tecla dreta per ajustar l\'horari d\'enregistrament.</item>
- <item quantity="one">Aquest canal no es podrà reproduir fins a les <xliff:g id="END_TIME_0">%1$s</xliff:g> perquè el sintonitzador s\'està utilitzant per enregistrar altres programes. \n\nPrem la tecla dreta per ajustar l\'horari d\'enregistrament.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Aquest canal no es podrà reproduir fins a les <xliff:g id="END_TIME_1">%1$s</xliff:g> perquè s\'estan enregistrant altres canals. \n\nPrem la tecla dreta per ajustar l\'horari d\'enregistrament.</item>
+ <item quantity="one">Aquest canal no es podrà reproduir fins a les <xliff:g id="END_TIME_0">%1$s</xliff:g> perquè se n\'està enregistrant un altre. \n\nPrem la tecla dreta per ajustar l\'horari d\'enregistrament.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Sense títol"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Canal bloquejat"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Canals en directe necessita permís per consultar les programacions de TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configura les teves fonts"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"L\'aplicació TV en directe combina l\'experiència dels canals de televisió tradicionals amb els canals de reproducció en temps real proporcionats per les aplicacions. \n\nPer començar, configura les fonts de canals que ja hi ha instal·lades. També pots navegar per Google Play Store per descobrir més aplicacions que ofereixin TV en directe."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Enregistraments i horaris"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minuts"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minuts"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hora"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Programats"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Sèries"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Altres"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"El canal no es pot enregistrar."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"El programa no es pot enregistrar."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"S\'ha programat l\'enregistrament de <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"S\'enregistrarà <xliff:g id="PROGRAMNAME">%1$s</xliff:g> d\'ara fins a les <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Calendari complet"</string>
@@ -225,9 +228,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Reprodueix des del principi"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Reprèn la reproducció"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Suprimeix"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Suprimeix els enregistraments"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Reprèn"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Mostra programa"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Més informació"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Suprimeix enregistr."</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Selecciona els episodis que vols suprimir. No els podràs recuperar una vegada s\'hagin suprimit."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"No hi ha cap enregistrament per suprimir."</string>
@@ -244,17 +249,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritat"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Més alta"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Més baixa"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"No. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Canals"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Qualsevol"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Selecciona la prioritat"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Quan no hi hagi prou sintonitzadors per enregistrar diversos programes alhora, només s\'enregistraran els programes amb la prioritat més alta."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Quan hi hagi massa programes per enregistrar a la mateixa hora, només s\'enregistraran els que tinguin una prioritat més elevada."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -268,17 +272,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"La part enregistrada es desarà a la biblioteca de DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -296,6 +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>
+ <!-- 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>
@@ -308,15 +324,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"S\'enregistrarà parcialment per conflictes amb sintonitzador."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"No s\'enregistrarà perquè hi ha conflictes amb sintonitzador."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Encara no hi ha enregistraments programats.\nPots programar-ne des de la programació."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Calendari d\'enregistrament per als propers %1$d dies</item>
- <item quantity="one">Calendari d\'enregistrament per al proper dia (%1$d)</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d conflictes d\'enregistrament</item>
+ <item quantity="one">%1$d conflicte d\'enregistrament</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Configuració"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Enrere"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Desfés"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Configuració de la sèrie"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Inicia enregistrament sèrie"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Atura enregistrament sèrie"</string>
+ <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_empty_state" msgid="3407962945399698707">"No hi ha episodis disponibles.\nS\'enregistraran quan estiguin disponibles."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minuts)</item>
+ <item quantity="one">(%1$d minut) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Avui"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Demà"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Ahir"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 6d0b62a5..6dac1751 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -159,11 +159,11 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Pouze zvuk"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Slabý signál"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Nejste připojeni k internetu"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="few">Tento kanál do <xliff:g id="END_TIME_1">%1$s</xliff:g> nelze přehrát, protože se pomocí tuneru nahrávají jiné programy. \n\nChcete-li upravit plán nahrávání, stiskněte šipku vpravo.</item>
- <item quantity="many">Tento kanál do <xliff:g id="END_TIME_1">%1$s</xliff:g> nelze přehrát, protože se pomocí tuneru nahrávají jiné programy. \n\nChcete-li upravit plán nahrávání, stiskněte šipku vpravo.</item>
- <item quantity="other">Tento kanál do <xliff:g id="END_TIME_1">%1$s</xliff:g> nelze přehrát, protože se pomocí tuneru nahrávají jiné programy. \n\nChcete-li upravit plán nahrávání, stiskněte šipku vpravo.</item>
- <item quantity="one">Tento kanál do <xliff:g id="END_TIME_0">%1$s</xliff:g> nelze přehrát, protože se pomocí tuneru nahrávají jiné programy. \n\nChcete-li upravit plán nahrávání, stiskněte šipku vpravo.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="few">Tento kanál do <xliff:g id="END_TIME_1">%1$s</xliff:g> nelze přehrát, protože se nahrávají jiné kanály. \n\nChcete-li upravit plán nahrávání, stiskněte šipku vpravo.</item>
+ <item quantity="many">Tento kanál do <xliff:g id="END_TIME_1">%1$s</xliff:g> nelze přehrát, protože se nahrávají jiné kanály. \n\nChcete-li upravit plán nahrávání, stiskněte šipku vpravo.</item>
+ <item quantity="other">Tento kanál do <xliff:g id="END_TIME_1">%1$s</xliff:g> nelze přehrát, protože se nahrávají jiné kanály. \n\nChcete-li upravit plán nahrávání, stiskněte šipku vpravo.</item>
+ <item quantity="one">Tento kanál do <xliff:g id="END_TIME_0">%1$s</xliff:g> nelze přehrát, protože se nahrává jiný kanál. \n\nChcete-li upravit plán nahrávání, stiskněte šipku vpravo.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Bez názvu"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanál byl zablokován"</string>
@@ -200,6 +200,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Televize online potřebuje oprávnění ke čtení televizních programů."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Nastavte zdroje"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Televize online spojuje klasické televizní kanály se streamovanými kanály z aplikací. \n\nChcete-li začít, nastavte zdroje kanálů, které již jsou nainstalovány. Případně můžete v Obchodu Google Play vyhledat další aplikace, které nabízí televizi online."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Nahrávání a plány"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minut"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minut"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hodina"</string>
@@ -208,6 +209,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Naplánováno"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Seriál"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Ostatní"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Tento kanál nelze nahrávat."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Tento program nelze nahrávat."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Nahrávání programu <xliff:g id="PROGRAMNAME">%1$s</xliff:g> bylo naplánováno"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Nahrávání programu <xliff:g id="PROGRAMNAME">%1$s</xliff:g> od této chvíle do <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Celý plán"</string>
@@ -245,9 +248,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Přehrát od začátku"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Pokračovat v přehrávání"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Smazat"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Smazat nahraný obsah"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Pokračovat"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Série <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Otevřít program"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Další informace"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Smazání obsahu"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Vyberte epizody, které chcete smazat. Po smazání je nebude možné obnovit."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Nemáte žádný obsah ke smazání."</string>
@@ -266,17 +271,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritní"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Nejvyšší"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Nejnižší"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Č. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanály"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Libovolný"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Vybrat prioritu"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Když není k dispozici dostatek tunerů k souběžnému nahrávání programů, budou nahrány pouze programy s vyšší prioritou."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Když naplánujete nahrávání příliš mnoha programů, budou nahrány pouze programy s vyšší prioritou."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -290,17 +294,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Nahraná část bude uložena do knihovny DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -320,6 +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>
+ <!-- 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>
@@ -334,17 +350,25 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Z důvodu konfliktu tunerů bude nahrána jen část obsahu."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Z důvodu konfliktu tunerů obsah nebude nahrán."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Zatím není naplánováno žádné nahrávání.\nNahrávání lze naplánovat pomocí programového průvodce."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="few">Plán nahrávání na %1$d další dny</item>
- <item quantity="many">Plán nahrávání na %1$d dalšího dne</item>
- <item quantity="other">Plán nahrávání na %1$d dalších dnů</item>
- <item quantity="one">Plán nahrávání na %1$d další den</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="few">%1$d konflikty nahrávání</item>
+ <item quantity="many">%1$d konfliktu nahrávání</item>
+ <item quantity="other">%1$d konfliktů nahrávání</item>
+ <item quantity="one">%1$d konflikt nahrávání</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Nastavení"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Zpět"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Vrátit zpět"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Nastavení série"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Spustit nahrávání série"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Zastavit nahrávání série"</string>
+ <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_empty_state" msgid="3407962945399698707">"Nejsou k dispozici žádné epizody.\nEpizody budou nahrány, až budou k dispozici."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="few">(%1$d minuty)</item>
+ <item quantity="many">(%1$d minuty)</item>
+ <item quantity="other">(%1$d minut)</item>
+ <item quantity="one">(%1$d minuta) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Dnes"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Zítra"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Včera"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 128db1e7..b053e77d 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Kun lyd"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Svagt signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Der er ingen internetforbindelse"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Denne kanal kan ikke afspilles før kl. <xliff:g id="END_TIME_1">%1$s</xliff:g>, da alle tunere i øjeblikket bruges til at optage andre programmer. \n\nTryk på højreknappen for at justere tidsplanen for optagelse.</item>
- <item quantity="other">Denne kanal kan ikke afspilles før kl. <xliff:g id="END_TIME_1">%1$s</xliff:g>, da alle tunere i øjeblikket bruges til at optage andre programmer. \n\nTryk på højreknappen for at justere tidsplanen for optagelse.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Denne kanal kan ikke afspilles før kl. <xliff:g id="END_TIME_1">%1$s</xliff:g>, da andre kanaler i øjeblikket optages. \n\nTryk på højreknappen for at justere tidsplanen for optagelse.</item>
+ <item quantity="other">Denne kanal kan ikke afspilles før kl. <xliff:g id="END_TIME_1">%1$s</xliff:g>, da andre kanaler i øjeblikket optages. \n\nTryk på højreknappen for at justere tidsplanen for optagelse.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Ingen titel"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanalen er blokeret"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Tv-kanaler skal have tilladelse for at kunne læse tv-guiden."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Konfigurer dine kilder"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Tv-kanaler kombinerer oplevelsen af traditionelle fjernsynskanaler med streamingkanaler fra apps. \n\nKom godt i gang ved at konfigurere de kanalkilder, der allerede er installeret. Du kan også gå til Google Play Butik og finde flere apps med tv-kanaler."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Optagelser og tidsplaner"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutter"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutter"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 time"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Planlagt"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serie"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Andre"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Kanalen kan ikke optages."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Programmet kan ikke optages."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Optagelse af <xliff:g id="PROGRAMNAME">%1$s</xliff:g> er planlagt"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Optager <xliff:g id="PROGRAMNAME">%1$s</xliff:g> fra nu af til <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Hele tidsplanen"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Afspil fra begyndelsen"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Genoptag afspilning"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Slet"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Slet optagelser"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Genoptag"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Sæson <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Se tidsplan"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Læs mere"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Slet optagelser"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Vælg de afsnit, du vil slette. De kan ikke gendannes, når du har slettet dem."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Der er ingen optagelser at slette."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritet"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Højest"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Lavest"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nr. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanaler"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Alle"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Vælg prioritet"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Når der ikke er nok tunere til at optage programmer på samme tid, er det kun programmer med højere prioritet, der optages."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Når der er for mange programmer at optage på samme tid, er det kun programmer med højere prioritet, der optages."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Den optagede del gemmes i DVR-samlingen."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Det optagede indhold gemmes."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Optages delvist, da der ikke er en tilgængelig tuner."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Optages ikke, da der ikke er en tilgængelig tuner."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Der er endnu ingen planlagte optagelser.\nDu kan planlægge optagelser i programguiden."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Tidsplan for optagelse den næste %1$d dag</item>
- <item quantity="other">Tidsplan for optagelse de næste %1$d dage</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d konflikt i forbindelse med optagelse</item>
+ <item quantity="other">%1$d konflikter i forbindelse med optagelse</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Indstillinger"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Tilbage"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Fortryd"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Indstillinger for Serier"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Start optagelse af serie"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Stop optagelse af serie"</string>
+ <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_empty_state" msgid="3407962945399698707">"Der er ingen tilgængelige tv-serier.\nDe optages, så snart de er tilgængelige.."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d minut)</item>
+ <item quantity="other">(%1$d minutter)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"I dag"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"I morgen"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"I går"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 8c3f8333..b4cc6c0f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Nur Audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Schwaches Signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Keine Internetverbindung"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Dieser Kanal kann bis <xliff:g id="END_TIME_1">%1$s</xliff:g> nicht abgespielt werden, weil alle Tuner für die Aufnahme anderer Programme verwendet werden. \n\nDrücken Sie rechts, um den Aufnahmeplan anzupassen.</item>
- <item quantity="one">Dieser Kanal kann bis <xliff:g id="END_TIME_0">%1$s</xliff:g> nicht abgespielt werden, weil der Tuner für die Aufnahme anderer Programme verwendet wird. \n\nDrücken Sie rechts, um den Aufnahmeplan anzupassen.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Dieser Kanal kann bis <xliff:g id="END_TIME_1">%1$s</xliff:g> nicht wiedergegeben werden, weil andere Kanäle aufgenommen werden. \n\nDrücken Sie rechts, um den Aufnahmeplan anzupassen.</item>
+ <item quantity="one">Dieser Kanal kann bis <xliff:g id="END_TIME_0">%1$s</xliff:g> nicht wiedergegeben werden, weil ein anderer Kanal aufgenommen wird. \n\nDrücken Sie rechts, um den Aufnahmeplan anzupassen.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Kein Titel"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanal blockiert"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Live TV benötigt einen Lesezugriff für die Kanalliste."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Quellen einrichten"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Bei Live-TV wird die Nutzererfahrung mit klassischen Fernsehsendern mit der von Streaming-Kanälen von Apps kombiniert.\n\nRichten Sie zuerst die bereits installierten Kanalquellen ein. Sie können auch im Google Play Store nach weiteren Apps suchen, die Live-TV anbieten."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Aufnahmen und Zeitpläne"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 Minuten"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 Minuten"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 Stunde"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Geplant"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serien"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Andere"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Dieser Kanal kann nicht aufgenommen werden."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Diese Sendung kann nicht aufgenommen werden."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Aufnahme von <xliff:g id="PROGRAMNAME">%1$s</xliff:g> geplant"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"\"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" wird ab jetzt bis <xliff:g id="ENDTIME">%2$s</xliff:g> aufgenommen"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Programmübersicht"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Von Anfang an abspielen"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Wiedergabe fortsetzen"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Löschen"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Aufnahmen löschen"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Fortsetzen"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Staffel <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Aufnahmeplan"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Weitere Infos"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Aufnahmen löschen"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Wählen Sie die Folgen aus, die gelöscht werden sollen. Eine Wiederherstellung ist nicht möglich."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Es sind keine Aufnahmen zum Löschen vorhanden."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priorität"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Höchste"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Niedrigste"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nein. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanäle"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Alle"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Priorität auswählen"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Wenn zur gleichzeitigen Aufnahme von Programmen nicht genügend Tuner verfügbar sind, werden nur die Programme mit höherer Priorität aufgenommen."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Wenn zu viele Programme gleichzeitig aufgenommen werden, werden nur die Programme mit höherer Priorität aufgenommen."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Der aufgenommene Teil wird in der DVR-Bibliothek gespeichert."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Die aufgenommenen Inhalte werden 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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Wird aufgrund von Tunerkonflikten nur teilweise aufgenommen."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Wird aufgrund von Tunerkonflikten nicht aufgenommen."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Es sind noch keine Aufnahmen geplant.\nDu kannst von der Programmübersicht einen Aufnahmeplan erstellen."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Aufnahmeplan für die nächsten %1$d Tage</item>
- <item quantity="one">Aufnahmeplan für den nächsten %1$d Tag</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d Konflikte bei der Aufnahme</item>
+ <item quantity="one">%1$d Konflikt bei der Aufnahme</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Einstellungen"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Zurück"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Rückgängig machen"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Serieneinstellungen"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Serienaufnahme starten"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Serienaufnahme beenden"</string>
+ <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_empty_state" msgid="3407962945399698707">"Keine Folgen verfügbar.\nSie werden aufgenommen, sobald sie verfügbar sind."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d Minuten)</item>
+ <item quantity="one">(%1$d Minute) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Heute"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Morgen"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Gestern"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index a81c28d4..9e8e042c 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Μόνο ήχος"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Ασθενές σήμα"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Δεν υπάρχει σύνδεση στο διαδίκτυο"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Δεν είναι δυνατή η αναπαραγωγή αυτού του καναλιού μέχρι τις <xliff:g id="END_TIME_1">%1$s</xliff:g>, επειδή όλοι οι δέκτες χρησιμοποιούνται για την εγγραφή άλλων προγραμμάτων. \n\nΠατήστε δεξιά για να προσαρμόσετε το χρονοδιάγραμμα εγγραφής.</item>
- <item quantity="one">Δεν είναι δυνατή η αναπαραγωγή αυτού του καναλιού μέχρι τις <xliff:g id="END_TIME_0">%1$s</xliff:g>, επειδή ο δέκτης χρησιμοποιείται για την εγγραφή άλλων προγραμμάτων. \n\nΠατήστε δεξιά για να προσαρμόσετε το χρονοδιάγραμμα εγγραφής.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Δεν είναι δυνατή η αναπαραγωγή αυτού του καναλιού μέχρι τις <xliff:g id="END_TIME_1">%1$s</xliff:g> επειδή πραγματοποιείται εγγραφή άλλων καναλιών. \n\nΠατήστε το στοιχείο \"Δεξιά\" για να προσαρμόσετε το χρονοδιάγραμμα εγγραφής.</item>
+ <item quantity="one">Δεν είναι δυνατή η αναπαραγωγή αυτού του καναλιού μέχρι τις <xliff:g id="END_TIME_0">%1$s</xliff:g> επειδή πραγματοποιείται εγγραφή κάποιου άλλου καναλιού. \n\nΠατήστε το στοιχείο \"Δεξιά\" για να προσαρμόσετε το χρονοδιάγραμμα εγγραφής.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Χωρίς τίτλο"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Το κανάλι αποκλείστηκε"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Τα ζωντανά κανάλια χρειάζονται άδεια για να διαβάσουν τις τηλεοπτικές καταχωρίσεις."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Ρυθμίστε τις πηγές σας"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Τα Ζωντανά κανάλια συνδυάζουν την εμπειρία των παραδοσιακών τηλεοπτικών καναλιών με τα κανάλια μετάδοσης ροής που παρέχονται από τις εφαρμογές. \n\nΞεκινήστε με τη ρύθμιση των πηγών καναλιών που είναι ήδη εγκατεστημένα. Εναλλακτικά, περιηγηθείτε στο Google Play Store για να βρείτε περισσότερες εφαρμογές που προσφέρουν ζωντανά κανάλια."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Εγγραφές και χρονοδιαγράμματα"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 λεπτά"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 λεπτά"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ώρα"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Προγραμματισμένα"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Σειρά"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Άλλα"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Δεν είναι δυνατή η εγγραφή του καναλιού."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Δεν είναι δυνατή η εγγραφή του προγράμματος."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Το πρόγραμμα <xliff:g id="PROGRAMNAME">%1$s</xliff:g> έχει προγραμματιστεί για εγγραφή"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Εγγραφή του προγράμματος <xliff:g id="PROGRAMNAME">%1$s</xliff:g> από τώρα έως <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Πλήρες χρονοδιάγραμμα"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Αναπαραγωγή από την αρχή"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Διαγραφή εγγραφών"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Επιλέξτε τα επεισόδια που θέλετε να διαγράψετε. Δεν είναι δυνατή η ανάκτησή τους μετά τη διαγραφή."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Δεν υπάρχουν εγγραφές για διαγραφή."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Προτεραιότητα"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Υψηλότερη"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Χαμηλότερη"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Όχι. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Κανάλια"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Οποιοδήποτε"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Επιλέξτε προτεραιότητα"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Όταν δεν υπάρχουν αρκετοί δέκτες για ταυτόχρονη εγγραφή προγραμμάτων, θα πραγματοποιηθεί η εγγραφή μόνο των προγραμμάτων με την υψηλότερη προτεραιότητα."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Το τμήμα που καταγράψατε θα αποθηκευτεί στη βιβλιοθήκη DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Θα γίνει αποθήκευση του περιεχομένου που έχει εγγραφεί."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Θα γίνει μερική εγγραφή λόγω διενέξεων δέκτη."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Δεν θα γίνει εγγραφή λόγω διενέξεων δέκτη."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Προς το παρόν, δεν υπάρχουν προγραμματισμένες εγγραφές.\nΜπορείτε να προγραμματίσετε εγγραφές από τον οδηγό προγράμματος."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Χρονοδιάγραμμα εγγραφής για τις επόμενες %1$d ημέρες</item>
- <item quantity="one">Χρονοδιάγραμμα εγγραφής για την επόμενη %1$d ημέρα</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d διενέξεις εγγραφής</item>
+ <item quantity="one">%1$d διένεξη εγγραφής</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Ρυθμίσεις"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Επιστροφή"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Αναίρεση"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Ρυθμίσεις σειράς"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Έναρξη εγγραφής σειράς"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Διακοπή εγγραφής σειράς"</string>
+ <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_empty_state" msgid="3407962945399698707">"Δεν υπάρχουν διαθέσιμα επεισόδια.\nΗ εγγραφή τους θα πραγματοποιηθεί όταν θα είναι διαθέσιμα."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d λεπτά)</item>
+ <item quantity="one">(%1$d λεπτό) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Σήμερα"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Αύριο"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Χθες"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index d7e00fe7..bda4e1ea 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Audio only"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Weak signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"No Internet connection"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">This channel can\'t be played until <xliff:g id="END_TIME_1">%1$s</xliff:g> because all the tuners are being used for recording other programmes. \n\nPress Right to adjust recording schedule.</item>
- <item quantity="one">This channel can\'t be played until <xliff:g id="END_TIME_0">%1$s</xliff:g> because the tuner is being used for recording other programs. \n\nPress Right to adjust recording schedule.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">This channel can\'t be played until <xliff:g id="END_TIME_1">%1$s</xliff:g>, because other channels are being recorded. \n\nPress Right to adjust recording schedule.</item>
+ <item quantity="one">This channel can\'t be played until <xliff:g id="END_TIME_0">%1$s</xliff:g>, because another channel is being recorded. \n\nPress Right to adjust recording schedule.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"No title"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Channel blocked"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Live TV needs permission to read the TV listings."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Set up your sources"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Live channels combines the experience of traditional TV channels with streaming channels provided by apps. \n\nGet started by setting up the channel sources already installed. Or browse Google Play Store for more apps that offer live channels."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Recordings &amp; schedules"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutes"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutes"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hour"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Scheduled"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Series"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Others"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"The channel cannot be recorded."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"The programme cannot be recorded."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> has been scheduled to be recorded"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Recording <xliff:g id="PROGRAMNAME">%1$s</xliff:g> from now to <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Full schedule"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Play from beginning"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Resume playing"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Delete"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Delete recordings"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"CV"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Series <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"View schedule"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Read more"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Delete recordings"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Select the episodes that you would like to delete. They can\'t be recovered once deleted."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"There are no recordings to delete."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priority"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Highest"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Lowest"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"No. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Channels"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Any"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Choose priority"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"When there are not enough tuners to record programmes at the same time, only the programmes with higher priorities will be recorded."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"When there are too many programmes to be recorded at the same time, only the ones with higher priorities will be recorded."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"The recorded part will be saved in the DVR library."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Will be partially recorded due to tuner conflicts."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Won\'t be recorded due to tuner conflicts."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"There are no recordings on schedule yet.\nYou can schedule recording from the programme guide."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Recording schedule for the next %1$d days</item>
- <item quantity="one">Recording schedule for the next %1$d day</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d recording conflicts</item>
+ <item quantity="one">%1$d recording conflict</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Settings"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Back"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Undo"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Series settings"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Start series recording"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Stop series recording"</string>
+ <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_empty_state" msgid="3407962945399698707">"No episodes are available.\nThey will be recorded once they are available."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutes)</item>
+ <item quantity="one">(%1$d minute) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Today"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Tomorrow"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Yesterday"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index d7e00fe7..bda4e1ea 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Audio only"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Weak signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"No Internet connection"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">This channel can\'t be played until <xliff:g id="END_TIME_1">%1$s</xliff:g> because all the tuners are being used for recording other programmes. \n\nPress Right to adjust recording schedule.</item>
- <item quantity="one">This channel can\'t be played until <xliff:g id="END_TIME_0">%1$s</xliff:g> because the tuner is being used for recording other programs. \n\nPress Right to adjust recording schedule.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">This channel can\'t be played until <xliff:g id="END_TIME_1">%1$s</xliff:g>, because other channels are being recorded. \n\nPress Right to adjust recording schedule.</item>
+ <item quantity="one">This channel can\'t be played until <xliff:g id="END_TIME_0">%1$s</xliff:g>, because another channel is being recorded. \n\nPress Right to adjust recording schedule.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"No title"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Channel blocked"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Live TV needs permission to read the TV listings."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Set up your sources"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Live channels combines the experience of traditional TV channels with streaming channels provided by apps. \n\nGet started by setting up the channel sources already installed. Or browse Google Play Store for more apps that offer live channels."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Recordings &amp; schedules"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutes"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutes"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hour"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Scheduled"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Series"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Others"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"The channel cannot be recorded."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"The programme cannot be recorded."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> has been scheduled to be recorded"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Recording <xliff:g id="PROGRAMNAME">%1$s</xliff:g> from now to <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Full schedule"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Play from beginning"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Resume playing"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Delete"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Delete recordings"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"CV"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Series <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"View schedule"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Read more"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Delete recordings"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Select the episodes that you would like to delete. They can\'t be recovered once deleted."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"There are no recordings to delete."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priority"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Highest"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Lowest"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"No. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Channels"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Any"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Choose priority"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"When there are not enough tuners to record programmes at the same time, only the programmes with higher priorities will be recorded."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"When there are too many programmes to be recorded at the same time, only the ones with higher priorities will be recorded."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"The recorded part will be saved in the DVR library."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Will be partially recorded due to tuner conflicts."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Won\'t be recorded due to tuner conflicts."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"There are no recordings on schedule yet.\nYou can schedule recording from the programme guide."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Recording schedule for the next %1$d days</item>
- <item quantity="one">Recording schedule for the next %1$d day</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d recording conflicts</item>
+ <item quantity="one">%1$d recording conflict</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Settings"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Back"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Undo"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Series settings"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Start series recording"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Stop series recording"</string>
+ <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_empty_state" msgid="3407962945399698707">"No episodes are available.\nThey will be recorded once they are available."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutes)</item>
+ <item quantity="one">(%1$d minute) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Today"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Tomorrow"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Yesterday"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index d7e00fe7..bda4e1ea 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Audio only"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Weak signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"No Internet connection"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">This channel can\'t be played until <xliff:g id="END_TIME_1">%1$s</xliff:g> because all the tuners are being used for recording other programmes. \n\nPress Right to adjust recording schedule.</item>
- <item quantity="one">This channel can\'t be played until <xliff:g id="END_TIME_0">%1$s</xliff:g> because the tuner is being used for recording other programs. \n\nPress Right to adjust recording schedule.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">This channel can\'t be played until <xliff:g id="END_TIME_1">%1$s</xliff:g>, because other channels are being recorded. \n\nPress Right to adjust recording schedule.</item>
+ <item quantity="one">This channel can\'t be played until <xliff:g id="END_TIME_0">%1$s</xliff:g>, because another channel is being recorded. \n\nPress Right to adjust recording schedule.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"No title"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Channel blocked"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Live TV needs permission to read the TV listings."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Set up your sources"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Live channels combines the experience of traditional TV channels with streaming channels provided by apps. \n\nGet started by setting up the channel sources already installed. Or browse Google Play Store for more apps that offer live channels."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Recordings &amp; schedules"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutes"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutes"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hour"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Scheduled"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Series"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Others"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"The channel cannot be recorded."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"The programme cannot be recorded."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> has been scheduled to be recorded"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Recording <xliff:g id="PROGRAMNAME">%1$s</xliff:g> from now to <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Full schedule"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Play from beginning"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Resume playing"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Delete"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Delete recordings"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"CV"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Series <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"View schedule"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Read more"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Delete recordings"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Select the episodes that you would like to delete. They can\'t be recovered once deleted."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"There are no recordings to delete."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priority"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Highest"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Lowest"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"No. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Channels"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Any"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Choose priority"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"When there are not enough tuners to record programmes at the same time, only the programmes with higher priorities will be recorded."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"When there are too many programmes to be recorded at the same time, only the ones with higher priorities will be recorded."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"The recorded part will be saved in the DVR library."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Will be partially recorded due to tuner conflicts."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Won\'t be recorded due to tuner conflicts."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"There are no recordings on schedule yet.\nYou can schedule recording from the programme guide."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Recording schedule for the next %1$d days</item>
- <item quantity="one">Recording schedule for the next %1$d day</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d recording conflicts</item>
+ <item quantity="one">%1$d recording conflict</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Settings"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Back"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Undo"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Series settings"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Start series recording"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Stop series recording"</string>
+ <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_empty_state" msgid="3407962945399698707">"No episodes are available.\nThey will be recorded once they are available."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutes)</item>
+ <item quantity="one">(%1$d minute) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Today"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Tomorrow"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Yesterday"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 76fca089..14e9f506 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Solo audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Señal débil"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Sin conexión a Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Este canal no puede reproducirse hasta las <xliff:g id="END_TIME_1">%1$s</xliff:g> porque todos los sintonizadores están grabando otros programas. \n\nPresiona el botón derecho para ajustar el cronograma de grabación.</item>
- <item quantity="one">Este canal no puede reproducirse hasta las <xliff:g id="END_TIME_0">%1$s</xliff:g> porque el sintonizador está grabando otros programas. \n\nPresiona el botón derecho para ajustar el cronograma de grabación.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Este canal no puede reproducirse hasta las <xliff:g id="END_TIME_1">%1$s</xliff:g> porque se están grabando otros canales. \n\nPresiona el botón derecho para ajustar el cronograma de grabación.</item>
+ <item quantity="one">Este canal no puede reproducirse hasta las <xliff:g id="END_TIME_0">%1$s</xliff:g> porque se está grabando otro canal. \n\nPresiona el botón derecho para ajustar el cronograma de grabación.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Sin título"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Canal bloqueado"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"\"Canales en vivo\" necesita permiso para leer las listas de canales de televisión."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configura tus fuentes"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Canales en vivo combina la experiencia de los canales de TV tradicionales con la transmisión de canales que ofrecen las apps.\n\nPara comenzar, configura las fuentes de canales que ya están instaladas o explora Google Play Store para obtener más apps que ofrecen canales en vivo."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Grabaciones y cronograma"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutos"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutos"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hora"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Programada"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serie"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Otros"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"No se puede grabar el canal."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"No se puede grabar el programa."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Se programó la grabación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Grabando <xliff:g id="PROGRAMNAME">%1$s</xliff:g> desde ahora hasta las <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Cronograma completo"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Reproducir desde comienzo"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Reanudar reproducción"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Borrar"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Borrar grabaciones"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Reanudar"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Ver programación"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Leer más"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Borra grabaciones"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Selecciona los episodios que quieres borrar. Una vez que los borres, no podrás recuperarlos."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"No hay ninguna grabación para borrar."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioridad"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Máxima"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Muy baja"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"N.º <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Canales"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Cualquiera"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Selecciona la prioridad"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Cuando no haya suficientes sintonizadores para grabar programas simultáneamente, se grabarán solo los programas con mayor prioridad."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Cuando hay demasiados programas para grabar al mismo tiempo, solo se grabarán los que tengan mayor prioridad."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"La parte grabada se guardará en la biblioteca de DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Se grabará parcialmente debido a problemas del sintonizador."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"No se grabará debido a problemas con el sintonizador."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Aún no hay grabaciones programadas.\nPuedes programar grabaciones en la guía de programas."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Programa de grabación para los próximos %1$d días</item>
- <item quantity="one">Programa de grabación para el próximo día</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d problemas de grabación</item>
+ <item quantity="one">%1$d problema de grabación</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Configuración"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Atrás"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Deshacer"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Configuración de la serie"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Iniciar grabación"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Detener grabación"</string>
+ <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_empty_state" msgid="3407962945399698707">"No hay episodios disponibles.\nSe grabarán cuando lo estén."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutos)</item>
+ <item quantity="one">(%1$d minuto) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Hoy"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Mañana"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Ayer"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 60e9a2e2..badab6a4 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Solo audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Señal débil"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Sin conexión a Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Este canal no se puede reproducir hasta las <xliff:g id="END_TIME_1">%1$s</xliff:g> porque los sintonizadores están grabando otros programas. \n\nPulsa la flecha hacia la derecha para modificar la programación de grabaciones.</item>
- <item quantity="one">Este canal no se puede reproducir hasta las <xliff:g id="END_TIME_0">%1$s</xliff:g> porque el sintonizador está grabando otros programas. \n\nPulsa la flecha hacia la derecha para modificar la programación de grabaciones.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Este canal no se puede reproducir hasta <xliff:g id="END_TIME_1">%1$s</xliff:g> porque se están grabando otros canales. \n\nPulsa la flecha hacia la derecha para modificar la programación de grabaciones.</item>
+ <item quantity="one">Este canal no se puede reproducir hasta <xliff:g id="END_TIME_0">%1$s</xliff:g> porque se está grabando otro canal. \n\nPulsa la flecha hacia la derecha para modificar la programación de grabaciones.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Sin título"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Canal bloqueado"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Canales en directo necesita permiso para consultar las programaciones de TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configura las fuentes de canales"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"TV en directo combina la experiencia de los canales de TV tradicionales con los canales de reproducción en streaming que proporcionan las aplicaciones. \n\nPara empezar, configura las fuentes de canales que ya están instaladas. También puedes buscar más aplicaciones que ofrezcan TV en directo en Google Play Store."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Grabaciones y programaciones"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutos"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutos"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hora"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Programadas"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serie"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Otros"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"No se puede grabar el canal."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"No se puede grabar el programa."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Se ha programado la grabación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Grabando <xliff:g id="PROGRAMNAME">%1$s</xliff:g> desde ahora hasta <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Programación completa"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Reproducir desde inicio"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Reanudar reproducción"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Eliminar"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Eliminar grabaciones"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Reanudar"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Ver programación"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Más información"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Eliminar grabaciones"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Selecciona los episodios que quieras eliminar. Una vez eliminados, no se pueden recuperar."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"No hay grabaciones para eliminar."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioridad"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"La más alta"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"La más baja"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"N.º <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Canales"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Cualquiera"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Elegir prioridad"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Cuando no haya suficientes sintonizadores para grabar varios programas al mismo tiempo, solo se grabarán aquellos con mayor prioridad."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Cuando haya demasiados programas que grabar al mismo tiempo, solo se grabarán aquellos con mayor prioridad."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"La parte grabada se guardará en la colección del DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Se grabará parcialmente por problemas del sintonizador."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"No se grabará por problemas del sintonizador."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Aún no has programado ninguna grabación.\nPuedes hacerlo en la programación."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Programación de grabación para los %1$d días siguientes</item>
- <item quantity="one">Programación de grabación para el día siguiente</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d conflictos de grabación</item>
+ <item quantity="one">%1$d conflicto de grabación</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Ajustes"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Atrás"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Deshacer"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Ajustes de series"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Iniciar grabación serie"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Detener grabación serie"</string>
+ <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_empty_state" msgid="3407962945399698707">"No hay episodios disponibles.\nSe grabarán cuando estén disponibles."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutos)</item>
+ <item quantity="one">(%1$d minuto) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Hoy"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Mañana"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Ayer"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 38a35507..83022b8e 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Ainult heli"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Nõrk signaal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Interneti-ühendus puudub"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Seda kanalit ei saa kuni kellani <xliff:g id="END_TIME_1">%1$s</xliff:g> esitada, kuna kõiki tuunereid kasutatakse teiste saadete salvestamiseks. \n\nSalvestamise ajakava kohandamiseks vajutage paremnoolt.</item>
- <item quantity="one">Seda kanalit ei saa kuni kellani <xliff:g id="END_TIME_0">%1$s</xliff:g> esitada, kuna tuunerit kasutatakse teiste saadete salvestamiseks. \n\nSalvestamise ajakava kohandamiseks vajutage paremnoolt.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Seda kanalit ei saa kuni kellani <xliff:g id="END_TIME_1">%1$s</xliff:g> esitada, kuna salvestatakse teisi kanaleid. \n\nSalvestamise ajakava kohandamiseks vajutage paremnoolt.</item>
+ <item quantity="one">Seda kanalit ei saa kuni kellani <xliff:g id="END_TIME_0">%1$s</xliff:g> esitada, kuna salvestatakse teist kanalit. \n\nSalvestamise ajakava kohandamiseks vajutage paremnoolt.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Pealkiri puudub"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanal on blokeeritud"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Reaalajas kanalid vajavad telekavade lugemiseks luba."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Allikate seadistamine"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Reaalajakanalid ühendavad tavaliste telekanalite kasutuskogemuse ja rakendustes kanalite voogesitamise. \n\nAlustamiseks seadistage juba installitud kanaliallikad. Võite ka sirvida Google Play poodi, et hankida rakendusi, mis pakuvad reaalajakanaleid."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Salvestised ja ajakavad"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutit"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutit"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 tund"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Ajakavas´"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Seeria"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Muud"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Kanalit ei saa salvestada."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Programmi ei saa salvestada."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> on salvestamiseks ajastatud"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Saate <xliff:g id="PROGRAMNAME">%1$s</xliff:g> salvestamine praegusest kuni <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Kogu ajakava"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Esita algusest"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Jätka esitust"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Kustuta"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Kustuta salvestised"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Jätka"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. hooaeg"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Kuva ajakava"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Lisateave"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Salvestuste kustutamine"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Valige jaod, mille soovite kustutada. Pärast kustutamist ei saa neid enam taastada."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Kustutamiseks pole salvestusi."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioriteet"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Kõige kõrgem"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Kõige madalam"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nr <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanalid"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Kõik"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Prioriteedi valimine"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Kui samal ajal programmide salvestamiseks pole piisavalt tuunereid, salvestatakse ainult kõige kõrgema prioriteediga programmid."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Kui samal ajal salvestamiseks on liiga palju programme, salvestatakse ainult prioriteetsed programmid."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Salvestatud osa salvestatakse DVR-i kogusse."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Salvestatud sisu talletatakse."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Salvestatakse tuuneri konfliktide tõttu osaliselt."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Ei salvestata tuuneri konfliktide tõttu."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Ajakavas ei ole veel salvestusi.\nSalvestuse saate ajakavva lisada saatekavas."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Salvestamise ajakava järgmiseks %1$d päevaks</item>
- <item quantity="one">Salvestamise ajakava järgmiseks %1$d päevaks</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d salvestamise konflikti</item>
+ <item quantity="one">%1$d salvestamise konflikt</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Seaded"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Tagasi"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Võta tagasi"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Seeria seaded"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Alusta seeria salvestam."</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Peata seeria salvestamine"</string>
+ <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_empty_state" msgid="3407962945399698707">"Ükski osa pole saadaval.\nNeed salvestatakse siis, kui need kättesaadavaks muutuvad."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutit)</item>
+ <item quantity="one">(%1$d minut) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Täna"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Homme"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Eile"</string>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 9dba4920..19a00433 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -19,7 +19,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<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">"Erreprodukzio-kontrolak"</string>
+ <string name="menu_title_play_controls" msgid="2490237359425190652">"Erreprodukzioa kontrolatzeko aukerak"</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>
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Audioa soilik"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Seinale ahula"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Ez zaude Internetera konektatuta"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Kanal hau ezin da erreproduzitu <xliff:g id="END_TIME_1">%1$s</xliff:g> arte, sintonizadore guztiak lanean ari direlako beste programa batzuk grabatzen. \n\nGrabaketaren orduak aldatzeko, sakatu Eskuinera tekla.</item>
- <item quantity="one">Kanal hau ezin da erreproduzitu <xliff:g id="END_TIME_0">%1$s</xliff:g> arte, sintonizadorea beste programa batzuk grabatzen ari delako. \n\nGrabaketaren orduak aldatzeko, sakatu Eskuinera tekla.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Kanal hau ezin da erreproduzitu <xliff:g id="END_TIME_1">%1$s</xliff:g> arte, beste kanal batzuk grabatzen ari garelako. \n\nGrabaketaren orduak aldatzeko, sakatu Eskuinera tekla.</item>
+ <item quantity="one">Kanal hau ezin da erreproduzitu <xliff:g id="END_TIME_0">%1$s</xliff:g> arte, beste kanal bat ari garelako grabatzen. \n\nGrabaketaren orduak aldatzeko, sakatu Eskuinera tekla.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Izenik ez"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanala blokeatuta dago"</string>
@@ -192,6 +192,7 @@
<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>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutu"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutu"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ordu"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Programatutakoak"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Telesailak"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Beste batzuk"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Ezin da grabatu kanal hau."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Ezin da grabatu programa hau."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> grabatzeko programatu da"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> grabatuko da <xliff:g id="ENDTIME">%2$s</xliff:g> arte"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Programazio osoa"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Erreproduzitu hasieratik"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Berrekin"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Ezabatu"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Ezabatu grabaketak"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Berrekin"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. denboraldia"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Ikusi agenda"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Irakurri gehiago"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Ezabatu grabaketak"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Hautatu ezabatu nahi dituzun atalak. Ezabatu ondoren, ezingo dituzu berreskuratu."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Ez dago ezaba daitekeen grabaketarik."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Lehentasuna"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Handiena"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Txikiena"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"<xliff:g id="RANK">%1$d</xliff:g>.a"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanalak"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Edozein"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Aukeratu lehentasuna"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Aldi berean programa bat baino gehiago grabatzeko behar adina sintonizadore ez ditugunean erabilgarri, lehentasun handieneko programak bakarrik grabatuko dira."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Aldi berean programa gehiegi grabatu behar badira, lehentasun handieneko programak bakarrik grabatuko dira."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"DVR liburutegian gordeko da grabatutako zatia."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Grabatutako edukia gordeta geratuko da."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Partzialki grabatuko da, sintonizadoreak gatazkak baititu."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Ez da grabatuko, sintonizadoreak gatazkak baititu."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Oraindik ez duzu programatu grabaketarik.\nProgramazio-gidan programa ditzakezu grabaketak."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Datorren %1$d egunetako grabaketen ordutegia</item>
- <item quantity="one">Datorren %1$d eguneko grabaketen ordutegia</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d grabaketa-gatazka</item>
+ <item quantity="one">%1$d grabaketa-gatazka</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Ezarpenak"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Atzera"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Desegin"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Seriearen ezarpenak"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Hasi seriea grabatzen"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Utzi seriea grabatzeari"</string>
+ <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_empty_state" msgid="3407962945399698707">"Ez dago atalik ikusgai.\nIkusgai ezartzen dituztenean grabatuko ditugu."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutu)</item>
+ <item quantity="one">(%1$d minutu) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Gaur"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Bihar"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Atzo"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index c782329d..7dd59c28 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"فقط صدا"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"سیگنال ضعیف است"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"اتصال اینترنت قطع است"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">این کانال تا <xliff:g id="END_TIME_1">%1$s</xliff:g> قابل پخش نیست، زیرا همه تیونرها درحال استفاده برای ضبط سایر برنامه‌ها هستند. \n\nبرای تنظیم زمان‌بندی ضبط، «راست» را فشار دهید.</item>
- <item quantity="other">این کانال تا <xliff:g id="END_TIME_1">%1$s</xliff:g> قابل پخش نیست، زیرا همه تیونرها درحال استفاده برای ضبط سایر برنامه‌ها هستند. \n\nبرای تنظیم زمان‌بندی ضبط، «راست» را فشار دهید.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">این کانال تا <xliff:g id="END_TIME_1">%1$s</xliff:g> قابل پخش نیست، زیرا کانال‌های دیگری درحال ضبط هستند. \n\nبرای تنظیم زمان‌بندی ضبط، «راست» را فشار دهید.</item>
+ <item quantity="other">این کانال تا <xliff:g id="END_TIME_1">%1$s</xliff:g> قابل پخش نیست، زیرا کانال‌های دیگری درحال ضبط هستند. \n\nبرای تنظیم زمان‌بندی ضبط، «راست» را فشار دهید.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"بدون عنوان"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"کانال مسدود شد"</string>
@@ -187,11 +187,12 @@
<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>
- <string name="msg_channel_unavailable_unknown" msgid="765586450831081871">"این ویدیو به‌طور غیر منتظره‌ای در دسترس نیست."</string>
+ <string name="msg_channel_unavailable_unknown" msgid="765586450831081871">"این ویدئو به‌طور غیر منتظره‌ای در دسترس نیست."</string>
<string name="msg_back_key_guide" msgid="7404682718828721924">"کلید بازگشت برای دستگاه‌ متصل است. برای خروج دکمه صفحه اصلی را فشار دهید."</string>
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"کانال‌های مستقیم به مجوز خواندن فهرست‌های تلویزیون نیاز دارند."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"راه‌اندازی منابع"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"‏کانال‌های زنده تجربه کانال‌های تلویزیونی قدیمی را با کانال‌های پخش جریانی ارائه‌شده توسط برنامه‌ها ادغام می‌کند. \n\nبا راه‌اندازی منابع کانالی که قبلاً نصب شده‌اند شروع کنید. یا برای پیدا کردن برنامه‌های بیشتری که کانال‌های زنده ارائه می‌کنند، فروشگاه Google Play را مرور کنید."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"ضبط و زمان‌بندی"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"۱۰ دقیقه"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"۳۰ دقیقه"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"۱ ساعت"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"زمان‌بندی‌شده"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"سری"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"موارد دیگر"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"کانال را نمی‌توان ضبط کرد."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"برنامه را نمی‌توان ضبط کرد."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> برای ضبط زمان‌بندی شده است"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"ضبط <xliff:g id="PROGRAMNAME">%1$s</xliff:g> از اکنون تا <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"زمان‌بندی کامل"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"پخش از اول"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"حذف موارد ضبط‌شده"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"قسمت‌هایی را که می‌خواهید حذف کنید انتخاب کنید. این قسمت‌ها را پس از حذف نمی‌توان بازیابی کرد."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"مورد ضبط‌شده‌ای برای حذف وجود ندارد."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"اولویت‌دار"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"بالاترین"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"پایین‌ترین"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"شماره <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"کانال‌ها"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"هرکدام"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"انتخاب اولویت"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"اگر تیونر کافی برای ضبط هم‌زمان برنامه‌ها وجود ندارد، فقط برنامه‌های دارای اولویت بالا ضبط می‌شوند."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"‏قسمت ضبط‌شده در کتابخانه DVR ذخیره‌ می‌شود."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"محتوای ضبط‌شده ذخیره خواهد شد."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"به دلیل تداخل‌های تنظیم‌کننده، به‌طور کامل ضبط نمی‌شود."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"به دلیل تداخل‌های تنظیم‌کننده، ضبط نمی‌شود."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"هنوز موردی برای ضبط زمان‌بندی نشده است.\nمی‌توانید از «راهنمای برنامه» ضبط را زمان‌بندی کنید."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">‏زمان‌بندی ضبط برای %1$d روز بعد</item>
- <item quantity="other">‏زمان‌بندی ضبط برای %1$d روز بعد</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">‏%1$d ضبط متناقض با زمان‌بندی</item>
+ <item quantity="other">‏%1$d ضبط متناقض با زمان‌بندی</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"تنظیمات"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"برگشت"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"واگرد"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"تنظیمات مجموعه"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"شروع ضبط مجموعه"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"توقف ضبط مجموعه"</string>
+ <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_empty_state" msgid="3407962945399698707">"هیچ قسمتی موجود نیست.\nهر قسمتی در دسترس قرار بگیرد ضبط خواهد شد."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">‏(%1$d دقیقه)</item>
+ <item quantity="other">‏(%1$d دقیقه)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"امروز"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"فردا"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"دیروز"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 2c8d579c..b6f5fb7e 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Vain ääni"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Heikko signaali"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Ei internetyhteyttä"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Voit katsella tätä kanavaa aikaisintaan klo <xliff:g id="END_TIME_1">%1$s</xliff:g>, sillä kaikkia virittimiä käytetään muiden ohjelmien tallentamiseen. \n\nMuokkaa tallennusaikataulua painamalla oikeanpuoleista painiketta.</item>
- <item quantity="one">Voit katsella tätä kanavaa aikaisintaan klo <xliff:g id="END_TIME_0">%1$s</xliff:g>, sillä viritintä käytetään muiden ohjelmien tallentamiseen. \n\nMuokkaa tallennusaikataulua painamalla oikeanpuoleista painiketta.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Voit katsella tätä kanavaa aikaisintaan klo <xliff:g id="END_TIME_1">%1$s</xliff:g>, sillä muita kanavia tallennetaan. \n\nMuokkaa tallennusaikataulua painamalla oikeanpuoleista painiketta.</item>
+ <item quantity="one">Voit katsella tätä kanavaa aikaisintaan klo <xliff:g id="END_TIME_0">%1$s</xliff:g>, sillä toista kanavaa tallennetaan. \n\nMuokkaa tallennusaikataulua painamalla oikeanpuoleista painiketta.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Ei nimeä"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanava estetty"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Live-kanavat tarvitsee luvan TV-ohjelmatietojen lukemiseen."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Määritä lähteesi"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Live-kanavat yhdistävät perinteisen TV-kanavakokemuksen suoratoistoon sovelluksilla. \n\nAloita määrittämällä asennetut kanavalähteet tai etsi livekanavia tarjoavia sovelluksia Google Play Kaupasta."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Tallenteet ja aikataulut"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minuuttia"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minuuttia"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 tunti"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Ajastetut"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Sarja"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Muut"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Tämän kanavan sisältöä ei voida tallentaa."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Tätä ohjelmaa ei voida tallentaa."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> on ajastettu tallennettavaksi."</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Tallennetaan ohjelmaa <xliff:g id="PROGRAMNAME">%1$s</xliff:g> tästä hetkestä klo <xliff:g id="ENDTIME">%2$s</xliff:g> asti."</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Koko aikataulu"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Toista alusta"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Jatka toistoa"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Poista"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Poista tallenteet"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Jatka"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Kausi <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Näytä aikataulu"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Lisätietoja"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Tallenteiden poisto"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Valitse poistettavat jaksot. Kun ne on poistettu, niitä ei voi palauttaa."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Ei poistettavia tallenteita"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Tärkeät"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Korkein"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Matalin"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"<xliff:g id="RANK">%1$d</xliff:g>."</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanavat"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Kaikki"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Valitse tärkeysjärjestys"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Jos monen ohjelman samanaikainen tallentaminen ei ole mahdollista, koska virittimiä ei ole tarpeeksi, vain tärkeimmät ohjelmat tallennetaan."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Jos ohjelmia on ajastettu enemmän kuin samalla kertaa voidaan tallentaa, vain tärkeimmät ohjelmat tallennetaan."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Tallennettu osa lisätään DVR:n kirjastoon."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Tallennettu sisältö lisätään kirjastoon."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Tallennetaan osittain virittimen ristiriitojen vuoksi"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Ei tallenneta virittimen ristiriitojen vuoksi"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Aikataulussa ei ole vielä yhtään nauhoitusta.\nVoit ajastaa nauhoituksen ohjelmaoppaasta."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Seuraavan %1$d päivän tallennusaikataulu</item>
- <item quantity="one">Seuraavan %1$d päivän tallennusaikataulu</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d tallennusristiriitaa</item>
+ <item quantity="one">%1$d tallennusristiriita</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Asetukset"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Takaisin"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Kumoa"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Sarja-asetukset"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Aloita sarjan tallennus"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Lopeta sarjan tallennus"</string>
+ <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_empty_state" msgid="3407962945399698707">"Yhtään jaksoa ei ole saatavilla.\nNe nauhoitetaan, kun ne ovat saatavilla."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minuuttia)</item>
+ <item quantity="one">(%1$d minuutti) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Tänään"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Huomenna"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Eilen"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index a8abd914..1fc794e3 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Audio uniquement"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Signal faible"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Aucune connexion Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Impossible de visionner cette chaîne jusqu\'à <xliff:g id="END_TIME_1">%1$s</xliff:g>, car le syntoniseur est utilisé pour enregistrer d\'autres programmes. \n\nAppuyez sur la touche de droite pour ajuster l\'horaire d\'enregistrement.</item>
- <item quantity="other">Impossible de visionner cette chaîne jusqu\'à <xliff:g id="END_TIME_1">%1$s</xliff:g>, car tous les syntoniseurs sont utilisés pour enregistrer d\'autres programmes. \n\nAppuyez sur la touche de droite pour ajuster l\'horaire d\'enregistrement.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Impossible de visionner cette chaîne jusqu\'à <xliff:g id="END_TIME_1">%1$s</xliff:g>, car un autre programme est en cours d\'enregistrement. \n\nAppuyez sur la touche de droite pour modifier l\'horaire d\'enregistrement.</item>
+ <item quantity="other">Impossible de visionner cette chaîne jusqu\'à <xliff:g id="END_TIME_1">%1$s</xliff:g>, car d\'autres programmes sont en cours d\'enregistrement. \n\nAppuyez sur la touche de droite pour modifier l\'horaire d\'enregistrement.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Sans titre"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Chaîne bloquée"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Les chaînes en direct ont besoin de l\'autorisation nécessaire pour lire les programmes télé."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configurez vos sources"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Avec Télé en direct, diffusez les chaînes proposées par des applications comme s\'il s\'agissait de chaînes de télévision traditionnelles. \n\nCommencez par configurer les sources de chaînes déjà installées. Vous pouvez également parcourir la boutique Google Play Store et rechercher d\'autres applications qui proposent des chaînes en direct."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Enregistrements et horaires"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutes"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutes"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 heure"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Prévu"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Série"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Autres"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Impossible d\'enregistrer ce canal"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Impossible d\'enregistrer ce programme."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Vous avez planifié l\'enregistrement du programme « <xliff:g id="PROGRAMNAME">%1$s</xliff:g> »"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Enregistrement du programme <xliff:g id="PROGRAMNAME">%1$s</xliff:g> de maintenant jusqu\'à <xliff:g id="ENDTIME">%2$s</xliff:g>…"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Calendrier complet"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Lire du début"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Reprendre la lecture"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Supprimer"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Supprimer les enregistrements"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Reprendre"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Saison <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Voir l\'horaire"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"En savoir plus"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Supprim. enregistr."</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Sélectionnez les épisodes que vous souhaitez supprimer. Ceux-ci ne peuvent pas être récupérés une fois cette opération effectuée."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Aucun enregistrement à supprimer."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priorité"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"La plus élevée"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"La plus faible"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Non. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Chaînes"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Tout"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Choisissez la priorité"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Lorsqu\'il n\'y a pas assez de syntoniseurs pour enregistrer des programmes simultanément, seuls les programmes aux priorités les plus élevées sont enregistrés."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Quand il y a trop de programmes à enregistrer en même temps, seuls ceux aux priorités les plus élevées sont enregistrés."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"La section enregistrée sera stockée dans la bibliothèque du magnétoscope numérique."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Le contenu enregistré sera gardé."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Sera partiellement enreg. en raison de conflits de syntoniseur"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Ne sera pas enregistré en raison de conflits de syntoniseur"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Aucun enregistrement n\'est encore planifié.\nVous pouvez programmer des enregistrements à partir du guide des programmes."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Enregistrement programmé pour le jour suivant (%1$d)</item>
- <item quantity="other">Enregistrement programmé pour les %1$d jours suivants</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d conflit d\'enregistrement</item>
+ <item quantity="other">%1$d conflits d\'enregistrement</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Paramètres"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Précédent"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Annuler"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Paramètres de la série"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Commencer à enregistrer la série"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Arrêter d\'enregistrer la série"</string>
+ <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_empty_state" msgid="3407962945399698707">"Aucun épisode.\nLes épisodes seront enregistrés lorsqu\'ils seront diffusés."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d minute)</item>
+ <item quantity="other">(%1$d minutes)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Aujourd\'hui"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Demain"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Hier"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 5be4b4a4..c140aa62 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Audio uniquement"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Signal faible"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Aucune connexion Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Impossible de lire cette chaîne jusqu\'à <xliff:g id="END_TIME_1">%1$s</xliff:g>, car le tuner est utilisé pour enregistrer d\'autres programmes. \n\nAppuyez sur le bouton droit pour modifier le planning d\'enregistrement.</item>
- <item quantity="other">Impossible de lire cette chaîne jusqu\'à <xliff:g id="END_TIME_1">%1$s</xliff:g>, car tous les tuners sont utilisés pour enregistrer d\'autres programmes. \n\nAppuyez sur le bouton droit pour modifier le planning d\'enregistrement.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Impossible de lire cette chaîne jusqu\'à <xliff:g id="END_TIME_1">%1$s</xliff:g>, car une autre chaîne est en cours d\'enregistrement. \n\nAppuyez sur le bouton droit pour modifier le planning d\'enregistrement.</item>
+ <item quantity="other">Impossible de lire cette chaîne jusqu\'à <xliff:g id="END_TIME_1">%1$s</xliff:g>, car d\'autres chaînes sont en cours d\'enregistrement. \n\nAppuyez sur le bouton droit pour modifier le planning d\'enregistrement.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Sans titre"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Chaîne bloquée"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"L\'application Chaînes en direct a besoin d\'une autorisation pour accéder au programme TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configurez vos sources."</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Avec TV en direct, regardez en streaming les chaînes proposées par des applications comme s\'il s\'agissait de chaînes de télévision traditionnelles. \n\nCommencez par configurer les sources de chaînes déjà installées. Vous pouvez également parcourir le Google Play Store et rechercher d\'autres applications qui proposent des chaînes en direct."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Enregistrements et plannings"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutes"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutes"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 heure"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Planifiés"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Séries"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Autres"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Impossible d\'enregistrer la chaîne."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Impossible d\'enregistrer le programme."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Vous avez planifié l\'enregistrement du programme \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\"."</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Enregistrement de \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" de maintenant jusqu\'à <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Agenda complet"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Lire depuis le début"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Reprendre la lecture"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Supprimer"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Supprimer les enregistrements"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Reprendre"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Saison <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Voir planning"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Lire la suite"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Suppr. enregistrements"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Sélectionnez les épisodes que vous souhaitez supprimer. Ceux-ci ne peuvent pas être récupérés une fois cette opération effectuée."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Aucun enregistrement à supprimer."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priorité"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"La plus élevée"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"La plus faible"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Numéro <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Chaînes"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Toutes"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Sélectionner la priorité"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Lorsqu\'il n\'y a pas assez tuners pour enregistrer des programmes simultanément, seuls les programmes aux priorités les plus élevées sont enregistrés."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Lorsqu\'il y a trop de programmes à enregistrer simultanément, seuls les programmes aux priorités les plus élevées sont enregistrés."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"La section enregistrée sera sauvegardée dans la bibliothèque DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Le contenu enregistré sera sauvegardé."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Ne sera que partiellement enregistré (conflit de tuners)."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Ne sera pas enregistré en raison d\'un conflit de tuners."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Aucun enregistrement n\'est encore planifié.\nVous pouvez programmer des enregistrements à partir du guide des programmes."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Planning d\'enregistrement pour le jour suivant</item>
- <item quantity="other">Planning d\'enregistrement pour les %1$d jours suivants</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d conflit d\'enregistrement</item>
+ <item quantity="other">%1$d conflits d\'enregistrement</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Paramètres"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Retour"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Annuler"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Paramètres de la série"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Lancer enregistrement série"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Arrêter enregistr. série"</string>
+ <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_empty_state" msgid="3407962945399698707">"Aucun épisode disponible.\nLes épisodes seront enregistrés lorsqu\'ils seront disponibles."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d minute)</item>
+ <item quantity="other">(%1$d minutes)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Aujourd\'hui"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Demain"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Hier"</string>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 243a47b6..7ce0ac2d 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Só audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Sinal feble"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Non hai conexión a Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Esta canle non se pode reproducir ata as <xliff:g id="END_TIME_1">%1$s</xliff:g> porque se están usando todos os sintonizadores para gravar outros programas. \n\nPreme na tecla cara á dereita para axustar o programa de gravación.</item>
- <item quantity="one">Esta canle non se pode reproducir ata as <xliff:g id="END_TIME_0">%1$s</xliff:g> porque se está usando o sintonizador para gravar outros programas. \n\nPreme na tecla cara á dereita para axustar o programa de gravación.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Esta canle non se pode reproducir ata as <xliff:g id="END_TIME_1">%1$s</xliff:g> porque se están gravando outras canles. \n\nPreme na tecla cara á dereita para axustar o programa de gravación.</item>
+ <item quantity="one">Esta canle non se pode reproducir ata as <xliff:g id="END_TIME_0">%1$s</xliff:g> porque se está gravando outra canle. \n\nPreme na tecla cara á dereita para axustar o programa de gravación.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Sen título"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Canle bloqueada"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"As canles en directo necesitan permiso para ler a programación da televisión."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configura as túas fontes"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"As canles en directo combinan a experiencia das canles de televisión tradicionais coas canles de emisión que proporcionan as aplicacións. \n\nComeza configurando as fontes de canles que xa están instaladas ou ben examina Google Play Store para obter máis aplicacións que ofrezan canles en directo."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Gravacións e programacións"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutos"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutos"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hora"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Programados"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Series"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Outros"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Non se pode gravar a canle."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Non se pode gravar o programa."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Programouse a gravación de <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Gravarase <xliff:g id="PROGRAMNAME">%1$s</xliff:g> desde agora ata as <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Programación completa"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Reproducir desde o inicio"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Retomar reprodución"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Eliminar"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Eliminar gravacións"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Retomar"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Tempada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Ver programac."</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Máis información"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Eliminar gravacións"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Selecciona os vídeos que queres eliminar e ten en conta que non se poden recuperar unha vez eliminados."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Non hai gravacións para eliminar."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioridade"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Máis alta"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Máis baixa"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Non. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Canles"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Calquera"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Seleccionar prioridade"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Cando non haxa suficientes sintonizadores para gravar programas á vez, só se gravarán os programas con máis prioridade."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Cando hai demasiados programas para gravar á vez, só se gravarán os programas con máis prioridade."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"A parte gravada gardarase na mediateca de DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Gravarase parcialmente debido aos conflitos co sintonizador."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Non se gravará debido aos conflitos co sintonizador."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Aínda non hai gravacións programadas.\nPodes programalas desde a guía de programas."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Programa de gravación para os próximos %1$d días</item>
- <item quantity="one">Programa de gravación para o día seguinte</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d conflitos de gravación</item>
+ <item quantity="one">%1$d conflito de gravación</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Configuración"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Volver"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Desfacer"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Configuración da serie"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Iniciar gravación serie"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Deter gravación da serie"</string>
+ <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_empty_state" msgid="3407962945399698707">"Non hai episodios dispoñibles.\nGravaranse unha vez que estean dispoñibles."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutos)</item>
+ <item quantity="one">(%1$d minuto) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Hoxe"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Mañá"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Onte"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index d8adc6cc..d6db8677 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"केवल ऑडियो"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"कमज़ोर सिग्नल"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"कोई इंटरनेट कनेक्शन नहीं"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">इस चैनल को <xliff:g id="END_TIME_1">%1$s</xliff:g> तक चलाया नहीं जा सकता है क्योंकि सभी ट्यूनर का उपयोग अन्य कार्यक्रमों को रिकॉर्ड करने के लिए किया जा रहा है. \n\nरिकॉर्डिंग शेड्यूल एडजस्ट करने के लिए दायां दबाएं.</item>
- <item quantity="other">इस चैनल को <xliff:g id="END_TIME_1">%1$s</xliff:g> तक चलाया नहीं जा सकता है क्योंकि सभी ट्यूनर का उपयोग अन्य कार्यक्रमों को रिकॉर्ड करने के लिए किया जा रहा है. \n\nरिकॉर्डिंग शेड्यूल एडजस्ट करने के लिए दायां दबाएं.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">यह चैनल <xliff:g id="END_TIME_1">%1$s</xliff:g> तक नहीं चलाया जा सकता क्योंकि अन्य चैनल रिकॉर्ड हो रहे हैं. \n\nरिकॉर्डिंग शेड्यूल समायोजित करने के लिए दाएं दबाएं.</item>
+ <item quantity="other">यह चैनल <xliff:g id="END_TIME_1">%1$s</xliff:g> तक नहीं चलाया जा सकता क्योंकि अन्य चैनल रिकॉर्ड हो रहे हैं. \n\nरिकॉर्डिंग शेड्यूल समायोजित करने के लिए दाएं दबाएं.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"कोई शीर्षक नहीं"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"चैनल अवरोधित"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"लाइव चैनल को टीवी सूची पढ़ने के लिए अनुमति की आवश्यकता होती है."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"अपने स्रोत सेट करें"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"लाइव चैनल परंपरागत टीवी चैनल के अनुभव के साथ ऐप्स के द्वारा प्रदान किए जाने वाले स्ट्रीमिंग चैनल अनुभव को संयोजित करते हैं. \n\nपहले से इंस्टॉल किए गए चैनल स्रोतों को सेट करके प्रारंभ करें. या लाइव चैनल उपलब्ध कराने वाले अधिक ऐप्स के लिए Google Play स्टोर ब्राउज़ करें."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"रिकॉर्डिंग और शेड्यूूल"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 मिनट"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 मिनट"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 घंटा"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"शेड्यूल की गई"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"श्रृंखला"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"अन्य"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"चैनल रिकॉर्ड नहीं किया जा सकता."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"कार्यक्रम रिकॉर्ड नहीं किया जा सकता."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> को रिकॉर्ड करने के लिए शेड्यूल किया गया है"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> की अभी से <xliff:g id="ENDTIME">%2$s</xliff:g> तक की रिकॉर्डिंग"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"पूर्ण शेड्यूल"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"शुरू से चलाएं"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"रिकॉर्डिंग हटाएं"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"वे एपिसोड चुनें जिन्हें आप हटाना चाहते हैं. हटाए जाने के बाद वे वापस नहीं मिल सकते हैं."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"हटाने के लिए कोई रिकॉर्डिंग नहीं है."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"प्राथमिकता"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"उच्चतम"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"निम्नतम"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"संख्या <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"चैनल"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"कोई भी"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"प्राथमिकता चुनें"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"एक ही समय में कार्यक्रमों को रिकॉर्ड करने के लिए पर्याप्त ट्यूनर नहीं होने पर, केवल उच्च प्राथमिकता वाले कार्यक्रम रिकॉर्ड किए जाएंगे."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"रिकॉर्ड किया गया भाग DVR लाइब्रेरी में सहेजा जाएगा."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"रिकॉर्ड की गई सामग्री सहेज ली जाएगी."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ट्यूनर संबंधी विरोधों के कारण आंशिक रूप से रिकॉर्ड होगा."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ट्यूनर संबंधी विरोधों के कारण रिकॉर्ड नहीं किया जाएगा."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"अभी कोई भी रिकॉर्डिंग शेड्यूल नहीं की गई है.\nआप कार्यक्रम मार्गदर्शिका से रिकॉर्डिंग शेड्यूल कर सकते हैं."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">अगले %1$d दिनों का रिकॉर्डिंग शेड्यूल</item>
- <item quantity="other">अगले %1$d दिनों का रिकॉर्डिंग शेड्यूल</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d रिकॉर्डिंग विरोध</item>
+ <item quantity="other">%1$d रिकॉर्डिंग विरोध</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"सेटिंग"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"वापस"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"पूर्ववत करें"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"श्रृंखला की सेटिंग"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"श्रृंखला रिकॉर्डिंग शुरू करें"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"श्रृंखला रिकॉर्डिंग रोकें"</string>
+ <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_empty_state" msgid="3407962945399698707">"कोई भी एपिसोड उपलब्ध नहीं है.\nएपिसोड उपलब्ध होने पर उन्हें रिकॉर्ड कर लिया जाएगा."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d मिनट)</item>
+ <item quantity="other">(%1$d मिनट)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"आज"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"कल"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"कल"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index ae421311..596a3f96 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -157,10 +157,10 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Samo zvuk"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Slab signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Nema internetske veze"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Ovaj se kanal ne može prikazivati do <xliff:g id="END_TIME_1">%1$s</xliff:g> jer se svi prijemnici upotrebljavaju za snimanje drugih programa. \n\nPritisnite desno da biste prilagodili raspored snimanja.</item>
- <item quantity="few">Ovaj se kanal ne može prikazivati do <xliff:g id="END_TIME_1">%1$s</xliff:g> jer se svi prijemnici upotrebljavaju za snimanje drugih programa. \n\nPritisnite desno da biste prilagodili raspored snimanja.</item>
- <item quantity="other">Ovaj se kanal ne može prikazivati do <xliff:g id="END_TIME_1">%1$s</xliff:g> jer se svi prijemnici upotrebljavaju za snimanje drugih programa. \n\nPritisnite desno da biste prilagodili raspored snimanja.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Ovaj se kanal ne može prikazivati do <xliff:g id="END_TIME_1">%1$s</xliff:g> jer se snimaju drugi kanali. \n\nPritisnite desno da biste prilagodili raspored snimanja.</item>
+ <item quantity="few">Ovaj se kanal ne može prikazivati do <xliff:g id="END_TIME_1">%1$s</xliff:g> jer se snimaju drugi kanali. \n\nPritisnite desno da biste prilagodili raspored snimanja.</item>
+ <item quantity="other">Ovaj se kanal ne može prikazivati do <xliff:g id="END_TIME_1">%1$s</xliff:g> jer se snimaju drugi kanali. \n\nPritisnite desno da biste prilagodili raspored snimanja.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Bez naslova"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanal blokiran"</string>
@@ -196,6 +196,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Kanali uživo trebaju dopuštenje za čitanje TV unosa."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Postavite izvore"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"TV kanali uživo kombiniraju doživljaj tradicionalnih TV kanala sa strujanjem kanala koje nude aplikacije. \n\nDa biste započeli, postavite izvore kanala koji su već instalirani. U Trgovini Google Play možete potražiti još aplikacija koje nude kanale uživo."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Snimanja i rasporedi"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minuta"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minuta"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 sat"</string>
@@ -204,6 +205,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Zakazano"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serija"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Ostalo"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Kanal se ne može snimati."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Emisija se ne može snimati."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> – snimanje je programirano"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Snimanje emisije <xliff:g id="PROGRAMNAME">%1$s</xliff:g> od sad do <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Cijeli raspored"</string>
@@ -236,9 +239,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Reproduciraj od početka"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Nastavi reprodukciju"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Izbriši"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Izbriši snimke"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Nastavi"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. sezona"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Prikaz rasporeda"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Pročitajte više"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Brisanje snimki"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Odaberite epizode koje želite izbrisati. Nakon brisanja nećete ih moći vratiti."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Nema snimki za brisanje."</string>
@@ -256,17 +261,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritet"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Najviši"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Najniži"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Br. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanali"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Bilo koji"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Odabir prioriteta"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Kada nema dovoljno prijemnika za istovremeno snimanje programa, snimat će se samo programi s višim prioritetom."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Kada će se se istovremeno trebati snimati previše emisija, snimit će se samo one s najvišim prioritetom."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -280,17 +284,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Snimljeni dio spremit će se u biblioteku DVR-a."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Snimljeni će se sadržaj spremiti."</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>
@@ -309,6 +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>
+ <!-- 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>
@@ -322,16 +338,23 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Snimit će se djelomično zbog sukoba na prijemniku."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Neće se snimiti zbog sukoba na prijemniku."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Još nije programirano nijedno snimanje.\nSnimanje možete programirati u programskom vodiču."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Raspored snimanja za sljedeći %1$d dan</item>
- <item quantity="few">Raspored snimanja za sljedeća %1$d dana</item>
- <item quantity="other">Raspored snimanja za sljedećih %1$d dana</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d sukob snimanja</item>
+ <item quantity="few">%1$d sukoba snimanja</item>
+ <item quantity="other">%1$d sukoba snimanja</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Postavke"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Natrag"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Poništi"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Postavke serije"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Pokreni snimanje serije"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Zaustavi snimanje serije"</string>
+ <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_empty_state" msgid="3407962945399698707">"Nije dostupna nijedna epizoda.\nEpizode će se snimiti kada budu dostupne."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d minuta)</item>
+ <item quantity="few">(%1$d minute)</item>
+ <item quantity="other">(%1$d minuta)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Danas"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Sutra"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Jučer"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index eb20a1b3..d007a135 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Csak hang"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Gyenge jel"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Nincs internetkapcsolat"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Ezt a csatornát nem lehet lejátszani (eddig: <xliff:g id="END_TIME_1">%1$s</xliff:g>), mert jelenleg az összes tunert más programok rögzítéséhez használják. \n\nNyomja meg a Jobbra gombot a rögzítési ütemterv módosításához.</item>
- <item quantity="one">Ezt a csatornát nem lehet lejátszani (eddig: <xliff:g id="END_TIME_0">%1$s</xliff:g>), mert a tunert jelenleg más programok rögzítéséhez használják. \n\nNyomja meg a Jobbra gombot a rögzítési ütemterv módosításához.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Ez a csatorna nem játszható le <xliff:g id="END_TIME_1">%1$s</xliff:g>-ig, mert más csatornák rögzítése folyamatban van. \n\nNyomja meg a Jobbra gombot a rögzítési ütemterv módosításához.</item>
+ <item quantity="one">Ez a csatorna nem játszható le <xliff:g id="END_TIME_0">%1$s</xliff:g>-ig, mert egy másik csatorna rögzítése folyamatban van. \n\nNyomja meg a Jobbra gombot a rögzítési ütemterv módosításához.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Nincs cím"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Csatorna letiltva"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Az Élő csatornák alkalmazásnak engedélyre van szüksége a tévéműsorok listázásának olvasásához."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Források beállítása"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Az Élő csatornák szolgáltatás a hagyományos tévézési élményt ötvözi az alkalmazások által kínált streamelhető csatornákkal. \n\nKezdésként állítsa be a már telepített csatornaforrásokat, vagy tallózzon a Google Play Áruházban az élő csatornákat kínáló alkalmazásokért."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Felvételek és ütemtervek"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 perc"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 perc"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 óra"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Ütemezve"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Sorozatok"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Továbbiak"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"A csatornát nem lehet rögzíteni."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"A programot nem lehet rögzíteni."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"A(z) <xliff:g id="PROGRAMNAME">%1$s</xliff:g> rögzítése beütemezve"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"A(z) <xliff:g id="PROGRAMNAME">%1$s</xliff:g> rögzítése mostantól a következő időpontig: <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Teljes rögzítési ütemezés"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Lejátszás az elejétől"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Lejátszás folytatása"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Törlés"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Felvételek törlése"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Folytatás"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. évad"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Ütemezés megtekintése"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Továbbiak"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Felvételek törlése"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Válassza ki a törölni kívánt epizódokat. A műveletet nem lehet visszavonni."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Nincsenek törölhető felvételek."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritási szint"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Legmagasabb"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Legalacsonyabb"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"<xliff:g id="RANK">%1$d</xliff:g>."</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Csatornák"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Bármelyik"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Prioritás kiválasztása"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Ha nincs elég tuner a műsorok egyidejű rögzítéséhez, a rendszer a magasabb prioritású tartalmakat rögzíti."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Ha túl sok rögzítendő műsort állít be ugyanarra az időtartamra, kizárólag a magasabb prioritással rendelkezőket rögzíti a rendszer."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"A rögzített részt a DVR könyvtárba menti a rendszer."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"A rögzített tartalmat elmenti a rendszer."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Csak részben lesz rögzítve tunerproblémák miatt."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Nem lesz rögzítve tunerpoblémák miatt."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Még nincs ütemezett rögzítés.\nEzeket a műsorfüzetben lehet beállítani."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Rögzítési ütemterv a következő %1$d napra</item>
- <item quantity="one">Rögzítési ütemterv a következő %1$d napra</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d rögzítési ütközés</item>
+ <item quantity="one">%1$d rögzítési ütközés</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Beállítások"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Vissza"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Visszavonás"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Sorozatbeállítások"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Sorozatrögzítés"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Rögzítés leállítása"</string>
+ <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_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>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d perc)</item>
+ <item quantity="one">(%1$d perc) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Ma"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Holnap"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Tegnap"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 935c73c7..d10652e1 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Միայն ձայն"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Թույլ ազդանշան"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Համացանցի կապակցում չկա"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">This channel can\'t be played until <xliff:g id="END_TIME_1">%1$s</xliff:g> because all the tuners are being used for recording other programs. \n\nPress Right to adjust recording schedule.</item>
- <item quantity="other">Այս ալիքը հնարավոր չէ ցուցադրել մինչև <xliff:g id="END_TIME_1">%1$s</xliff:g>-ը, քանի որ բոլոր ընդունիչները ներկայումս օգտագործվում են այլ ծրագրեր տեսագրելու համար: \n\nՏեսագրման ժամանակացույցը կարգավորելու համար սեղմեք Աջ կոճակը:</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">This channel can\'t be played until <xliff:g id="END_TIME_1">%1$s</xliff:g> because other channels are being recorded. \n\nPress Right to adjust recording schedule.</item>
+ <item quantity="other">Այս ալիքը հնարավոր չէ ցուցադրել մինչև <xliff:g id="END_TIME_1">%1$s</xliff:g>-ը, քանի որ ներկայումս տեսագրվում են այլ ալիքներ: \n\nՏեսագրման ժամանակացույցը կարգավորելու համար սեղմեք Աջ կոճակը:</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Անվերնագիր"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Ալիքն արգելափակված է"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Հեռուստատեսային ծրագրերը կարդալու համար ուղիղ եթերին թույլտվություն է անհրաժեշտ:"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Կարգավորեք աղբյուրները"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Ուղիղ եթերը համատեղում է ավանդական հեռուստաալիքները և հավելվածների կողմից հոսքային եղանակով հեռարձակվող ալիքները: \n\nՍկսեք արդեն իսկ տեղադրված ալիքների աղբյուրները կարգավորելուց կամ Google Play Խանութում որոնեք ուղիղ եթեր առաջարկող այլ հավելվածներ:"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Տեսագրում և ժամանակացույցեր"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 րոպե"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 րոպե"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ժամ"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Ծրագրավորված"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Սերիալներ"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Այլ"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Հնարավոր չէ տեսագրել այս հեռուստաալիքը:"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Հնարավոր չէ տեսագրել այս ծրագիրը:"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ծրագրի տեսագրումը ծրագրավորվեց"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ծրագրի տեսագրում այս պահից մինչև <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Ամբողջական ժամանակացույց"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Նվագարկել սկզբից"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Ջնջել տեսագրումները"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Ընտրեք դրվագները, որոնք ցանկանում եք ջնջել: Ջնջելուց հետո դրանք այլևս հնարավոր չի լինի տեսագրել:"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Ջնջելու համար տեսագրումներ չկան"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Առաջնահերթություն"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Ամենաբարձր"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Ամենացածր"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Ոչ: <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Հեռուստաալիքներ"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Ցանկացած"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Ընտրեք առաջնահերթությունը"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Եթե ծրագրերը միաժամանակ տեսագրելու համար բավականաչափ ընդունիչներ չկան, կտեսագրվեն միայն բարձր առաջնահերթություն ունեցող ծրագրերը:"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Տեսագրված հատվածը կպահվի DVR դարանում:"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Տեսագրված բովանդակությունը կպահվի:"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Ընդունիչների հակասությունների պատճառով կտեսագրվի մասամբ:"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Ընդունիչների հակասությունների պատճառով չի տեսագրվի:"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Ծրագրավորված տեսագրումներ դեռ չկան:\nՏեսագրումը կարող եք ծրագրավորել հեռուստահաղորդումների ցանկից:"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Recording schedule for the next %1$d days</item>
- <item quantity="other">Տեսագրությունների ժամանակացույցը հաջորդ %1$d օրվա համար</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d recording conflicts</item>
+ <item quantity="other">Տեսագրման %1$d հակասություն</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Կարգավորումներ"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Հետ"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Հետարկել"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Սերիալների կարգավորումներ"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Սկսել սերիալի տեսագրումը"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Դադարեցնել սերիալի տեսագրումը"</string>
+ <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_empty_state" msgid="3407962945399698707">"Հասանելի դրվագներ չկան:\nԴրանք կտեսագրվեն հասանելի դառնալուց հետո:"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d minutes)</item>
+ <item quantity="other">(%1$d րոպե)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Այսօր"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Վաղը"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Երեկ"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index b2a4ef2d..662cfc89 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Audio saja"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Sinyal lemah"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Tidak ada sambungan internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Saluran ini tidak dapat diputar sampai <xliff:g id="END_TIME_1">%1$s</xliff:g> karena penyetel sedang dipakai merekam program lainnya. \n\nTekan Kanan untuk menyesuaikan jadwal perekaman.</item>
- <item quantity="one">Saluran ini tidak dapat diputar sampai <xliff:g id="END_TIME_0">%1$s</xliff:g> karena penyetel sedang dipakai merekam program lainnya. \n\nTekan Kanan untuk menyesuaikan jadwal perekaman.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Saluran ini tidak dapat diputar sampai <xliff:g id="END_TIME_1">%1$s</xliff:g> karena saluran lain sedang direkam. \n\nTekan Kanan untuk menyesuaikan jadwal perekaman.</item>
+ <item quantity="one">Saluran ini tidak dapat diputar hingga <xliff:g id="END_TIME_0">%1$s</xliff:g> karena saluran lain sedang direkam. \n\nTekan Kanan untuk menyesuaikan jadwal perekaman.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Tanpa judul"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Saluran diblokir"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Saluran Langsung membutuhkan izin untuk membaca cantuman TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Siapkan sumber Anda"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Saluran TV langsung menggabungkan pengalaman saluran TV tradisional dengan saluran streaming yang disediakan aplikasi. \n\nMulailah dengan menyiapkan sumber saluran yang telah terpasang. Atau jelajahi Google Play Store untuk menemukan aplikasi lain yang menawarkan saluran TV langsung."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Jadwal &amp; rekaman"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 menit"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 menit"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 jam"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Terjadwal"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serial"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Lainnya"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Saluran ini tidak dapat direkam."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Program ini tidak dapat direkam."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> telah dijadwalkan untuk direkam"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Merekam <xliff:g id="PROGRAMNAME">%1$s</xliff:g> dari saat ini hingga <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Jadwal lengkap"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Putar dari awal"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Lanjutkan pemutaran"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Hapus"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Hapus rekaman"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Lanjutkan"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Season <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Lihat jadwal"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Baca selengkapnya"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Hapus data"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Pilih episode yang ingin dihapus. Episode tidak dapat dipulihkan setelah dihapus."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Tidak ada data untuk dihapus."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritas"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Tertinggi"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Terendah"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Tidak. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Saluran"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Apa saja"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Pilih prioritas"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Jika tuner tidak cukup untuk merekam program secara bersamaan, hanya program dengan prioritas lebih tinggi yang akan direkam."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Jika terlalu banyak program yang akan direkam secara bersamaan, hanya program dengan prioritas lebih tinggi yang akan direkam."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Bagian yang direkam akan disimpan di pustaka DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Akan direkam sebagian karena tuner bermasalah."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Tidak akan direkam karena tuner bermasalah."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Belum ada rekaman yang dijadwalkan.\nAnda dapat menjadwalkan rekaman dari panduan program."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Jadwal rekaman untuk %1$d hari berikutnya</item>
- <item quantity="one">Jadwal rekaman untuk %1$d hari berikutnya</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d rekaman bentrok</item>
+ <item quantity="one">%1$d rekaman bentrok</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Setelan"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Kembali"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Urungkan"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Setelan seri"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Mulai rekaman seri"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Hentikan rekaman seri"</string>
+ <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_empty_state" msgid="3407962945399698707">"Tidak ada episode yang tersedia.\nEpisode akan direkam setelah tersedia."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d menit)</item>
+ <item quantity="one">(%1$d menit) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Hari ini"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Besok"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Kemarin"</string>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 940a2e55..6111b578 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Aðeins hljóð"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Lítill sendistyrkur"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Engin nettenging"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Ekki er hægt að spila þessa rás þar til <xliff:g id="END_TIME_1">%1$s</xliff:g> þar sem er verið að nota alla móttakara til að taka upp aðra þætti. \n\nÝttu á hægri takkann til að breyta upptökuáætluninni.</item>
- <item quantity="other">Ekki er hægt að spila þessa rás þar til <xliff:g id="END_TIME_1">%1$s</xliff:g> þar sem er verið að nota alla móttakara til að taka upp aðra þætti. \n\nÝttu á hægri takkann til að breyta upptökuáætluninni.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Ekki er hægt að spila þessa rás fyrr en <xliff:g id="END_TIME_1">%1$s</xliff:g> þar sem verið er að taka upp aðrar rásir. \n\nÝttu á hægri takkann til að breyta upptökuáætluninni.</item>
+ <item quantity="other">Ekki er hægt að spila þessa rás fyrr en <xliff:g id="END_TIME_1">%1$s</xliff:g> þar sem verið er að taka upp aðrar rásir. \n\nÝttu á hægri takkann til að breyta upptökuáætluninni.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Ekkert heiti"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Rás læst"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Rásir í beinni þurfa heimild til að lesa sjónvarpsdagskrána."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Setja upp inntök rása"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Beinar útsendingar sameina þá upplifun að horfa á venjulegar sjónvarpsstöðvar og straumspila rásir í gegnum forrit. \n\nByrjaðu á því að setja upp þau inntök rása sem þegar hafa verið sótt eða farðu í Google Play Store til að skoða fleiri forrit sem bjóða upp á beinar útsendingar."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Upptökur og áætlanir"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 mínútur"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 mínútur"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 klukkustund"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Áætlað"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Þáttaröð"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Annað"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Ekki er hægt að taka upp rásina."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Ekki er hægt að taka upp dagskrárliðinn."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> var sett á upptökuáætlun"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Tekur upp <xliff:g id="PROGRAMNAME">%1$s</xliff:g> núna og þangað til <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Heildaráætlun"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Spila frá upphafi"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Halda spilun áfram"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Eyða"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Eyða upptökum"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Halda áfram"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Þáttaröð <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Skoða dagskrá"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Lesa meira"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Eyða upptökum"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Veldu þætti sem þú vilt eyða. Ekki er hægt að endurheimta þætti eftir að þeim hefur verið eytt."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Engar upptökur til að eyða"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Forgangur"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Mestur"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Mjög lítill"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nei. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Stöðvar"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Hvað sem er"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Veldu forgang"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Þegar ekki eru nægilega margir móttakarar til að taka upp þætti á sama tíma eru aðeins þættir sem eru í forgangi teknir upp."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Þegar taka á upp of marga þætti á sama tíma eru aðeins þættir sem eru í forgangi teknir upp."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Upptekinn hluti verður vistaður í DVR-safninu."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Upptökur á efni verða vistaðar."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Verður tekið upp að hluta til vegna árekstra við stilli."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Verður ekki tekið upp vegna árekstra við stilli."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Engar upptökur eru á áætlun enn sem komið er.\nÞú getur bætt upptöku við áætlun í dagskrárvísinum."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Upptökuáætlun næsta %1$d dag</item>
- <item quantity="other">Upptökuáætlun næstu %1$d daga</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d árekstur í upptöku</item>
+ <item quantity="other">%1$d árekstrar í upptöku</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Stillingar"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Til baka"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Afturkalla"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Þáttaraðastillingar"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Hefja upptöku á þáttaröð"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Hætta upptöku á þáttaröð"</string>
+ <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_empty_state" msgid="3407962945399698707">"Engir þættir eru tiltækir.\nÞeir verða teknir upp þegar þeir eru tiltækir."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d mínúta)</item>
+ <item quantity="other">(%1$d mínútur)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Í dag"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Á morgun"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Í gær"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index c372e246..da0b48a6 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -157,9 +157,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Solo audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Segnale debole"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Nessuna connessione Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Questo canale non può essere riprodotto sino alle ore <xliff:g id="END_TIME_1">%1$s</xliff:g> perché tutti gli altri sintonizzatori sono utilizzati per la registrazione di altri programmi. \n\nPremi la freccia destra per regolare la pianificazione di registrazione.</item>
- <item quantity="one">Questo canale non può essere riprodotto sino alle ore <xliff:g id="END_TIME_0">%1$s</xliff:g> perché il sintonizzatore è utilizzato per la registrazione di altri programmi. \n\nPremi la freccia destra per regolare la pianificazione di registrazione.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Il canale non può essere riprodotto fino alle ore <xliff:g id="END_TIME_1">%1$s</xliff:g> perché è in corso la registrazione di altri canali. \n\nPremi la freccia destra per regolare la pianificazione di registrazione.</item>
+ <item quantity="one">Il canale non può essere riprodotto fino alle ore <xliff:g id="END_TIME_0">%1$s</xliff:g> perché è in corso la registrazione di un altro canale. \n\nPremi la freccia destra per regolare la pianificazione di registrazione.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Senza titolo"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Canale bloccato"</string>
@@ -194,6 +194,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Live TV richiede l\'autorizzazione per leggere gli elenchi TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configura le tue fonti"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"L\'app Dirette TV combina i canali TV tradizionali ai canali in streaming forniti dalle app. \n\nInnanzitutto, configura le fonti di canali già installate. In alternativa, cerca altre app di dirette TV sul Google Play Store."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Registrazioni e programmazioni"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minuti"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minuti"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ora"</string>
@@ -202,6 +203,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Programmate"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serie"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Altri"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Il canale non può essere registrato."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Il programma non può essere registrato."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"È stata programmata la registrazione di <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Registra <xliff:g id="PROGRAMNAME">%1$s</xliff:g> da adesso fino alle ore <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Pianificazione completa"</string>
@@ -229,9 +232,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Riproduci dall\'inizio"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Riprendi riproduz."</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Elimina"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Elimina registraz."</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Riprendi"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Stagione <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Pianificazione"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Leggi tutto"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Elimina registraz."</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Seleziona le puntate da eliminare. Una volta eliminate, le puntate non potranno essere ripristinate."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Nessuna registrazione da eliminare."</string>
@@ -248,17 +253,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priorità"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Massima"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Minima"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"N. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Canali"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Qualsiasi"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Scegli la priorità"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Qualora non ci fossero sintonizzatori a sufficienza per registrare più programmi contemporaneamente, verranno registrati soltanto i programmi con la massima priorità."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Quando ci sono troppi programmi da registrare nello stesso momento, vengono registrati solo quelli con le priorità maggiori."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -272,17 +276,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"La parte registrata verrà salvata nella raccolta DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -300,6 +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>
+ <!-- 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>
@@ -312,15 +328,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Registraz. parziale per conflitti con il sintonizzatore."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Impossibile registrare per conflitti con il sintonizzatore."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Non ci sono ancora registrazioni in programma.\nPuoi pianificare la registrazione dalla guida ai programmi."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Pianificazione di registrazione per i prossimi %1$d giorni</item>
- <item quantity="one">Pianificazione di registrazione per il prossimo giorno</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d conflitti di registrazione</item>
+ <item quantity="one">%1$d conflitto di registrazione</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Impostazioni"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Indietro"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Annulla"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Impostazioni per la serie"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Avvia registrazione serie"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Interrompi regis. serie"</string>
+ <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_empty_state" msgid="3407962945399698707">"Non ci sono episodi a disposizione.\nVerranno registrati non appena saranno disponibili."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minuti)</item>
+ <item quantity="one">(%1$d minuto) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Oggi"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Domani"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Ieri"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 9196bcbb..743b31fd 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -159,11 +159,11 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"אודיו בלבד"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"אות חלש"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"אין חיבור לאינטרנט"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="two">לא ניתן להפעיל את הערוץ הזה עד <xliff:g id="END_TIME_1">%1$s</xliff:g> מפני שכל הטיונרים משמשים להקלטת תוכניות אחרות. \n\nלחץ על \'ימינה\' כדי לכוון את לוח הזמנים להקלטה.</item>
- <item quantity="many">לא ניתן להפעיל את הערוץ הזה עד <xliff:g id="END_TIME_1">%1$s</xliff:g> מפני שכל הטיונרים משמשים להקלטת תוכניות אחרות. \n\nלחץ על \'ימינה\' כדי לכוון את לוח הזמנים להקלטה.</item>
- <item quantity="other">לא ניתן להפעיל את הערוץ הזה עד <xliff:g id="END_TIME_1">%1$s</xliff:g> מפני שכל הטיונרים משמשים להקלטת תוכניות אחרות. \n\nלחץ על \'ימינה\' כדי לכוון את לוח הזמנים להקלטה.</item>
- <item quantity="one">לא ניתן להפעיל את הערוץ הזה עד <xliff:g id="END_TIME_0">%1$s</xliff:g> מפני שהטיונר משמש להקלטת תוכניות אחרות. \n\nלחץ על \'ימינה\' כדי לכוון את לוח הזמנים להקלטה.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="two">לא ניתן להפעיל את הערוץ הזה עד <xliff:g id="END_TIME_1">%1$s</xliff:g> כי ערוצים אחרים מוקלטים. \n\nלחץ על \'ימינה\' כדי לכוון את לוח הזמנים להקלטה.</item>
+ <item quantity="many">לא ניתן להפעיל את הערוץ הזה עד <xliff:g id="END_TIME_1">%1$s</xliff:g> כי ערוצים אחרים מוקלטים. \n\nלחץ על \'ימינה\' כדי לכוון את לוח הזמנים להקלטה.</item>
+ <item quantity="other">לא ניתן להפעיל את הערוץ הזה עד <xliff:g id="END_TIME_1">%1$s</xliff:g> כי ערוצים אחרים מוקלטים. \n\nלחץ על \'ימינה\' כדי לכוון את לוח הזמנים להקלטה.</item>
+ <item quantity="one">לא ניתן להפעיל את הערוץ הזה עד <xliff:g id="END_TIME_0">%1$s</xliff:g> כי ערוץ אחר מוקלט. \n\nלחץ על \'ימינה\' כדי לכוון את לוח הזמנים להקלטה.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"ללא כותרת"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"הערוץ חסום"</string>
@@ -200,6 +200,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"‏Live TV זקוק להרשאה כדי לקרוא את לוחות שידורי הטלוויזיה."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"הגדרת המקורות שלך"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"‏ערוצי שידורים חיים משלבים בין חוויית הצפייה בערוצי טלוויזיה מסורתיים לבין ערוצי סטרימינג שמספקות אפליקציות. \n\nהתחל על ידי הגדרת מקורות הערוצים שכבר מותקנים. או חפש בחנות Google Play אפליקציות נוספות המציעות ערוצי שידורים חיים."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"הקלטות ולוחות זמנים"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 דקות"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 דקות"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 שעה"</string>
@@ -208,6 +209,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"מתוזמנות"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"סדרה"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"אחרות"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"לא ניתן להקליט את הערוץ."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"לא ניתן להקליט את התוכנית."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"התוכנית <xliff:g id="PROGRAMNAME">%1$s</xliff:g> תוזמנה להקלטה"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"מקליט את התוכנית <xliff:g id="PROGRAMNAME">%1$s</xliff:g> מעכשיו עד <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"לוח זמנים מלא"</string>
@@ -245,9 +248,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"הפעל מההתחלה"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"מחיקת הקלטות"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"בחר את הפרקים שברצונך למחוק. לא ניתן יהיה לשחזר אותם לאחר המחיקה."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"אין הקלטות למחיקה."</string>
@@ -266,17 +271,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"עדיפות"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"הגבוהה ביותר"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"הנמוכה ביותר"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"לא. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"ערוצים"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"הכול"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"בחירת עדיפות"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"כאשר אין מספיק טיונרים להקלטת תוכניות בו-זמנית, רק התוכניות בעלות העדיפות הגבוהה ביותר יוקלטו."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -290,17 +294,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"‏החלק המוקלט יישמר בספריית ה-DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"התוכן המוקלט יישמר."</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>
@@ -320,6 +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>
+ <!-- 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>
@@ -334,17 +350,25 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ההקלטה תבוצע באופן חלקי עקב התנגשויות בטיונר."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ההקלטה לא תבוצע עקב התנגשויות בטיונר."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"עדיין אין הקלטות מתוזמנות.\nניתן לתזמן הקלטה מלוח השידורים."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="two">לוח זמנים להקלטה למשך היומיים הבאים</item>
- <item quantity="many">‏לוח זמנים להקלטה למשך %1$d הימים הבאים</item>
- <item quantity="other">‏לוח זמנים להקלטה למשך %1$d הימים הבאים</item>
- <item quantity="one">לוח זמנים להקלטה למשך היום הבא</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="two">‏%1$d התנגשויות בין הקלטות</item>
+ <item quantity="many">‏%1$d התנגשויות בין הקלטות</item>
+ <item quantity="other">‏%1$d התנגשויות בין הקלטות</item>
+ <item quantity="one">‏%1$d התנגשות בין הקלטות</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"הגדרות"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"הקודם"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"בטל"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"הגדרות סדרה"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"התחל הקלטת סדרה"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"הפסק הקלטת סדרה"</string>
+ <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_empty_state" msgid="3407962945399698707">"אין פרקים זמינים.\nהם יוקלטו כשיהיו זמינים."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="two">‏(%1$d דקות)</item>
+ <item quantity="many">‏(%1$d דקות)</item>
+ <item quantity="other">‏(%1$d דקות)</item>
+ <item quantity="one">‏(%1$d דקה) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"היום"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"מחר"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"אתמול"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index f4d8e74c..9c526c21 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -93,7 +93,7 @@
</plurals>
<string name="msg_no_channel_added" msgid="2882586037409921925">"追加されたチャンネルなし"</string>
<string name="input_selector_tuner_label" msgid="6631205039926880892">"チューナー"</string>
- <string name="menu_parental_controls" msgid="2474294054521345840">"ペアレンタルコントロール"</string>
+ <string name="menu_parental_controls" msgid="2474294054521345840">"保護者による使用制限"</string>
<string name="option_toggle_parental_controls_on" msgid="9122851821454622696">"ON"</string>
<string name="option_toggle_parental_controls_off" msgid="7797910199040440618">"OFF"</string>
<string name="option_channels_locked" msgid="5797855082297549907">"ブロック済み"</string>
@@ -125,7 +125,7 @@
<string name="pin_enter_unlock_program" msgid="7311628843209871203">"PINを入力してこのプログラムを視聴"</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">"PINの入力"</string>
- <string name="pin_enter_create_pin" msgid="3385754356793309946">"ペアレンタルコントロールを設定するには、PINを作成してください"</string>
+ <string name="pin_enter_create_pin" msgid="3385754356793309946">"保護者による使用制限を設定するには、暗証番号を作成してください"</string>
<string name="pin_enter_new_pin" msgid="1739471585849790384">"新しいPINを入力"</string>
<string name="pin_enter_again" msgid="2618999754723090427">"PINの確認"</string>
<string name="pin_enter_old_pin" msgid="4588282612931041919">"現在のPINの入力"</string>
@@ -140,7 +140,7 @@
<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_parental_controls" msgid="5449397921700749317">"保護者による使用制限"</string>
<string name="settings_menu_licenses" msgid="1257646083838406103">"オープンソース ライセンス"</string>
<string name="dialog_title_licenses" msgid="4471754920475076623">"オープンソースライセンス"</string>
<string name="settings_menu_version" msgid="2604030372029921403">"バージョン"</string>
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"音声のみ"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"信号強度が弱くなっています"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"インターネットに接続されていません"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">他の番組の録画にすべてのチューナーを使用しているため、このチャンネルの再生は<xliff:g id="END_TIME_1">%1$s</xliff:g>までできません。\n\n録画予約を調整するには右のボタンを押してください。</item>
- <item quantity="one">他の番組の録画にチューナーを使用しているため、このチャンネルの再生は<xliff:g id="END_TIME_0">%1$s</xliff:g>までできません。\n\n録画予約を調整するには右のボタンを押してください。</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">他のチャンネルが録画されているため、このチャンネルの再生は <xliff:g id="END_TIME_1">%1$s</xliff:g> までできません。\n\n録画予約を調整するには右のボタンを押してください。</item>
+ <item quantity="one">他のチャンネルが録画されているため、このチャンネルの再生は <xliff:g id="END_TIME_0">%1$s</xliff:g> までできません。\n\n録画予約を調整するには右のボタンを押してください。</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"タイトルなし"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"チャンネルをブロック"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"ライブチャンネルには、TV番組表を読み取る権限が必要です。"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"ソースをセットアップ"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"ライブ チャンネルを利用すると、アプリで提供されるストリーミング チャンネルを従来のテレビのチャンネルと同様に視聴できます。\n\n使ってみるには、既にインストールされているチャンネル ソースをセットアップします。また、ライブ チャンネルを提供するアプリを Google Play ストアで探してさらに追加することもできます。"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"録画予約"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10分"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30分"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1時間"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"予約済み"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"シリーズ"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"その他"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"このチャンネルの録画はできません。"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"この番組の録画はできません。"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"「<xliff:g id="PROGRAMNAME">%1$s</xliff:g>」が録画予約されました"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"「<xliff:g id="PROGRAMNAME">%1$s</xliff:g>」を今から <xliff:g id="ENDTIME">%2$s</xliff:g> まで録画します"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"すべての予約"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"最初から再生"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"録画の削除"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"削除するエピソードを選択してください。削除したエピソードは復元できませんのでご注意ください。"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"削除できる録画がありません。"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"優先度"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"最高"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"最低"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"<xliff:g id="RANK">%1$d</xliff:g> 番目"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"チャンネル"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"すべて"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"優先度の選択"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"同時に複数の番組を録画するのにチューナーが不足している場合は、優先度の高い番組だけが録画されます。"</string>
+ <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">"1 回のみの録画を最優先"</string>
<string name="dvr_action_cancel" msgid="8094060199570272625">"キャンセル"</string>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"録画した内容は DVR ライブラリに保存されます。"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"録画したコンテンツは保存されます。"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"チューナーが競合しているため、一部のみ録画されます。"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"チューナーが競合しているため、録画されません。"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"録画予約はまだありません。\n録画予約は番組ガイドから行えます。"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">今後 %1$d 日間の録画予約</item>
- <item quantity="one">今後 %1$d 日間の録画予約</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d 件の録画予約が競合しています</item>
+ <item quantity="one">%1$d 件の録画予約が競合しています</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"設定"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"戻る"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"元に戻す"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"シリーズの設定"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"シリーズの録画を開始"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"シリーズの録画を停止"</string>
+ <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_empty_state" msgid="3407962945399698707">"利用可能なエピソードはありません。\n利用可能になると録画されます。"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d分)</item>
+ <item quantity="one">(%1$d分)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"今日"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"明日"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"昨日"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 699b25c5..72608bd4 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"მხოლოდ აუდიო"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"სიგნალი სუსტია"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"ინტერნეტთან კავშირი არ არის"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">ამ არხის დაკვრა <xliff:g id="END_TIME_1">%1$s</xliff:g>-მდე ვერ მოხერხდება, რადგან ყველა ტუნერი სხვა პროგრამების ჩასაწერად გამოიყენება. \n\nჩაწერის განრიგის კორექტირებისთვის, დააჭირეთ „მარჯვნივ“-ს.</item>
- <item quantity="one">ამ არხის დაკვრა <xliff:g id="END_TIME_0">%1$s</xliff:g>-მდე ვერ მოხერხდება, რადგან ტუნერი სხვა პროგრამების ჩასაწერად გამოიყენება. \n\nჩაწერის განრიგის კორექტირებისთვის, დააჭირეთ „მარჯვნივ“-ს.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">ამ არხის დაკვრა <xliff:g id="END_TIME_1">%1$s</xliff:g>-მდე ვერ მოხერხდება, რადგან იწერება სხვა არხები. \n\nჩაწერის განრიგის კორექტირებისთვის, დააჭირეთ „მარჯვნივ“-ს.</item>
+ <item quantity="one">ამ არხის დაკვრა <xliff:g id="END_TIME_0">%1$s</xliff:g>-მდე ვერ მოხერხდება, რადგან იწერება სხვა არხი. \n\nჩაწერის განრიგის კორექტირებისთვის, დააჭირეთ „მარჯვნივ“-ს.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"უსათაურო"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"არხი დაბლოკილია"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"პირდაპირი არხები საჭიროებს ნებართვას ტელეპროგრამის წასაკითხად."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"დააყენეთ თქვენი წყაროები"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"პირდაპირი არხები ტრადიციულ სატელევიზიო არხებსა და აპების მიერ მოწოდებულ სტრიმინგის არხებს აერთიანებს. \n\nდასაწყებად, დააყენეთ არხების უკვე დაინსტალირებული წყაროები, ან დაათვალიერეთ Google Play Store და აღმოაჩინეთ მეტი აპი, რომლებიც პირდაპირ არხებს გთავაზობთ."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"ჩანაწერები და განრიგები"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 წუთი"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 წუთი"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 საათი"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"დაგეგმილი"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"სერიები"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"სხვა"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"არხის ჩაწერა ვერ მოხერხდება."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"პროგრამის ჩაწერა ვერ მოხერხდება."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> დაიგეგმა ჩასაწერად"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> იწერება ამ მომენტიდან <xliff:g id="ENDTIME">%2$s</xliff:g>-მდე"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"სრული განრიგი"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"თავიდან დაკვრა"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"ჩანაწერების წაშლა"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"აირჩიეთ ეპიზოდები, რომელთა წაშლაც გსურთ. წაშლის შემდეგ, მათი აღდგენა ვეღარ მოხერხდება."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"წასაშლელი ჩანაწერები არ არის."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"პრიორიტეტი"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"ყველაზე მაღალი"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"ყველაზე დაბალი"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"№ <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"არხები"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"ნებისმიერი"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"აირჩიეთ პრიორიტეტი"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"თუ პროგრამების ერთდროულად ჩაწერისთვის საკმარისი ტუნერების რაოდენობა არ იქნება, ჩაიწერება მხოლოდ მაღალი პრიორიტეტის მქონე პროგრამები."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"ჩაწერილი ნაწილი DVR ბიბლიოთეკაში შეინახება."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ჩაწერილი კონტენტი შეინახება."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -309,16 +325,22 @@
<string name="dvr_schedules_deletion_info" msgid="2837586459900271031">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ამოიშალა ჩაწერის განრიგიდან"</string>
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ჩაიწერება ნაწილობრივ ტუნერის კონფლიქტების გამო."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"არ ჩაიწერება ტუნერის კონფლიქტების გამო."</string>
- <string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ჩაწერა ჯერ დაგეგმილი არ არის.\nჩაწერის დაგეგმვა პროგრამის სახელმძღვანელოდან შეგიძლიათ."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">ჩაწერის განრიგი შემდეგი %1$d დღისთვის</item>
- <item quantity="one">ჩაწერის განრიგი შემდეგი %1$d დღისთვის</item>
+ <string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ჩაწერა ჯერ დაგეგმილი არ არის.\nჩაწერის დაგეგმვა პროგრამების მეგზურიდან შეგიძლიათ."</string>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d ჩაწერის კონფლიქტი</item>
+ <item quantity="one">%1$d ჩაწერის კონფლიქტი</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"პარამეტრები"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"უკან"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"მოქმედების გაუქმება"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"სერიალის პარამეტრები"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"სერიალის ჩაწერის დაწყება"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"სერიალის ჩაწერის შეწყვეტა"</string>
+ <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_empty_state" msgid="3407962945399698707">"ეპიზოდები მიუწვდომელია.\nმათი ჩაწერა მოხდება მაშინ, როცა ისინი ხელმისაწვდომი გახდება."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d წუთი)</item>
+ <item quantity="one">(%1$d წუთი) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"დღეს"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"ხვალ"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"გუშინ"</string>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 83c30626..2a47972c 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Тек аудио"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Cигнал әлсіз"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Интернетпен байланыс жоқ"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Барлық тюнерлер басқа бағдарламаларды жазу үшін пайдаланылып жатқандықтан, бұл арна <xliff:g id="END_TIME_1">%1$s</xliff:g> дейін ойнатылмайды. \n\nЖазу кестесін реттеу үшін \"Оң жақ\" түймесін басыңыз.</item>
- <item quantity="one">Тюнер басқа бағдарламаларды жазу үшін пайдаланылып жатқандықтан, бұл арна <xliff:g id="END_TIME_0">%1$s</xliff:g> дейін ойнатылмайды. \n\nЖазу кестесін реттеу үшін \"Оң жақ\" түймесін басыңыз.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Басқа арналар жазылып жатқандықтан, бұл арна <xliff:g id="END_TIME_1">%1$s</xliff:g> дейін ойнатылмайды. \n\nЖазып алу кестесін реттеу үшін \"Оң жақ\" түймесін басыңыз.</item>
+ <item quantity="one">Басқа арна жазылып жатқандықтан, бұл арна <xliff:g id="END_TIME_0">%1$s</xliff:g> дейін ойнатылмайды. \n\nЖазып алу кестесін реттеу үшін \"Оң жақ\" түймесін басыңыз.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Тақырыпсыз"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Арна бөгелген"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Live TV үшін ТД тізімдерін оқу рұқсаты қажет."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Дерек көздерін орнату"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Live арналары қолданбалардағы ағынды арналармен қатар дәстүрлі теледидар арналарын да ұсынады. \n\nІсті бұрын орнатылған арна көздерін реттеуден бастаңыз. Тікелей эфир арналарын ұсынатын басқа қолданбаларды Google Play Store дүкенінен алуға болады."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Жазбалар және кестелер"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 минут"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 минут"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 сағат"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Жоспарланған"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Сериялар"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Басқалар"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Арнаны жазу мүмкін емес."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Бағдарламаны жазу мүмкін емес."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> бағдарламасын жазып алу жоспарланды"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> бағдарламасын қазірден бастап <xliff:g id="ENDTIME">%2$s</xliff:g> дейін жазу"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Толық кесте"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Басынан бастап ойнату"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Жазбаларды жою"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Жойғыңыз келетін серияларды таңдаңыз. Олар біржола жойылады және қалпына келтірілмейді."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Жоюға болатын жазбалар жоқ."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Маңыздылық"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Ең жоғары"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Ең төмен"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"№ <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Арналар"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Кез келген"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Маңыздылық деңгейін таңдау"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Бағдарламаларды бір мезгілде жазып алуға тюнерлер жеткіліксіз болғанда, тек ең маңызды бағдарламалар ғана жазылады."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Жазылған бөлігі DVR жинағында сақталады."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Жазылған мазмұн сақталады."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Тюнер қайшылықтарына байланысты толық жазылмайды."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Тюнер қайшылықтарына байланысты жазылмайды."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Кестеде ешқандай жазып алу белгіленбеген.\nМұны бағдарлама нұсқаулығынан жоспарлауға болады."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Келесі %1$d күнге арналған жазу кестесі</item>
- <item quantity="one">Келесі %1$d күнге арналған жазу кестесі</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d жазу қайшылығы</item>
+ <item quantity="one">%1$d жазу қайшылығы</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Параметрлер"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Артқа"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Кері қайтару"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Сериялар параметрлері"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Серияларды жазуды бастау"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Серияларды жазуды тоқтату"</string>
+ <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_empty_state" msgid="3407962945399698707">"Ешқандай серия қолжетімді емес.\nОларды қолжетімді болған кезде ғана жазып алуға болады."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d минут)</item>
+ <item quantity="one">(%1$d минут) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Бүгін"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Ертең"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Кеше"</string>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index ab1fb24b..98fa13f5 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"តែ​អូឌីយ៉ូ​ប៉ុណ្ណោះ"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"សញ្ញា​ខ្សោយ"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"គ្មានការតភ្ជាប់អ៊ីនធឺណិតទេ"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">មិនអាចចាក់ប៉ុស្តិ៍នេះបានទេ រហូតដល់ម៉ោង <xliff:g id="END_TIME_1">%1$s</xliff:g> ដោយសារតែកម្មវិធីរាវប៉ុស្តិ៍កំពុងប្រើសម្រាប់ថតកម្មវិធីផ្សេងទៀត។ \n\nចុច ស្តាំ ដើម្បីកែសម្រួលកាលវិភាគថត។</item>
- <item quantity="one">មិនអាចចាក់ប៉ុស្តិ៍នេះបានទេ រហូតដល់ម៉ោង <xliff:g id="END_TIME_0">%1$s</xliff:g> ដោយសារតែកម្មវិធីរាវប៉ុស្តិ៍កំពុងប្រើសម្រាប់ថតកម្មវិធីផ្សេងទៀត។ \n\nចុច ស្តាំ ដើម្បីកែសម្រួលកាលវិភាគថត។</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">ប៉ុស្តិ៍នេះមិនអាចចាក់បានទេរហូតដល់ម៉ោង <xliff:g id="END_TIME_1">%1$s</xliff:g> ដោយសារតែប៉ុស្តិ៍ផ្សេងទៀតកំពុងត្រូវបានថត។ \n\nចុច ស្តាំ ដើម្បីកែសម្រួលកាលវិភាគថត។</item>
+ <item quantity="one">ប៉ុស្តិ៍នេះមិនអាចចាក់បានទេរហូតដល់ម៉ោង <xliff:g id="END_TIME_0">%1$s</xliff:g> ដោយសារតែប៉ុស្តិ៍ផ្សេងទៀតកំពុងត្រូវបានថត។ \n\nចុច ស្តាំ ដើម្បីកែសម្រួលកាលវិភាគថត។</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"គ្មាន​ចំណងជើង"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"បាន​ទប់​ស្កាត់​ឆានែល"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"ប៉ុស្តិ៍ផ្សាយផ្ទាល់ត្រូវការសិទ្ធិអនុញ្ញាតដើម្បីអានបញ្ជីទូរទស្សន៍។"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"កំណត់ប្រភពរបស់អ្នក"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"ប៉ុស្តិ៍ផ្សាយផ្ទាល់ផ្សាភ្ជាប់បទពិសោធន៍ប្រើប្រាស់ប៉ុស្តិ៍ទូរទស្សន៍លក្ខណៈបុរាណជាមួយប៉ុស្តិ៍ស្រ្ទីមដែលផ្តល់ដោយកម្មវិធី។ \n\nចាប់ផ្តើមដោយកំណត់ប្រភពប៉ុស្តិ៍ដែលបានដំឡើងរួចហើយ។ ឬរុករកក្នុងហាង Google Play ដើម្បីរកកម្មវិធីច្រើនទៀតដែលផ្តល់ជូនប៉ុស្តិ៍ផ្សាយផ្ទាល់។"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"ការថត និងកាលវិភាក"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 នាទី"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 នាទី"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ម៉ោង"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"បាន​កំណត់​ពេល"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"ស៊េរី"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"ផ្សេងៗ"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"មិនអាចថតប៉ុស្តិ៍នេះបានទេ"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"មិនអាចថតកម្មវិធីនេះបានទេ"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ត្រូវបានកំណត់ពេលដើម្បីថត"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"ការថត <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ពីឥឡូវនេះដល់ <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"កាលវិភាគពេញហើយ"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"ចាក់ពីដំបូង"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"លុបការថត"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"ជ្រើសភាគដែលអ្នកចង់លុប។ ពួកវាមិនអាចស្តារឡើវិញបានទេបន្ទាប់ពីលុបរួចហើយ។"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"មិនមានការថតដែលត្រូវលុបទេ"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"អាទិភាព"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"ខ្ពស់បំផុត"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"ទាបបំផុត"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"លេខ <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"ប៉ុស្តិ៍"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"មួយណាក៏បាន"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"ជ្រើសអាទិភាព"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"នៅពេលដែលមិនមានអង្គរាវប៉ុស្តិ៍គ្រប់គ្រាន់ដើម្បីថតកម្មវិធីក្នុងពេលតែមូយទេ មានតែកម្មវិធីដែលមានអាទិភាពខ្ពស់បំផុតប៉ុណ្ណោះដែលនឹងត្រូវបានថត។"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"ផ្នែកដែលបានថតនឹងត្រូវបានរក្សាទុកទៅក្នុងបណ្ណាល័យ DVR ។"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"មាតិកាដែលបានថតនឹងត្រូវបានរក្សាទុក"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"នឹងមិនត្រូវបានថតពេញលេញនោះទេដោយសារតែអង្គរាវប៉ុស្តិ៍ជាន់គ្នា។"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"នឹងមិនត្រូវបានថតនោះទេដោយសារតែអង្គរាវប៉ុស្តិ៍ជាន់គ្នា។"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"មិនទាន់មានការថតនៅក្នុងកាលវិភាគនៅឡើយទេ។\nអ្នកអាចកំណត់ពេលថតចេញពីការណែនាំកម្មវិធីនេះ។"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">កាលវិភាគថតសម្រាប់រយៈពេល %1$d ថ្ងៃបន្ទាប់</item>
- <item quantity="one">កាលវិភាគថតសម្រាប់រយៈពេល %1$d ថ្ងៃបន្ទាប់</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">ការជាន់ម៉ោងថត %1$d</item>
+ <item quantity="one">ការជាន់ម៉ោងថត %1$d</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"ការកំណត់"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"ថយក្រោយ"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"មិនធ្វើវិញ"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"ការកំណត់វគ្គ"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"ចាប់ផ្តើមថតវគ្គ"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"ឈប់ថតវគ្គ"</string>
+ <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_empty_state" msgid="3407962945399698707">"មិនមានផ្តល់ជូនភាគណាមួយទេ។\nពួកវានឹងត្រូវបានថតបន្ទាប់ពីមានផ្តល់ជូន។"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d នាទី)</item>
+ <item quantity="one">(%1$d នាទី) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"ថ្ងៃនេះ"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"ថ្ងៃស្អែក"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"ម្សិលមិញ"</string>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 23a3bcad..adc99656 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"ಆಡಿಯೊ ಮಾತ್ರ"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"ದುರ್ಬಲ ಸಿಗ್ನಲ್"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿಲ್ಲ"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">ಇತರೆ ಕಾರ್ಯಕ್ರಮಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡುವುದಕ್ಕಾಗಿ ಎಲ್ಲಾ ಟ್ಯೂನರ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡಿರುವ ಕಾರಣ <xliff:g id="END_TIME_1">%1$s</xliff:g> ವರೆಗೂ ಈ ಚಾನಲ್‌ ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. \n\nರೆಕಾರ್ಡ್ ಮಾಡುವ ವೇಳಾಪಟ್ಟಿಯನ್ನು ಸರಿಹೊಂದಿಸಲು ಬಲಕ್ಕೆ ಒತ್ತಿ.</item>
- <item quantity="other">ಇತರೆ ಕಾರ್ಯಕ್ರಮಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡುವುದಕ್ಕಾಗಿ ಎಲ್ಲಾ ಟ್ಯೂನರ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡಿರುವ ಕಾರಣ <xliff:g id="END_TIME_1">%1$s</xliff:g> ವರೆಗೂ ಈ ಚಾನಲ್‌ ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. \n\nರೆಕಾರ್ಡ್ ಮಾಡುವ ವೇಳಾಪಟ್ಟಿಯನ್ನು ಸರಿಹೊಂದಿಸಲು ಬಲಕ್ಕೆ ಒತ್ತಿ.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">ಇತರ ಚಾನಲ್‌ಗಳು ರೆಕಾರ್ಡ್ ಆಗುತ್ತಿರುವ ಕಾರಣ <xliff:g id="END_TIME_1">%1$s</xliff:g> ವರೆಗೂ ಈ ಚಾನಲ್‌ ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. \n\nರೆಕಾರ್ಡ್ ಮಾಡುವ ವೇಳಾಪಟ್ಟಿಯನ್ನು ಸರಿಹೊಂದಿಸಲು ಬಲಕ್ಕೆ ಒತ್ತಿರಿ.</item>
+ <item quantity="other">ಇತರ ಚಾನಲ್‌ಗಳು ರೆಕಾರ್ಡ್ ಆಗುತ್ತಿರುವ ಕಾರಣ <xliff:g id="END_TIME_1">%1$s</xliff:g> ವರೆಗೂ ಈ ಚಾನಲ್‌ ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. \n\nರೆಕಾರ್ಡ್ ಮಾಡುವ ವೇಳಾಪಟ್ಟಿಯನ್ನು ಸರಿಹೊಂದಿಸಲು ಬಲಕ್ಕೆ ಒತ್ತಿರಿ.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"ಯಾವುದೇ ಶೀರ್ಷಿಕೆಯಿಲ್ಲ"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"ಚಾನಲ್ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"ಟಿವಿ ಪಟ್ಟಿಗಳನ್ನು ರೀಡ್ ಮಾಡಲು ಲೈವ್ ಚಾನಲ್‌ಗಳಿಗೆ ಅನುಮತಿ ಅಗತ್ಯವಿದೆ."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"ನಿಮ್ಮ ಮೂಲಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"ಲೈವ್‌ ಚಾನಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ ಮೂಲಕ ಒದಗಿಸಲಾದ ಸ್ಟ್ರೀಮಿಂಗ್ ಚಾನಲ್‌ಗಳ ಜೊತೆಗೆ ಸಾಂಪ್ರದಾಯಿಕ ಟಿವಿ ಅನುಭವವನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ. \n\nಈಗಾಗಲೇ ಸ್ಥಾಪಿಸಲಾದ ಚಾನಲ್‌‌ ಮೂಲಗಳನ್ನು ಹೊಂದಿಸುವ ಮೂಲಕ ಪ್ರಾರಂಭಿಸಿ. ಅಥವಾ ಲೈವ್‌ ಚಾನಲ್‌ಗಳನ್ನು ಆಫರ್‌ ಮಾಡುವಂತಹ ಇನ್ನಷ್ಟು ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ Google Play ಸ್ಟೋರ್‌ನಲ್ಲಿ ಬ್ರೌಸ್‌ ಮಾಡಿ."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"ರೆಕಾರ್ಡಿಂಗ್‌ಗಳು ಮತ್ತು ವೇಳಾಪಟ್ಟಿಗಳು"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 ನಿಮಿಷಗಳು"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 ನಿಮಿಷಗಳು"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ಗಂಟೆ"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"ನಿಗದಿಪಡಿಸಲಾಗಿದ್ದು"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"ಸರಣಿ"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"ಇತರರು"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"ಚಾನಲ್ ರೆಕಾರ್ಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"ಪ್ರೋಗ್ರಾಂ ರೆಕಾರ್ಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ಅನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"ಈಗಿನಿಂದ <xliff:g id="ENDTIME">%2$s</xliff:g> ವರೆಗೆ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುತ್ತದೆ"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"ಪೂರ್ಣ ವೇಳಾಪಟ್ಟಿ"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"ಪ್ರಾರಂಭದಿಂದ ಪ್ಲೇ ಮಾಡು"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"ರೆಕಾರ್ಡಿಂಗ್‌ ಅಳಿಸಿ"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"ನೀವು ಅಳಿಸಲು ಬಯಸುವಂತಹ ಸಂಚಿಕೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ. ಅವುಗಳನ್ನು ಒಮ್ಮೆ ಅಳಿಸಿದರೆ ಹಿಂಪಡೆಯಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"ಅಳಿಸಲು ಯಾವುದೇ ರೆಕಾರ್ಡಿಂಗ್‌ಗಳಿಲ್ಲ."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"ಆದ್ಯತೆ"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"ಹೆಚ್ಚು"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"ಅತಿ ಕಡಿಮೆ"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"ಸಂ. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"ಚಾನಲ್‌ಗಳು"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"ಯಾವುದಾದರೂ"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"ಆದ್ಯತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"ಕಾರ್ಯಕ್ರಮಗಳನ್ನು ರೆಕಾರ್ಡ್‌ ಮಾಡಲು ಸಾಕಷ್ಟು ಟ್ಯೂನರ್‌ಗಳು ಇಲ್ಲದ ಸಂದರ್ಭದಲ್ಲಿ, ಹೆಚ್ಚಿನ ಆದ್ಯತೆ ಇರುವ ಕಾರ್ಯಕ್ರಮಗಳನ್ನು ಮಾತ್ರ ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾಗುವುದು."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾದ ಭಾಗವನ್ನು DVR ಲೈಬ್ರರಿಯಲ್ಲಿ ಉಳಿಸಲಾಗುತ್ತದೆ."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾದ ವಿಷಯವನ್ನು ಉಳಿಸಲಾಗುತ್ತದೆ."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ಟ್ಯೂನರ್ ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ಭಾಗಶಃ ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುತ್ತದೆ."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ಟ್ಯೂನರ್ ಸಂಘರ್ಷಗಳ ಕಾರಣದಿಂದಾಗಿ ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ಯಾವುದೇ ರೆಕಾರ್ಡಿಂಗ್ ಇನ್ನೂ ನಿಗದಿಪಡಿಸಿಲ್ಲ.\n ನೀವು ಪ್ರೋಗ್ರಾಂ ಮಾರ್ಗಸೂಚಿ ಮೂಲಕ ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ನಿಗದಿಪಡಿಸಬಹುದು."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">ಮುಂದಿನ %1$d ದಿನಗಳ ರೆಕಾರ್ಡಿಂಗ್ ವೇಳಾಪಟ್ಟಿ</item>
- <item quantity="other">ಮುಂದಿನ %1$d ದಿನಗಳ ರೆಕಾರ್ಡಿಂಗ್ ವೇಳಾಪಟ್ಟಿ</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d ರೆಕಾರ್ಡಿಂಗ್ ಸಂಘರ್ಷಗಳು</item>
+ <item quantity="other">%1$d ರೆಕಾರ್ಡಿಂಗ್ ಸಂಘರ್ಷಗಳು</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"ಹಿಂದೆಕ್ಕೆ"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"ರದ್ದುಮಾಡು"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"ಸರಣಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"ಸರಣಿ ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಾರಂಭ"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"ಸರಣಿ ರೆಕಾರ್ಡಿಂಗ್ ನಿಲ್ಲಿಸು"</string>
+ <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_empty_state" msgid="3407962945399698707">"ಯಾವುದೇ ಸಂಚಿಕೆಗಳು ಲಭ್ಯವಿಲ್ಲ.\nಅವುಗಳು ಒಮ್ಮೆ ಲಭ್ಯವಾದಾಗ ಅವುಗಳನ್ನು ರೆಕಾರ್ಡ್‌ ಮಾಡಲಾಗುತ್ತದೆ."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d ನಿಮಿಷಗಳು)</item>
+ <item quantity="other">(%1$d ನಿಮಿಷಗಳು)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"ಇಂದು"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"ನಾಳೆ"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"ನಿನ್ನೆ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 8960cd8d..4e9fa6a6 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -157,9 +157,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"오디오 전용"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"신호 약함"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"인터넷에 연결되지 않았습니다."</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">모든 튜너가 다른 프로그램을 녹화하는 데 사용되고 있어서 <xliff:g id="END_TIME_1">%1$s</xliff:g>까지 이 채널을 재생할 수 없습니다. \n\n녹화 일정을 조정하려면 오른쪽을 누르세요.</item>
- <item quantity="one">튜너가 다른 프로그램을 녹화하는 데 사용되고 있어서 <xliff:g id="END_TIME_0">%1$s</xliff:g>까지 이 채널을 재생할 수 없습니다. \n\n녹화 일정을 조정하려면 오른쪽을 누르세요.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">다른 채널을 녹화 중이므로 <xliff:g id="END_TIME_1">%1$s</xliff:g>까지 이 채널을 재생할 수 없습니다. \n\n녹화 일정을 조정하려면 오른쪽을 누르세요.</item>
+ <item quantity="one">다른 채널을 녹화 중이므로 <xliff:g id="END_TIME_0">%1$s</xliff:g>까지 이 채널을 재생할 수 없습니다. \n\n녹화 일정을 조정하려면 오른쪽을 누르세요.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"제목 없음"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"차단된 채널"</string>
@@ -194,6 +194,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"TV 목록을 읽으려면 실시간 채널에 권한이 필요합니다."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"소스 설정"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"실시간 채널은 기존 TV 채널 환경과 앱에서 제공하는 스트리밍 채널을 결합합니다. \n\n이미 설치된 채널 소스를 설정하여 시작하거나 Google Play 스토어에서 실시간 채널을 제공하는 더 많은 앱을 찾아보세요."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"녹화 및 일정"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10분"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30분"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1시간"</string>
@@ -202,6 +203,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"예약"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"시리즈"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"기타"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"현재 채널을 녹화할 수 없습니다."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"현재 프로그램을 녹화할 수 없습니다."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>이(가) 녹화 예약되었습니다."</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"지금부터 <xliff:g id="ENDTIME">%2$s</xliff:g>까지 <xliff:g id="PROGRAMNAME">%1$s</xliff:g> 녹화"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"전체 일정"</string>
@@ -229,9 +232,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"처음부터 재생"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"녹화 삭제"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"삭제하려는 에피소드를 선택하세요. 삭제 후에는 복구할 수 없습니다."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"삭제할 녹화가 없습니다."</string>
@@ -248,17 +253,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"우선순위"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"가장 높음"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"가장 낮음"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"아니요. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"채널"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"임의"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"우선순위 선택"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"동시에 프로그램을 녹화할 튜너가 충분하지 않으면 최우선 순위의 프로그램만 녹화됩니다."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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,17 +276,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"녹화된 부분은 DVR 라이브러리에 저장됩니다."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"녹화된 콘텐츠가 저장됩니다."</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>
@@ -300,6 +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>
+ <!-- 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>
@@ -312,15 +328,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"튜너의 충돌로 인해 일부만 녹화됩니다."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"튜너의 충돌로 인해 녹화되지 않습니다."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"아직 예약된 녹화가 없습니다.\n프로그램 가이드에서 녹화를 예약할 수 있습니다."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">다음 %1$d일의 녹화 일정</item>
- <item quantity="one">다음 %1$d일의 녹화 일정</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">녹화 충돌 %1$d개</item>
+ <item quantity="one">녹화 충돌 %1$d개</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"설정"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"뒤로"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"실행취소"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"시리즈 설정"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"시리즈 녹화 시작"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"시리즈 녹화 중지"</string>
+ <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_empty_state" msgid="3407962945399698707">"사용할 수 있는 에피소드가 없습니다.\n사용 가능한 에피소드가 생기면 녹화됩니다."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d분)</item>
+ <item quantity="one">(%1$d분) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"오늘"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"내일"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"어제"</string>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 22085e26..2b9d37ab 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Аудио гана"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Начар сигнал"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Интернет туташуусу жок"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Бул каналды саат <xliff:g id="END_TIME_1">%1$s</xliff:g> чейин ойнотууга болбойт, себеби бардык тюнерлер башка программаларды жаздыруу үчүн колдонулууда. \n\nЖаздыруунун графигин өзгөртүү үчүн \"Оңго\" деген жебени басыңыз.</item>
- <item quantity="one">Бул каналды саат <xliff:g id="END_TIME_0">%1$s</xliff:g> чейин ойнотууга болбойт, себеби учурда тюнер башка программаларды жаздыруу үчүн колдонулууда. \n\nЖаздыруунун графигин өзгөртүү үчүн \"Оңго\" деген жебени басыңыз.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Бул каналды саат <xliff:g id="END_TIME_1">%1$s</xliff:g> чейин ойнотууга болбойт, себеби башка каналдар жаздырылууда. \n\nЖаздыруунун графигин өзгөртүү үчүн \"Оңго\" деген жебени басыңыз.</item>
+ <item quantity="one">Бул каналды саат <xliff:g id="END_TIME_0">%1$s</xliff:g> чейин ойнотууга болбойт, себеби башка канал жаздырылууда. \n\nЖаздыруунун графигин өзгөртүү үчүн \"Оңго\" деген жебени басыңыз.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Аталышы жок"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Канал бөгөттөлдү"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Сыналгы тизмелерин оруу үчүн Түз ободогу каналдарга уруксат керек."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Булактарыңызды жөндөңүз"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Түз ободогу каналдарда - кадимки сыналгы каналдары менен орнотулган колдонмолор аркылуу көрсөтүлүүчү видеоканалдар камтылган. \n\nМурунтан эле орнотулган канал булактарын жөндөөдөн баштаңыз же Google Play Store\'дон башка медиа колдонмолорду карап көрүңүз."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Жаздыруулар жана графиги"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 мүнөт"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 мүнөт"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 саат"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Ыраатталды"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Топтомдор"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Башкалар"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Каналды жаздыруу мүмкүн эмес."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Программаны жаздыруу мүмкүн эмес."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> программасы жаздыруу графигине кошулду"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> программасын азыркы убактан <xliff:g id="ENDTIME">%2$s</xliff:g> чейин жаздыруу"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Толук графиги"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Башынан баштап ойнотуу"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Жаздырылган нерселерди жок кылуу"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Жок кылгыңыз келген серияларды тандаңыз. Алар жок кылынгандан кийин кайра калыбына келтирилбейт."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Жок кылына турган жаздыруулар жок."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Артыкчылыктуу"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Эң жогорку"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Эң төмөн"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Жок. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Каналдар"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Баары"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Артыкчылыкты тандоо"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Бир эле убакта программаларды жаздырууда тюнерлер жетишсиз болгон учурда, эң жогорку артыкчылыгы бар программалар гана жаздырылат."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Жаздырылган бөлүгү DVR китепканасында сакталат."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Тартылган мазмун сакталып калат."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Күүлөгүчтөгү дал келбестиктерге байланыштуу жарым-жартылай жаздырылат."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Күүлөгүчтөгү дал келбестиктерге байланыштуу жаздырылбайт."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Графикке жаздыруу киргизиле элек.\nПрограмма жетегинен жаздыруу графигин түзсөңүз болот."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Иш-тартибин кийинки %1$d кунгө жаздыруу</item>
- <item quantity="one">Иш-тартибин кийинки %1$d кунгө жаздыруу</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">Жаздырууда %1$d дал келбестик бар</item>
+ <item quantity="one">Жаздырууда %1$d дал келбестик бар</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Жөндөөлөр"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Артка"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Артка кайтаруу"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Сериал жөндөөлөрү"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Сериал тартып баштоо"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Сериал тартууну токтотуу"</string>
+ <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_empty_state" msgid="3407962945399698707">"Учурда бир да эпизод жок.\nАлар жеткиликтүү болоору менен жаздырылат."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d мүнөт)</item>
+ <item quantity="one">(%1$d мүнөт) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Бүгүн"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Эртең"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Кечээ"</string>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 14e85b85..05aba1ce 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"ສຽງເທົ່ານັ້ນ"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"ສັນຍານອ່ອນ"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">ຊ່ອງນີ້ຈະບໍ່ສາມາດຫຼິ້ນໄດ້ຈົນກວ່າຈະຮອດ <xliff:g id="END_TIME_1">%1$s</xliff:g> ເນື່ອງຈາກຕົວປັບສຽງກຳລັງຖືກໃຊ້ສຳລັບການບັນທຶກໂປຣແກຣມອື່ນຢູ່. \n\nກົດຂວາເພື່ອປັບກຳນົດການບັນທຶກ.</item>
- <item quantity="one">ຊ່ອງນີ້ຈະບໍ່ສາມາດຫຼິ້ນໄດ້ຈົນກວ່າຈະຮອດ <xliff:g id="END_TIME_0">%1$s</xliff:g> ເນື່ອງຈາກຕົວປັບສຽງກຳລັງຖືກໃຊ້ສຳລັບການບັນທຶກໂປຣແກຣມອື່ນຢູ່. \n\nກົດຂວາເພື່ອປັບກຳນົດການບັນທຶກ.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">ບໍ່ສາມາດຫຼິ້ນຊ່ອງນີ້ໄດ້ຈົນກວ່າຈະຮອດ <xliff:g id="END_TIME_1">%1$s</xliff:g> ເນື່ອງຈາກກຳລັງບັນທຶກຊ່ອງອື່ນຢູ່. \n\nກົດຂວາເພື່ອປັບແຕ່ງເວລາການບັນທຶກ.</item>
+ <item quantity="one">ບໍ່ສາມາດຫຼິ້ນຊ່ອງນີ້ໄດ້ຈົນກວ່າຈະຮອດ <xliff:g id="END_TIME_0">%1$s</xliff:g> ເນື່ອງຈາກກຳລັງບັນທຶກຊ່ອງອື່ນຢູ່. \n\nກົດຂວາເພື່ອປັບແຕ່ງເວລາການບັນທຶກ.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"ບໍ່ມີຫົວຂໍ້"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"​ຊ່ອງ​ຖືກບລັອກ"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"ຊ່ອງ​ສົດ​ຕ້ອງ​ມີ​ການ​ອະ​ນຸ​ຍາດ​ເພື່ອ​ອ່ານ​ການ​ຈັດ​ລາຍ​ການ TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"ຕັ້ງຄ່າແຫຼ່ງຊ່ອງຂອງທ່ານ"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"ຊ່ອງອອກອາກາດສົດລວມເອົາປະສົບການຂອງຊ່ອງໂທລະພາບແບບເດີມເຂົ້າກັບຊ່ອງທີ່ໃຊ້ການສະຕຣີມທີ່ສະໜອງໃຫ້ໂດຍແອັບ. \n\nເລີ່ມຕົ້ນນຳໃຊ້ໂດຍການຕັ້ງຄ່າແຫຼ່ງຊ່ອງທີ່ຕິດຕັ້ງແລ້ວ. ຫຼື ຊອກຫາແອັບເພີ່ມເຕີມທີ່ໃຫ້ຊ່ອງອອກອາກາດສົດໃນ Google Play Store."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"ການບັນທຶກ ແລະ ການຕັ້ງເວລາ"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 ນາທີ"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 ນາທີ"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ຊົ່ວໂມງ"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"ຕັ້ງເວລາໄວ້ແລ້ວ"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"ຊີຣີ"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"ອື່ນໆ"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"ບໍ່ສາມາດບັນທຶກຊ່ອງໄດ້."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"ບໍ່ສາມາດບັນທຶກລາຍການໄດ້."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ຖືກຕັ້ງເວລາໃຫ້ບັນທຶກໄວ້ແລ້ວ"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"ກຳລັງບັນທຶກ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ຈາກຕອນນີ້ຫາ <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"ຕາລາງແບບເຕັມ"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"ຫຼິ້ນຕັ້ງແຕ່ຕົ້ນ"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"ລຶບການບັນທຶກອອກ"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"ເລືອກເອັບພິໂສດທີ່ທ່ານຕ້ອງການລຶບອອກ. ພວກມັນຈະບໍ່ສາມາດກູ້ກັບຄືນມາໄດ້ຫຼັງຈາກທີ່ລຶບອອກໄປແລ້ວ."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"ບໍ່ມີການບັນທຶກໃຫ້ລຶບ."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"ຄວາມສຳຄັນ"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"ສູງສຸດ"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"ຕ່ຳສຸດ"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"ບໍ່. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"​ຊ່ອງ"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"ອັນ​ໃດ​ກໍ່​ໄດ້"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"ເລືອກຄວາມສຳຄັນ"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"ເມື່ອມີຈູນເນີບໍ່ພຽງພໍເພື່ອບັນທຶກລາຍການໃນເວລາດຽວກັນ, ລະບົບຈະບັນທຶກສະເພາະລາຍການທີ່ມີຄວາມສຳຄັນສູງທີ່ສຸດເທົ່ານັ້ນ."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"ພາກສ່ວນທີ່ບັນທຶກໄວ້ຈະຖືກຈັດເກັບໄວ້ໃນຫ້ອງສະໝຸດ DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ເນື້ອຫາທີ່ອັດໄວ້ແລ້ວຈະຖືກບັຍທຶກໄວ້."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ຈະຖືກບັນທຶກບາງສ່ວນເນື່ອງຈາກມີຄວາມຂັດແຍ່ງໃນຕົວປັບຫາສັນຍານ."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ຈະບໍ່ຖືກບັນທຶກເນື່ອງຈາກມີຄວາມຂັດແຍ່ງໃນຕົວປັບຫາສັນຍານ."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ຍັງບໍ່ມີການຕັ້ງເວລາບັນທຶກເທື່ອ.\nທ່ານສາມາດຕັ້ງເວລາບັນທຶກໄດ້ຈາກຄຳແນະນຳລາຍການ."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">ຕັ້ງເວລາບັນທຶກສຳລັບ %1$d ມື້ຕໍ່ໄປ</item>
- <item quantity="one">ຕັ້ງເວລາບັນທຶກສຳລັບ %1$d ມື້ຕໍ່ໄປ</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d ການບັນທຶກທີ່ຂັດແຍ່ງກັນ</item>
+ <item quantity="one">%1$d ການບັນທຶກທີ່ຂັດແຍ່ງກັນ</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"ການຕັ້ງຄ່າ"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"ກັບຄືນ"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"ຍົກເລີກ"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"ການຕັ້ງຄ່າຊີຣີ"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"ເລີ່ມການບັນທຶກຊີຣີ"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"ຢຸດການບັນທຶກຊີຣີ"</string>
+ <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_empty_state" msgid="3407962945399698707">"ຍັງບໍ່ມີເອບພິໂສດທີ່ສາມາດເບິ່ງໄດ້ເທື່ອ.\nພວກມັນຈະຖືກບັນທຶອຶກເມື່ອມີການສາຍ."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d ນາທີ)</item>
+ <item quantity="one">(%1$d ນາທີ) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"ມື້ນີ້"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"ມື້ອື່ນ"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"ມື້ວານນີ້"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index b9ff042e..88afdec0 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -159,11 +159,11 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Tik garso įrašas"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Silpnas signalas"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Nėra interneto ryšio"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Šio kanalo negalima leisti iki <xliff:g id="END_TIME_1">%1$s</xliff:g>, nes visi derintuvai naudojami kitoms programoms įrašyti. \n\nPaspauskite mygtuką dešinėn, kad galėtumėte koreguoti tvarkaraštį.</item>
- <item quantity="few">Šio kanalo negalima leisti iki <xliff:g id="END_TIME_1">%1$s</xliff:g>, nes visi derintuvai naudojami kitoms programoms įrašyti. \n\nPaspauskite mygtuką dešinėn, kad galėtumėte koreguoti tvarkaraštį.</item>
- <item quantity="many">Šio kanalo negalima leisti iki <xliff:g id="END_TIME_1">%1$s</xliff:g>, nes visi derintuvai naudojami kitoms programoms įrašyti. \n\nPaspauskite mygtuką dešinėn, kad galėtumėte koreguoti tvarkaraštį.</item>
- <item quantity="other">Šio kanalo negalima leisti iki <xliff:g id="END_TIME_1">%1$s</xliff:g>, nes visi derintuvai naudojami kitoms programoms įrašyti. \n\nPaspauskite mygtuką dešinėn, kad galėtumėte koreguoti tvarkaraštį.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Šio kanalo negalima leisti iki <xliff:g id="END_TIME_1">%1$s</xliff:g>, nes įrašomi kiti kanalai. \n\nPaspauskite mygtuką dešinėn, kad galėtumėte koreguoti įrašymo tvarkaraštį.</item>
+ <item quantity="few">Šio kanalo negalima leisti iki <xliff:g id="END_TIME_1">%1$s</xliff:g>, nes įrašomi kiti kanalai. \n\nPaspauskite mygtuką dešinėn, kad galėtumėte koreguoti įrašymo tvarkaraštį.</item>
+ <item quantity="many">Šio kanalo negalima leisti iki <xliff:g id="END_TIME_1">%1$s</xliff:g>, nes įrašomi kiti kanalai. \n\nPaspauskite mygtuką dešinėn, kad galėtumėte koreguoti įrašymo tvarkaraštį.</item>
+ <item quantity="other">Šio kanalo negalima leisti iki <xliff:g id="END_TIME_1">%1$s</xliff:g>, nes įrašomi kiti kanalai. \n\nPaspauskite mygtuką dešinėn, kad galėtumėte koreguoti įrašymo tvarkaraštį.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Nėra pavadinimo"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanalas užblokuotas"</string>
@@ -200,6 +200,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Programai „Live TV“ reikalingas leidimas skaityti TV įrašus."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Nustatykite šaltinius"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Tiesioginiuose kanaluose derinamos tradicinių TV kanalų ir programų srautu perduodamų kanalų funkcijos. \n\nPradėkite nustatydami jau įdiegtų kanalų šaltinius. Arba naršykite „Google Play“ parduotuvę, kur rasite daugiau tiesioginius kanalus teikiančių programų."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Įrašai ir tvarkaraščiai"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 min."</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 min."</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 val."</string>
@@ -208,6 +209,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Suplanuota"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serialas"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Kiti"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Kanalo neįmanoma įrašyti."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Programos neįmanoma įrašyti."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Programa „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ suplanuota įrašyti"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Įrašoma „<xliff:g id="PROGRAMNAME">%1$s</xliff:g>“ nuo dabar iki <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Visas tvarkaraštis"</string>
@@ -245,9 +248,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Leisti nuo pradžios"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Tęsti ir leisti"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Ištrinti"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Ištrinti įrašus"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Tęsti"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g> sezonas"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Žr. tvarkaraštį"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Skaityti daugiau"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Įrašų ištrynimas"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Pasirinkite serijas, kurias norėtumėte ištrinti. Jų nebus galima atkurti, kai ištrinsite."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Nėra jokių įr., kuriuos b. gal. ištr."</string>
@@ -266,17 +271,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritetas"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Didžiausias"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Mažiausias"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Ne. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanalai"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Bet koks"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Pasirinkti prioritetą"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Jei nepakanka derintuvų programoms įrašyti vienu metu, bus įrašomos tik tos programos, kurių prioritetas yra didžiausias."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Kai vienu metu bus per daug įrašomų programų, bus įrašomos tik aukštesnio prioriteto programos."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -290,17 +294,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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_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="8059817161905528708">"Įrašyta dalis bus išsaugota DVR bibliotekoje."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Į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>
@@ -320,6 +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>
+ <!-- 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>
@@ -334,17 +350,25 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Dėl radijo imtuvo konfliktų bus įrašyta tik dalis."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Dėl radijo imtuvo konfliktų nebus įrašyta."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Dar nėra suplanuota jokių įrašymo veiksmų.\nĮrašymo veiksmą galite suplanuoti iš programų vadovo."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Kitos %1$d dienos įrašymo tvarkaraštis</item>
- <item quantity="few">Kitų %1$d dienų įrašymo tvarkaraštis</item>
- <item quantity="many">Kitos %1$d dienos įrašymo tvarkaraštis</item>
- <item quantity="other">Kitų %1$d dienų įrašymo tvarkaraštis</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d įrašo nesuderinamumas</item>
+ <item quantity="few">%1$d įrašų nesuderinamumai</item>
+ <item quantity="many">%1$d įrašo nesuderinamumo</item>
+ <item quantity="other">%1$d įrašų nesuderinamumų</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Nustatymai"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Atgal"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Anuliuoti"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Serijos nustatymai"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Pradėti serijos įrašymą"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Sustabd. serijos įrašymą"</string>
+ <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>
<string name="dvr_series_schedules_empty_state" msgid="3407962945399698707">"Nėra jokių serijų.\nSerijos bus įrašytos, kai jų bus."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d minutė)</item>
+ <item quantity="few">(%1$d minutės)</item>
+ <item quantity="many">(%1$d minutės)</item>
+ <item quantity="other">(%1$d minučių)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Šiandien"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Rytoj"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Vakar"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 4eca4f11..00021bca 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -157,10 +157,10 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Tikai audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Vājš signāls"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Nav interneta savienojuma."</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="zero">Šo kanālu nevar atskaņot līdz <xliff:g id="END_TIME_1">%1$s</xliff:g>, jo visi uztvērēji tiek izmantoti citu programmu ierakstīšanai. \n\nNospiediet “Pa labi”, lai mainītu ierakstīšanas grafiku.</item>
- <item quantity="one">Šo kanālu nevar atskaņot līdz <xliff:g id="END_TIME_1">%1$s</xliff:g>, jo visi uztvērēji tiek izmantoti citu programmu ierakstīšanai. \n\nNospiediet “Pa labi”, lai mainītu ierakstīšanas grafiku.</item>
- <item quantity="other">Šo kanālu nevar atskaņot līdz <xliff:g id="END_TIME_1">%1$s</xliff:g>, jo visi uztvērēji tiek izmantoti citu programmu ierakstīšanai. \n\nNospiediet “Pa labi”, lai mainītu ierakstīšanas grafiku.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="zero">Šo kanālu nevar atskaņot līdz plkst. <xliff:g id="END_TIME_1">%1$s</xliff:g>, jo tiek ierakstīti citi kanāli. \n\nNospiediet “Pa labi”, lai pielāgotu ierakstīšanas grafiku.</item>
+ <item quantity="one">Šo kanālu nevar atskaņot līdz plkst. <xliff:g id="END_TIME_1">%1$s</xliff:g>, jo tiek ierakstīti citi kanāli. \n\nNospiediet “Pa labi”, lai pielāgotu ierakstīšanas grafiku.</item>
+ <item quantity="other">Šo kanālu nevar atskaņot līdz plkst. <xliff:g id="END_TIME_1">%1$s</xliff:g>, jo tiek ierakstīti citi kanāli. \n\nNospiediet “Pa labi”, lai pielāgotu ierakstīšanas grafiku.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Nav nosaukuma"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanāls bloķēts"</string>
@@ -196,6 +196,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Lietotnei Tiešraides kanāli ir nepieciešama atļauja lasīt TV sarakstus."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Iestatiet avotus"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Lietotnē Dzīvie kanāli varat skatīties tradicionālos TV kanālus, kā arī straumēt kanālus no citām lietotnēm. \n\nLai sāktu, iestatiet jau instalētos kanālu avotus. Vai pārlūkojiet Google Play veikalu, kurā pieejamas citas dzīvo kanālu lietotnes."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Ieraksti un grafiki"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minūtes"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minūtes"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 stunda"</string>
@@ -204,6 +205,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Ieplānotie"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Sērijas"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Citas"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Kanālu nevar ierakstīt."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Programmu nevar ierakstīt."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Tika ieplānota programmas <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ierakstīšana."</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Tiek ierakstīta programma <xliff:g id="PROGRAMNAME">%1$s</xliff:g>, sākot no šī brīža līdz: <xliff:g id="ENDTIME">%2$s</xliff:g>."</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Pilns grafiks"</string>
@@ -236,9 +239,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Atskaņot no sākuma"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Atsākt atskaņošanu"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Dzēst"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Dzēst ierakstus"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Atsākt"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. sezona"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Skatīt grafiku"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Uzzināt vairāk"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Ierakstu dzēšana"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Atlasiet sērijas, kuras vēlaties dzēst. Pēc dzēšanas tās nevarēs atjaunot."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Nav neviena ieraksta, ko dzēst."</string>
@@ -256,17 +261,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritāte"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Visaugstākā"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Viszemākā"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nr. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanāli"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Jebkurš"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Prioritātes izvēle"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Ja nav pietiekami daudz kanālu meklētāju, lai vienlaicīgi ierakstītu vairākas programmas, tiek ierakstītas tikai programmas ar augstāku prioritāti."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Ja vēlaties ierakstīt pārāk daudz programmu vienlaikus, tiks ierakstītas tikai programmas ar augstāku prioritāti."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -280,17 +284,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Ierakstītā daļa tiks saglabāta DVR bibliotēkā."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -306,6 +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>
+ <!-- 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>
@@ -319,16 +335,23 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Kanālu meklētāja konfliktu dēļ tiks ierakstīts daļēji"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Kanālu meklētāja konfliktu dēļ netiks ierakstīts"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Grafikā pašlaik nevienas pārraides ierakstīšana nav ieplānota.\nVarat ieplānot ierakstīšanu no pārraižu ceļveža."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="zero">Ierakstīšanas grafiks nākamajām %1$d dienām</item>
- <item quantity="one">Ierakstīšanas grafiks nākamajai %1$d dienai</item>
- <item quantity="other">Ierakstīšanas grafiks nākamajām %1$d dienām</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="zero">%1$d ierakstīšanas konflikti</item>
+ <item quantity="one">%1$d ierakstīšanas konflikts</item>
+ <item quantity="other">%1$d ierakstīšanas konflikti</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Iestatījumi"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Atpakaļ"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Atsaukt"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Sērijas iestatījumi"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Sākt sērijas ierakstīšanu"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Apturēt sērijas ierakst."</string>
+ <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_empty_state" msgid="3407962945399698707">"Nav pieejama neviena sērija.\nTās tiks ierakstītas, kad būs pieejamas."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="zero">(%1$d minūtes)</item>
+ <item quantity="one">(%1$d minūte)</item>
+ <item quantity="other">(%1$d minūtes)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Šodien"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Rīt"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Vakar"</string>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index 2e985363..566377a8 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Само звук"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Слаб сигнал"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Нема интернет-врска"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Каналов не може да се пушти сѐ до <xliff:g id="END_TIME_1">%1$s</xliff:g> затоа што сите приемници се користат за снимање други програми. \n\nДопрете Десно за приспособување на распоредот на снимање.</item>
- <item quantity="other">Каналов не може да се пушти сѐ до <xliff:g id="END_TIME_1">%1$s</xliff:g> затоа што сите приемници се користат за снимање други програми. \n\nДопрете Десно за приспособување на распоредот на снимање.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Каналов не може да се пушти сѐ до <xliff:g id="END_TIME_1">%1$s</xliff:g> бидејќи се снимаат други канали. \n\nДопрете “Десно“ за приспособување на распоредот на снимање.</item>
+ <item quantity="other">Каналов не може да се пушти сѐ до <xliff:g id="END_TIME_1">%1$s</xliff:g> бидејќи се снимаат други канали. \n\nДопрете “Десно“ за приспособување на распоредот на снимање.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Без наслов"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Каналот е блокиран"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"На каналите во живо им е потребна дозвола за да ги читаат ТВ-листите."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Поставете ги изворите"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"ТВ каналите во живо го комбинираат искуството на традиционалните ТВ канали со преносот на канали што го овозможуваат апликациите. \n\nЗапочнете со поставување на изворите на канали што се веќе инсталирани. Или прелистајте во Google Play Store за повеќе апликации што нудат ТВ канали во живо."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Снимки и распореди"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 минути"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 минути"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 час"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Закажани"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Серии"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Други"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Каналот не може да се сними."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Програмата не може да се сними."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> е закажана за снимање."</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Се снима <xliff:g id="PROGRAMNAME">%1$s</xliff:g> од сега до <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Целосен распоред"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Репродуцирај отпочеток"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Избриши ги снимките"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Изберете ги епизодите што сакате да ги избришете. Не може да се вратат откако ќе се избришат."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Нема снимки за бришење."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Приоритет"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Највисок"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Најнизок"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Бр. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Канали"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Кој било"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Изберете приоритет"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Кога нема доволно приемници за снимање програми во исто време, ќе се снимат само програмите со повисоки приоритети."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Снимениот дел ќе се зачува во DVR-збирката."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Снимените содржини ќе се зачуваат."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Ќе се сними делумно поради конфликти со приемникот."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Нема да се сними поради конфликти со приемникот."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Сѐ уште нема закажани снимања.\nМоже да закажете снимање од програмскиот водич."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Распоред за снимање за наредните %1$d ден</item>
- <item quantity="other">Распоред за снимање за наредните %1$d дена</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d конфликт на снимање</item>
+ <item quantity="other">%1$d конфликти на снимање</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Поставки"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Назад"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Врати"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Поставки за серии"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Започни со снимање серија"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Сопри го снимањето серија"</string>
+ <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_empty_state" msgid="3407962945399698707">"Не се достапни епизоди.\nЌе се снимат штом ќе бидат достапни."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d минута)</item>
+ <item quantity="other">(%1$d минути)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Денес"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Утре"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Вчера"</string>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index 78024a75..e29a8755 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -153,9 +153,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"ഓഡിയോ മാത്രം"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"സിഗ്‌നൽ ദുർബലമാണ്"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"ഇന്റർനെറ്റ് കണക്ഷനില്ല"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other"><xliff:g id="END_TIME_1">%1$s</xliff:g> വരെ ഈ ചാനൽ പ്ലേ ചെയ്യാൻ കഴിയില്ല, കാരണം മറ്റ് പ്രോഗ്രാമുകൾ റെക്കോർഡ് ചെയ്യുന്നതിന് ട്യൂണറുകൾ ഉപയോഗിച്ച് കൊണ്ടിരിക്കുകയാണ്. \n\nറെക്കോർഡിംഗ് ഷെഡ്യൂൾ ക്രമപ്പെടുത്തുന്നതിന് വലത് അമർത്തുക.</item>
- <item quantity="one"><xliff:g id="END_TIME_0">%1$s</xliff:g> വരെ ഈ ചാനൽ പ്ലേ ചെയ്യാൻ കഴിയില്ല, കാരണം മറ്റ് പ്രോഗ്രാമുകൾ റെക്കോർഡ് ചെയ്യുന്നതിന് ട്യൂണർ ഉപയോഗിച്ച് കൊണ്ടിരിക്കുകയാണ്. \n\nറെക്കോർഡിംഗ് ഷെഡ്യൂൾ ക്രമപ്പെടുത്തുന്നതിന് വലത് അമർത്തുക.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">മറ്റ് ചാനലുകൾ റെക്കോർഡ് ചെയ്തുകൊണ്ടിരിക്കുന്നതിനാൽ <xliff:g id="END_TIME_1">%1$s</xliff:g> വരെ ഈ ചാനൽ പ്ലേ ചെയ്യാൻ കഴിയില്ല. \n\nറെക്കോർഡിംഗ് ഷെഡ്യൂൾ ക്രമപ്പെടുത്തുന്നതിന് വലത് അമർത്തുക.</item>
+ <item quantity="one">മറ്റൊരു ചാനൽ റെക്കോർഡ് ചെയ്തുകൊണ്ടിരിക്കുന്നതിനാൽ <xliff:g id="END_TIME_0">%1$s</xliff:g> വരെ ഈ ചാനൽ പ്ലേ ചെയ്യാൻ കഴിയില്ല. \n\nറെക്കോർഡിംഗ് ഷെഡ്യൂൾ ക്രമപ്പെടുത്തുന്നതിന് വലത് അമർത്തുക.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"ശീർഷകമൊന്നുമില്ല"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"ചാനൽ തടഞ്ഞിരിക്കുന്നു"</string>
@@ -190,6 +190,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"TV ലിസ്റ്റിംഗുകൾ വായിക്കുന്നതിന് തത്സമയ ചാനലുകൾക്ക് അനുമതി ആവശ്യമാണ്."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"നിങ്ങളുടെ ഉറവിടങ്ങൾ സജ്ജമാക്കുക"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"പരമ്പരാഗത ടിവി ചാനലുകളുടെയും ആപ്‌സ് നൽകുന്ന സ്‌ട്രീമിംഗ് ചാനലുകളുടെയും അനുഭവമാണ് തത്സമയ ചാനലുകൾ ഒരുമിപ്പിക്കുന്നത്. \n\nഇതിനകം തന്നെ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുള്ള ചാനൽ ഉറവിടങ്ങൾ സജ്ജമാക്കിക്കൊണ്ട് തുടങ്ങുക. അല്ലെങ്കിൽ Google Play സ്റ്റോറിൽ നിന്ന് തത്സമയ ചാനലുകൾ നൽകുന്ന കൂടുതൽ ആപ്‌സ് ബ്രൗസുചെയ്യുക."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"റെക്കോർഡിംഗുകളും ഷെഡ്യൂളുകളും"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 മിനിറ്റ്"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 മിനിറ്റ്"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 മണിക്കൂർ"</string>
@@ -198,6 +199,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"ഷെഡ്യൂൾചെയ്‌തു"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"സീരീസ്"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"മറ്റുള്ളവ"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"ചാനൽ റെക്കോർഡുചെയ്യാൻ കഴിയില്ല."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"പ്രോഗ്രാം റെക്കോർഡുചെയ്യാൻ കഴിയില്ല."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"റെക്കോർഡുചെയ്യുന്നതിന് <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ഷെഡ്യൂൾ ചെയ്തിരിക്കുന്നു"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"ഇപ്പോൾ മുതൽ <xliff:g id="ENDTIME">%2$s</xliff:g> വരെ <xliff:g id="PROGRAMNAME">%1$s</xliff:g> റെക്കോർഡുചെയ്യുന്നു"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"പൂർണ്ണമായ ഷെഡ്യൂൾ"</string>
@@ -225,9 +228,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"തുടക്കം മുതൽ പ്ലേ ചെയ്യുക"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"റെക്കോർഡിംഗ് ഇല്ലാതാക്കൂ"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"ഇല്ലാതാക്കാൻ ആഗ്രഹിക്കുന്ന എപ്പിസോഡുകൾ തിരഞ്ഞെടുക്കുക. ഇല്ലാതാക്കിക്കഴിഞ്ഞാൽ അവ വീണ്ടെടുക്കാനാവില്ല."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"ഇല്ലാതാക്കാൻ റെക്കോർഡിംഗുകൾ ഒന്നുമില്ല."</string>
@@ -244,17 +249,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"മു‌ൻഗണന"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"ഏറ്റവും ഉയർന്നത്"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"ഏറ്റവും കുറഞ്ഞത്"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"നമ്പർ <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"ചാനലുകൾ"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"ഏതെങ്കിലും"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"മുൻഗണന തിരഞ്ഞെടുക്കുക"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"ഒരേ സമയം പരിപാടികൾ റെക്കോർഡുചെയ്യുന്നതിന് ആവശ്യമായത്ര ട്യൂണറുകൾ ഇല്ലാത്ത സമയത്ത്, ഉയർന്ന മുൻഗണനകളുള്ള പ്രോഗ്രാമുകൾ മാത്രം റെക്കോർഡുചെയ്യപ്പെടും."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -268,17 +272,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"റെക്കോർഡുചെയ്തിട്ടുള്ള ഭാഗം DVR ലൈബ്രറിയിൽ സംരക്ഷിക്കപ്പെടും."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"റെക്കോർഡുചെയ്തിട്ടുള്ള ഉള്ളടക്കം സംരക്ഷിക്കപ്പെടും."</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>
@@ -296,6 +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>
+ <!-- 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>
@@ -308,15 +324,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ട്യൂണർ പൊരുത്തക്കേടുള്ളതിനാൽ ഭാഗികമായി റെക്കോർഡ് ചെയ്യും."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ട്യൂണർ പൊരുത്തക്കേടുള്ളതിനാൽ റെക്കോർഡ് ചെയ്യില്ല."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ഷെഡ്യൂളിൽ ഇതുവരെയും റെക്കോർഡിംഗുകളൊന്നും ഇല്ല.\nപ്രോഗ്രാം ഗൈഡിൽ നിന്ന് നിങ്ങൾക്ക് റെക്കോർഡിംഗ് ഷെഡ്യൂൾ ചെയ്യാവുന്നതാണ്."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">അടുത്ത %1$d ദിവസത്തേക്കുള്ള റെക്കോർഡിംഗ് ഷെഡ്യൂൾ</item>
- <item quantity="one">അടുത്ത %1$d ദിവസത്തേക്കുള്ള റെക്കോർഡിംഗ് ഷെഡ്യൂൾ</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d റെക്കോർഡിംഗ് പൊരുത്തക്കേടുകൾ</item>
+ <item quantity="one">%1$d റെക്കോർഡിംഗ് പൊരുത്തക്കേട്</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"ക്രമീകരണം"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"മടങ്ങുക"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"പഴയപടിയാക്കുക"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"സീരീസ് ക്രമീകരണം"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"സീരീസ് റെക്കോർഡുചെയ്യുന്നത് ആരംഭിക്കുക"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"സീരീസ് റെക്കോർഡുചെയ്യുന്നത് നിർത്തുക"</string>
+ <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_empty_state" msgid="3407962945399698707">"എപ്പിസോഡുകളൊന്നും ലഭ്യമല്ല.\nലഭ്യമായിക്കഴിഞ്ഞാൽ അവ റെക്കോർഡ് ചെയ്യപ്പെടും."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d മിനിറ്റ്)</item>
+ <item quantity="one">(%1$d മിനിറ്റ്) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"ഇന്ന്"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"നാളെ"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"ഇന്നലെ"</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index f266b4a0..e99f8a0e 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Зөвхөн аудио"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Дохио муу"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Интернэт холболт байхгүй"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Бүх суваг солигчийг өөр хөтөлбөр бичихэд ашиглаж байгаа тул энэ сувгийг <xliff:g id="END_TIME_1">%1$s</xliff:g> хүртэл тоглуулах боломжгүй. \n\nБичих хуваарийг тохируулахын тулд Барууныг дарна уу.</item>
- <item quantity="one">Суваг солигчийг өөр хөтөлбөр бичихэд ашиглаж байгаа тул энэ сувгийг <xliff:g id="END_TIME_0">%1$s</xliff:g> хүртэл тоглуулах боломжгүй. \n\nБичих хуваарийг тохируулахын тулд Барууныг дарна уу.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Бусад сувгийг бичиж байгаа тул энэ сувгийг <xliff:g id="END_TIME_1">%1$s</xliff:g> хүртэл тоглуулах боломжгүй. \n\nБичих хуваарийг тохируулахын тулд Баруун товчлуурыг дарна уу.</item>
+ <item quantity="one">Өөр сувгийг бичиж байгаа тул энэ сувгийг <xliff:g id="END_TIME_0">%1$s</xliff:g> хүртэл тоглуулах боломжгүй. \n\nБичих хуваарийг тохируулахын тулд Баруун товчлуурыг дарна уу.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Гарчиггүй"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Сувгийг хориглосон"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Шууд сувагт TВ-н жагсаалтыг унших зөвшөөрөл шаардлагатай."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Эх сурвалжаа тохируулах"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Шууд суваг нь апп-с хангадаг TV-н уламжлалт урсгал сувгийн хэрэглээтэй хосолдог. \n\nЭхлүүлэхийн тулд өмнө нь суулгасан сувгийн эх сурвалжийг тохируулаарай. Эсвэл Google Play Store-с шууд суваг дамжуулдаг бусад апп-г хайгаарай."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Бичлэг, хуваарь"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 минут"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 минут"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 цаг"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Хуваарилсан"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Цуврал"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Бусад"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Сувгийг бичих боломжгүй."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Хөтөлбөрийг бичих боломжгүй."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>-г бичихээр товлосон"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>-г одооноос <xliff:g id="ENDTIME">%2$s</xliff:g> хүртэл бичиж байна"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Бүтэн цагийн хуваарь"</string>
@@ -225,9 +228,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Эхнээс нь тоглуулах"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Бичлэгийг устгах"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Устгах ангийг сонгоно уу. Устгасан тохиолдолд дахин сэргээх боломжгүй."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Устгах ямар ч бичлэг алга."</string>
@@ -244,17 +249,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Ач холбогдол"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Хамгийн өндөр"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Хамгийн бага"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Үгүй. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Суваг"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Дурын"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Ач холбогдол сонгох"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Хөтөлбөрийг нэгэн зэрэг бичих хангалттай тохируулагч байхгүй бол зөвхөн өндөр ач холбогдол бүхий хөтөлбөрийг бичих болно."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -268,17 +272,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Бичсэн хэсгийг DVR санд хадгалах болно."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Бичсэн агуулгыг хадгална."</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>
@@ -296,6 +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>
+ <!-- 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>
@@ -308,15 +324,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Тааруулагчийн алдааны улмаас хэсэгчлэн бичих болно."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Тааруулагч алдаатай тул бичихгүй."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Одоогоор хуваарьт бичлэг байхгүй байна.\nТа ТВ хөтөлбөрөөс бичлэг товлох боломжтой."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Дараагийн %1$d өдрийн бичих хуваарь</item>
- <item quantity="one">Дараагийн %1$d өдрийн бичих хуваарь</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d бичлэгийн зөрчил</item>
+ <item quantity="one">%1$d бичлэгийн зөрчил</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Тохиргоо"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Буцах"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Болих"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Цувралын тохиргоо"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Цувралыг бичиж эхлэх"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Цувралыг бичихээ зогсоох"</string>
+ <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_empty_state" msgid="3407962945399698707">"Ямар ч анги алга.\nТэд боломжтой болсон үедээ бичих болно."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d минут)</item>
+ <item quantity="one">(%1$d минут) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Өнөөдөр"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Маргааш"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Өчигдөр"</string>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index ac764c2f..1888e9de 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"फक्त ऑडिओ"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"खराब सिग्नल"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"कोणतेही इंटरनेट कनेक्शन नाही"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">हे चॅनेल <xliff:g id="END_TIME_1">%1$s</xliff:g> पर्यंत प्ले केले जाऊ शकत नाही कारण ट्यू्नर इतर प्रोग्राम रेकॉर्ड करण्यासाठी वापरले जात आहे. \n\nरेकॉर्डिंग अनुसूची समायोजित करण्यासाठी उजवीकडे दाबा.</item>
- <item quantity="other">हे चॅनेल <xliff:g id="END_TIME_1">%1$s</xliff:g> पर्यंत प्ले केले जाऊ शकत नाही कारण ट्यू्नर इतर प्रोग्राम रेकॉर्ड करण्यासाठी वापरले जात आहे. \n\nरेकॉर्डिंग अनुसूची समायोजित करण्यासाठी उजवीकडे दाबा.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">दुसरे चॅनेल रेकॉर्ड केले जात असल्याने <xliff:g id="END_TIME_1">%1$s</xliff:g> पर्यंत हे चॅनेल प्ले केले जाऊ शकत नाही. \n\nरेकॉर्डिंग अनुसूची समायोजित करण्यासाठी उजवीकडे दाबा.</item>
+ <item quantity="other">दुसरे चॅनेल रेकॉर्ड केले जात असल्याने <xliff:g id="END_TIME_1">%1$s</xliff:g> पर्यंत हे चॅनेल प्ले केले जाऊ शकत नाही. \n\nरेकॉर्डिंग अनुसूची समायोजित करण्यासाठी उजवीकडे दाबा.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"शीर्षक नाही"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"चॅनेल अवरोधित केले"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"थेट चॅनेलना टीव्ही सूचींचे वाचन करण्यासाठी परवानगीची आवश्यकता आहे."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"आपले स्रोत सेट करा"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"थेट चॅनेल पारंपारिक TV चॅनेलच्या अनुभवास अॅप्सने प्रदान केलेल्या प्रवाहित केलेल्या चॅनेलसह एकत्रित करतात. \n\nआधीपासून स्थापित केलेले चॅनेल स्रोत सेट करून प्रारंभ करा किंवा थेट चॅनेल प्रदान करणार्‍या आणखी अॅप्ससाठी Google Play स्टोअर ब्राउझ करा."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"रेकॉर्डिंग आणि अनुसूची"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 मिनिटे"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 मिनिटे"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 तास"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"अनुसूचित"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"मालिका"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"इतर"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"चॅनेल रेकॉर्ड केले जाऊ शकत नाही."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"प्रोग्राम रेकॉर्ड केला जाऊ शकतो."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"रेकॉर्ड करण्‍यासाठी <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ची अनुसूची केली गेली"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> चे रेकॉर्डिंग आतापासून <xliff:g id="ENDTIME">%2$s</xliff:g> पर्यंत"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"पूर्ण अनुसूची"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"सुरूवातीपासून प्ले करा"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"रेकॉर्डिंग हटवा"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"आपण हटवू इच्छिता ते भाग निवडा. एकदा हटविले की ते पुनर्प्राप्त केले जाऊ शकत नाहीत."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"हटविण्यासाठी कोणतेही रेकॉर्डिंग नाहीत."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"प्राधान्य"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"सर्वोच्च"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"सर्वात निम्न"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"<xliff:g id="RANK">%1$d</xliff:g> क्र."</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"चॅनेल"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"कोणतेही"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"प्राधान्य निवडा"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"एकाच वेळी प्रोग्राम रेकॉर्ड करण्यासाठी पर्याप्त ट्यूनर नसतात तेव्हा, केवळ अधिक प्राधान्ये असलेले प्रोग्राम रेकॉर्ड केले जातील."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"रेकॉर्ड केलेला भाग DVR लायब्ररीमध्ये जतन केला जाईल."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"रेकॉर्ड केलेली सामग्री जतन केली जाईल."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ट्यूनर विरोधामुळे अंशतः रेकॉर्ड केले जाईल."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ट्यूनर विरोधामुळे रेकॉर्ड केले जाणार नाही."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"अद्याप कोणतेही रेकॉर्डिंग शेड्यूल केलेले नाही\nआपण कार्यक्रम मार्गदर्शकामधून रेकॉर्डिंग शेड्यूल करू शकता."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">पुढील %1$d दिवसासाठी रेकॉर्डिंग अनुसूची</item>
- <item quantity="other">पुढील %1$d दिवसासाठी रेकॉर्डिंग अनुसूची</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d रेकॉर्डिंग संबंधी विरोध</item>
+ <item quantity="other">%1$d रेकॉर्डिंग संबंधी विरोध</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"सेटिंग्ज"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"मागे या"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"पूर्ववत करा"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"मालिका सेटिंग्ज"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"मालिका रेकॉर्ड करणे प्रारंभ करा"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"मालिका रेकॉर्ड करणे थांबवा"</string>
+ <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_empty_state" msgid="3407962945399698707">"कोणतेही भाग उपलब्ध नाहीत.\nते उपलब्ध झाल्यावर रेकॉर्ड केले जातील."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d मिनिट)</item>
+ <item quantity="other">(%1$d मिनिटे)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"आज"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"उद्या"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"काल"</string>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index f7f4ab8d..816dee35 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Audio sahaja"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Isyarat lemah"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Tiada sambungan Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Saluran ini tidak boleh dimainkan sehingga <xliff:g id="END_TIME_1">%1$s</xliff:g> kerana semua penala digunakan untuk rakaman program lain. \n\nTekan Kanan untuk melaraskan jadual rakaman.</item>
- <item quantity="one">Saluran ini tidak boleh dimainkan sehingga <xliff:g id="END_TIME_0">%1$s</xliff:g> kerana penala digunakan untuk rakaman program lain. \n\nTekan Kanan untuk melaraskan jadual rakaman.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Saluran ini tidak dapat dimainkan hingga <xliff:g id="END_TIME_1">%1$s</xliff:g> kerana saluran lain sedang dirakamkan. \n\nTekan Kanan untuk melaraskan jadual rakaman.</item>
+ <item quantity="one">Saluran ini tidak dapat dimainkan hingga <xliff:g id="END_TIME_0">%1$s</xliff:g> kerana saluran lain sedang dirakamkan. \n\nTekan Kanan untuk melaraskan jadual rakaman.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Tiada tajuk"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Saluran disekat"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Saluran Langsung memerlukan kebenaran untuk membaca penyenaraian TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Sediakan sumber anda"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Saluran langsung menggabungkan pengalaman saluran TV tradisional dengan saluran penstriman yang disediakan oleh apl. \n\nMulakan dengan menyediakan sumber saluran yang sudah dipasang. Selain itu, semak imbas Gedung Google Play untuk mendapatkan lebih banyak apl yang menawarkan saluran langsung."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Rakaman &amp; jadual"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minit"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minit"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 jam"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Dijadualkan"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Siri"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Lain-lain"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Saluran ini tidak boleh dirakam."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Rancangan ini tidak boleh dirakam."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> telah dijadualkan untuk dirakamkan"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Merakam <xliff:g id="PROGRAMNAME">%1$s</xliff:g> mulai sekarang hingga <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Jadual penuh"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Mainkan dari mula"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Sbg smula prses main"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Padam"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Padam rakaman"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Sambung semula"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Musim <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Lihat jadual"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Baca lagi"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Padam rakaman"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Pilih episod yang anda ingin padamkan. Episod ini tidak boleh dipulihkan setelah dipadamkan."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Tiada rakaman untuk dipadamkan."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Keutamaan"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Tertinggi"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Terendah"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nombor <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Saluran"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Sebarang"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Pilih keutamaan"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Apabila tidak cukup penala untuk merekodkan program secara serentak, program yang mempunyai keutamaan lebih tinggi akan direkodkan."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Apabila ada terlalu banyak rancangan yang ingin dirakamkan secara serentak, rancangan yang berkeutamaan lebih tinggi sahaja yang akan dirakamkan."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Bahagian yang dirakam akan disimpan dalam pustaka DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Sebahagian sahaja yang akan dirakamkan kerana konflik penala."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Tidak akan dirakamkan kerana konflik penala."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Belum ada lagi rakaman yang dijadualkan.\nAnda boleh menjadualkan rakaman daripada panduan rancangan."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Jadual rakaman untuk %1$d hari akan datang</item>
- <item quantity="one">Jadual rakaman untuk %1$d hari akan datang</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d konflik rakaman</item>
+ <item quantity="one">%1$d konflik rakaman</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Tetapan"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Kembali"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Buat asal"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Tetapan siri"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Mulakan rakaman siri"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Hentikan rakaman siri"</string>
+ <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_empty_state" msgid="3407962945399698707">"Tiada episod yang tersedia.\nEpisod ini akan dirakamkan apabila sudah tersedia."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minit)</item>
+ <item quantity="one">(%1$d minit) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Hari ini"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Esok"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Semalam"</string>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index c333b646..1ab6baf7 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"အသံ သီးသန့်"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"လှိုင်းဆွဲအားနည်းသည်"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"အင်တာနက်ချိတ်ဆက်မှု မရှိပါ"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">လိုင်းဖမ်းစက်ကို အခြားအစီအစဉ် ဖမ်းယူရာ၌ အသုံးပြုနေသောကြောင့် ဤချန်နယ်အား <xliff:g id="END_TIME_1">%1$s</xliff:g> အထိ ဖွင့်၍ရမည်မဟုတ်ပါ။ \n\nဖမ်းယူခြင်းအချိန်ဇယားကို ချိန်ညှိရန် ညာဘက်ကိုနှိပ်ပါ။</item>
- <item quantity="one">လိုင်းဖမ်းစက်ကို အခြားအစီအစဉ် ဖမ်းယူရာ၌ အသုံးပြုနေသောကြောင့် ဤချန်နယ်အား <xliff:g id="END_TIME_0">%1$s</xliff:g> အထိ ဖွင့်၍ရမည်မဟုတ်ပါ။ \n\nဖမ်းယူခြင်းအချိန်ဇယားကို ချိန်ညှိရန် ညာဘက်ကိုနှိပ်ပါ။</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">အခြားချန်နယ်လိုင်းများကို ဖမ်းယူနေသောကြောင့် ဤချန်နယ်လိုင်းကို <xliff:g id="END_TIME_1">%1$s</xliff:g> အထိ ဖွင့်၍ရမည်မဟုတ်ပါ။ \n\nဖမ်းယူခြင်းအချိန်ဇယားကို ချိန်ညှိရန် ညာဘက်ကိုနှိပ်ပါ။</item>
+ <item quantity="one">အခြားချန်နယ်လိုင်းကို ဖမ်းယူနေသောကြောင့် ဤချန်နယ်လိုင်းကို <xliff:g id="END_TIME_0">%1$s</xliff:g> အထိ ဖွင့်၍ရမည်မဟုတ်ပါ။ \n\nဖမ်းယူခြင်းအချိန်ဇယားကို ချိန်ညှိရန် ညာဘက်ကိုနှိပ်ပါ။</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"ခေါင်းစဉ် မပါ"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"ချာနယ် ပိတ်ဆို့ထား"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"တီဗီစာရင်းများကို ဖတ်ရှုရန် တိုက်ရိုက်ထုတ်လွှင့်သောချန်နယ်လိုင်းများတွင် ခွင့်ပြူချက်လိုအပ်သည်။"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"သင့်သတင်းအရင်းအမြစ်များကို တပ်ဆင်ပါ"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"တိုက်ရိုက်လွှင့်သည့် ချန်နယ်များသည် သမားရိုးကျ TV ချန်နယ်များနှင့် အက်ပ်မှလွှင့်ပေးသည့် ချန်နယ်များကို ပူးပေါင်းထားသည့်ခံစားမှုပင်ဖြစ်သည်။ \n\nထည့်သွင်းပြီးသား ချန်နယ်အရင်းမြစ်များကို တပ်ဆင်ခြင်းဖြင့် စတင်လိုက်ပါ။ သို့မဟုတ် တိုက်ရိုက်လွှင့်သည့် ချန်နယ်များပါဝင်သည့် နောက်ထပ်အက်ပ်များအတွက် Google Play Store တွင်ရှာပါ။"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"ဖမ်းယူခြင်းနှင့် အချိန်ဇယားမျာ"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"၁၀ မိနစ်"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"၃၀ မိနစ်"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"၁ နာရီ"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"စီစဉ်ထားသော"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"စီးရီး"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"အခြား"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"ချန်နယ်ကို မှတ်တမ်းတင်၍မရပါ။"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"ပရိုဂရမ်ကို မှတ်တမ်းတင်၍ မရပါ။"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ကို ဖမ်းယူရန် စီစဉ်ထားပါသည်"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ကို ယခုချိန်မှ <xliff:g id="ENDTIME">%2$s</xliff:g> အထိ ရိုက်ကူးမည်"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"အချိန်ဇယားအပြည့်အစုံ"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"အစမှနေ၍ ဖွင့်ရန်"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"ရုပ်သံကူးယူမှုဖျက်ပါ"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"သင်ဖျက်ပစ်လိုသော အခန်းဆက်များကို ရွေးပါ။ ဖျက်လိုက်သည်နှင့် ၎င်းတို့ကို ပြန်ဆည်ယူ၍ မရတော့ပါ။"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"ဖျက်ရန် ရုပ်သံဖမ်းယူမှုများ မရှိတော့ပါ။"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"ဦးစားပေးမှု"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"အမြင့်ဆုံး"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"အနိမ့်ဆုံး"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"နံပါတ် <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"ချန်နယ်များ"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"မည်သည့်အရာမဆို"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"ဦးစားပေးမှုကို ရွေးရန်"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"တစ်ချိန်တည်းတွင် အစီအစဉ်များကို ဖမ်းယူရန် လိုင်းဖမ်းစက် မလောက်ငှသည့်အခါ ဦးစားပေးမှု ပိုမိုမြင့်မားသည့် အစီအစဉ်များကိုသာ ဖမ်းယူသွားပါမည်။"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"ရိုက်ကူးထားသည့် အပိုင်းကို DVR စုစည်းမှုတွင် သိမ်းဆည်းသွားပါမည်။"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ဖမ်းယူထားသည့် အကြောင်းအရာကို သိမ်းဆည်းထားပါမည်။"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ချန်နယ်ချိန်ကိရိယာလိုင်းပူးနေ၍ တစ်ချို့ကိုသာ ဖမ်းယူနိုင်မည်။"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ချန်နယ်ချိန်ကိရိယာ လိုင်းပူးနေ၍ ဖမ်းယူနိုင်မည်မဟုတ်ပါ။"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"စီစဉ်ထားသည့် ဖမ်းယူမှုများ မရှိသေးပါ။\nဖမ်းယူမှုကို ပရိုဂရမ်လမ်းညွှန်အား ကြည့်ရှု၍ စီစဉ်နိုင်ပါသည်။"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">နောက် %1$d ရက်အတွက် ဖမ်းယူခြင်းအချိန်ဇယား</item>
- <item quantity="one">နောက် %1$d ရက်အတွက် ဖမ်းယူခြင်းအချိန်ဇယား</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">ရိုက်ကူးမှု %1$d ခု ပဋိပက္ခဖြစ်နေပါသည်</item>
+ <item quantity="one">ရိုက်ကူးမှု %1$d ခု ပဋိပက္ခဖြစ်နေပါသည်</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"ဆက်တင်များ"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"နောက်သို့"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"တစ်ဆင့် နောက်ပြန်ရန်"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"ဇာတ်လမ်းတွဲဆက်တင်များ"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"ဇာတ်လမ်းတွဲ စတင်ဖမ်းယူရန်"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"ဇာတ်လမ်းတွဲဖမ်းယူခြင်း ရပ်ရန်"</string>
+ <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_empty_state" msgid="3407962945399698707">"အပိုင်းငယ်များ မရနိုင်သေးပါ။\nရနိုင်သည်နှင့် ၎င်းတို့ကို ဖမ်းယူသွားပါမည်။"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d မိနစ်)</item>
+ <item quantity="one">(%1$d မိနစ်) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"ဒီနေ့"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"မနက်ဖြန်"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"မနေ့က"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 31862bbd..a2cf46cc 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Bare lyd"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Svakt signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Ingen Internett-tilkobling"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Denne kanalen kan ikke spilles av før <xliff:g id="END_TIME_1">%1$s</xliff:g> fordi alle tunerne brukes for opptak av andre programmer. \n\nTrykk til høyre for å justere tidsplanen for opptak.</item>
- <item quantity="one">Denne kanalen kan ikke spilles av før <xliff:g id="END_TIME_0">%1$s</xliff:g> fordi tuneren brukes for opptak av andre programmer. \n\nTrykk til høyre for å justere tidsplanen for opptak.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Denne kanalen kan ikke spilles av før <xliff:g id="END_TIME_1">%1$s</xliff:g> fordi andre kanaler blir tatt opp. \n\nTrykk høyre for å justere tidsplanen for opptak.</item>
+ <item quantity="one">Denne kanalen kan ikke spilles av før <xliff:g id="END_TIME_0">%1$s</xliff:g> fordi en annen kanal blir tatt opp. \n\nTrykk høyre for å justere tidsplanen for opptak.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Ingen tittel"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanalen er blokkert"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Live TV trenger tillatelse til å lese TV-programoversikten."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Konfigurer kanalkildene dine"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Med direkte-TV får du både den tradisjonelle TV-opplevelsen og strømming av kanaler via apper. \n\nKom i gang ved å konfigurere de kanalkildene som allerede er installert. Eventuelt kan du bla gjennom Google Play Butikk for å finne flere apper som tilbyr direkte-TV."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Opptak og tidsplaner"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutter"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutter"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 time"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Planlagt"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serier"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Annet"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Kanalen kan ikke bli tatt opp."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Programmet kan ikke bli tatt opp."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> er planlagt for opptak"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Tar opp <xliff:g id="PROGRAMNAME">%1$s</xliff:g> fra nå til <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Fullstendig tidsplan"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Spill av fra begynnelsen"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Gjenoppta avspilling"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Slett"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Slett opptak"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Gjenoppta"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Sesong <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Se tidsplanen"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Finn ut mer"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Slett opptak"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Velg episodene du vil slette. De kan ikke gjenopprettes når de først er slettet."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Det finnes ingen opptak som kan slettes."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritet"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Høyest"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Lavest"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nei. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanaler"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Alle"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Velg prioritet"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Når det ikke er nok tunere til å ta opp programmene samtidig, blir bare programmene med høyere prioritet tatt opp."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Når det er for mange programmer som skal tas opp samtidig, blir bare programmene med høyere prioritet tatt opp."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Den innspilte delen blir lagret i DVR-biblioteket."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Blir delvis tatt opp på grunn av tunerkonflikter."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Blir ikke tatt opp på grunn av tunerkonflikter."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Det finnes ingen planlagte opptak ennå.\nDu kan planlegge opptak fra programoversikten."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Opptaksplan for de neste %1$d dagene</item>
- <item quantity="one">Opptaksplan for neste dag</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d opptakskonflikter</item>
+ <item quantity="one">%1$d opptakskonflikt</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Innstillinger"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Tilbake"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Angre"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Innstillinger for serier"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Start opptak av serie"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Stopp opptak av serie"</string>
+ <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_empty_state" msgid="3407962945399698707">"Ingen episoder er tilgjengelige.\nDe blir tatt opp når de er tilgjengelige."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutter)</item>
+ <item quantity="one">(%1$d minutt) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"I dag"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"I morgen"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"I går"</string>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index 312b8fd9..142dfade 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"अडियो मात्र"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"सिग्नल कमजोर छ"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"इन्टरनेटमा जडान गर्न सकिएन"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">अन्य कार्यक्रमहरू रेकर्ड गर्नका लागि सबै ट्युनरहरूको प्रयोग भइरहेको हुनाले <xliff:g id="END_TIME_1">%1$s</xliff:g> सम्म यो च्यानललाई प्रसारण गर्न मिल्दैन। \n\nरेकर्डिङको समयतालिका समायोजन गर्न दायाँ बटन थिच्नुहोस्।</item>
- <item quantity="one">अन्य कार्यक्रमहरू रेकर्ड गर्नका लागि उक्त ट्युनरको प्रयोग भइरहेको हुनाले <xliff:g id="END_TIME_0">%1$s</xliff:g> सम्म यो च्यानललाई प्रसारण गर्न मिल्दैन। \n\nरेकर्डिङको समयतालिका समायोजन गर्न दायाँ बटन थिच्नुहोस्।</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">अन्य च्यानलहरू रेकर्ड भइरहेका हुनाले <xliff:g id="END_TIME_1">%1$s</xliff:g> सम्म यो च्यानल प्ले गर्न सकिँदैन। \n\nरेकर्डिङको समय तालिकालाई समायोजन गर्न दायाँ बटन थिच्नुहोस्।</item>
+ <item quantity="one">अर्को च्यानल रेकर्ड भइरहेको हुनाले <xliff:g id="END_TIME_0">%1$s</xliff:g> सम्म यो च्यानल प्ले गर्न सकिँदैन। \n\nरेकर्डिङको समय तालिकालाई समायोजन गर्न दायाँ बटन थिच्नुहोस्।</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"शीर्षक छैन"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"च्यानल अवरुद्ध"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"लाइभ च्यानलहरुलाई TV सूचीहरूलाई पढ्न अनुमति आवश्यक पदर्छ।"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"आफ्नो स्रोतहरू सेट अप गर्नुहोस्"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"लाइभ च्यानलहरूले TV च्यानलहरूसँगै उपलब्ध गराइएका प्रवाह भइरहेका च्यानलहरूको परम्परागत अनुभवलाई संयोजन गर्छ। \n\nपहिले नै स्थापित च्यानल स्रोतहरू सेट अप गरेर सुरू गरौं। वा लाइभ च्यानलहरू प्रस्ताव गर्ने अझ बढी अनुप्रयोगहरूका लागि Google Play स्टोर ब्राउज गर्नुहोस्।"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"रेकर्डिङ र समयतालिकाहरू"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"१० मिनेट"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"३० मिनेट"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"१ घन्टा"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"तालिकाबद्ध गरिएको"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"श्रृंखला"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"अन्य"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"यो च्यानल रेकर्ड गर्न सकिँदैन।"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"यो कार्यक्रम रेकर्ड गर्न सकिँदैन।"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> लाई रेकर्ड गर्ने कार्यतालिका निर्धारण गरिएको छ"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"अहिले देखि <xliff:g id="ENDTIME">%2$s</xliff:g> सम्म <xliff:g id="PROGRAMNAME">%1$s</xliff:g> नामक कार्यक्रम रेकर्ड गर्दै"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"समय सहितको पूर्ण कार्यतालिका"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"सुरुबाट चलाउनुहोस्"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"रेकर्डिङ मेट्नुहोस्"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"तपाईँले मेट्न चाहनुहुने एपिसोडहरूलाई चयन गर्नुहोस्। एक पटक मेटाएपछि तिनीहरूलाई पुन:प्राप्त गर्न सकिँदैन।"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"मेट्नका लागि कुनै रेकर्डिङ छैन।"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"प्राथमिकता"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"सबैभन्दा उच्च"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"सबैभन्दा न्यून"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"नम्बर <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"च्यानलहरू"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"जुनसुकै"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"प्राथमिकता छान्नुहोस्"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"एकै समयमा कार्यक्रमहरू रेकर्ड गर्नका लागि पर्याप्त ट्युनरहरू उपलब्ध नहुँदा उच्च प्राथमिकता भएका कार्यक्रमहरूलाई मात्र रेकर्ड गरिनेछ।"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"रेकर्ड गरिएको भागलाई DVR सम्बन्धी लाइब्रेरीमा सुरक्षित गरिनेछ।"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"रेकर्ड गरिएको सामग्रीलाई सुरक्षित गरिनेछ।"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ट्युनर सम्बन्धी असहमतिका कारण आंशिक रूपमा रेकर्ड गरिनेछ।"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ट्युनर सम्बन्धी असहमतिका कारण रेकर्ड गरिने छैन।"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"अहिलेसम्म समय सहितको कार्यतालिका निर्धारण गरिएको कुनै रेकर्डिङ छैन।\nतपाईँ कार्यक्रम निर्देशिका मार्फत रेकर्डिङको समय सहितको कार्यतालिका निर्धारण गर्न सक्नुहुन्छ।"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">अर्को %1$d दिनको रेकर्डिङको समय सहितको कार्यतालिका</item>
- <item quantity="one">अर्को %1$d दिनको रेकर्डिङको समय सहितको कार्यतालिका</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">रेकर्डिङ सम्बन्धी %1$d असहमतिहरू</item>
+ <item quantity="one">रेकर्डिङ सम्बन्धी %1$d असहमति</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"सेटिङहरू"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"पछाडि"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"अनडू गर्नुहोस्"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"शृंखला सम्बन्धी सेटिङहरू"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"शृंखलाको रेकर्डिङ सुरु गर्नुहोस्"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"शृंखलाको रेकर्डिङ रोक्नुहोस्"</string>
+ <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_empty_state" msgid="3407962945399698707">"कुनै एपिसोड उपलब्ध छैन।\nएपिसोडहरू उपलब्ध भएपछि तिनीहरूलाई रेकर्ड गरिनेछ।"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d मिनेट)</item>
+ <item quantity="one">(%1$d मिनेट) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"आज"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"भोलि"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"हिजो"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index edb3300e..f24ed1c3 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -113,9 +113,9 @@
<string name="option_rating_medium" msgid="6455853836426497151">"Gem. beperkingen"</string>
<string name="option_rating_low" msgid="5800146024503377969">"Lage beperkingen"</string>
<string name="option_rating_custom" msgid="3155377834510646436">"Aangepast"</string>
- <string name="option_rating_high_description" msgid="609567565273278745">"Inhoud geschikt voor kinderen"</string>
- <string name="option_rating_medium_description" msgid="7169199016608935280">"Inhoud geschikt voor oudere kinderen"</string>
- <string name="option_rating_low_description" msgid="4740109576615335045">"Inhoud geschikt voor tieners"</string>
+ <string name="option_rating_high_description" msgid="609567565273278745">"Content geschikt voor kinderen"</string>
+ <string name="option_rating_medium_description" msgid="7169199016608935280">"Content geschikt voor oudere kinderen"</string>
+ <string name="option_rating_low_description" msgid="4740109576615335045">"Content geschikt voor tieners"</string>
<string name="option_rating_custom_description" msgid="6180723522991233194">"Handmatige beperkingen"</string>
<!-- no translation found for option_attribution (2967657807178951562) -->
<skip />
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Alleen audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Zwak signaal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Geen internetverbinding"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Dit kanaal kan tot <xliff:g id="END_TIME_1">%1$s</xliff:g> niet worden afgespeeld omdat alle tuners worden gebruikt voor het opnemen van andere programma\'s. \n\nDruk op de pijl-rechts om het opnameschema aan te passen.</item>
- <item quantity="one">Dit kanaal kan tot <xliff:g id="END_TIME_0">%1$s</xliff:g> niet worden afgespeeld omdat de tuner wordt gebruikt voor het opnemen van andere programma\'s. \n\nDruk op de pijl-rechts om het opnameschema aan te passen.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Dit kanaal kan tot <xliff:g id="END_TIME_1">%1$s</xliff:g> niet worden afgespeeld omdat er andere kanalen worden opgenomen. \n\nDruk op de pijl-rechts om de opnameplanning aan te passen.</item>
+ <item quantity="one">Dit kanaal kan tot <xliff:g id="END_TIME_0">%1$s</xliff:g> niet worden afgespeeld omdat er een ander kanaal wordt opgenomen. \n\nDruk op de pijl-rechts om de opnameplanning aan te passen.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Geen titel"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanaal geblokkeerd"</string>
@@ -192,6 +192,7 @@
<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>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minuten"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minuten"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 uur"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Gepland"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serie"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Overige"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Het kanaal kan niet worden opgenomen."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Het programma kan niet worden opgenomen."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> is ingepland voor opname"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> opnemen van nu tot <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Volledig schema"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Afspelen vanaf het begin"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Afspelen hervatten"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Verwijderen"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Opnamen verwijderen"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Hervatten"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Seizoen <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Schema bekijken"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Meer informatie"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Opnamen verwijderen"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Selecteer de afleveringen die je wilt verwijderen. Ze kunnen na verwijdering niet worden hersteld."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Er zijn geen opnamen om te verwijderen."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioriteit"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Hoogste"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Laagste"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nr. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanalen"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Elke"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Prioriteit kiezen"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Wanneer er niet genoeg tuners zijn om meerdere programma\'s tegelijk op te nemen, worden alleen de programma\'s met de hogere prioriteit opgenomen."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Wanneer er te veel programma\'s tegelijk moeten worden opgenomen, worden alleen de programma\'s met de hogere prioriteit opgenomen."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Het opgenomen gedeelte wordt opgeslagen in de DVR-bibliotheek."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Wordt gedeeltelijk opgenomen wegens tunerconflicten."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Wordt niet opgenomen wegens tunerconflicten."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Er zijn nog geen ingeplande opnamen.\nJe kunt opnamen inplannen vanuit de tv-gids."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Opnameplanning voor de volgende %1$d dagen</item>
- <item quantity="one">Opnameplanning voor de volgende dag</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d opnameconflicten</item>
+ <item quantity="one">%1$d opnameconflict</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Instellingen"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Terug"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Ongedaan maken"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Serie-instellingen"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Serie-opname starten"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Serie-opname stoppen"</string>
+ <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_empty_state" msgid="3407962945399698707">"Er zijn geen afleveringen beschikbaar.\nZe worden opgenomen zodra ze beschikbaar zijn."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minuten)</item>
+ <item quantity="one">(%1$d minuut) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Vandaag"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Morgen"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Gisteren"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 22853f18..1e86cb7a 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -159,11 +159,11 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Tylko dźwięk"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Słaby sygnał"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Brak połączenia z internetem"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="few">Do <xliff:g id="END_TIME_1">%1$s</xliff:g> nie możesz oglądać tego kanału – przez ten czas wszystkie tunery będą nagrywać inne programy. \n\nNaciśnij przycisk W prawo, by zmienić harmonogram nagrywania.</item>
- <item quantity="many">Do <xliff:g id="END_TIME_1">%1$s</xliff:g> nie możesz oglądać tego kanału – przez ten czas wszystkie tunery będą nagrywać inne programy. \n\nNaciśnij przycisk W prawo, by zmienić harmonogram nagrywania.</item>
- <item quantity="other">Do <xliff:g id="END_TIME_1">%1$s</xliff:g> nie możesz oglądać tego kanału – przez ten czas wszystkie tunery będą nagrywać inne programy. \n\nNaciśnij przycisk W prawo, by zmienić harmonogram nagrywania.</item>
- <item quantity="one">Do <xliff:g id="END_TIME_0">%1$s</xliff:g> nie możesz oglądać tego kanału – przez ten czas tuner będzie nagrywać inne programy. \n\nNaciśnij przycisk W prawo, by zmienić harmonogram nagrywania.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="few">Do <xliff:g id="END_TIME_1">%1$s</xliff:g> nie możesz oglądać tego kanału – przez ten czas będą nagrywane inne kanały. \n\nNaciśnij przycisk W prawo, by zmienić harmonogram nagrywania.</item>
+ <item quantity="many">Do <xliff:g id="END_TIME_1">%1$s</xliff:g> nie możesz oglądać tego kanału – przez ten czas będą nagrywane inne kanały. \n\nNaciśnij przycisk W prawo, by zmienić harmonogram nagrywania.</item>
+ <item quantity="other">Do <xliff:g id="END_TIME_1">%1$s</xliff:g> nie możesz oglądać tego kanału – przez ten czas będą nagrywane inne kanały. \n\nNaciśnij przycisk W prawo, by zmienić harmonogram nagrywania.</item>
+ <item quantity="one">Do <xliff:g id="END_TIME_0">%1$s</xliff:g> nie możesz oglądać tego kanału – przez ten czas będzie nagrywany inny kanał. \n\nNaciśnij przycisk W prawo, by zmienić harmonogram nagrywania.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Bez tytułu"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanał zablokowany"</string>
@@ -200,6 +200,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Aby odczytywać programy telewizyjne, Telewizja online potrzebuje uprawnień."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Skonfiguruj źródła"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Telewizja online to połączenie tradycyjnych kanałów TV i przesyłanych strumieniowo przez aplikacje.\n\nAby rozpocząć, skonfiguruj zainstalowane źródła kanałów. Możesz też przejrzeć Sklep Google Play, by znaleźć więcej aplikacji, które oferują dostęp do telewizji online."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Nagrywanie i harmonogramy"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minut"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minut"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 godzina"</string>
@@ -208,6 +209,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Zaplanowane"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Seriale"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Inne"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Tego kanału nie można nagrać."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Tego programu nie można nagrać."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Program <xliff:g id="PROGRAMNAME">%1$s</xliff:g> został dodany do harmonogramu nagrywania"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Nagrywam program <xliff:g id="PROGRAMNAME">%1$s</xliff:g> od teraz do <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Pełny harmonogram"</string>
@@ -245,9 +248,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Odtwórz od początku"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Wznów odtwarzanie"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Usuń"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Usuń nagrania"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Wznów"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Sezon <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Harmonogram"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Więcej informacji"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Usuń nagrania"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Wybierz odcinki, które chcesz usunąć. Po usunięciu nie będzie można ich odzyskać."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Brak nagrań do usunięcia."</string>
@@ -266,17 +271,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priorytet"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Najwyższy"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Najniższy"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nr <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanały"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Dowolny"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Wybierz priorytet"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Jeśli masz za mało tunerów do nagrania wszystkich programów w danym czasie, nagrane zostaną tylko programy o wyższych priorytetach."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Jeśli wybierzesz za dużo programów do nagrania w tym samym czasie, nagrane zostaną tylko te o wyższych priorytetach."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -290,17 +294,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Nagrany fragment zostanie zapisany w bibliotece DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Nagrana treść zostanie zapisana."</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>
@@ -320,6 +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>
+ <!-- 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>
@@ -334,17 +350,25 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Zostanie nagrany częściowo z powodu konfliktów w tunerze."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Nie zostanie nagrany z powodu konfliktów w tunerze."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Żadne nagrywanie nie jest jeszcze zaplanowane.\nMożesz utworzyć harmonogram nagrywania, używając przewodnika po programach."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="few">Harmonogram nagrywania na następne %1$d dni</item>
- <item quantity="many">Harmonogram nagrywania na następne %1$d dni</item>
- <item quantity="other">Harmonogram nagrywania na następne %1$d dnia</item>
- <item quantity="one">Harmonogram nagrywania na następny dzień</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="few">%1$d konflikty nagrywania</item>
+ <item quantity="many">%1$d konfliktów nagrywania</item>
+ <item quantity="other">%1$d konfliktu nagrywania</item>
+ <item quantity="one">%1$d konflikt nagrywania</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Ustawienia"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Wstecz"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Cofnij"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Ustawienia nagrywania cyklicznego"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Zacznij nagrywanie cykliczne"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Zatrzymaj nagrywanie cykliczne"</string>
+ <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_empty_state" msgid="3407962945399698707">"Brak dostępnych odcinków.\nZostaną one nagrane, gdy będą dostępne."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="few">(%1$d minuty)</item>
+ <item quantity="many">(%1$d minut)</item>
+ <item quantity="other">(%1$d minuty)</item>
+ <item quantity="one">(%1$d minuta) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Dzisiaj"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Jutro"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Wczoraj"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index a157d88f..45fa4e20 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Apenas áudio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Sinal fraco"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Sem ligação à Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Não é possível reproduzir este canal até às <xliff:g id="END_TIME_1">%1$s</xliff:g> porque todos os sintonizadores estão a ser utilizados para gravar outros programas. \n\nPrima para a direita para ajustar o horário de gravação.</item>
- <item quantity="one">Não é possível reproduzir este canal até às <xliff:g id="END_TIME_0">%1$s</xliff:g> porque o sintonizador está a ser utilizado para gravar outros programas. \n\nPrima para a direita para ajustar o horário de gravação.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Não é possível reproduzir este canal até à(s) <xliff:g id="END_TIME_1">%1$s</xliff:g> porque estão a ser gravados outros canais. \n\nPrima para a direita para ajustar o horário de gravação.</item>
+ <item quantity="one">Não é possível reproduzir este canal até à(s) <xliff:g id="END_TIME_0">%1$s</xliff:g> porque está a ser gravado outro canal. \n\nPrima para a direita para ajustar o horário de gravação.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Sem título"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Canal bloqueado"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"A aplicação Canais em direto necessita de autorização para ler as listagens de programas de TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configurar fontes"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Os canais em direto combinam a experiência dos canais de TV tradicionais com os canais de transmissão em fluxo contínuo fornecidos pelas aplicações. \n\nComece por configurar as fontes de canais já instaladas. Em alternativa, procure mais aplicações que ofereçam canais em direto na Google Play Store."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Gravações e agendamentos"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutos"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutos"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hora"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Agendados"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Série"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Outros"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Não é possível gravar o canal."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Não é possível gravar o programa."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"O programa <xliff:g id="PROGRAMNAME">%1$s</xliff:g> foi agendado para gravação"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"A gravar <xliff:g id="PROGRAMNAME">%1$s</xliff:g> desde agora até às <xliff:g id="ENDTIME">%2$s</xliff:g>…"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Agenda completa"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Reproduzir do início"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Retomar a reprodução"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Eliminar"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Eliminar gravações"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Retomar"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Ver horários"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Ler mais"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Eliminar gravações"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Selecione os episódios que pretende eliminar. Depois da eliminação, não é possível recuperá-los."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Não existem gravações a eliminar."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioridade"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Mais alta"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Mais baixa"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"N.º <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Canais"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Qualquer"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Escolher prioridade"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Quando não existem sintonizadores suficientes para gravar programas em simultâneo, apenas são gravados os programas com as prioridades mais altas."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Quando existem demasiados programas para serem gravados em simultâneo, apenas são gravados os programas com as prioridades mais altas."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"A parte gravada será guardada na biblioteca do DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Será parcialmente grav. devido a conflitos de sintonizador."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Não será gravado devido a conflitos de sintonizador."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Ainda não existem gravações agendadas.\nPode agendar a gravação a partir do guia de programação."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Horário de gravação para os próximos %1$d dias</item>
- <item quantity="one">Horário de gravação para o próximo %1$d dia</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d conflitos de gravação</item>
+ <item quantity="one">%1$d conflito de gravação</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Definições"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Anterior"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Anular"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Definições de séries"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Iniciar gravação da série"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Parar gravação da série"</string>
+ <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_empty_state" msgid="3407962945399698707">"Não existem episódios disponíveis.\nVão ser gravados assim que estiverem disponíveis."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minutos)</item>
+ <item quantity="one">(%1$d minuto) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Hoje"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Amanhã"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Ontem"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index db91f78f..9c22a58a 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Somente áudio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Sinal fraco"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Sem conexão com a Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Não é possível reproduzir este canal até <xliff:g id="END_TIME_1">%1$s</xliff:g> porque todos os sintonizadores estão sendo usados para gravar outros programas. \n\nPressione o botão à direita para ajustar a programação de gravação.</item>
- <item quantity="other">Não é possível reproduzir este canal até <xliff:g id="END_TIME_1">%1$s</xliff:g> porque todos os sintonizadores estão sendo usados para gravar outros programas. \n\nPressione o botão à direita para ajustar a programação de gravação.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Não é possível reproduzir este canal até <xliff:g id="END_TIME_1">%1$s</xliff:g>, porque outro canal está sendo gravado. \n\nPressione o botão à direita para ajustar a programação de gravação.</item>
+ <item quantity="other">Não é possível reproduzir este canal até <xliff:g id="END_TIME_1">%1$s</xliff:g>, porque outros canais estão sendo gravados. \n\nPressione o botão à direita para ajustar a programação de gravação.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Sem título"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Canal bloqueado"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"O app \"Canais ao vivo\" precisa de permissão para ler a programação de TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configurar suas fontes"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Os canais ao vivo combinam a experiência dos canais de TV tradicionais com canais de streaming fornecidos por apps. \n\nComece configurando as fontes de canais já instaladas ou procure na Google Play Store mais apps que ofereçam canais ao vivo."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Gravações e programações"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minutos"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minutos"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"Uma hora"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Programadas"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Série"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Outros"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Não é possível gravar o canal."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Não é possível gravar o programa."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"A gravação de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> foi programada"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Gravação de <xliff:g id="PROGRAMNAME">%1$s</xliff:g> a partir de agora até <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Programação completa"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Reproduzir do início"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Retomar reprodução"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Excluir"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Excluir gravações"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Retomar"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Temporada <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Ver programação"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Mais informações"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Excluir gravações"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Selecione os episódios que você gostaria de excluir. Não é possível recuperá-los após a exclusão."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Não há nenhuma gravação para excluir."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioridade"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Mais alta"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Mais baixa"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Não. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Canais"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Qualquer"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Escolher prioridade"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Quando não houver sintonizadores suficientes para gravar programas ao mesmo tempo, apenas os programas com maior prioridade serão gravados."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Quando houver muitos programas a serem gravados ao mesmo tempo, apenas os com maior prioridade serão gravados."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"A parte gravada será salva na biblioteca de DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Será parcialmente gravada devido a conflitos do sintoniz."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Não será gravada devido a conflitos do sintonizador."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Ainda não há gravações programadas.\nElas podem ser programadas a partir do guia de programação."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Programação de gravação para o próximo %1$d dia</item>
- <item quantity="other">Programação de gravação para os próximos %1$d dias</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d conflito de gravação</item>
+ <item quantity="other">%1$d conflitos de gravação</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Configurações"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Voltar"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Desfazer"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Configurações da série"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Iniciar gravação da série"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Parar gravação da série"</string>
+ <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_empty_state" msgid="3407962945399698707">"Nenhum episódio disponível.\nOs episódios serão gravados quando estiverem disponíveis."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d minuto)</item>
+ <item quantity="other">(%1$d minutos)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Hoje"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Amanhã"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Ontem"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 1bc07809..adc3b359 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -157,10 +157,10 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Numai conținut audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Semnal slab"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Fără conexiune la internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="few">Acest canal nu poate fi redat înainte de <xliff:g id="END_TIME_1">%1$s</xliff:g>, deoarece toate tunerele sunt folosite pentru a înregistra alte programe. \n\nApăsați săgeata spre dreapta pentru a ajusta programul de înregistrare.</item>
- <item quantity="other">Acest canal nu poate fi redat înainte de <xliff:g id="END_TIME_1">%1$s</xliff:g>, deoarece toate tunerele sunt folosite pentru a înregistra alte programe. \n\nApăsați săgeata spre dreapta pentru a ajusta programul de înregistrare.</item>
- <item quantity="one">Acest canal nu poate fi redat înainte de <xliff:g id="END_TIME_0">%1$s</xliff:g>, deoarece tunerul este folosit pentru a înregistra alte programe. \n\nApăsați săgeata spre dreapta pentru a ajusta programul de înregistrare.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="few">Acest canal nu poate fi redat înainte de <xliff:g id="END_TIME_1">%1$s</xliff:g>, deoarece sunt înregistrate alte canale. \n\nApăsați săgeata spre dreapta pentru a ajusta programul de înregistrare.</item>
+ <item quantity="other">Acest canal nu poate fi redat înainte de <xliff:g id="END_TIME_1">%1$s</xliff:g>, deoarece sunt înregistrate alte canale. \n\nApăsați săgeata spre dreapta pentru a ajusta programul de înregistrare.</item>
+ <item quantity="one">Acest canal nu poate fi redat înainte de <xliff:g id="END_TIME_0">%1$s</xliff:g>, deoarece este înregistrat un alt canal. \n\nApăsați săgeata spre dreapta pentru a ajusta programul de înregistrare.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Fără titlu"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Canal blocat"</string>
@@ -196,6 +196,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Aplicația „Canale live” are nevoie de permisiunea de a citi lista de programe TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Configurați sursele"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Canalele live combină experiența canalelor TV tradiționale cu cea a canalelor cu redare în flux, oferită de aplicații. \n\nÎncepeți prin a configura sursele canalelor care au fost deja instalate. Sau căutați în Magazinul Google Play mai multe aplicații care oferă canale live."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Înregistrări și programări"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minute"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 de minute"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 oră"</string>
@@ -204,6 +205,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Programată"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Seriale"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Altele"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Canalul nu poate fi înregistrat."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Programul nu poate fi înregistrat."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> a fost programat pentru înregistrare"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Se înregistrează <xliff:g id="PROGRAMNAME">%1$s</xliff:g> de acum până la <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Programul complet"</string>
@@ -236,9 +239,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Redați de la început"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Reluați redarea"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Ștergeți"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Ștergeți înregistrările"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Reluați"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Sezonul <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Vedeți programul"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Aflați mai multe"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Ștergeți înregistrările"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Selectați episoadele pe care doriți să le ștergeți. Acestea nu pot fi recuperate după ce sunt șterse."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Nu există nicio înregistrare de șters."</string>
@@ -256,17 +261,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritate"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Cea mai mare"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Cea mai mică"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Numărul <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Canale"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Oricare"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Alegeți prioritatea"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Când nu există suficiente tunere pentru a înregistra programe în același timp, vor fi înregistrate numai programele cu priorități mai mari."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Când există prea multe programe de înregistrat în același timp, vor fi înregistrate numai cele cu priorități mai mari."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -280,17 +284,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Partea înregistrată va fi salvată în biblioteca DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -309,6 +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>
+ <!-- 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>
@@ -322,16 +338,23 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Din cauza unor probleme de tuner, va fi înregistrat parțial."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Din cauza unor probleme de tuner, nu va fi înregistrat."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Nu există înregistrări programate încă.\nPuteți programa înregistrări din ghidul de programe."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="few">Programul de înregistrare pentru următoarele %1$d zile</item>
- <item quantity="other">Programul de înregistrare pentru următoarele %1$d de zile</item>
- <item quantity="one">Programul de înregistrare pentru următoarea %1$d zi</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="few">%1$d conflicte privind înregistrarea</item>
+ <item quantity="other">%1$d de conflicte privind înregistrarea</item>
+ <item quantity="one">%1$d conflict privind înregistrarea</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Setări"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Înapoi"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Anulați"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Setările seriei"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Începeți înregistrarea seriei"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Opriți înregistrarea seriei"</string>
+ <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_empty_state" msgid="3407962945399698707">"Nu există episoade disponibile.\nAcestea vor fi înregistrate de îndată ce vor fi disponibile."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="few">(%1$d minute)</item>
+ <item quantity="other">(%1$d de minute)</item>
+ <item quantity="one">(%1$d minut) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Astăzi"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Mâine"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Ieri"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index b39ccf22..61bef1f6 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -159,11 +159,11 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Только аудио"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Слабый сигнал"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Нет доступа к Интернету"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Невозможно включить этот канал до <xliff:g id="END_TIME_1">%1$s</xliff:g>, поскольку все тюнеры используются для записи других программ. \n\nЧтобы изменить расписание записи, нажмите стрелку вправо.</item>
- <item quantity="few">Невозможно включить этот канал до <xliff:g id="END_TIME_1">%1$s</xliff:g>, поскольку все тюнеры используются для записи других программ. \n\nЧтобы изменить расписание записи, нажмите стрелку вправо.</item>
- <item quantity="many">Невозможно включить этот канал до <xliff:g id="END_TIME_1">%1$s</xliff:g>, поскольку все тюнеры используются для записи других программ. \n\nЧтобы изменить расписание записи, нажмите стрелку вправо.</item>
- <item quantity="other">Невозможно включить этот канал до <xliff:g id="END_TIME_1">%1$s</xliff:g>, поскольку все тюнеры используются для записи других программ. \n\nЧтобы изменить расписание записи, нажмите стрелку вправо.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Невозможно включить этот канал до <xliff:g id="END_TIME_1">%1$s</xliff:g>, поскольку тюнер используется для записи других каналов. \n\nЧтобы изменить расписание записи, нажмите стрелку вправо.</item>
+ <item quantity="few">Невозможно включить этот канал до <xliff:g id="END_TIME_1">%1$s</xliff:g>, поскольку тюнер используется для записи других каналов. \n\nЧтобы изменить расписание записи, нажмите стрелку вправо.</item>
+ <item quantity="many">Невозможно включить этот канал до <xliff:g id="END_TIME_1">%1$s</xliff:g>, поскольку тюнер используется для записи других каналов. \n\nЧтобы изменить расписание записи, нажмите стрелку вправо.</item>
+ <item quantity="other">Невозможно включить этот канал до <xliff:g id="END_TIME_1">%1$s</xliff:g>, поскольку тюнер используется для записи других каналов. \n\nЧтобы изменить расписание записи, нажмите стрелку вправо.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Без названия"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Канал заблокирован"</string>
@@ -200,6 +200,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Требуется разрешение для чтения телепрограмм."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Настройте источники каналов"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Каналы Live – это сочетание обычных телеканалов и потоковых видеотрансляций, идущих через установленные приложения.\n\nНачните с настройки уже имеющихся источников контента или найдите в Play Маркете другие медиаприложения."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Записи и расписание"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 мин."</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 мин."</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ч."</string>
@@ -208,6 +209,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"По расписанию"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Сериалы"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Другие"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Не удается записать канал"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Не удается записать программу"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Программа \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" будет записана"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Запись программы \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" с данного момента до <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Полное расписание"</string>
@@ -245,9 +248,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Смотреть с начала"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Удаление записей"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Выберите серии, которые нужно удалить. Их нельзя будет восстановить."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Нет записей, которые можно удалить"</string>
@@ -266,17 +271,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Приоритет"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Самый высокий"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Самый низкий"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Нет (<xliff:g id="RANK">%1$d</xliff:g>)"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Каналы"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Любой"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Выберите приоритет"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Если для записи всех программ не хватает тюнеров, будут записываться только программы с наивысшим приоритетом."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -290,17 +294,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Записанная часть будет сохранена в библиотеке видеорекордера."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Записанный контент будет сохранен."</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>
@@ -320,6 +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>
+ <!-- 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>
@@ -334,17 +350,25 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Будет записана только часть: отсутствует тюнер."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Невозможно сделать запись: отсутствует тюнер."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"В расписании пока пусто.\nВы можете запланировать запись из телегида."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Расписание записи на следующий %1$d день</item>
- <item quantity="few">Расписание записи на следующие %1$d дня</item>
- <item quantity="many">Расписание записи на следующие %1$d дней</item>
- <item quantity="other">Расписание записи на следующие %1$d дня</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d конфликт таймера записи</item>
+ <item quantity="few">%1$d конфликта таймера записи</item>
+ <item quantity="many">%1$d конфликтов таймера записи</item>
+ <item quantity="other">%1$d конфликта таймера записи</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Настройки"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Назад"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Вернуть все"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Настроить запись серий"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Начать запись"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Остановить запись"</string>
+ <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_empty_state" msgid="3407962945399698707">"Серий пока нет.\nОни будут записаны, как только выйдут в эфир."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d минута)</item>
+ <item quantity="few">(%1$d минуты)</item>
+ <item quantity="many">(%1$d минут)</item>
+ <item quantity="other">(%1$d минуты)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Cегодня"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Завтра"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Вчера"</string>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 90ad68bc..eab8c336 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"ශ්‍රව්‍ය පමණයි"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"දුර්වල සංඥාව"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"අන්තර්ජාල සබැඳුමක් නැත"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">සුසරක වෙනත් වැඩසටහන් පටිගත කිරීමට භාවිත කරමින් ඇති නිසා <xliff:g id="END_TIME_1">%1$s</xliff:g> වනතෙක් මෙම නාලිකාව ධාවනය කළ නොහැකිය. \n\nපටිගත කිරීමේ කාල සටහන සීරුමාරු කිරීමට දකුණ ඔබන්න.</item>
- <item quantity="other">සුසරක වෙනත් වැඩසටහන් පටිගත කිරීමට භාවිත කරමින් ඇති නිසා <xliff:g id="END_TIME_1">%1$s</xliff:g> වනතෙක් මෙම නාලිකාව ධාවනය කළ නොහැකිය. \n\nපටිගත කිරීමේ කාල සටහන සීරුමාරු කිරීමට දකුණ ඔබන්න.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">වෙනත් නාලිකා පටිගත වෙමින් ඇති නිසා මෙම නාලිකාව <xliff:g id="END_TIME_1">%1$s</xliff:g> වනතෙක් ධාවනය කළ නොහැකිය. \n\nපටිගත කිරීමේ කාල සටහන සීරුමාරු කිරීමට දකුණ ඔබන්න.</item>
+ <item quantity="other">වෙනත් නාලිකා පටිගත වෙමින් ඇති නිසා මෙම නාලිකාව <xliff:g id="END_TIME_1">%1$s</xliff:g> වනතෙක් ධාවනය කළ නොහැකිය. \n\nපටිගත කිරීමේ කාල සටහන සීරුමාරු කිරීමට දකුණ ඔබන්න.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"මාතෘකාවක් නොමැත"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"නාලිකාව අවහිර කරන ලදි"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"සජීවී නාලිකාවලට TV ලැයිස්තුගත කිරීම් කියවීමට අවසරය අවශ්‍යයි."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"ඔබගේ මූලාශ්‍ර පිහිටුවන්න"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"සජීවී නාලිකා සම්ප්‍රදායික TV නාලිකාවල අත්දැකීම යෙදුම්වලින් සපයන ප්‍රවාහ කිරීමේ නාලිකා සමග ඒකාබද්ධ කරයි. \n\nදැනටමත් ස්ථාපනය කර ඇති නාලිකා මූලාශ්‍ර පිහිටුවීමෙන් ආරම්භ කරන්න. නැතහොත් සජීවී නාලිකා පිරිනමන තවත් යෙදුම් සඳහා Google Play Store බ්‍රවුස් කරන්න."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"පටිගත කිරීම් සහ කාලසටහන්"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"මිනිත්තු 10"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"මිනිත්තු 30"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"පැය 1"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"නියමිත"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"මාලා"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"වෙනත්"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"නාලිකාව පටිගත කළ නොහැකිය."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"වැඩසටහන පටිගත කළ නොහැකිය."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> පටිගත කිරීමට කාල සටහන්ගත කර ඇත"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> දැන් සිට <xliff:g id="ENDTIME">%2$s</xliff:g> දක්වා පටිගත කරමින්"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"සම්පූර්ණ කාල සටහන"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"මුල සිට ධාවනය කරන්න"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"පටිගත කිරීම් මකන්න"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"ඔබ මැකීමට කැමති කථාංග තෝරන්න. වරක් මැකූ පසු ඒවා ප්‍රතිසාධනය කළ නොහැකිය."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"මැකීමට පටිගත කිරීම් නැත."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"ප්‍රමුඛතාව"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"වැඩිම"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"අඩුම"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"නැත. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"නාලිකා"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"ඕනෑම"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"ප්‍රමුඛතාව තේරීම"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"එකම අවස්ථාවේදී වැඩසටහන් පටිගත කිරීමට ප්‍රමාණවත් තරම් සුසරක නැති විට, වඩා වැඩි ප්‍රමුඛතා සහිත වැඩසටහන් පමණක් පටිගත කරනු ඇත."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"පටිගත කළ කොටස DVR පුස්තකාලයේ සුරකිනු ඇත."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"පටිගත කළ අන්තර්ගතය සුරැකෙනු ඇත."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"සුසරක ගැටුම් නිසා අර්ධ වශයෙන් පටිගත කරනු ඇත."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"සුසරක ගැටුම් නිසා පටිගත නොකරනු ඇත."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"තවම කාල සටහනෙහි පටිගත කිරීම් නැත.\nඔබට වැඩසටහන් මාර්ගෝපදේශය වෙතින් පටිගත කිරීම කාලසටහන්ගත කළ හැකිය."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">ඊළඟ දින %1$d සඳහා පටිගත කිරීමේ කාල සටහන</item>
- <item quantity="other">ඊළඟ දින %1$d සඳහා පටිගත කිරීමේ කාල සටහන</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">පටිගත කිරීමේ ගැටුම් %1$d</item>
+ <item quantity="other">පටිගත කිරීමේ ගැටුම් %1$d</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"සැකසීම්"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"ආපසු"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"අස් කරන්න"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"මාලා සැකසීම්"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"මාලා පටිගත කිරීම අරඹන්න"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"මාලා පටිගත කිරීම නවත්වන්න"</string>
+ <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_empty_state" msgid="3407962945399698707">"ලබා ගත හැකි කථාංග නැත.\nඒවා ලබා ගත හැකි වූ විට පටිගත කරනු ඇත."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(මිනිත්තු %1$d)</item>
+ <item quantity="other">(මිනිත්තු %1$d)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"අද"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"හෙට"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"ඊයේ"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index e5beefe8..78d94c7f 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -159,11 +159,11 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Iba zvuk"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Slabý signál"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Žiadne pripojenie k internetu"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="few">Tento kanál bude možné prehrať až o <xliff:g id="END_TIME_1">%1$s</xliff:g>, pretože všetky tunery sa používajú na zaznamenávanie iných programov. \n\nPlán zaznamenávania upravíte stlačením tlačidla vpravo.</item>
- <item quantity="many">Tento kanál bude možné prehrať až o <xliff:g id="END_TIME_1">%1$s</xliff:g>, pretože všetky tunery sa používajú na zaznamenávanie iných programov. \n\nPlán zaznamenávania upravíte stlačením tlačidla vpravo.</item>
- <item quantity="other">Tento kanál bude možné prehrať až o <xliff:g id="END_TIME_1">%1$s</xliff:g>, pretože všetky tunery sa používajú na zaznamenávanie iných programov. \n\nPlán zaznamenávania upravíte stlačením tlačidla vpravo.</item>
- <item quantity="one">Tento kanál bude možné prehrať až o <xliff:g id="END_TIME_0">%1$s</xliff:g>, pretože sa tuner používa na zaznamenávanie iných programov. \n\nPlán zaznamenávania upravíte stlačením tlačidla vpravo.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="few">Tento kanál bude možné prehrať až o <xliff:g id="END_TIME_1">%1$s</xliff:g>, pretože sa nahrávajú iné kanály. \n\nPlán nahrávania upravíte stlačením šípky vpravo.</item>
+ <item quantity="many">Tento kanál bude možné prehrať až o <xliff:g id="END_TIME_1">%1$s</xliff:g>, pretože sa nahrávajú iné kanály. \n\nPlán nahrávania upravíte stlačením šípky vpravo.</item>
+ <item quantity="other">Tento kanál bude možné prehrať až o <xliff:g id="END_TIME_1">%1$s</xliff:g>, pretože sa nahrávajú iné kanály. \n\nPlán nahrávania upravíte stlačením šípky vpravo.</item>
+ <item quantity="one">Tento kanál bude možné prehrať až o <xliff:g id="END_TIME_0">%1$s</xliff:g>, pretože sa nahráva iný kanál. \n\nPlán nahrávania upravíte stlačením šípky vpravo.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Bez názvu"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanál bol zablokovaný"</string>
@@ -200,6 +200,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Aktívne kanály potrebujú povolenie na čítanie televíznych programov."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Nastavte si zdroje"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Televízia online spája zážitok z tradičných televíznych kanálov so streamovaním kanálov z aplikácií. \n\nZačnite nastavením zdrojov kanálov, ktoré už máte nainštalované. Prípadne si prehliadnite Obchod Google Play a získajte ďalšie aplikácie, ktoré poskytujú televíziu online."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Nahrávanie a plány"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minút"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minút"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 hodina"</string>
@@ -208,6 +209,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Naplánované"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Seriál"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Ostatné"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Tento kanál nie je možné nahrávať."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Tento program nie je možné nahrávať."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Nahrávanie programu <xliff:g id="PROGRAMNAME">%1$s</xliff:g> bolo naplánované"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Zaznamenáva sa program <xliff:g id="PROGRAMNAME">%1$s</xliff:g> odteraz do <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Úplný plán"</string>
@@ -245,9 +248,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Prehrať od začiatku"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Obnoviť prehrávanie"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Odstrániť"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Odstrániť nahratý obsah"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Pokračovať"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Séria <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Zobraziť rozvrh"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Ďalšie informácie"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Odstrániť záznamy"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Vyberte epizódy, ktoré chcete odstrániť. Po odstránení sa už nebudú dať obnoviť."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Žiadne záznamy na odstránenie."</string>
@@ -266,17 +271,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priorita"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Najvyššia"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Najnižšia"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Č. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanály"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Akýkoľvek"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Voľba priority"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Keď nie je k dispozícii dostatok tunerov na záznam niekoľkých programov súčasne, zaznamenajú sa iba programy s najvyššími prioritami."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Keď naplánujete nahrávanie príliš veľa programov súčasne, zaznamenajú sa iba programy s najvyššími prioritami."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -290,17 +294,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Nahraná časť bude uložená do knižnice DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Nahraný 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>
@@ -320,6 +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>
+ <!-- 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>
@@ -334,17 +350,25 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Z dôvodu konfliktu tunerov bude nahratá iba časť obsahu."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Z dôvodu konfliktu tunerov obsah nebude nahratý."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Nemáte naplánované žiadne záznamy.\nZaznamenávanie môžete naplánovať z televízneho programu."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="few">Plán zaznamenávania pre nasledujúce %1$d dni</item>
- <item quantity="many">Plán zaznamenávania pre nasledujúceho %1$d dňa</item>
- <item quantity="other">Plán zaznamenávania pre nasledujúcich %1$d dní</item>
- <item quantity="one">Plán zaznamenávania pre nasledujúci %1$d deň</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="few">%1$d konflikty nahrávania</item>
+ <item quantity="many">%1$d konfliktu nahrávania</item>
+ <item quantity="other">%1$d konfliktov nahrávania</item>
+ <item quantity="one">%1$d konflikt nahrávania</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Nastavenia"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Späť"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Späť"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Nastavenia série"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Spustiť nahrávanie série"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Zastaviť nahrávanie série"</string>
+ <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_empty_state" msgid="3407962945399698707">"Nie sú k dispozícii žiadne epizódy.\nZaznamenajú sa, keď budú dostupné."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="few">(%1$d minúty)</item>
+ <item quantity="many">(%1$d minúty)</item>
+ <item quantity="other">(%1$d minút)</item>
+ <item quantity="one">(%1$d minúta) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Dnes"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Zajtra"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Včera"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 830783f9..6e79cacc 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -159,11 +159,11 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Samo zvok"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Šibek signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Ni internetne povezave"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Tega kanala ni mogoče predvajati do <xliff:g id="END_TIME_1">%1$s</xliff:g>, ker se vsi sprejemniki uporabljajo za snemanje drugih programov. \n\nPritisnite gumb za desno, da prilagodite razpored snemanja.</item>
- <item quantity="two">Tega kanala ni mogoče predvajati do <xliff:g id="END_TIME_1">%1$s</xliff:g>, ker se vsi sprejemniki uporabljajo za snemanje drugih programov. \n\nPritisnite gumb za desno, da prilagodite razpored snemanja.</item>
- <item quantity="few">Tega kanala ni mogoče predvajati do <xliff:g id="END_TIME_1">%1$s</xliff:g>, ker se vsi sprejemniki uporabljajo za snemanje drugih programov. \n\nPritisnite gumb za desno, da prilagodite razpored snemanja.</item>
- <item quantity="other">Tega kanala ni mogoče predvajati do <xliff:g id="END_TIME_1">%1$s</xliff:g>, ker se vsi sprejemniki uporabljajo za snemanje drugih programov. \n\nPritisnite gumb za desno, da prilagodite razpored snemanja.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Tega kanala ni mogoče predvajati do <xliff:g id="END_TIME_1">%1$s</xliff:g>, ker se snemajo drugi kanali. \n\nPritisnite gumb za desno, da prilagodite razpored snemanja.</item>
+ <item quantity="two">Tega kanala ni mogoče predvajati do <xliff:g id="END_TIME_1">%1$s</xliff:g>, ker se snemajo drugi kanali. \n\nPritisnite gumb za desno, da prilagodite razpored snemanja.</item>
+ <item quantity="few">Tega kanala ni mogoče predvajati do <xliff:g id="END_TIME_1">%1$s</xliff:g>, ker se snemajo drugi kanali. \n\nPritisnite gumb za desno, da prilagodite razpored snemanja.</item>
+ <item quantity="other">Tega kanala ni mogoče predvajati do <xliff:g id="END_TIME_1">%1$s</xliff:g>, ker se snemajo drugi kanali. \n\nPritisnite gumb za desno, da prilagodite razpored snemanja.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Brez naslova"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanal je blokiran"</string>
@@ -200,6 +200,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Kanali v živo potrebujejo dovoljenje za branje televizijskih sporedov."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Nastavitev virov"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Kanali v živo združujejo izkušnjo običajnih TV-kanalov in pretočno predvajanje kanalov, ki ga omogočajo aplikacije. \n\nZačnite tako, da nastavite vire kanalov, ki so že nameščeni. V Trgovini Google Play lahko tudi poiščete druge aplikacije, ki omogočajo kanale v živo."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Posnetki in razporedi"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 min"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 min"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 h"</string>
@@ -208,6 +209,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Načrtovano"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Nanizanka"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Drugo"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Kanala ni mogoče posneti."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Oddaje ni mogoče posneti."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Snemanje oddaje <xliff:g id="PROGRAMNAME">%1$s</xliff:g> je nastavljeno"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Snemanje oddaje <xliff:g id="PROGRAMNAME">%1$s</xliff:g> od zdaj do <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Celoten razpored"</string>
@@ -245,9 +248,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Predvajaj od začetka"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Nadaljuj predvajanje"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Izbriši"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Izbris posnetkov"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Nadaljuj"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. sezona"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Pokaži razpored"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Več o tem"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Izbris posnetkov"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Izberite epizode, ki jih želite izbrisati. Po izbrisu jih ni mogoče več obnoviti."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Ni posnetkov za izbris."</string>
@@ -266,17 +271,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prednost"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Najvišja"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Najnižja"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Št. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanali"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Kateri koli"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Izbira prednosti"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Če ni dovolj sprejemnikov za snemanje oddaj ob istem času, so posnete samo oddaje z višjo prednostjo."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Če je nastavljeno snemanje preveč oddaj ob istem času, bodo posnete samo oddaje z višjo prednostjo."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -290,17 +294,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Posneti del bo shranjen v knjižnici digitalnega videorekorderja."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -320,6 +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>
+ <!-- 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>
@@ -334,17 +350,25 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Posneto bo delno, ker sprejemnik ni na voljo"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Ne bo posneto, ker sprejemnik ni na voljo"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Trenutno ni nastavljeno še nobeno snemanje.\nSnemanje lahko nastavitev v programskem vodniku."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Razpored snemanja za naslednji %1$d dan</item>
- <item quantity="two">Razpored snemanja za naslednja %1$d dneva</item>
- <item quantity="few">Razpored snemanja za naslednje %1$d dni</item>
- <item quantity="other">Razpored snemanja za naslednjih %1$d dni</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d spor glede snemanja</item>
+ <item quantity="two">%1$d spora glede snemanja</item>
+ <item quantity="few">%1$d spori glede snemanja</item>
+ <item quantity="other">%1$d sporov glede snemanja</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Nastavitve"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Nazaj"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Razveljavi"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Nastavitev serije"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Začni snemanje serije"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Ustavi snemanje serije"</string>
+ <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_empty_state" msgid="3407962945399698707">"Na voljo ni nobena epizoda.\nPosnete bodo, ko bodo na voljo."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d minuta)</item>
+ <item quantity="two">(%1$d minuti)</item>
+ <item quantity="few">(%1$d minute)</item>
+ <item quantity="other">(%1$d minut)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Danes"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Jutri"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Včeraj"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index c52d54b6..0b4c2f3c 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -131,12 +131,12 @@
<string name="pin_enter_again" msgid="2618999754723090427">"Потврдите PIN"</string>
<string name="pin_enter_old_pin" msgid="4588282612931041919">"Унесите актуелни PIN"</string>
<plurals name="pin_enter_countdown" formatted="false" msgid="3415233538538544309">
- <item quantity="one">Унели сте погрешан PIN 5 пута.\nПокушајте поново за <xliff:g id="REMAINING_SECONDS_1">%1$d</xliff:g> секунду.</item>
- <item quantity="few">Унели сте погрешан PIN 5 пута.\nПокушајте поново за <xliff:g id="REMAINING_SECONDS_1">%1$d</xliff:g> секунде.</item>
- <item quantity="other">Унели сте погрешан PIN 5 пута.\nПокушајте поново за <xliff:g id="REMAINING_SECONDS_1">%1$d</xliff:g> секунди.</item>
+ <item quantity="one">Унели сте погрешан PIN 5 пута.\nПробајте поново за <xliff:g id="REMAINING_SECONDS_1">%1$d</xliff:g> секунду.</item>
+ <item quantity="few">Унели сте погрешан PIN 5 пута.\nПробајте поново за <xliff:g id="REMAINING_SECONDS_1">%1$d</xliff:g> секунде.</item>
+ <item quantity="other">Унели сте погрешан PIN 5 пута.\nПробајте поново за <xliff:g id="REMAINING_SECONDS_1">%1$d</xliff:g> секунди.</item>
</plurals>
- <string name="pin_toast_wrong" msgid="2126295626095048746">"Тај PIN је погрешан. Покушајте поново."</string>
- <string name="pin_toast_not_match" msgid="4283624338659521768">"Покушајте поново, PIN се не подудара"</string>
+ <string name="pin_toast_wrong" msgid="2126295626095048746">"Тај PIN је погрешан. Пробајте поново."</string>
+ <string name="pin_toast_not_match" msgid="4283624338659521768">"Пробајте поново, PIN се не подудара"</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>
@@ -157,10 +157,10 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Само аудио"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Слаб сигнал"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Нема интернет везе"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Овај канал не може да се пусти пре <xliff:g id="END_TIME_1">%1$s</xliff:g> јер се сви тјунери користе за снимање других програма. \n\nПритисните тастер за десно да бисте прилагодили распоред снимања.</item>
- <item quantity="few">Овај канал не може да се пусти пре <xliff:g id="END_TIME_1">%1$s</xliff:g> јер се сви тјунери користе за снимање других програма. \n\nПритисните тастер за десно да бисте прилагодили распоред снимања.</item>
- <item quantity="other">Овај канал не може да се пусти пре <xliff:g id="END_TIME_1">%1$s</xliff:g> јер се сви тјунери користе за снимање других програма. \n\nПритисните тастер за десно да бисте прилагодили распоред снимања.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Овај канал не може да се пусти до <xliff:g id="END_TIME_1">%1$s</xliff:g> јер се снимају други канали. \n\nПритисните тастер за десно да бисте прилагодили распоред снимања.</item>
+ <item quantity="few">Овај канал не може да се пусти до <xliff:g id="END_TIME_1">%1$s</xliff:g> јер се снимају други канали. \n\nПритисните тастер за десно да бисте прилагодили распоред снимања.</item>
+ <item quantity="other">Овај канал не може да се пусти до <xliff:g id="END_TIME_1">%1$s</xliff:g> јер се снимају други канали. \n\nПритисните тастер за десно да бисте прилагодили распоред снимања.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Нема наслова"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Канал је блокиран"</string>
@@ -196,6 +196,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Каналима уживо треба дозвола за читање листе TV канала."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Подесите изворе канала"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Канали уживо комбинују доживљај традиционалних ТВ канала са каналима за стримовање које пружају апликације. \n\nЗапочните тако што ћете подесити изворе канала који су већ инсталирани. Или потражите још апликација које нуде канале уживо у Google Play продавници."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Снимци и распореди"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 минута"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 минута"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 сат"</string>
@@ -204,6 +205,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Заказано"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Серија"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Друго"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Није могуће снимити канал."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Није могуће снимити програм."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Заказано је снимање програма <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> се снима од сада до <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Комплетан распоред"</string>
@@ -236,9 +239,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Пусти од почетка"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Избриши снимке"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Изаберите епизоде које желите да избришете. Када их избришете, нећете моћи да их вратите."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Нема снимака за брисање."</string>
@@ -256,17 +261,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Приоритет"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Највиши"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Најнижи"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Не. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Канали"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Било који"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Изаберите приоритет"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Када нема довољно тјунера за истовремено снимање програма, снимаће се само програми са највишим приоритетом."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -280,17 +284,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Снимљени део ће бити сачуван у DVR библиотеци."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Снимљени садржај ће се сачувати."</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>
@@ -309,6 +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>
+ <!-- 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>
@@ -322,16 +338,23 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Биће делимично снимљено јер нема тјунера."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Неће бити снимљено јер нема тјунера."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Још увек није заказано ниједно снимање.\nСнимање можете да закажете из водича за програме."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Распоред снимања за наредни %1$d дан</item>
- <item quantity="few">Распоред снимања за наредна %1$d дана</item>
- <item quantity="other">Распоред снимања за наредних %1$d дана</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d неусаглашеност при снимању</item>
+ <item quantity="few">%1$d неусаглашености при снимању</item>
+ <item quantity="other">%1$d неусаглашености при снимању</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Подешавања"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Назад"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Опозови"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Подешавања серија"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Започни снимање серије"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Заустави снимање серије"</string>
+ <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_empty_state" msgid="3407962945399698707">"Нема доступних епизода.\nБиће снимљене када постану доступне."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d минут)</item>
+ <item quantity="few">(%1$d минута)</item>
+ <item quantity="other">(%1$d минута)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Данас"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Сутра"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Јуче"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 834639a6..212fd957 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Endast ljud"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Svag signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Ingen internetanslutning"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Kanalen kan inte spelas upp förrän <xliff:g id="END_TIME_1">%1$s</xliff:g>, eftersom alla mottagare används för att spela in andra program. \n\nTryck på Höger om du vill ändra inspelningsschemat.</item>
- <item quantity="one">Kanalen kan inte spelas upp förrän <xliff:g id="END_TIME_0">%1$s</xliff:g>, eftersom mottagaren används för att spela in andra program. \n\nTryck på Höger om du vill ändra inspelningsschemat.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Kanalen kan inte spelas upp förrän <xliff:g id="END_TIME_1">%1$s</xliff:g> eftersom andra kanaler spelas in. \n\nTryck på Höger om du vill ändra inspelningsschemat.</item>
+ <item quantity="one">Kanalen kan inte spelas upp förrän <xliff:g id="END_TIME_0">%1$s</xliff:g> eftersom en annan kanal spelas in. \n\nTryck på Höger om du vill ändra inspelningsschemat.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Ingen titel"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanalen har blockerats"</string>
@@ -192,6 +192,7 @@
<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 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">"En timme"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Planerat"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Serie"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Övrigt"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Det går inte att spela in från kanalen."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Det går inte att spela in programmet."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> har schemalagts för inspelning"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> spelas in från och med nu till kl. <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Hela schemat"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Spela upp från början"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Fortsätt spela upp"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Ta bort"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Radera inspelningar"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Återuppta"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Säsong <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Visa schema"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Läs mer"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Radera inspelningar"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Markera de avsnitt du vill radera. Det går inte att återställa avsnitten när de har raderats."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Det finns inga inspelningar att radera."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Prioritet"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Högsta"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Lägsta"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nej. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanaler"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Alla"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Välj prioritet"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"När det inte finns tillräckligt många mottagare för att spela in program samtidigt spelas endast programmen med högst prioritet in."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"När det finns för många program för att de ska kunna spelas in samtidigt spelas endast de med högst prioritet in."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Den inspelade delen sparas i DVR-biblioteket."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Bara delar av schemat spelas in p.g.a. mottagarkonflikter."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Schemat spelas inte in på grund av mottagarkonflikter."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Det finns inga schemalagda inspelningar ännu.\nDu schemalägger inspelningar i programguiden."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Inspelningsschema för kommande %1$d dagar</item>
- <item quantity="one">Inspelningsschema för %1$d dag</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d inspelningskrockar</item>
+ <item quantity="one">%1$d inspelningskrock</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Inställningar"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Tillbaka"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Ångra"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Serieinställningar"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Starta serieinspelning"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Stoppa serieinspelning"</string>
+ <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_empty_state" msgid="3407962945399698707">"Det finns inga tillgängliga avsnitt.\nDe spelas in när de är tillgängliga."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d minuter)</item>
+ <item quantity="one">(%1$d minut) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"I dag"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"I morgon"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"I går"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 49cb5cb1..00038ff4 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Sauti pekee"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Mawimbi dhaifu"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Hakuna muunganisho wa Intaneti"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Huwezi kucheza kituo hiki hadi <xliff:g id="END_TIME_1">%1$s</xliff:g> kwa sababu vitafuta vituo vyote vinatumika kurekodi programu nyingine. \n\nBonyeza Kulia ili ubadilishe ratiba ya kurekodi.</item>
- <item quantity="one">Huwezi kucheza kituo hiki hadi <xliff:g id="END_TIME_0">%1$s</xliff:g> kwa sababu kitafuta vituo kinatumika kurekodi programu nyingine. \n\nBonyeza Kulia ili ubadilishe ratiba ya kurekodi.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Huwezi kucheza kituo hiki hadi <xliff:g id="END_TIME_1">%1$s</xliff:g> kwa sababu vituo vingine vinarekodiwa. \n\nBonyeza Kulia ili ubadilishe ratiba ya kurekodi.</item>
+ <item quantity="one">Huwezi kucheza kituo hiki hadi <xliff:g id="END_TIME_0">%1$s</xliff:g> kwa sababu kituo kingine kinarekodiwa. \n\nBonyeza Kulia ili ubadilishe ratiba ya kurekodi.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Kichwa hakijaongezwa"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kituo kimezuiwa"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Kipengele cha Vituo vya Moja kwa Moja kinahitaji idhini ili kione orodha ya vipindi vya televisheni."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Weka mipangilio ya vyanzo vyako"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Televisheni mtandaoni hujumuisha hali ya matumizi ya vituo vya TV ya kawaida na vituo vya utiririshaji vinavyotolewa na programu. \n\nAnza kutumia kwa kuweka mipangilio ya vyanzo vya vituo ambavyo tayari vimesakinishwa. Au kagua Duka la Google Play ili upate programu zaidi zinazotoa huduma za televisheni mtandaoni."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Rekodi na ratiba"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"Dakika 10"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"Dakika 30"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"Saa 1"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Imeratibiwa"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Mfululizo"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Nyinginezo"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Haiwezi kurekodi kituo hiki."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Haiwezi kurekodi kipindi hiki."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> imeratibiwa kurekodiwa"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Inarekodi <xliff:g id="PROGRAMNAME">%1$s</xliff:g> kuanzia sasa hadi <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Ratiba kamili"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Cheza kutoka mwanzo"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Endelea kucheza"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Futa"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Futa rekodi"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Endelea"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Msimu wa <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Tazama ratiba"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Endelea kusoma"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Futa rekodi"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Chagua vipindi ambavyo ungependa kufuta. Huwezi kurejesha vipindi ulivyofuta."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Hakuna rekodi za kufuta."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Kipaumbele"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Juu kabisa"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Chini kabisa"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Nambari <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Vituo"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Chochote"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Chagua kipaumbele"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Wakati hakuna vipokea mawimbi vya kutosha kurekodi vipindi kwa wakati mmoja, ni vipindi vilivyopewa kipaumbele ndivyo vitakavyorekodiwa."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Wakati kuna vipindi vingi vya kurekodi kwa wakati mmoja, tutarekodi vipindi vilivyopewa kipaumbele pekee."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Sehemu iliyorekodiwa itahifadhiwa katika maktaba ya DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Itahifadhi maudhui uliyorekodi."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Haitarekodiwa yote kufuatia kukinzana kwa kitafuta vituo."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Haitarekodiwa kufuatia kukinzana kwa kitafuta vituo."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Bado hujaratibu kurekodi kipindi chochote.\nUnaweza kuratibu kutoka orodha ya vipindi."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Ratiba ya kurekodi ya siku %1$d zijazo</item>
- <item quantity="one">Ratiba ya kurekodi ya siku %1$d ijayo</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">Itaonyesha orodha ya rekodi siku %1$d</item>
+ <item quantity="one">Itaonyesha orodha ya rekodi siku 1$d</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Mipangilio"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Nyuma"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Tendua"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Mipangilio ya mfululizo"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Anza kurekodi mfululizo"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Komesha kurekodi mfululizo"</string>
+ <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_empty_state" msgid="3407962945399698707">"Hakuna vipindi vinavyopatikana.\nVitarekodiwa pindi vitakapopatikana."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(Dakika %1$d)</item>
+ <item quantity="one">(Dakika %1$d) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Leo"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Kesho"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Jana"</string>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index a1d39859..7d13e3cf 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"ஆடியோ மட்டும்"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"வலுவற்ற சிக்னல்"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"இணைய இணைப்பு இல்லை"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">மற்ற நிகழ்ச்சிகளை ரெக்கார்ட் செய்வதற்காக எல்லா டியூனர்களும் பயன்படுத்தப்படுவதால், <xliff:g id="END_TIME_1">%1$s</xliff:g> வரை இந்தச் சேனலை இயக்க முடியாது. \n\nரெக்கார்ட் செய்வதற்கான திட்ட அட்டவணையில் மாற்றம் செய்ய, \"Right\" என்பதை அழுத்தவும்.</item>
- <item quantity="one">மற்ற நிகழ்ச்சிகளை ரெக்கார்ட் செய்வதற்காக டியூனர் பயன்படுத்தப்படுவதால், <xliff:g id="END_TIME_0">%1$s</xliff:g> வரை இந்தச் சேனலை இயக்க முடியாது. \n\nரெக்கார்ட் செய்வதற்கான திட்ட அட்டவணையில் மாற்றம் செய்ய, \"Right\" என்பதை அழுத்தவும்.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">மற்ற சேனல்கள் ரெக்கார்டு செய்யப்படுவதால், <xliff:g id="END_TIME_1">%1$s</xliff:g> வரை இந்தச் சேனலை இயக்க முடியாது. \n\nரெக்கார்டு செய்வதற்கான திட்ட அட்டவணையில் மாற்றம் செய்ய, \"Right\" என்பதை அழுத்தவும்.</item>
+ <item quantity="one">மற்றொரு சேனல் ரெக்கார்டு செய்யப்படுவதால், <xliff:g id="END_TIME_0">%1$s</xliff:g> வரை இந்தச் சேனலை இயக்க முடியாது. \n\nரெக்கார்டு செய்வதற்கான திட்ட அட்டவணையில் மாற்றம் செய்ய, \"Right\" என்பதை அழுத்தவும்.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"தலைப்பு இல்லை"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"சேனல் தடுக்கப்பட்டது"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"டிவி பட்டியல்களைப் படிக்க, நேரலைச் சேனல்களுக்கு அனுமதி தேவை."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"மூலங்களை அமைக்கவும்"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"நேரலைச் சேனல்களானது பயன்பாடுகள் வழங்கும் ஸ்ட்ரீமிங் சேனல்களுடன் பாரம்பரிய டிவி சேனல்களின் அனுபவத்தை ஒன்றிணைக்கிறது. \n\nஏற்கனவே நிறுவிய சேனல் மூலங்களை அமைப்பதன் மூலம் தொடங்கவும் அல்லது நேரலைச் சேனல்களை வழங்கும் கூடுதல் பயன்பாடுகளைப் பெற, Google Play ஸ்டோரில் தேடவும்."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"ரெக்கார்டிங்குகள் &amp; திட்ட அட்டவணைகள்"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 நிமிடங்கள்"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 நிமிடங்கள்"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 மணிநேரம்"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"திட்டமிடப்பட்டது"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"தொடர்"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"மற்றவை"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"இந்தச் சேனலை ரெக்கார்டு செய்ய முடியாது."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"இந்த நிகழ்ச்சியை ரெக்கார்டு செய்ய முடியாது."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ரெக்கார்டு செய்வதற்காகத் திட்டமிடப்பட்டது"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"இப்போதிலிருந்து <xliff:g id="ENDTIME">%2$s</xliff:g> வரை <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ரெக்கார்டு செய்யப்படுகிறது"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"முழுத் திட்ட அட்டவணை"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"முதலிலிருந்து இயக்கு"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"ரெக்கார்டிங்குகளை நீக்கு"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"நீக்க விரும்பும் எபிசோடுகளைத் தேர்ந்தெடுக்கவும். ஒருமுறை நீக்கிவிட்டால், அவற்றை மீட்டெடுக்க முடியாது."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"நீக்குவதற்கான ரெக்கார்டிங்குகள் இல்லை."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"முன்னுரிமை"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"மிக அதிக முன்னுரிமை"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"மிகக்குறைந்த முன்னுரிமை"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"முன்னுரிமை: <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"சேனல்கள்"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"எந்தச் சேனலும்"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"முன்னுரிமையைத் தேர்வுசெய்க"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"ஒரே நேரத்தில் நிகழ்ச்சிகளை ரெக்கார்டு செய்வதற்குப் போதுமான டியூனர்கள் இல்லாத சமயத்தில், மிக அதிக முன்னுரிமைகளைக் கொண்ட நிகழ்ச்சிகள் மட்டுமே ரெக்கார்டு செய்யப்படும்."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"ரெக்கார்டு செய்த பகுதி DVR நூலகத்தில் சேமிக்கப்படும்."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ரெக்கார்டு செய்த உள்ளடக்கம் சேமிக்கப்படும்."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ட்யூனர் இல்லாததால், பகுதியளவு ரெக்கார்டு செய்யப்படும்."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ட்யூனர் இல்லாததால், ரெக்கார்டு செய்யப்படாது."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ரெக்கார்டு செய்வதற்காக எதுவும் திட்டமிடப்படவில்லை.\nநிகழ்ச்சி வழிகாட்டிக்குச் சென்று, ரெக்கார்டிங்கைத் திட்டமிடலாம்."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">அடுத்த %1$d நாட்களுக்கான ரெக்கார்டிங் திட்ட அட்டவணை</item>
- <item quantity="one">அடுத்த %1$d நாளுக்கான ரெக்கார்டிங் திட்ட அட்டவணை</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d ரெக்கார்டிங் முரண்பாடுகள்</item>
+ <item quantity="one">%1$d ரெக்கார்டிங் முரண்பாடு</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"அமைப்புகள்"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"முந்தையது"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"செயல்தவிர்"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"தொடர் அமைப்புகள்"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"தொடர் ரெக்கார்டிங்கைத் தொடங்கு"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"தொடர் ரெக்கார்டிங்கை நிறுத்து"</string>
+ <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_empty_state" msgid="3407962945399698707">"எபிசோடுகள் இல்லை.\nஅவை கிடைக்கும் போது ரெக்கார்டு செய்யப்படும்."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d நிமிடங்கள்)</item>
+ <item quantity="one">(%1$d நிமிடம்) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"இன்று"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"நாளை"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"நேற்று"</string>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 46a893bf..274be2ce 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"ఆడియో మాత్రమే"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"సిగ్నల్ బలహీనంగా ఉంది"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"ఇంటర్నెట్ కనెక్షన్ లేదు"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">అన్ని ట్యూనర్‌లను ఇతర కార్యక్రమాలు రికార్డ్ చేయడం కోసం ఉపయోగిస్తున్నందున ఈ ఛానెల్‌ని <xliff:g id="END_TIME_1">%1$s</xliff:g> వరకు ప్లే చేయలేరు. \n\nరికార్డింగ్ షెడ్యూల్‌ను సర్దుబాటు చేయడానికి కుడివైపు నొక్కండి.</item>
- <item quantity="one">ట్యూనర్‌ను ఇతర కార్యక్రమాలు రికార్డ్ చేయడం కోసం ఉపయోగిస్తున్నందున ఈ ఛానెల్‌ని <xliff:g id="END_TIME_0">%1$s</xliff:g> వరకు ప్లే చేయలేరు. \n\nరికార్డింగ్ షెడ్యూల్‌ను సర్దుబాటు చేయడానికి కుడివైపు నొక్కండి.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">ఇతర ఛానెల్‌లు రికార్డ్ అవుతున్నందున ఈ ఛానెల్‌ని <xliff:g id="END_TIME_1">%1$s</xliff:g> వరకు ప్లే చేయలేరు. \n\nరికార్డింగ్ షెడ్యూల్‌ను సర్దుబాటు చేయడానికి కుడివైపు నొక్కండి.</item>
+ <item quantity="one">మరొక ఛానెల్ రికార్డ్ అవుతున్నందున ఈ ఛానెల్‌ని <xliff:g id="END_TIME_0">%1$s</xliff:g> వరకు ప్లే చేయలేరు. \n\nరికార్డింగ్ షెడ్యూల్‌ను సర్దుబాటు చేయడానికి కుడివైపు నొక్కండి.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"శీర్షిక లేదు"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"ఛానెల్ బ్లాక్ చేయబడింది"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"టీవీ జాబితాలను చదవడానికి ప్రత్యక్ష ప్రసార ఛానెల్‌లకు అనుమతి అవసరం."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"మీ మూలాధారాలను సెటప్ చేయండి"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"ప్రత్యక్ష ప్రసార ఛానెల్‌లు అనువర్తనాల ద్వారా అందించబడే ప్రసార ఛానెల్‌ల్లో సాంప్రదాయక టీవీ ఛానెల్‌ల అనుభూతి కలగలిపి అందించబడతాయి. \n\nఇప్పటికే ఇన్‌స్టాల్ చేసుకున్న ఛానెల్ మూలాధారాలను సెటప్ చేయడం ద్వారా ప్రారంభించండి. లేదా ప్రత్యక్ష ప్రసార ఛానెల్‌లను ఆఫర్ చేసే మరిన్ని అనువర్తనాల కోసం Google Play స్టోర్‌లో బ్రౌజ్ చేయండి."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"రికార్డింగ్‌లు &amp; షెడ్యూల్‌లు"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 నిమిషాలు"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 నిమిషాలు"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 గంట"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"షెడ్యూల్ చేసినవి"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"సిరీస్"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"ఇతరం"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"ఛానెల్‌ను రికార్డ్ చేయడం సాధ్యపడదు."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"కార్యక్రమాన్ని రికార్డ్ చేయడం సాధ్యపడదు."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> రికార్డ్ చేయడం కోసం షెడ్యూల్ చేయబడింది"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"ఇప్పటి నుండి <xliff:g id="ENDTIME">%2$s</xliff:g> వరకు <xliff:g id="PROGRAMNAME">%1$s</xliff:g> రికార్డ్ చేస్తుంది"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"పూర్తి షెడ్యూల్"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"మొదటి నుండి ప్లే చేయి"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"రికార్డింగ్‌లు తొలగించు"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"మీరు తొలగించాలనుకునే ఎపిసోడ్‌లను ఎంచుకోండి. వీటిని ఒకసారి తొలగించాక తిరిగి పునరుద్ధరించలేరు."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"తొలగించడానికి రికార్డింగ్‌లు ఏవీ లేవు."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"ప్రాధాన్యత"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"అత్యధికం"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"అతి తక్కువ"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"వద్దు. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"ఛానెల్‌లు"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"ఏదైనా"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"ప్రాధాన్యతను ఎంచుకోండి"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"ఒకే సమయంలో ప్రోగ్రామ్‌లను రికార్డ్ చేయడానికి తగినన్ని ట్యూనర్‌లు లేనప్పుడు, అధిక ప్రాధాన్యతలను కలిగి ఉన్న ప్రోగ్రామ్‌లు మాత్రమే రికార్డ్ చేయబడతాయి."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"రికార్డ్ చేసిన భాగం DVR లైబ్రరీలో సేవ్ చేయబడుతుంది."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"రికార్డ్ అయిన కంటెంట్ సేవ్ చేయబడుతుంది."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ట్యూనర్ వైరుధ్యాల కారణంగా పాక్షికంగా రికార్డ్ చేయబడుతుంది."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ట్యూనర్ వైరుధ్యాల కారణంగా రికార్డ్ చేయబడదు."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ఇంకా షెడ్యూల్ చేసిన రికార్డింగ్‌లు ఏవీ లేవు.\nమీరు కార్యక్రమాల గైడ్ నుండి రికార్డింగ్‌ను షెడ్యూల్ చేయవచ్చు."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">తదుపరి %1$d రోజుల రికార్డింగ్ షెడ్యూల్</item>
- <item quantity="one">తదుపరి %1$d రోజు రికార్డింగ్ షెడ్యూల్</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d రికార్డింగ్ వైరుధ్యాలు ఉన్నాయి</item>
+ <item quantity="one">%1$d రికార్డింగ్ వైరుధ్యం ఉంది</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"సెట్టింగ్‌లు"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"వెనుకకు"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"చర్య రద్దు చేయి"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"సిరీస్ సెట్టింగ్‌లు"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"సిరీస్ రికార్డింగ్ ఆరంభించు"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"సిరీస్ రికార్డింగ్ ఆపివేయి"</string>
+ <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_empty_state" msgid="3407962945399698707">"ఎపిసోడ్‌లు ఏవీ అందుబాటులో లేవు.\nఇవి అందుబాటులోకి వచ్చిన వెంటనే రికార్డ్ చేయబడతాయి."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d నిమిషాలు)</item>
+ <item quantity="one">(%1$d నిమిషం) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"ఈ రోజు"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"రేపు"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"నిన్న"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index fe295dc0..8424e9bb 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"เฉพาะเสียง"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"สัญญาณไม่ดี"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"ไม่มีการเชื่อมต่ออินเทอร์เน็ต"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">ช่องนี้ไม่สามารถเล่นได้จนถึง <xliff:g id="END_TIME_1">%1$s</xliff:g> เพราะตัวรับสัญญาณทั้งหมดกำลังบันทึกรายการอื่นอยู่ \n\nกดขวาเพื่อปรับกำหนดการบันทึก</item>
- <item quantity="one">ช่องนี้ไม่สามารถเล่นได้จนถึง <xliff:g id="END_TIME_0">%1$s</xliff:g> เพราะตัวรับสัญญาณกำลังบันทึกรายการอื่นอยู่ \n\nกดขวาเพื่อปรับกำหนดการบันทึก</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">ช่องนี้ไม่สามารถเล่นได้จนถึง <xliff:g id="END_TIME_1">%1$s</xliff:g> เพราะกำลังบันทึกช่องอื่นๆ อยู่ \n\nกดขวาเพื่อปรับกำหนดการบันทึก</item>
+ <item quantity="one">ช่องนี้ไม่สามารถเล่นได้จนถึง <xliff:g id="END_TIME_0">%1$s</xliff:g> เพราะกำลังบันทึกอีกช่องอยู่ \n\nกดขวาเพื่อปรับกำหนดการบันทึก</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"ไม่มีชื่อ"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"บล็อกช่องแล้ว"</string>
@@ -191,7 +191,8 @@
<string name="msg_back_key_guide" msgid="7404682718828721924">"แป้นกลับมีไว้สำหรับอุปกรณ์ที่เชื่อมต่อ กดปุ่มหน้าแรกเพื่อออก"</string>
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Live TV ต้องใช้สิทธิ์ในการอ่านรายการทีวี"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"ตั้งค่าแหล่งที่มา"</string>
- <string name="setup_sources_description" msgid="5695518946225445202">"รายการถ่ายทอดสดมอบประสบการณ์ที่ผสมผสานระหว่างช่องทีวีแบบดั้งเดิมกับช่องแบบสตรีมโดยแอป\n\nเริ่มต้นใช้งานได้โดยตั้งค่าแหล่งที่มาของช่องที่ติดตั้งไว้แล้ว หรือเรียกดู Google Play สโตร์เพื่อค้นหาแอปอื่นๆ ที่เสนอรายการถ่ายทอดสด"</string>
+ <string name="setup_sources_description" msgid="5695518946225445202">"รายการถ่ายทอดสดมอบประสบการณ์ที่ผสมผสานระหว่างช่องทีวีแบบดั้งเดิมกับช่องแบบสตรีมโดยแอป\n\nเริ่มต้นใช้งานได้โดยตั้งค่าแหล่งที่มาของช่องที่ติดตั้งไว้แล้ว หรือเรียกดู Google Play Store เพื่อค้นหาแอปอื่นๆ ที่เสนอรายการถ่ายทอดสด"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"การบันทึกและกำหนดการ"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 นาที"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 นาที"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ชั่วโมง"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"กำหนดเวลาไว้"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"ซีรี่ส์"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"อื่นๆ"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"ไม่สามารถบันทึกช่องได้"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"ไม่สามารถบันทึกรายการได้"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"ตั้งกำหนดการบันทึก <xliff:g id="PROGRAMNAME">%1$s</xliff:g> แล้ว"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"กำลังบันทึก <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ตั้งแต่ตอนนี้ถึง <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"กำหนดการทั้งหมด"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"เล่นจากจุดเริ่มต้น"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"ลบการบันทึก"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"เลือกตอนที่ต้องการลบ โปรดทราบว่าเมื่อลบแล้วจะกู้คืนไม่ได้"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"ไม่มีการบันทึกที่จะลบ"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"ความสำคัญ"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"สูงสุด"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"ต่ำสุด"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"อันดับที่ <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"ช่อง"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"ทั้งหมด"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"เลือกลำดับความสำคัญ"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"หากตัวรับสัญญาณไม่พอสำหรับการบันทึกรายการพร้อมกัน ระบบจะบันทึกเฉพาะรายการที่มีความสำคัญมากกว่า"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"ส่วนที่บันทึกจะเก็บไว้ในห้องสมุดดนตรี DVR"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ระบบจะเก็บเนื้อหาที่บันทึกไว้"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ระบบจะบันทึกไว้บางส่วนเนื่องจากมีข้อขัดแย้งของตัวรับสัญญาณ"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ระบบจะไม่บันทึกเนื่องจากมีข้อขัดแย้งของตัวรับสัญญาณ"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ยังไม่มีการบันทึกในกำหนดการ\nคุณสามารถกำหนดเวลาบันทึกจากคู่มือรายการทีวี"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">กำหนดการบันทึกสำหรับ %1$d วันถัดไป</item>
- <item quantity="one">กำหนดการบันทึกสำหรับ %1$d วันถัดไป</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">ตารางบันทึกชนกัน %1$d รายการ</item>
+ <item quantity="one">ตารางบันทึกชนกัน %1$d รายการ</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"การตั้งค่า"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"กลับ"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"เลิกทำ"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"การตั้งค่าซีรีส์"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"เริ่มบันทึกซีรีส์"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"หยุดบันทึกซีรีส์"</string>
+ <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_empty_state" msgid="3407962945399698707">"ไม่มีตอนที่พร้อมรับชม\nระบบจะเริ่มบันทึกเมื่อมีตอนที่พร้อมรับชม"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d นาที)</item>
+ <item quantity="one">(%1$d นาที) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"วันนี้"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"พรุ่งนี้"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"เมื่อวานนี้"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index c4bb2081..a925aee6 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Audio lang"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Mahinang signal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Walang koneksyon sa internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Hindi mape-play ang channel na ito hanggang <xliff:g id="END_TIME_1">%1$s</xliff:g> dahil ginagamit ang lahat ng tuner sa pagre-record ng iba pang mga program. \n\nPindutin ang Right upang isaayos ang iskedyul ng pagre-record.</item>
- <item quantity="other">Hindi mape-play ang channel na ito hanggang <xliff:g id="END_TIME_1">%1$s</xliff:g> dahil ginagamit ang lahat ng tuner sa pagre-record ng iba pang mga program. \n\nPindutin ang Right upang isaayos ang iskedyul ng pagre-record.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Hindi mape-play ang channel na ito hanggang <xliff:g id="END_TIME_1">%1$s</xliff:g> dahil nagre-record ng iba pang mga channel. \n\nPindutin ang Kanan upang i-adjust ang iskedyul sa pagre-record.</item>
+ <item quantity="other">Hindi mape-play ang channel na ito hanggang <xliff:g id="END_TIME_1">%1$s</xliff:g> dahil nagre-record ng iba pang mga channel. \n\nPindutin ang Kanan upang i-adjust ang iskedyul sa pagre-record.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Walang pamagat"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Naka-block ang channel"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Kailangan ng pahintulot ng Live TV upang mabasa ang mga listahan sa TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"I-set up ang iyong mga pinagmulan"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Mapapanood sa mga live channel ang mga ipinapalabas sa mga nakasanayan nang TV channel at sa mga streaming channel na mula sa mga app. \n\nMagsimula sa pamamagitan ng pagse-set up ng mga pinagmulan ng channel na naka-install na. O mag-browse sa Google Play Store para sa higit pang mga app na nag-aalok ng mga live na channel."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Mga recording &amp; iskedyul"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 minuto"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 minuto"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 oras"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Nakaiskedyul"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Mga Serye"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Iba Pa"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Hindi ma-record ang channel."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Hindi ma-record ang programa."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Naiskedyul nang i-record ang <xliff:g id="PROGRAMNAME">%1$s</xliff:g>"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Nire-record ang <xliff:g id="PROGRAMNAME">%1$s</xliff:g> mula ngayon hanggang <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Buong iskedyul"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"I-play mula sa simula"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Ituloy ang pag-play"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"I-delete"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Mag-delete ng mga recording"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Ituloy"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Season <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Tingnan ang iskedyul"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Magbasa pa"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"I-delete recordings"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Piliin ang mga episode na gusto mong i-delete. Hindi na mababawi ang mga ito sa sandaling ma-delete."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Walang mga recording na ide-delete."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Priyoridad"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Pinakamataas"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Pinakamababa"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"No. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Mga Channel"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Kahit ano"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Pumili ng priyoridad"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Kapag walang mga sapat na tuner upang sabay na mag-record ng mga programa, ang mga programa lang na may mas mataas na priyoridad ang ire-record."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Kapag masyadong maraming programa ang ire-record nang sabay-sabay, tanging ang may mas mataas na priyoridad lang ang mare-record."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Mase-save ang na-record na bahagi sa library ng DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Mase-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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Bahagyang mare-record dahil sa mga problema sa tuner."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Hindi mare-record dahil sa mga problema sa tuner."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Wala pang nakaiskedyul na mga pagre-record.\nMaaari kang mag-iskedyul ng pagre-record sa gabay sa programa."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Iskedyul ng pagre-record para sa susunod na %1$d araw</item>
- <item quantity="other">Iskedyul ng pagre-record para sa susunod na %1$d na araw</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d kasabay na recording</item>
+ <item quantity="other">%1$d na kasabay na recording</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Mga Setting"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Bumalik"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"I-undo"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Mga setting ng mga serye"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Simulan ang pagre-record ng mga serye"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Ihinto ang pagre-record ng mga serye"</string>
+ <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_empty_state" msgid="3407962945399698707">"Walang available na mga episode.\nMare-record ang mga ito kapag available na ang mga ito."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d minuto)</item>
+ <item quantity="other">(%1$d na minuto)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Ngayong araw"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Bukas"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Kahapon"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index be25ae69..8162fbfa 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Yalnızca ses"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Zayıf sinyal"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"İnternet bağlantısı yok"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Tüm kanal ayarlayıcılar, başka programları kaydetmek için kullanıldığından bu kanal şu saatten önce oynatılamaz: <xliff:g id="END_TIME_1">%1$s</xliff:g> \n\nKayıt zaman planını düzenlemek için Sağ\'a basın.</item>
- <item quantity="one">Kanal ayarlayıcı, başka programları kaydetmek için kullanıldığından bu kanal şu saatten önce oynatılamaz: <xliff:g id="END_TIME_0">%1$s</xliff:g> \n\nKayıt zaman planını düzenlemek için Sağ\'a basın.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Şu anda başka kanallar kaydedildiğinden bu kanal şu saatten önce oynatılamaz: <xliff:g id="END_TIME_1">%1$s</xliff:g>. \n\nKayıt zaman planını düzenlemek için Sağ\'a basın.</item>
+ <item quantity="one">Şu anda başka bir kanal kaydedildiğinden bu kanal şu saatten önce oynatılamaz: <xliff:g id="END_TIME_0">%1$s</xliff:g>. \n\nKayıt zaman planını düzenlemek için Sağ\'a basın.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Başlıksız"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanal engellendi"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Canlı Kanallar\'ın TV kanal listesini okuması için izin gerekiyor."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Kaynaklarınızı ayarlayın"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Canlı kanallar, geleneksel TV kanallarının deneyimini uygulamalar tarafından sağlanan kanal akışlarıyla birleştirir. \n\nHalihazırda yüklü kanal kaynaklarını ayarlayarak başlayın. İsterseniz canlı kanallar sunan diğer uygulamalar için Google Play Store\'a göz atabilirsiniz."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Kayıtlar ve programlar"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 dakika"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 dakika"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 saat"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Programlananlar"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Diziler"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Diğerleri"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Kanal kaydedilemiyor."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Program kaydedilemiyor."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> kaydedilmek üzere programlandı"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> adlı program şu andan itibaren şu saate kadar kaydedilecek: <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Tam program"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Baştan oynat"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Oynatmaya devam et"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Sil"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Kayıtları sil"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Devam ettir"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>. Sezon"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Programı göster"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Daha fazla okuyun"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Kayıtları silin"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Silmek istediğiniz bölümleri seçin. Bölümler silindikten sonra geri alınamaz."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Silinecek kayıt yok."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Öncelik"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"En yüksek"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"En düşük"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Sıra: <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanallar"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Tüm kanallar"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Öncelik seçin"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Programları aynı anda kaydetmek için yeterli sayıda kanal ayarlayıcı olmadığında, yalnızca yüksek öncelikli programlar kaydedilir."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Aynı anda kaydedilecek çok sayıda program olduğundan, yalnızca yüksek öncelikli programlar kaydedilir."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Kaydedilen kısım DVR kitaplığında saklanacaktır."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Kanal ayarlayıcı çakışması nedeniyle tamamı kaydedilmeyecek."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Kanal ayarlayıcı çakışması nedeniyle kaydedilemeyecek."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Henüz programa alınmış bir kayıt yok.\nKayıtları, program rehberinden programlayabilirsiniz."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Sonraki %1$d gün için kayıt programı</item>
- <item quantity="one">Sonraki %1$d gün için kayıt programı</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d kayıt çakışması</item>
+ <item quantity="one">%1$d kayıt çakışması</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Ayarlar"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Geri"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Geri al"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Dizi ayarları"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Dizi kaydetmeye başla"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Dizi kaydetmeyi durdur"</string>
+ <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_empty_state" msgid="3407962945399698707">"Kaydedilebilecek bir bölüm yok.\nBölümler kullanıma sunulduğunda kaydedilecektir."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d dakika)</item>
+ <item quantity="one">(%1$d dakika) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Bugün"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Yarın"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Dün"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 516cba2a..b9d91a7a 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -159,11 +159,11 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Лише аудіо"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Слабкий сигнал"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Немає з’єднання з Інтернетом"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Вміст цього каналу не відтворюватиметься до <xliff:g id="END_TIME_1">%1$s</xliff:g>, оскільки тюнери використовуються для запису інших програм. \n\nНатисніть стрілку \"Управо\", щоб змінити розклад запису.</item>
- <item quantity="few">Вміст цього каналу не відтворюватиметься до <xliff:g id="END_TIME_1">%1$s</xliff:g>, оскільки тюнери використовуються для запису інших програм. \n\nНатисніть стрілку \"Управо\", щоб змінити розклад запису.</item>
- <item quantity="many">Вміст цього каналу не відтворюватиметься до <xliff:g id="END_TIME_1">%1$s</xliff:g>, оскільки тюнери використовуються для запису інших програм. \n\nНатисніть стрілку \"Управо\", щоб змінити розклад запису.</item>
- <item quantity="other">Вміст цього каналу не відтворюватиметься до <xliff:g id="END_TIME_1">%1$s</xliff:g>, оскільки тюнери використовуються для запису інших програм. \n\nНатисніть стрілку \"Управо\", щоб змінити розклад запису.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Вміст цього каналу не відтворюватиметься до <xliff:g id="END_TIME_1">%1$s</xliff:g>, оскільки записуються інші канали. \n\nНатисніть стрілку \"Управо\", щоб змінити графік запису.</item>
+ <item quantity="few">Вміст цього каналу не відтворюватиметься до <xliff:g id="END_TIME_1">%1$s</xliff:g>, оскільки записуються інші канали. \n\nНатисніть стрілку \"Управо\", щоб змінити графік запису.</item>
+ <item quantity="many">Вміст цього каналу не відтворюватиметься до <xliff:g id="END_TIME_1">%1$s</xliff:g>, оскільки записуються інші канали. \n\nНатисніть стрілку \"Управо\", щоб змінити графік запису.</item>
+ <item quantity="other">Вміст цього каналу не відтворюватиметься до <xliff:g id="END_TIME_1">%1$s</xliff:g>, оскільки записуються інші канали. \n\nНатисніть стрілку \"Управо\", щоб змінити графік запису.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Без назви"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Канал заблоковано"</string>
@@ -200,6 +200,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Додатку Live TV потрібен дозвіл переглядати програму телепередач."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Налаштуйте джерела"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"У телеканалах поєднуються зручність традиційних каналів і трансляція каналів із додатків. \n\nЩоб почати, налаштуйте вже встановлені джерела каналів. Або пошукайте в магазині Google Play інші додатки з телеканалами."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Записи та графіки"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 хвилин"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 хвилин"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 година"</string>
@@ -208,6 +209,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"За розкладом"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Серіал"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Інші"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Не можна записати канал."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Не можна записати передачу."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"Програму \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" заплановано для запису"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Запис передачі \"<xliff:g id="PROGRAMNAME">%1$s</xliff:g>\" з цього моменту до <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Повний розклад"</string>
@@ -245,9 +248,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Відтворити з початку"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Видалити записи"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Виберіть серії, які потрібно видалити. Їх не можна буде відновити."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Немає записів для видалення."</string>
@@ -266,17 +271,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Пріоритет"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Найвищий"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Найнижчий"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Немає. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Канали"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Будь-який канал"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Виберіть пріоритет"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Якщо замало тюнерів для одночасного запису програм, записуватимуться лише програми з вищим пріоритетом."</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -290,17 +294,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Записана частина збережеться в бібліотеці DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Записаний вміст буде збережено."</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>
@@ -320,6 +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>
+ <!-- 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>
@@ -334,17 +350,25 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Буде частково записано через конфлікти тюнера."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Не буде записано через конфлікти тюнера."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"У розкладі ще немає записів.\nВи можете запланувати запис на основі програми передач."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Розклад запису на наступний %1$d день</item>
- <item quantity="few">Розклад запису на наступні %1$d дні</item>
- <item quantity="many">Розклад запису на наступні %1$d днів</item>
- <item quantity="other">Розклад запису на наступні %1$d дня</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d конфлікт запису</item>
+ <item quantity="few">%1$d конфлікти запису</item>
+ <item quantity="many">%1$d конфліктів запису</item>
+ <item quantity="other">%1$d конфлікту запису</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Налаштування"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Назад"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Відмінити"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Налаштування серій"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Почати запис серій"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Припинити запис серій"</string>
+ <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_empty_state" msgid="3407962945399698707">"Немає серій.\nСерії буде записано, щойно вони з’являться."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d хвилина)</item>
+ <item quantity="few">(%1$d хвилини)</item>
+ <item quantity="many">(%1$d хвилин)</item>
+ <item quantity="other">(%1$d хвилини)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Сьогодні"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Завтра"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Учора"</string>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index 88860382..47fcb2ad 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"صرف آڈیو"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"کمزور سگنل"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"کوئی انٹرنیٹ کنکشن نہیں ہے"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other"><xliff:g id="END_TIME_1">%1$s</xliff:g> تک یہ چینل نہیں چل سکتا کیونکہ ٹیونر دیگر پروگرامز کو ریکارڈ کرنے میں استعمال ہو رہا ہے۔ \n\nریکارڈنگ کا شیڈول ایڈجسٹ کرنے کیلئے دائیں طرف دبائیں۔</item>
- <item quantity="one"><xliff:g id="END_TIME_0">%1$s</xliff:g> تک یہ چینل نہیں چل سکتا کیونکہ ٹیونر دیگر پروگرامز کو ریکارڈ کرنے میں استعمال ہو رہا ہے۔ \n\nریکارڈنگ کا شیڈول ایڈجسٹ کرنے کیلئے دائیں طرف دبائیں۔</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">یہ چینل <xliff:g id="END_TIME_1">%1$s</xliff:g> تک نہیں چلایا جا سکتا کیونکہ دوسرے چینلز کو ریکارڈ کیا جا رہا ہے۔ \n\nریکارڈنگ کا شیڈول ایڈجسٹ کرنے کیلئے دائیں طرف دبائیں۔</item>
+ <item quantity="one">یہ چینل <xliff:g id="END_TIME_0">%1$s</xliff:g> تک نہیں چلایا جا سکتا کیونکہ ایک اور چینل کو ریکارڈ کیا جا رہا ہے۔ \n\nریکارڈنگ کا شیڈول ایڈجسٹ کرنے کیلئے دائیں طرف دبائیں۔</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"کوئی عنوان نہیں ہے"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"چینل مسدود کر دیا گیا"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"‏لائیو چینلز کو TV فہرستیں پڑھنے کیلئے اجازت کی ضرورت ہے۔"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"اپنے ذرائع سیٹ اپ کریں"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"‏لائیو چینلز روایتی TV چینلز کے تجربے کو ایپس کی جانب سے فراہم کردہ اسٹریمنگ چینلز سے ملاتے ہیں۔ \n\nپہلے سے انسٹال شدہ چینل ماخذین کو سیٹ اپ کر کے شروع کریں۔ یا لائیو چینلز کی پیشکش کرنے والی مزید ایپس کیلئے Google Play اسٹور براؤز کریں۔"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"ریکارڈنگز اور شیڈولز"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 منٹ"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 منٹ"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 گھنٹہ"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"شیڈول کردہ"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"سلسلہ"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"دیگر"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"چینل ریکارڈ نہیں ہو سکتا۔"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"پروگرام ریکارڈ نہیں ہو سکتا۔"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> کی ریکارڈنگ کیلئے شیڈول بن گیا ہے"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"اب سے لے کر <xliff:g id="ENDTIME">%2$s</xliff:g> تک <xliff:g id="PROGRAMNAME">%1$s</xliff:g> ریکارڈ ہو رہا ہے"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"پورا شیڈول"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"شروع سے چلائیں"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"ریکارڈنگز حذف کریں"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"وہ ایپی سوڈز منتخب کریں جو آپ حذف کرنا چاہتے ہیں۔ ایک بار حذف ہونے کے بعد ان کو بازیاب نہیں کیا جا سکتا۔"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"حذف کرنے کیلئے کوئی ریکارڈنگ نہیں ہے۔"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"ترجیح"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"سب سے اعلی"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"سب سے کم"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"نہیں۔ <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"چینلز"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"کوئی بھی"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"ترجیح کا انتخاب کریں"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"جب ایک ہی وقت میں پروگرام ریکارڈ کرنے کیلئے ٹیونرز کافی نہ ہوں تو صرف اعلی ترجیح والے پروگرام ریکارڈ کئے جائیں گے۔"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"‏ریکارڈ شدہ پروگرام DVR لائبریری میں محفوظ ہو جائے گا۔"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"ریکارڈ شدہ مواد محفوظ ہو جائے گا۔"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"ٹیونر تضادات کی وجہ سے جزوی طور پر ریکارڈ ہوگا۔"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"ٹیونر تضادات کی وجہ سے ریکارڈ نہیں ہوگا۔"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"ابھی شیڈول میں کوئی ریکارڈنگز نہیں ہیں۔\nآپ پروگرام گائیڈ سے ریکارڈنگ کا شیڈول بنا سکتے ہیں۔"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">‏اگلے ‎%1$d دن کیلئے ریکارڈنگ کا شیڈول</item>
- <item quantity="one">‏اگلے ‎%1$d دن کیلئے ریکارڈنگ کا شیڈول</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">‏%1$d ریکارڈنگ تنازعات</item>
+ <item quantity="one">‏%1$d ریکارڈنگ تنازعہ</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"ترتیبات"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"پیچھے"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"کالعدم کریں"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"سیریز کی ترتیبات"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"سیریز کی ریکارڈنگ شروع کریں"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"سیریز کی ریکارڈنگ روکیں"</string>
+ <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_empty_state" msgid="3407962945399698707">"کوئی ایپی سوڈز دستیاب نہیں۔\nایک بار دستیاب ہوجائے تو ان کو ریکارڈ کیا جائے گا۔"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">‏(%1$d منٹ)</item>
+ <item quantity="one">‏(%1$d منٹ) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"ﺁﺝ"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"آئندہ کل"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"گزشتہ کل"</string>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index 5acfb9ec..55a0324f 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Faqat audio"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Signal kuchsiz"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Internet aloqasi yo‘q"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Bu kanalni <xliff:g id="END_TIME_1">%1$s</xliff:g> sanasigacha yoqib bo‘lmaydi, chunki barcha tyunerlardan boshqa dasturlarni yozib olishda foydalanilmoqda. \n\nYozib olish jadvalini o‘zgartirish uchun o‘ng strelkani bosing.</item>
- <item quantity="one">Bu kanalni <xliff:g id="END_TIME_0">%1$s</xliff:g> sanasigacha yoqib bo‘lmaydi, chunki tyunerdan boshqa dasturlarni yozib olishda foydalanilmoqda. \n\nYozib olish jadvalini o‘zgartirish uchun o‘ng strelkani bosing.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Bu kanalni <xliff:g id="END_TIME_1">%1$s</xliff:g> gacha yoqib bo‘lmaydi, chunki boshqa kanallar yozib olinmoqda. \n\nYozib olish jadvalini o‘zgartirish uchun o‘ng strelkani bosing.</item>
+ <item quantity="one">Bu kanalni <xliff:g id="END_TIME_0">%1$s</xliff:g> gacha yoqib bo‘lmaydi, chunki boshqa kanal yozib olinmoqda. \n\nYozib olish jadvalini o‘zgartirish uchun o‘ng strelkani bosing.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Nomsiz"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Kanal bloklangan"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Teledasturlarni o‘qish uchun ruxsat zarur."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Manbalarni sozlash"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Jonli efirlar ilovalar tomonidan taqdim etiladigan translatsiya qilinadigan kanallar bilan an’anaviy televizor kanallarini uyg‘unlashtiradi. \n\nOldin o‘rnatilgan kanal manbalarini sozlash bilan boshlashingiz mumkin. Yoki jonli efirlarni taklif etadigan boshqa ilovalarni Google Play Market orqali ko‘rib chiqishingiz mumkin."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Yozuvlar va jadvallar"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 daqiqa"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 daqiqa"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 soat"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Rejalashtirilgan"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Seriallar"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Boshqalar"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Bu kanalni yozib bo‘lmaydi."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Bu dasturni yozib bo‘lmaydi."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> dasturini yozib olish rejalashtirildi"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> dasturini yozib olish boshlandi (<xliff:g id="ENDTIME">%2$s</xliff:g> gacha yoziladi)"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"To‘liq jadval"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Boshidan ijro etish"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Ijroni davom ettirish"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"O‘chirish"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Yozuvlarni o‘chirish"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Davom ettirish"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"<xliff:g id="SEASON_NUMBER">%1$s</xliff:g>-fasl"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Jadvalni ko‘rish"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Batafsil"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Yozuvlarni o‘chirish"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"O‘chirib tashlash kerak bo‘lgan qismlarni tanlang. O‘chirilgach, qayta tiklab bo‘lmaydi."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"O‘chirib tashlash uchun hech narsa yo‘q."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Muhimlik darajasi"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Eng yuqori"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Eng past"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"# <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kanallar"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Har qanday"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Muhimlilik darajasini tanlash"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Dasturlarni bir vaqtning o‘zida yozib olish uchun tyunerlar yetarli bo‘lmaganda, faqat muhimlilik darajasi yuqori dasturlargina yozib olinadi."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Bir vaqtning o‘zida bir nechta dasturlar yozib olinishi kerak bo‘lsa, faqat muhimlilik darajasi yuqori dasturlargina yozib olinadi."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Yozib olingan qismi DVR kutubxonasiga saqlanadi."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Yozib olingan kontent saqlab qo‘yiladi."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Tyuner yo‘qligi sababli qisman yozib olinadi."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Tyuner yo‘qligi sababli yozib olinmaydi."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Jadval bo‘sh.\nTele-yo‘lboshlovchi orqali yozib olishni rejalashtirish mumkin."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Keyingi %1$d kun uchun yozib olish jadvali</item>
- <item quantity="one">Keyingi %1$d kun uchun yozib olish jadvali</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d ta yozib olish bo‘yicha ziddiyat</item>
+ <item quantity="one">%1$d ta yozib olish bo‘yicha ziddiyat</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Sozlamalar"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Orqaga"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Ortga qaytarish"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Qismlar sozlamalari"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Yozib olishni boshlash"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Yozib olishni to‘xtatish"</string>
+ <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_empty_state" msgid="3407962945399698707">"Hali serial qismi chiqmagan.\nEfirga chiqishi bilan yozib olinadi."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d daqiqa)</item>
+ <item quantity="one">(%1$d daqiqa) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Bugun"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Ertaga"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Kecha"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 22f1706f..a8c4ab09 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Chỉ âm thanh"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Tín hiệu yếu"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Không có kết nối Internet"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">Không thể phát kênh này cho đến <xliff:g id="END_TIME_1">%1$s</xliff:g> vì tất cả bộ điều chỉnh đang được sử dụng để ghi các chương trình khác. \n\nNhấn vào Quyền để điều chỉnh lịch ghi.</item>
- <item quantity="one">Không thể phát kênh này cho đến <xliff:g id="END_TIME_0">%1$s</xliff:g> vì bộ điều chỉnh đang được sử dụng để ghi các chương trình khác. \n\nNhấn vào Quyền để điều chỉnh lịch ghi.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">Không thể phát kênh này cho đến <xliff:g id="END_TIME_1">%1$s</xliff:g> vì đang ghi các kênh khác. \n\nNhấn vào Quyền để điều chỉnh lịch ghi.</item>
+ <item quantity="one">Không thể phát kênh này cho đến <xliff:g id="END_TIME_0">%1$s</xliff:g> vì đang ghi kênh khác. \n\nNhấn vào Quyền để điều chỉnh lịch ghi.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Không có tiêu đề"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Đã chặn kênh"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Kênh trực tiếp cần quyền đọc danh sách TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Thiết lập nguồn của bạn"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Kênh trực tiếp kết hợp trải nghiệm của các kênh TV truyền thống với các kênh truyền trực tuyến do các ứng dụng cung cấp. \n\nHãy bắt đầu bằng cách thiết lập các nguồn kênh đã được cài đặt. Hoặc duyệt qua Cửa hàng Google Play để có thêm nhiều ứng dụng cung cấp kênh trực tiếp."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Bản ghi &amp; lịch"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 phút"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 phút"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 giờ"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Đã được lên lịch"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Loạt phim"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Khác"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Không thể ghi kênh."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Không thể ghi chương trình."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> đã được lên lịch để ghi"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Đang ghi <xliff:g id="PROGRAMNAME">%1$s</xliff:g> từ giờ đến <xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Lịch trình đầy đủ"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Phát từ đầu"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Tiếp tục phát"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Xóa"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Xóa bản ghi"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Tiếp tục"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Phần <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Xem lịch ghi"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Đọc thêm"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Xóa bản ghi"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Chọn các tập bạn muốn xóa. Không thể khôi phục chúng khi đã xóa."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Không có bản ghi nào để xóa."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Mức độ ưu tiên"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Cao nhất"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Thấp nhất"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Hạng <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Kênh"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Bất kỳ"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Chọn mức độ ưu tiên"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Khi không có đủ bộ điều chỉnh để ghi các chương trình cùng lúc, chỉ các chương trình với mức độ ưu tiên cao hơn sẽ được ghi."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Khi có quá nhiều chương trình được ghi cùng lúc, chỉ có những chương trình với mức ưu tiên cao hơn sẽ được ghi."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Phần được ghi sẽ được lưu trong thư viện DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Sẽ được ghi một phần do xung đột bộ dò."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Sẽ không được ghi do xung đột bộ dò."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Chưa có lịch ghi nào.\nBạn có thể lên lịch ghi từ hướng dẫn chương trình."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">Lịch ghi cho %1$d ngày tới</item>
- <item quantity="one">Lịch ghi cho %1$d ngày tới</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d xung đột ghi</item>
+ <item quantity="one">%1$d xung đột ghi</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Cài đặt"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Quay lại"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Hoàn tác"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Cài đặt cho loạt phim"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Bắt đầu ghi loạt phim"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Dừng ghi loạt phim"</string>
+ <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_empty_state" msgid="3407962945399698707">"Không có sẵn tập nào.\nChúng sẽ được ghi khi có sẵn."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d phút)</item>
+ <item quantity="one">(%1$d phút) </item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Hôm nay"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Ngày mai"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Hôm qua"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index e714abf0..e3d8ea08 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"仅提供音频"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"信号弱"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"未连接到互联网"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">由于所有调谐器都正用于录制其他节目,因此在<xliff:g id="END_TIME_1">%1$s</xliff:g> 前无法播放此频道。\n\n按向右箭头即可调整录制时间安排。</item>
- <item quantity="one">由于调谐器正用于录制其他节目,因此在<xliff:g id="END_TIME_0">%1$s</xliff:g> 前无法播放此频道。\n\n按向右箭头即可调整录制时间安排。</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">目前正在录制其他频道,因此在<xliff:g id="END_TIME_1">%1$s</xliff:g> 前无法播放此频道。\n\n按向右箭头即可调整录制时间安排。</item>
+ <item quantity="one">目前正在录制另一个频道,因此在<xliff:g id="END_TIME_0">%1$s</xliff:g> 前无法播放此频道。\n\n按向右箭头即可调整录制时间安排。</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"无标题"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"频道已屏蔽"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"直播频道需要获取相应权限才能读取电视节目列表。"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"设置您的频道来源"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"直播频道结合了传统电视频道和网络直播频道(由应用提供)的观看体验。\n\n要开始使用,请先设置已安装的频道来源,或前往 Google Play 商店浏览查找更多提供直播频道的应用。"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"录制内容和时间安排"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 分钟"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 分钟"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 小时"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"已排定"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"剧集"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"其他"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"无法录制该频道。"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"无法录制该节目。"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"已排定《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》的录制时间"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"从现在起到<xliff:g id="ENDTIME">%2$s</xliff:g> 录制《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"完整时间表"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"从头播放"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"删除录制内容"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"请选择您要删除的剧集。这些剧集一旦删除,便无法恢复。"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"没有可供删除的录制内容。"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"优先级"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"最高"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"最低"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"排名第 <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"频道"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"不限"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"选择优先级"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"如果同一时段没有足够的调谐器可用于录制节目,系统只会录制优先级较高的节目。"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"已录制的内容会保存到 DVR 媒体库中。"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"系统将保存已录制的内容。"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"没有可用的调谐器,因此只能录制部分内容。"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"没有可用的调谐器,因此无法录制。"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"尚未安排任何录制计划。\n您可以根据收视指南安排录制计划。"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">接下来 %1$d 天的录制时间表</item>
- <item quantity="one">接下来 %1$d 天的录制时间表</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d 项录制冲突</item>
+ <item quantity="one">%1$d 项录制冲突</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"设置"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"返回"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"撤消"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"剧集录制设置"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"开始创建剧集录制时间表"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"停止创建剧集录制时间表"</string>
+ <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_empty_state" msgid="3407962945399698707">"没有已录制的剧集。\n一旦有剧集可供录制,系统将立即开始录制。"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d 分钟)</item>
+ <item quantity="one">(%1$d 分钟)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"今天"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"明天"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"昨天"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 452d9377..5fe984d5 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"只限音效"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"訊號微弱"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"沒有互聯網連線"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">由於調諧器正在錄影其他節目,因此在 <xliff:g id="END_TIME_1">%1$s</xliff:g>前將無法播放此頻道。\n\n按向右鍵調整錄影時間表。</item>
- <item quantity="one">由於調諧器正在錄影其他節目,因此在 <xliff:g id="END_TIME_0">%1$s</xliff:g>前將無法播放此頻道。\n\n按向右鍵調整錄影時間表。</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">由於系統正在錄影其他頻道,因此在<xliff:g id="END_TIME_1">%1$s</xliff:g>前將無法播放此頻道。\n\n請按向右鍵調整錄影時間表。</item>
+ <item quantity="one">由於系統正在錄影另一個頻道,因此在<xliff:g id="END_TIME_0">%1$s</xliff:g>前將無法播放此頻道。\n\n請按向右鍵調整錄影時間表。</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"無標題"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"已封鎖的頻道"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"「直播頻道」需要權限方可讀取電視節目表。"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"設定頻道來源"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"直播頻道結合了傳統電視頻道和串流播放頻道 (由應用程式提供) 的觀看體驗。\n\n如要開始使用,請設定已安裝的頻道來源;或瀏覽「Google Play 商店」尋找更多提供直播頻道的應用程式。"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"錄影和時間表"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 分鐘"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 分鐘"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 小時"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"已預定"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"劇集"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"其他"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"無法錄影此頻道。"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"無法錄影此節目。"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"已預定《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》的錄影時間"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"從現在起到<xliff:g id="ENDTIME">%2$s</xliff:g>錄影《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"完整時間表"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"從頭開始播放"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"刪除錄影"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"選取要刪除的集數。一旦刪除,將無法復原。"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"沒有可刪除的錄影。"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"優先級別"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"最高"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"最低"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"第 <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"頻道"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"任何頻道"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"選擇優先級別"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"如果同一時間沒有足夠的調諧器用於錄影,系統只會錄影優先級別較高的節目。"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"已錄影的部分將儲存在 DVR 媒體庫中。"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"系統將儲存已錄影的內容。"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"由於調諧器有衝突,系統只會錄影部分預定節目。"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"由於調諧器有衝突,系統不會錄影預定節目。"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"尚未預定錄影時間。\n您可以在電視節目指南中預定錄影。"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">接下來 %1$d 天的錄影時間表</item>
- <item quantity="one">接下來 %1$d 天的錄影時間表</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d 個錄影時間有衝突</item>
+ <item quantity="one">%1$d 個錄影時間有衝突</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"設定"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"返回"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"復原"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"劇集設定"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"開始錄影劇集"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"停止錄影劇集"</string>
+ <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_empty_state" msgid="3407962945399698707">"沒有可供錄影的劇集。\n系統會在劇集播出時立即錄影。"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d 分鐘)</item>
+ <item quantity="one">(%1$d 分鐘)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"今天"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"明天"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"昨天"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 454b33bc..e33998ba 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"僅限音訊"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"訊號微弱"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"沒有網際網路連線"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="other">由於您正在使用調諧器錄製其他節目,因此在<xliff:g id="END_TIME_1">%1$s</xliff:g> 前都無法播放這個頻道。\n\n按向右鍵可調整錄製時間表。</item>
- <item quantity="one">由於您正在使用調諧器錄製其他節目,因此在<xliff:g id="END_TIME_0">%1$s</xliff:g> 前都無法播放這個頻道。\n\n按向右鍵可調整錄製時間表。</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="other">目前正在錄製其他頻道,因此<xliff:g id="END_TIME_1">%1$s</xliff:g> 前都無法播放這個頻道。\n\n按向右鍵可調整錄製時間表。</item>
+ <item quantity="one">目前正在錄製其他頻道,因此<xliff:g id="END_TIME_0">%1$s</xliff:g> 前都無法播放這個頻道。\n\n按向右鍵可調整錄製時間表。</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"無標題"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"頻道遭到封鎖"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"「直播頻道」需要權限才能讀取電視節目表。"</string>
<string name="setup_sources_text" msgid="4988039637873759839">"設定您的頻道來源"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"直播頻道具備傳統電視頻道的功能,同時還能播放應用程式所提供的串流頻道。\n\n如要開始使用,請設定已安裝的頻道來源,或是前往 Google Play 商店尋找更多提供直播頻道的應用程式。"</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"錄製項目和錄製時間表"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 分鐘"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 分鐘"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 小時"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"預約錄影"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"劇集"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"其他"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"無法錄製這個頻道。"</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"無法錄製這個節目。"</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"已排定《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》的錄影時間"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"從現在起到<xliff:g id="ENDTIME">%2$s</xliff:g>,系統將錄製《<xliff:g id="PROGRAMNAME">%1$s</xliff:g>》"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"完整時間表"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"從頭開始播放"</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_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>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"刪除錄影節目"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"選取要刪除的集數。請注意,刪除後即無法復原。"</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"沒有可刪除的錄影節目。"</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"優先順序"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"最高"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"最低"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"第 <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"頻道"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"不限"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"選擇優先順序"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"如果同一時段沒有足夠的調諧器可用於錄製節目,系統只會錄製優先順序較高的節目。"</string>
+ <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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"錄影片段將儲存在 DVR 媒體庫中。"</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"系統將儲存已錄製的內容。"</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"沒有可用的調諧器,因此只能錄製部分內容。"</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"沒有可用的調諧器,因此無法錄製。"</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"沒有任何預約錄影。\n你可以透過節目指南預約錄影。"</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="other">接下來 %1$d 天的錄製時間表</item>
- <item quantity="one">接下來 %1$d 天的錄製時間表</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="other">%1$d 項錄影衝突</item>
+ <item quantity="one">%1$d 項錄影衝突</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"設定"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"返回"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"復原"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"影集錄製設定"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"開始建立影集錄製時間表"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"停止建立影集錄製時間表"</string>
+ <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_empty_state" msgid="3407962945399698707">"目前沒有可供觀看的集數。\n系統會在節目播出時立即錄影。"</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="other">(%1$d 分鐘)</item>
+ <item quantity="one">(%1$d 分鐘)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"今天"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"明天"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"昨天"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 5868ebd8..ff1cfb3d 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -155,9 +155,9 @@
<string name="tvview_msg_audio_only" msgid="1356866203687173329">"Umsindo kuphela"</string>
<string name="tvview_msg_weak_signal" msgid="1095050812622908976">"Isignali engaqinile"</string>
<string name="tvview_msg_no_internet_connection" msgid="7655994401188888231">"Alukho uxhumano lwe-intanethi"</string>
- <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="7667615331469565106">
- <item quantity="one">Lesi siteshi asikwazi ukudlalwa kuze kube ngu-<xliff:g id="END_TIME_1">%1$s</xliff:g> ngoba onke amashuna asetshenziselwa ukurekhoda ezinye izinhlelo. \n\nCindezela Kwesokudla ukuze ulungise ishejuli yokurekhoda.</item>
- <item quantity="other">Lesi siteshi asikwazi ukudlalwa kuze kube ngu-<xliff:g id="END_TIME_1">%1$s</xliff:g> ngoba onke amashuna asetshenziselwa ukurekhoda ezinye izinhlelo. \n\nCindezela Kwesokudla ukuze ulungise ishejuli yokurekhoda.</item>
+ <plurals name="tvview_msg_input_no_resource" formatted="false" msgid="8581894855153658823">
+ <item quantity="one">Lesi siteshi asikwazi ukudlalwa kuze kube ngu-<xliff:g id="END_TIME_1">%1$s</xliff:g> ngoba ezinye iziteshi ziyarekhodwa. \n\nCindezela Kwesokudla ukuze ulungise ishejuli yokurekhoda.</item>
+ <item quantity="other">Lesi siteshi asikwazi ukudlalwa kuze kube ngu-<xliff:g id="END_TIME_1">%1$s</xliff:g> ngoba ezinye iziteshi ziyarekhodwa. \n\nCindezela Kwesokudla ukuze ulungise ishejuli yokurekhoda.</item>
</plurals>
<string name="channel_banner_no_title" msgid="8660301979190693176">"Asikho isihloko"</string>
<string name="channel_banner_locked_channel_title" msgid="2006564967318945980">"Isiteshi sivinjiw"</string>
@@ -192,6 +192,7 @@
<string name="msg_read_tv_listing_permission_denied" msgid="8882813301235518909">"Iziteshi ezibukhoma zidinga imvume ukuze zifunde ukufakwa kuhlu kwe-TV."</string>
<string name="setup_sources_text" msgid="4988039637873759839">"Setha imithombo yakho"</string>
<string name="setup_sources_description" msgid="5695518946225445202">"Iziteshi ezibukhoma zihlanganisa umuzwa wosiko weziteshi ze-TV ngokusakaza iziteshi ezinikezwe izinhlelo zokusebenza.\n\nQalisa ngokusetha imithombo yesiteshi esivele ifakiwe. Noma dlulisa amehlo ku-Google Play Isitolo ukuze uthole izinhlelo zokusebenza eziningi ezinikezela iziteshi ezibukhoma."</string>
+ <string name="channels_item_dvr" msgid="8911915252648532469">"Ukurekhoda manashejuli"</string>
<string name="recording_start_dialog_10_min_duration" msgid="5739636508245795292">"10 amaminithi"</string>
<string name="recording_start_dialog_30_min_duration" msgid="4691127772622189977">"30 amaminithi"</string>
<string name="recording_start_dialog_1_hour_duration" msgid="7159533207022355641">"1 ihora"</string>
@@ -200,6 +201,8 @@
<string name="dvr_main_scheduled" msgid="7837260963086408492">"Ishejuliwe"</string>
<string name="dvr_main_series" msgid="8278256687595691676">"Uchungechunge"</string>
<string name="dvr_main_others" msgid="2970835573614038153">"Abanye"</string>
+ <string name="dvr_msg_cannot_record_channel" msgid="6836291367918532447">"Isiteshi asikwazi ukurekhodwa."</string>
+ <string name="dvr_msg_cannot_record_program" msgid="4184046342810946090">"Uhlelo alukwazi ukurekhodwa."</string>
<string name="dvr_msg_program_scheduled" msgid="3800847542300367572">"<xliff:g id="PROGRAMNAME">%1$s</xliff:g> ishejulelwe ukurekhodwa"</string>
<string name="dvr_msg_current_program_scheduled" msgid="2505247201782991463">"Irekhoda i-<xliff:g id="PROGRAMNAME">%1$s</xliff:g> kusukela manje ukuya ku-<xliff:g id="ENDTIME">%2$s</xliff:g>"</string>
<string name="dvr_full_schedule_card_view_title" msgid="7198521806965950089">"Ishejuli egcwele"</string>
@@ -227,9 +230,11 @@
<string name="dvr_detail_play_from_beginning" msgid="8475543568260411836">"Dlala kusuka ekuqaleni"</string>
<string name="dvr_detail_resume_play" msgid="875591300274416373">"Qalisa ukudlala"</string>
<string name="dvr_detail_delete" msgid="4535881013528321898">"Susa"</string>
+ <string name="dvr_detail_series_delete" msgid="4831926831670312674">"Susa ukurekhodwa"</string>
<string name="dvr_detail_series_resume" msgid="6935136228671386246">"Qalisa kabusha"</string>
<string name="dvr_detail_series_season_title" msgid="5474850936497854790">"Isizini <xliff:g id="SEASON_NUMBER">%1$s</xliff:g>"</string>
<string name="dvr_detail_view_schedule" msgid="7137536927421904426">"Buka ishejula"</string>
+ <string name="dvr_detail_read_more" msgid="2588920758094498544">"Funda kabanzi"</string>
<string name="dvr_series_deletion_title" msgid="7672649492494507574">"Susa ukurekhodwa"</string>
<string name="dvr_series_deletion_description" msgid="994839237906552969">"Khetha zonke iziqephu ongathanda ukuzisusa. Azikwazi ukuphinda zitholwe uma sezisusiwe."</string>
<string name="dvr_series_deletion_no_recordings" msgid="481210819034514">"Akukho ukurekhodwa okuzosuswa."</string>
@@ -246,17 +251,16 @@
<string name="dvr_series_settings_priority" msgid="5836437092774185710">"Okubalulekile"</string>
<string name="dvr_series_settings_priority_highest" msgid="1072006447796648382">"Kuphezulu kakhulu"</string>
<string name="dvr_series_settings_priority_lowest" msgid="6003996497908810225">"Kuphansi kakhulu"</string>
+ <string name="dvr_series_settings_priority_rank" msgid="667778382820956116">"Inombolo. <xliff:g id="RANK">%1$d</xliff:g>"</string>
<string name="dvr_series_settings_channels" msgid="3164900110165729909">"Iziteshi"</string>
<string name="dvr_series_settings_channels_all" msgid="656434955168572976">"Noma ikuphi"</string>
<string name="dvr_priority_title" msgid="1537886929061487213">"Khetha okubalulekile"</string>
- <string name="dvr_priority_description" msgid="3653317573461947180">"Uma kungekho amashuna anele okurekhoda izinhlelo ngesikhathi esifanayo, izinhlelo ezinokubaluleka okuphezulu kuphela ezizorekhodwa."</string>
+ <string name="dvr_priority_description" msgid="8362040921417154645">"Uma kunezinhlelo eziningi kakhulu okufanele zirekhodwe ngesikhathi esisodwa, yilezo ezinokukhetha okuphezulu ezizorekhodwa."</string>
<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>
- <!-- no translation found for dvr_action_error_cancel (6822474458738023531) -->
- <skip />
- <!-- no translation found for dvr_action_error_forget_storage (5869994565663655638) -->
- <skip />
+ <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>
@@ -270,17 +274,21 @@
<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>
- <!-- no translation found for dvr_error_missing_storage_title (691914341845362669) -->
- <skip />
- <!-- no translation found for dvr_error_missing_storage_description (1036680750969954236) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_title (4996547357826788002) -->
- <skip />
- <!-- no translation found for dvr_error_forget_storage_description (3973761741009546142) -->
+ <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_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="8059817161905528708">"Ingxenye yokurekhoda izolondolozwa kulabhulali ye-DVR."</string>
+ <string name="dvr_stop_recording_dialog_description" msgid="4637830189399967761">"Okuqukethwe okurekhodiwe kuzolondolozwa."</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>
@@ -298,6 +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>
+ <!-- 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>
@@ -310,15 +326,21 @@
<string name="dvr_schedules_tuner_conflict_will_be_partially_recorded" msgid="5280490298546908729">"Izorekhodwa kancane ngenxa yokushayisana kweshuna."</string>
<string name="dvr_schedules_tuner_conflict_will_not_be_recorded_info" msgid="5065400564003201095">"Ngeke ize irekhodwe ngenxa yokushayisana kweshuna."</string>
<string name="dvr_schedules_empty_state" msgid="1291529283469462741">"Akukho ukurekhoda kushejuli okwamanje.\nUngahlela ukurekhoda kusuka kumhlahlandlela yohlelo."</string>
- <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="5687216771746946005">
- <item quantity="one">Isehuli yokurekhoda yezinsuku ezingu-%1$d ezilandelayo</item>
- <item quantity="other">Isehuli yokurekhoda yezinsuku ezingu-%1$d ezilandelayo</item>
+ <plurals name="dvr_series_schedules_header_description" formatted="false" msgid="9077188267856194114">
+ <item quantity="one">%1$d ukugcubuzana kokurekhoda</item>
+ <item quantity="other">%1$d ukugcubuzana kokurekhoda</item>
</plurals>
- <string name="dvr_series_schedules_settings" msgid="4069530935369561001">"Izilungiselelo"</string>
- <string name="dvr_series_schedules_dialog_back" msgid="1594678171444843646">"Phindela emuva"</string>
- <string name="dvr_series_schedules_undo" msgid="7445942340901896865">"Susa"</string>
+ <string name="dvr_series_schedules_settings" msgid="4868501926847903985">"Izilungiselelo zochungechunge"</string>
+ <string name="dvr_series_schedules_start" msgid="8458768834047133835">"Qala ukurekhoda kochungechunge"</string>
+ <string name="dvr_series_schedules_stop" msgid="3427479298317584961">"Misa ukurekhodwa kochungechunge"</string>
+ <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_empty_state" msgid="3407962945399698707">"Azikho iziqephu ezitholakalayo.\nZizorekhodwa uma zitholakala."</string>
- <!-- no translation found for dvr_schedules_recording_duration (3701771573063918552) -->
+ <plurals name="dvr_schedules_recording_duration" formatted="false" msgid="3701771573063918552">
+ <item quantity="one">(%1$d amaminithi)</item>
+ <item quantity="other">(%1$d amaminithi)</item>
+ </plurals>
<string name="dvr_date_today" msgid="7691050705354303471">"Namhlanje"</string>
<string name="dvr_date_tomorrow" msgid="4136735681186981844">"Kusasa"</string>
<string name="dvr_date_yesterday" msgid="2127672919053118239">"Izolo"</string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 926df605..ca601775 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -354,13 +354,15 @@
<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">78dp</dimen>
- <dimen name="dvr_schedules_item_delete_right_padding">32dp</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>
+ <dimen name="dvr_schedules_item_focus_translation_delta">2dp</dimen>
+ <dimen name="dvr_schedules_item_focus_width_delta">10dp</dimen>
<dimen name="dvr_schedules_header_margin_top">32dp</dimen>
<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">142dp</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>
@@ -388,6 +390,8 @@
<item name="dvr_conflict_guidedstep_keyline" format="float" type="string">30.0</item>
<dimen name="dvr_deletion_check_mark_size">32dp</dimen>
<dimen name="dvr_deletion_check_mark_margin">20dp</dimen>
+ <dimen name="dvr_details_overview_description_margin_start">12dp</dimen>
+ <dimen name="dvr_details_overview_description_margin_end">12dp</dimen>
<!-- Below values are used to avoid detail titles' layout changing with two-line titles -->
<dimen name="dvr_details_description_title_resized_text_size">34sp</dimen>
<dimen name="dvr_details_description_title_padding_adjust_top">0dp</dimen>
diff --git a/res/values/integers.xml b/res/values/integers.xml
index 5aa59ffd..81ccbeb7 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -84,4 +84,7 @@
<integer name="half_sized_dialog_anim_duration">250</integer>
<integer name="half_sized_dialog_enter_offset_y">32</integer>
<integer name="half_sized_dialog_exit_offset_y">32</integer>
+
+ <!-- DVR library -->
+ <integer name="dvr_details_full_text_animation_duration">500</integer>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a6166fe2..a58f2d36 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -428,9 +428,9 @@
<!-- The text message which is shown when the tune fails due to no available tuners.
This message is shown at the center of the screen. [CHAR LIMIT=NONE] -->
<plurals name="tvview_msg_input_no_resource">
- <item quantity="one">This channel can\'t be played until <xliff:g id="end_time" example="9:30 PM">%1$s</xliff:g> because the tuner is being used for recording other programs.
+ <item quantity="one">This channel can\'t be played until <xliff:g id="end_time" example="9:30 PM">%1$s</xliff:g> because another channel is being recorded.
\n\nPress Right to adjust recording schedule.</item>
- <item quantity="other">This channel can\'t be played until <xliff:g id="end_time" example="9:30 PM">%1$s</xliff:g> because all the tuners are being used for recording other programs.
+ <item quantity="other">This channel can\'t be played until <xliff:g id="end_time" example="9:30 PM">%1$s</xliff:g> because other channels are being recorded.
\n\nPress Right to adjust recording schedule.</item>
</plurals>
@@ -520,6 +520,10 @@
<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_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>
<!-- Title of Recently watched dialog. It is used for debug purpose. -->
<string name="recently_watched" translatable="false">Recently watched</string>
@@ -553,7 +557,7 @@
<string name="epg_dvr_delete_program" translatable="false">Delete schedule</string>
<!-- Menu item label to start DVR manager UI. -->
- <string name="channels_item_dvr" translatable="false">Recorded programs</string>
+ <string name="channels_item_dvr">Recordings &amp; schedules</string>
<!-- Menu item label to start recording of the current channel. -->
<string name="channels_item_record_start" translatable="false">Start recording</string>
<!-- Menu item label to start recording of the current channel. -->
@@ -586,8 +590,10 @@
<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>
- <string name="dvr_msg_cannot_record_channel" translatable="false">The channel cannot be recorded.</string>
- <string name="dvr_msg_cannot_record_program" translatable="false">The program cannot be 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>
@@ -646,6 +652,8 @@
<string name="dvr_detail_series_season_title">Season <xliff:g id="season_number">%1$s</xliff:g></string>
<!-- Button label to open full schedule list page [CHAR LIMIT=15] -->
<string name="dvr_detail_view_schedule">View schedule</string>
+ <!-- Text label to indicate there's more text in the details description [CHAR LIMIT=20] -->
+ <string name="dvr_detail_read_more">Read more</string>
<!-- DVR series settings -->
<eat-comment />
@@ -655,7 +663,7 @@
<string name="dvr_series_deletion_description">Select the episodes you would like to delete. They can\'t be recovered once deleted.</string>
<!-- Toast message of no recordings can be deleted [CHAR LIMIT=40] -->
<string name="dvr_series_deletion_no_recordings">There\'re no recordings to delete.</string>
- <!-- Button label to select all watched episodes of the given series [CHAR LIMIT=30] -->
+ <!-- Button label to select all watched episodes of the given series [CHAR LIMIT=35] -->
<string name="dvr_series_select_watched">Select watched episodes</string>
<!-- Button label to select all episodes of the given series [CHAR LIMIT=35] -->
<string name="dvr_series_select_all">Select all episodes</string>
@@ -682,6 +690,9 @@
<!-- Item description when the current series has the lowest proirty among scheduled
TV series. -->
<string name="dvr_series_settings_priority_lowest">Lowest</string>
+ <!-- Item description of the priority rank of the current series among all scheduled
+ TV series. -->
+ <string name="dvr_series_settings_priority_rank">No. <xliff:g id="rank">%1$d</xliff:g></string>
<!-- Item label to specify channel which will be recorded for TV series recording -->
<string name="dvr_series_settings_channels">Channels</string>
<!-- Sub item label to record TV series from any channel. c.f., a user can
@@ -690,7 +701,7 @@
<!-- Title of priority settings fragment -->
<string name="dvr_priority_title">Choose priority</string>
<!-- Description of priority settings fragment -->
- <string name="dvr_priority_description">When there are not enough tuners to record programs at the same time, only the programs with higher priorities will be recorded.</string>
+ <string name="dvr_priority_description">When there are too many programs to be recorded at the same time, only the ones with higher priorities will be recorded.</string>
<!-- Button lable in priority settings fragment to save the current settings -->
<string name="dvr_priority_button_action_save">Save</string>
<!-- Button label in priority settings fragment for one-time recordings -->
@@ -730,7 +741,7 @@
<string name="dvr_action_record_anyway">Schedule anyway</string>
<!-- The title of the action to record this program instead of the other. This happens when the
user tries to record a program while there is a existing schedule with the same episode
- as the program. [CHAR LIMIT=32] -->
+ as the program. [CHAR LIMIT=35] -->
<string name="dvr_action_record_instead">Record this one instead</string>
<!-- The title of the action to cancel to create the new schedule. This happens when the user
created a schedule while there is a existing schedule with the same episode as the program.
@@ -746,14 +757,24 @@
<string name="dvr_epg_program_recording_conflict">Recording conflict</string>
<!-- Dvr label in epg to indicate the program is recording now. [CHAR LIMIT=30] -->
<string name="dvr_epg_program_recording_in_progress">Recording</string>
+ <!-- Dvr label in epg to indicate the recording of the program has been failed. [CHAR LIMIT=30] -->
+ <string name="dvr_epg_program_recording_failed">Recording failed</string>
<string name="dvr_epg_program_icon_text" translatable="false">DVR</string>
<string name="dvr_epg_channel_watch_conflict_dialog_title" translatable="false">Upcoming schedules</string>
<string name="dvr_epg_channel_watch_conflict_dialog_description" translatable="false">The programs will not be recorded if you keep watching this channel. Cancel the recordings, or current channel will be blocked when the recording starts.</string>
<!-- A popup message which informs that Live TV is reading program information to create
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_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 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 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. -->
@@ -763,6 +784,8 @@
<!-- 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>
<!-- DVR half sized dialogs -->
<eat-comment />
@@ -771,7 +794,10 @@
<string name="dvr_stop_recording_dialog_title">Stop recording?</string>
<!-- The description of the stop recording dialog which asks the user whether to stop recording
of the current channel or not. -->
- <string name="dvr_stop_recording_dialog_description">The recorded part will be saved in the DVR library.</string>
+ <string name="dvr_stop_recording_dialog_description">The recorded content will be saved.</string>
+ <!-- The description of the stop recording dialog which asks the user whether to stop the
+ current recording to start another conflict schedule. -->
+ <string name="dvr_stop_recording_dialog_description_on_conflict">The recording of <xliff:g id="programName" example="Friends">%1$s</xliff:g> will be stopped because it conflicts with this program. The recorded content will be saved.</string>
<!--The title of the dialog to notify the user that the new schedule conflicts with others. -->
<string name="dvr_program_conflict_dialog_title">Recording scheduled but has conflicts</string>
<!--The title of the dialog to notify the user that the recording of the current channel
@@ -819,6 +845,48 @@
<!-- The description of the dialog which notifies the user that the same episode as the program
has already been recorded. -->
<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 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 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">%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 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_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 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 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 />
@@ -859,23 +927,23 @@
<!-- Description of no schedule recording for now, and ask user to schedule recordings from
the program guide. -->
<string name="dvr_schedules_empty_state">There are no recordings on schedule yet.\nYou can schedule recording from the program guide.</string>
- <!-- Description of schedule list header about how many days the recording list will show. -->
+ <!-- Description of schedule list header about how many recordings conflict. -->
<plurals name="dvr_series_schedules_header_description">
- <item quantity="one">Recording schedule for the next %1$d day</item>
- <item quantity="other">Recording schedule for the next %1$d days</item>
+ <item quantity="one">%1$d recording conflict</item>
+ <item quantity="other">%1$d recording conflicts</item>
</plurals>
- <!-- Button label of settings for DVR series recordings [CHAR LIMIT=20] -->
- <string name="dvr_series_schedules_settings">Settings</string>
- <!-- Button label of cancelling all series recording list. -->
- <string name="dvr_series_schedules_cancel_all" translatable="false">Pause all schedules</string>
- <!-- Description of asking user whether to cancel all schedules. -->
- <string name="dvr_series_schedules_dialog_cancel_all" translatable="false">Pause all schedules?</string>
- <!-- Action to leave the dialog to the previous screen. -->
- <string name="dvr_series_schedules_dialog_back">Back</string>
- <!-- Button label of resume all canceled series recording list. -->
- <string name="dvr_series_schedules_resume" translatable="false">Resume all schedules</string>
- <!-- Button label of undo cancel all series recording list. -->
- <string name="dvr_series_schedules_undo">Undo</string>
+ <!-- Button label of settings for DVR series recordings [CHAR LIMIT=25] -->
+ <string name="dvr_series_schedules_settings">Series settings</string>
+ <!-- Button label of the action which starts creating schedules for the series automatically.[CHAR LIMIT=32] -->
+ <string name="dvr_series_schedules_start">Start series recording</string>
+ <!-- Button label of the action which stops creating schedules for the series automatically. [CHAR LIMIT=32]-->
+ <string name="dvr_series_schedules_stop">Stop series recording</string>
+ <!-- The title of asking user whether to stop creating schedules. -->
+ <string name="dvr_series_schedules_stop_dialog_title">Stop series recording?</string>
+ <!-- The description of asking user whether to stop creating schedules for the series. -->
+ <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 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/themes.xml b/res/values/themes.xml
index 1c554069..9be64eb8 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -107,6 +107,11 @@
<item name="guidedActionItemCheckmarkStyle">@style/TV.Dvr.Series.Deletion.guidedActionItemCheckmarkStyle</item>
</style>
+ <style name="Theme.TV.Dvr.Series.Settings.GuidedStep" parent="Theme.TV.Dvr.Settings.GuidedStep">
+ <item name="android:windowBackground">@color/setup_background</item>
+ <item name="android:windowIsTranslucent">true</item>
+ </style>
+
<style name="Theme.TV.Dvr.Browse.Details" parent="Theme.Leanback.Details">
<item name="detailsDescriptionTitleStyle">@style/TV.Dvr.Browse.DetailsDescriptionTitleStyle</item>
</style>
diff --git a/src/com/android/exoplayer/MediaFormatUtil.java b/src/com/android/exoplayer/MediaFormatUtil.java
index 647f7dd9..d7a981f6 100644
--- a/src/com/android/exoplayer/MediaFormatUtil.java
+++ b/src/com/android/exoplayer/MediaFormatUtil.java
@@ -17,6 +17,8 @@ package com.google.android.exoplayer;
import android.support.annotation.Nullable;
+import com.google.android.exoplayer.util.MimeTypes;
+
import java.nio.ByteBuffer;
import java.util.ArrayList;
@@ -29,7 +31,6 @@ public class MediaFormatUtil {
* {@link android.media.MediaFormat} should be converted to be used with ExoPlayer.
*/
public static MediaFormat createMediaFormat(android.media.MediaFormat format) {
- // TODO: Add test for this method.
String mimeType = format.getString(android.media.MediaFormat.KEY_MIME);
String language = getOptionalStringV16(format, android.media.MediaFormat.KEY_LANGUAGE);
int maxInputSize =
@@ -52,36 +53,17 @@ public class MediaFormatUtil {
}
long durationUs = format.containsKey(android.media.MediaFormat.KEY_DURATION)
? format.getLong(android.media.MediaFormat.KEY_DURATION) : C.UNKNOWN_TIME_US;
+ int pcmEncoding = MimeTypes.AUDIO_RAW.equals(mimeType) ? C.ENCODING_PCM_16BIT
+ : MediaFormat.NO_VALUE;
MediaFormat mediaFormat = new MediaFormat(null, mimeType, MediaFormat.NO_VALUE,
maxInputSize, durationUs, width, height, rotationDegrees, MediaFormat.NO_VALUE,
channelCount, sampleRate, language, MediaFormat.OFFSET_SAMPLE_RELATIVE,
- initializationData, false, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE,
- MediaFormat.NO_VALUE, encoderDelay, encoderPadding);
+ initializationData, false, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, pcmEncoding,
+ encoderDelay, encoderPadding, null, MediaFormat.NO_VALUE);
mediaFormat.setFrameworkFormatV16(format);
return mediaFormat;
}
- /**
- * Creates {@link MediaFormat} for audio track.
- */
- public static MediaFormat createAudioMediaFormat(String mimeType, long durationUs,
- int channelCount, int sampleRate) {
- return MediaFormat.createAudioFormat(null, mimeType, MediaFormat.NO_VALUE,
- MediaFormat.NO_VALUE, durationUs, channelCount, sampleRate, null, "");
- }
-
- /**
- * Creates {@link MediaFormat} for closed caption track.
- */
- public static MediaFormat createTextMediaFormat(String mimeType, long durationUs) {
- return new MediaFormat(null, mimeType, 0, MediaFormat.NO_VALUE, durationUs,
- MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE,
- MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, "",
- MediaFormat.OFFSET_SAMPLE_RELATIVE, null, false, MediaFormat.NO_VALUE,
- MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE,
- MediaFormat.NO_VALUE);
- }
-
@Nullable
private static String getOptionalStringV16(android.media.MediaFormat format, String key) {
return format.containsKey(key) ? format.getString(key) : null;
diff --git a/src/com/android/tv/ApplicationSingletons.java b/src/com/android/tv/ApplicationSingletons.java
index 3f381635..fd125d52 100644
--- a/src/com/android/tv/ApplicationSingletons.java
+++ b/src/com/android/tv/ApplicationSingletons.java
@@ -24,6 +24,7 @@ import com.android.tv.data.ProgramDataManager;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.DvrScheduleManager;
+import com.android.tv.dvr.DvrStorageStatusManager;
import com.android.tv.dvr.DvrWatchedPositionManager;
import com.android.tv.util.AccountHelper;
import com.android.tv.util.TvInputManagerHelper;
@@ -39,6 +40,8 @@ public interface ApplicationSingletons {
DvrDataManager getDvrDataManager();
+ DvrStorageStatusManager getDvrStorageStatusManager();
+
DvrScheduleManager getDvrScheduleManager();
DvrManager getDvrManager();
diff --git a/src/com/android/tv/InputSessionManager.java b/src/com/android/tv/InputSessionManager.java
index c3380d81..e4b0f456 100644
--- a/src/com/android/tv/InputSessionManager.java
+++ b/src/com/android/tv/InputSessionManager.java
@@ -33,6 +33,7 @@ import android.os.Looper;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
@@ -108,8 +109,8 @@ public class InputSessionManager {
*/
@NonNull
public RecordingSession createRecordingSession(String inputId, String tag,
- RecordingCallback callback, Handler handler) {
- RecordingSession session = new RecordingSession(inputId, tag, callback, handler);
+ RecordingCallback callback, Handler handler, long endTimeMs) {
+ RecordingSession session = new RecordingSession(inputId, tag, callback, handler, endTimeMs);
mRecordingSessions.add(session);
if (DEBUG) Log.d(TAG, "Recording session created: " + session);
return session;
@@ -160,6 +161,24 @@ public class InputSessionManager {
return null;
}
+ /**
+ * Retruns the earliest end time of recording sessions in progress of the certain TV input.
+ */
+ @MainThread
+ public Long getEarliestRecordingSessionEndTimeMs(String inputId) {
+ long timeMs = Long.MAX_VALUE;
+ synchronized (mRecordingSessions) {
+ for (RecordingSession session : mRecordingSessions) {
+ if (session.mTuned && TextUtils.equals(inputId, session.mInputId)) {
+ if (session.mEndTimeMs < timeMs) {
+ timeMs = session.mEndTimeMs;
+ }
+ }
+ }
+ }
+ return timeMs == Long.MAX_VALUE ? null : timeMs;
+ }
+
@MainThread
int getTunedTvViewSessionCount(String inputId) {
int tunedCount = 0;
@@ -353,14 +372,17 @@ public class InputSessionManager {
private Uri mChannelUri;
private final RecordingCallback mCallback;
private final Handler mHandler;
+ private volatile long mEndTimeMs;
private TvRecordingClient mClient;
private boolean mTuned;
- RecordingSession(String inputId, String tag, RecordingCallback callback, Handler handler) {
+ RecordingSession(String inputId, String tag, RecordingCallback callback,
+ Handler handler, long endTimeMs) {
mInputId = inputId;
mCallback = callback;
mHandler = handler;
mClient = new TvRecordingClient(mContext, tag, callback, handler);
+ mEndTimeMs = endTimeMs;
}
void release() {
@@ -406,6 +428,7 @@ public class InputSessionManager {
});
return;
}
+ mTuned = true;
int tunedTuneSessionCount = getTunedTvViewSessionCount(inputId);
if (!isTunedForTvView(channelUri) && tunedTuneSessionCount > 0
&& tunedRecordingSessionCount + tunedTuneSessionCount
@@ -419,7 +442,6 @@ public class InputSessionManager {
}
}
mChannelUri = channelUri;
- mTuned = true;
mClient.tune(inputId, channelUri);
}
});
@@ -439,6 +461,13 @@ public class InputSessionManager {
mClient.stopRecording();
}
+ /**
+ * Sets recording session's ending time.
+ */
+ public void setEndTimeMs(long endTimeMs) {
+ mEndTimeMs = endTimeMs;
+ }
+
private void runOnHandler(Handler handler, Runnable runnable) {
if (Looper.myLooper() == handler.getLooper()) {
runnable.run();
diff --git a/src/com/android/tv/MainActivity.java b/src/com/android/tv/MainActivity.java
index b38b2911..58850b5f 100644
--- a/src/com/android/tv/MainActivity.java
+++ b/src/com/android/tv/MainActivity.java
@@ -94,9 +94,11 @@ import com.android.tv.data.epg.EpgFetcher;
import com.android.tv.dialog.PinDialogFragment;
import com.android.tv.dialog.SafeDismissDialogFragment;
import com.android.tv.dvr.ConflictChecker;
-import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
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.HalfSizedDialogFragment;
import com.android.tv.experiments.Experiments;
import com.android.tv.menu.Menu;
import com.android.tv.onboarding.OnboardingActivity;
@@ -205,6 +207,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_VOLUME_MUTE);
BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_MUTE);
BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_SEARCH);
+ BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_WINDOW);
}
@@ -231,10 +234,25 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
UPDATE_CHANNEL_BANNER_REASON_TUNE_FAST, UPDATE_CHANNEL_BANNER_REASON_UPDATE_INFO,
UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK})
private @interface ChannelBannerUpdateReason {}
+ /**
+ * Updates channel banner because the channel banner is forced to show.
+ */
private static final int UPDATE_CHANNEL_BANNER_REASON_FORCE_SHOW = 1;
+ /**
+ * Updates channel banner because of tuning.
+ */
private static final int UPDATE_CHANNEL_BANNER_REASON_TUNE = 2;
+ /**
+ * Updates channel banner because of fast tuning.
+ */
private static final int UPDATE_CHANNEL_BANNER_REASON_TUNE_FAST = 3;
+ /**
+ * Updates channel banner because of info updating.
+ */
private static final int UPDATE_CHANNEL_BANNER_REASON_UPDATE_INFO = 4;
+ /**
+ * Updates channel banner because the current watched channel is locked or unlocked.
+ */
private static final int UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK = 5;
private static final int TVVIEW_SET_MAIN_TIMEOUT_MS = 3000;
@@ -256,7 +274,6 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
private final DurationTimer mMainDurationTimer = new DurationTimer();
private final DurationTimer mTuneDurationTimer = new DurationTimer();
private DvrManager mDvrManager;
- private DvrDataManager mDvrDataManager;
private ConflictChecker mDvrConflictChecker;
private View mContentView;
@@ -463,8 +480,10 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
// Check this permission for the EPG fetch.
// TODO: check {@link shouldShowRequestPermissionRationale}.
- if (Utils.hasInternalTvInputs(this, true) && checkSelfPermission(
- android.Manifest.permission.ACCESS_COARSE_LOCATION)
+ // 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);
@@ -541,7 +560,6 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mMemoryManageables.add(TvContentRatingCache.getInstance());
if (CommonFeatures.DVR.isEnabled(this)) {
mDvrManager = tvApplication.getDvrManager();
- mDvrDataManager = tvApplication.getDvrDataManager();
}
mTimeShiftManager = new TimeShiftManager(this, mTvView, mProgramDataManager, mTracker,
new OnCurrentProgramUpdatedListener() {
@@ -1179,7 +1197,8 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
* It might be a live program. If the time shifting is available, it can be a past program, too.
*/
public Program getCurrentProgram() {
- if (mTimeShiftManager.isAvailable()) {
+ if (!isChannelChangeKeyDownReceived() && mTimeShiftManager.isAvailable()) {
+ // We shouldn't get current program from TimeShiftManager during channel tunning
return mTimeShiftManager.getCurrentProgram();
}
return mProgramDataManager.getCurrentProgram(getCurrentChannelId());
@@ -2276,6 +2295,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
@Override
protected void onDestroy() {
if (DEBUG) Log.d(TAG, "onDestroy()");
+ SideFragment.releasePreloadedRecycledViews();
if (mTvView != null) {
mTvView.release();
}
@@ -2354,9 +2374,11 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
case KeyEvent.KEYCODE_DPAD_UP:
if (event.getRepeatCount() == 0
&& mChannelTuner.getBrowsableChannelCount() > 0) {
- moveToAdjacentChannel(true, false);
+ // message sending should be done before moving channel, because we use the
+ // existence of message to decide if users are switching channel.
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CHANNEL_UP_PRESSED,
System.currentTimeMillis()), CHANNEL_CHANGE_INITIAL_DELAY_MILLIS);
+ moveToAdjacentChannel(true, false);
mTracker.sendChannelUp();
}
return true;
@@ -2364,9 +2386,11 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
case KeyEvent.KEYCODE_DPAD_DOWN:
if (event.getRepeatCount() == 0
&& mChannelTuner.getBrowsableChannelCount() > 0) {
- moveToAdjacentChannel(false, false);
+ // message sending should be done before moving channel, because we use the
+ // existence of message to decide if users are switching channel.
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CHANNEL_DOWN_PRESSED,
System.currentTimeMillis()), CHANNEL_CHANGE_INITIAL_DELAY_MILLIS);
+ moveToAdjacentChannel(false, false);
mTracker.sendChannelDown();
}
return true;
@@ -2390,7 +2414,6 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
* S KEYCODE_CAPTIONS: select subtitle
* W debug: toggle screen size
* V KEYCODE_MEDIA_RECORD debug: record the current channel for 30 sec
- * X KEYCODE_BUTTON_X KEYCODE_PROG_BLUE debug: record current channel for a few minutes
*/
if (SystemProperties.LOG_KEYEVENT.getValue()) {
Log.d(TAG, "onKeyUp(" + keyCode + ", " + event + ")");
@@ -2492,7 +2515,9 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
false);
}
return true;
-
+ case KeyEvent.KEYCODE_WINDOW:
+ enterPictureInPictureMode();
+ return true;
case KeyEvent.KEYCODE_ENTER:
case KeyEvent.KEYCODE_NUMPAD_ENTER:
case KeyEvent.KEYCODE_E:
@@ -2542,8 +2567,61 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mOverlayManager.showBanner();
return true;
}
+ case KeyEvent.KEYCODE_MEDIA_RECORD:
+ case KeyEvent.KEYCODE_V: {
+ Channel currentChannel = getCurrentChannel();
+ if (currentChannel != null && mDvrManager != null) {
+ boolean isRecording =
+ mDvrManager.getCurrentRecording(currentChannel.getId()) != null;
+ if (!isRecording) {
+ if (!mDvrManager.isChannelRecordable(currentChannel)) {
+ 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());
+ 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(),
+ DvrStopRecordingFragment.REASON_USER_STOP,
+ new HalfSizedDialogFragment.OnActionClickListener() {
+ @Override
+ public void onActionClick(long actionId) {
+ if (actionId == DvrStopRecordingFragment.ACTION_STOP) {
+ ScheduledRecording currentRecording =
+ mDvrManager.getCurrentRecording(
+ currentChannel.getId());
+ if (currentRecording != null) {
+ mDvrManager.stopRecording(currentRecording);
+ }
+ }
+ }
+ });
+ }
+ }
+ return true;
+ }
}
}
+ if (keyCode == KeyEvent.KEYCODE_WINDOW) {
+ // Consumes the PIP button to prevent entering PIP mode
+ // in case that TV isn't showing properly (e.g. no browsable channel)
+ return true;
+ }
if (SystemProperties.USE_DEBUG_KEYS.getValue() || BuildConfig.ENG) {
switch (keyCode) {
case KeyEvent.KEYCODE_W: {
@@ -2578,36 +2656,9 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mOverlayManager.getSideFragmentManager().show(new DisplayModeFragment());
return true;
}
-
case KeyEvent.KEYCODE_D:
mOverlayManager.getSideFragmentManager().show(new DeveloperOptionFragment());
return true;
-
- case KeyEvent.KEYCODE_MEDIA_RECORD: // TODO(DVR) handle with debug_keys set
- case KeyEvent.KEYCODE_V: {
- DvrManager dvrManager = TvApplication.getSingletons(this).getDvrManager();
- long startTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(5);
- long endTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(35);
- dvrManager.addSchedule(getCurrentChannel(), startTime, endTime);
- return true;
- }
- case KeyEvent.KEYCODE_PROG_BLUE:
- case KeyEvent.KEYCODE_BUTTON_X:
- case KeyEvent.KEYCODE_X:
- if (CommonFeatures.DVR.isEnabled(this)) {
- Channel channel = mTvView.getCurrentChannel();
- long channelId = channel.getId();
- Program p = mProgramDataManager.getCurrentProgram(channelId);
- if (p == null) {
- long now = System.currentTimeMillis();
- mDvrManager
- .addSchedule(channel, now, now + TimeUnit.MINUTES.toMillis(1));
- } else {
- mDvrManager.addSchedule(p, mDvrManager.getConflictingSchedules(p));
- }
- return true;
- }
- break;
}
}
return super.onKeyUp(keyCode, event);
@@ -3109,8 +3160,10 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
- initAnimations();
- initSideFragments();
+ if (mActivityStarted) {
+ initAnimations();
+ initSideFragments();
+ }
}
}, LAZY_INITIALIZATION_DELAY);
}
@@ -3142,13 +3195,17 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
switch (msg.what) {
case MSG_CHANNEL_DOWN_PRESSED:
long startTime = (Long) msg.obj;
- mainActivity.moveToAdjacentChannel(false, true);
+ // message re-sending should be done before moving channel, because we use the
+ // existence of message to decide if users are switching channel.
sendMessageDelayed(Message.obtain(msg), getDelay(startTime));
+ mainActivity.moveToAdjacentChannel(false, true);
break;
case MSG_CHANNEL_UP_PRESSED:
startTime = (Long) msg.obj;
- mainActivity.moveToAdjacentChannel(true, true);
+ // message re-sending should be done before moving channel, because we use the
+ // existence of message to decide if users are switching channel.
sendMessageDelayed(Message.obtain(msg), getDelay(startTime));
+ mainActivity.moveToAdjacentChannel(true, true);
break;
case MSG_UPDATE_CHANNEL_BANNER_BY_INFO_UPDATE:
mainActivity.updateChannelBannerAndShowIfNeeded(
@@ -3262,7 +3319,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
mUnlockAllowedRatingBeforeShrunken = isUnderShrunkenTvView();
mTvView.unblockContent(rating);
}
-
+ mChannelBannerView.setBlockingContentRating(rating);
updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK);
mTvViewUiManager.fadeInTvView();
}
@@ -3272,6 +3329,7 @@ public class MainActivity extends Activity implements AudioManager.OnAudioFocusC
if (!isUnderShrunkenTvView()) {
mUnlockAllowedRatingBeforeShrunken = false;
}
+ mChannelBannerView.setBlockingContentRating(null);
updateChannelBannerAndShowIfNeeded(UPDATE_CHANNEL_BANNER_REASON_LOCK_OR_UNLOCK);
}
}
diff --git a/src/com/android/tv/TimeShiftManager.java b/src/com/android/tv/TimeShiftManager.java
index 650f5191..2d6d45c4 100644
--- a/src/com/android/tv/TimeShiftManager.java
+++ b/src/com/android/tv/TimeShiftManager.java
@@ -19,8 +19,6 @@ package com.android.tv;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Context;
-import android.os.AsyncTask;
-import android.os.AsyncTask.Status;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.IntDef;
@@ -63,8 +61,7 @@ import java.util.concurrent.TimeUnit;
*/
public class TimeShiftManager {
private static final String TAG = "TimeShiftManager";
- // STOPSHIP: Turn this flag off once b/31074952 is fixed.
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
@Retention(RetentionPolicy.SOURCE)
@IntDef({PLAY_STATUS_PAUSED, PLAY_STATUS_PLAYING})
@@ -894,7 +891,6 @@ public class TimeShiftManager {
endTimeMs + PREFETCH_DURATION_FOR_NEXT);
if (needToLoad) {
Range<Long> period = Range.create(fetchStartTimeMs, endTimeMs);
- SoftPreconditions.checkState(isAvailable(), TAG, "Time shifting is not available");
mProgramLoadQueue.add(period);
startTaskIfNeeded();
}
@@ -907,52 +903,24 @@ public class TimeShiftManager {
if (mProgramLoadTask == null || mProgramLoadTask.isCancelled()) {
startNext();
} else {
- switch (mProgramLoadTask.getStatus()) {
- case PENDING:
- SoftPreconditions.checkState(false, TAG,
- "The state of task can not be PENDING");
- if (mProgramLoadTask.overlaps(mProgramLoadQueue)) {
- if (mProgramLoadTask.cancel(true)) {
- SoftPreconditions.checkState(isAvailable(), TAG,
- "Time shifting is not available");
- mProgramLoadQueue.add(mProgramLoadTask.getPeriod());
- mProgramLoadTask = null;
- startNext();
- }
- }
- break;
- case RUNNING:
- // Remove pending task fully satisfied by the current
- Range<Long> current = mProgramLoadTask.getPeriod();
- Iterator<Range<Long>> i = mProgramLoadQueue.iterator();
- while (i.hasNext()) {
- Range<Long> r = i.next();
- if (current.contains(r)) {
- i.remove();
- }
- }
- break;
- case FINISHED:
- SoftPreconditions.checkState(false, TAG,
- "The state of task can not be FINISHED");
- // The task should have already cleared it self, clear and restart anyways.
- Log.w(TAG, mProgramLoadTask + " is finished, but was not cleared");
- startNext();
- break;
+ // Remove pending task fully satisfied by the current
+ Range<Long> current = mProgramLoadTask.getPeriod();
+ Iterator<Range<Long>> i = mProgramLoadQueue.iterator();
+ while (i.hasNext()) {
+ Range<Long> r = i.next();
+ if (current.contains(r)) {
+ i.remove();
+ }
}
}
}
private void startNext() {
- SoftPreconditions.checkState(mProgramLoadTask == null
- || mProgramLoadTask.getStatus() == Status.RUNNING, TAG,
- "The status of task should be \"RUNNING\"");
mProgramLoadTask = null;
if (mProgramLoadQueue.isEmpty()) {
return;
}
- SoftPreconditions.checkState(isAvailable(), TAG, "Time shifting should be available.");
Range<Long> next = mProgramLoadQueue.poll();
// Extend next to include any overlapping Ranges.
Iterator<Range<Long>> i = mProgramLoadQueue.iterator();
@@ -1134,7 +1102,6 @@ public class TimeShiftManager {
private void schedulePrefetchPrograms() {
if (DEBUG) Log.d(TAG, "Scheduling prefetching programs.");
- SoftPreconditions.checkState(isAvailable(), TAG, "Time shifting is not available");
if (mHandler.hasMessages(MSG_PREFETCH_PROGRAM)) {
return;
}
@@ -1172,7 +1139,6 @@ public class TimeShiftManager {
// Prefetch programs within PREFETCH_DURATION_FOR_NEXT from now.
private void prefetchPrograms() {
- SoftPreconditions.checkState(isAvailable(), TAG, "Time shifting is not available");
long startTimeMs;
Program lastValidProgram = getLastValidProgram();
if (lastValidProgram == null) {
diff --git a/src/com/android/tv/TvApplication.java b/src/com/android/tv/TvApplication.java
index e15bad02..0e18a259 100644
--- a/src/com/android/tv/TvApplication.java
+++ b/src/com/android/tv/TvApplication.java
@@ -55,6 +55,7 @@ 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.tuner.TunerPreferences;
import com.android.tv.tuner.tvinput.TunerTvInputService;
@@ -95,6 +96,7 @@ public class TvApplication extends Application implements ApplicationSingletons
private DvrManager mDvrManager;
private DvrScheduleManager mDvrScheduleManager;
private DvrDataManager mDvrDataManager;
+ private DvrStorageStatusManager mDvrStorageStatusManager;
private DvrWatchedPositionManager mDvrWatchedPositionManager;
@Nullable
private InputSessionManager mInputSessionManager;
@@ -129,14 +131,16 @@ public class TvApplication extends Application implements ApplicationSingletons
// Only set StrictMode for ENG builds because the build server only produces userdebug
// builds.
if (BuildConfig.ENG && SystemProperties.ALLOW_STRICT_MODE.getValue()) {
- StrictMode.setThreadPolicy(
- new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build());
- StrictMode.VmPolicy.Builder vmPolicyBuilder = new StrictMode.VmPolicy.Builder()
- .detectAll().penaltyLog();
- if (BuildConfig.ENG && SystemProperties.ALLOW_DEATH_PENALTY.getValue() &&
- !TvCommonUtils.isRunningInTest()) {
- // TODO turn on death penalty for tests when they stop leaking MainActivity
+ StrictMode.ThreadPolicy.Builder threadPolicyBuilder =
+ new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog();
+ StrictMode.VmPolicy.Builder vmPolicyBuilder =
+ new StrictMode.VmPolicy.Builder().detectAll().penaltyLog();
+ if (!TvCommonUtils.isRunningInTest()) {
+ threadPolicyBuilder.penaltyDialog();
+ // Turn off death penalty for tests b/23355898
+ vmPolicyBuilder.penaltyDeath();
}
+ StrictMode.setThreadPolicy(threadPolicyBuilder.build());
StrictMode.setVmPolicy(vmPolicyBuilder.build());
}
if (BuildConfig.ENG && !SystemProperties.ALLOW_ANALYTICS_IN_ENG.getValue()) {
@@ -160,6 +164,9 @@ public class TvApplication extends Application implements ApplicationSingletons
return;
}
mRunningInMainProcess = isMainProcess;
+ if (CommonFeatures.DVR.isEnabled(this)) {
+ mDvrStorageStatusManager = new DvrStorageStatusManager(this, mRunningInMainProcess);
+ }
if (mRunningInMainProcess) {
mTvInputManagerHelper.addCallback(new TvInputCallback() {
@Override
@@ -286,14 +293,23 @@ public class TvApplication extends Application implements ApplicationSingletons
@Override
public DvrDataManager getDvrDataManager() {
if (mDvrDataManager == null) {
- DvrDataManagerImpl dvrDataManager = new DvrDataManagerImpl(this, Clock.SYSTEM);
- mDvrDataManager = dvrDataManager;
- dvrDataManager.start();
+ DvrDataManagerImpl dvrDataManager = new DvrDataManagerImpl(this, Clock.SYSTEM);
+ mDvrDataManager = dvrDataManager;
+ dvrDataManager.start();
}
return mDvrDataManager;
}
/**
+ * Returns {@link DvrStorageStatusManager}.
+ */
+ @TargetApi(Build.VERSION_CODES.N)
+ @Override
+ public DvrStorageStatusManager getDvrStorageStatusManager() {
+ return mDvrStorageStatusManager;
+ }
+
+ /**
* Returns {@link TvInputManagerHelper}.
*/
@Override
diff --git a/src/com/android/tv/data/BaseProgram.java b/src/com/android/tv/data/BaseProgram.java
index c32da431..f420de02 100644
--- a/src/com/android/tv/data/BaseProgram.java
+++ b/src/com/android/tv/data/BaseProgram.java
@@ -129,6 +129,11 @@ public abstract class BaseProgram {
abstract public long getDurationMillis();
/**
+ * Returns the series ID.
+ */
+ abstract public String getSeriesId();
+
+ /**
* Returns the season number.
*/
abstract public String getSeasonNumber();
@@ -149,6 +154,11 @@ public abstract class BaseProgram {
abstract public String getThumbnailUri();
/**
+ * Returns the array of the ID's of the canonical genres.
+ */
+ abstract public int[] getCanonicalGenreIds();
+
+ /**
* Returns channel's ID of the program.
*/
abstract public long getChannelId();
diff --git a/src/com/android/tv/data/Channel.java b/src/com/android/tv/data/Channel.java
index 898324f0..30f84236 100644
--- a/src/com/android/tv/data/Channel.java
+++ b/src/com/android/tv/data/Channel.java
@@ -150,11 +150,6 @@ public final class Channel {
private long mDvrId;
- /**
- * TODO(DVR): Need to fill the following data.
- */
- private boolean mRecordable;
-
private Channel() {
// Do nothing.
}
@@ -566,6 +561,8 @@ public final class Channel {
getUri().toString());
mAppLinkType = APP_LINK_TYPE_CHANNEL;
return;
+ } else {
+ Log.w(TAG, "No activity exists to handle : " + mAppLinkIntentUri);
}
} catch (URISyntaxException e) {
Log.w(TAG, "Unable to set app link for " + mAppLinkIntentUri, e);
diff --git a/src/com/android/tv/data/ChannelDataManager.java b/src/com/android/tv/data/ChannelDataManager.java
index af7ed904..6f9ea6d7 100644
--- a/src/com/android/tv/data/ChannelDataManager.java
+++ b/src/com/android/tv/data/ChannelDataManager.java
@@ -297,6 +297,16 @@ public class ChannelDataManager {
}
/**
+ * Checks if the channel exists in DB.
+ *
+ * <p>Note that the channels of the removed inputs can not be obtained from {@link #getChannel}.
+ * In that case this method is used to check if the channel exists in the DB.
+ */
+ public boolean doesChannelExistInDb(long channelId) {
+ return mChannelWrapperMap.get(channelId) != null;
+ }
+
+ /**
* Returns true if and only if there exists at least one channel and all channels are hidden.
*/
public boolean areAllChannelsHidden() {
diff --git a/src/com/android/tv/data/Lineup.java b/src/com/android/tv/data/Lineup.java
index 3e162d1c..d0e9d7ba 100644
--- a/src/com/android/tv/data/Lineup.java
+++ b/src/com/android/tv/data/Lineup.java
@@ -46,7 +46,6 @@ public class Lineup {
*/
public final String location;
- /** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef({LINEUP_CABLE, LINEUP_SATELLITE, LINEUP_BROADCAST_DIGITAL, LINEUP_BROADCAST_ANALOG,
LINEUP_IPTV, LINEUP_MVPD})
diff --git a/src/com/android/tv/data/Program.java b/src/com/android/tv/data/Program.java
index 05d7d9c4..b9cd3d8d 100644
--- a/src/com/android/tv/data/Program.java
+++ b/src/com/android/tv/data/Program.java
@@ -260,6 +260,7 @@ public final class Program extends BaseProgram implements Comparable<Program>, P
/**
* Returns the series ID.
*/
+ @Override
public String getSeriesId() {
return mSeriesId;
}
@@ -400,6 +401,7 @@ public final class Program extends BaseProgram implements Comparable<Program>, P
/**
* Returns array of canonical genre ID's for this program.
*/
+ @Override
public int[] getCanonicalGenreIds() {
return mCanonicalGenreIds;
}
diff --git a/src/com/android/tv/data/StreamInfo.java b/src/com/android/tv/data/StreamInfo.java
index df842737..fe461f14 100644
--- a/src/com/android/tv/data/StreamInfo.java
+++ b/src/com/android/tv/data/StreamInfo.java
@@ -16,6 +16,8 @@
package com.android.tv.data;
+import android.media.tv.TvContentRating;
+
public interface StreamInfo {
int VIDEO_DEFINITION_LEVEL_UNKNOWN = 0;
int VIDEO_DEFINITION_LEVEL_SD = 1;
@@ -26,6 +28,7 @@ public interface StreamInfo {
int AUDIO_CHANNEL_COUNT_UNKNOWN = 0;
Channel getCurrentChannel();
+ TvContentRating getBlockedContentRating();
int getVideoWidth();
int getVideoHeight();
diff --git a/src/com/android/tv/data/epg/EpgFetcher.java b/src/com/android/tv/data/epg/EpgFetcher.java
index dd46caf1..3b093b6a 100644
--- a/src/com/android/tv/data/epg/EpgFetcher.java
+++ b/src/com/android/tv/data/epg/EpgFetcher.java
@@ -30,7 +30,6 @@ import android.media.tv.TvContract;
import android.media.tv.TvContract.Programs;
import android.media.tv.TvContract.Programs.Genres;
import android.media.tv.TvInputInfo;
-import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
@@ -45,13 +44,11 @@ import android.util.Log;
import com.android.tv.TvApplication;
import com.android.tv.common.WeakHandler;
-import com.android.tv.common.feature.CommonFeatures;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.InternalDataUtils;
import com.android.tv.data.Lineup;
import com.android.tv.data.Program;
-import com.android.tv.dvr.SeriesRecordingScheduler;
import com.android.tv.util.LocationUtils;
import com.android.tv.util.RecurringRunner;
import com.android.tv.util.Utils;
@@ -69,13 +66,13 @@ import java.util.concurrent.TimeUnit;
*/
public class EpgFetcher {
private static final String TAG = "EpgFetcher";
- private static final boolean DEBUG = true; // STOPSHIP(DVR)
+ private static final boolean DEBUG = false;
private static final int MSG_FETCH_EPG = 1;
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.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 PROGRAM_QUERY_DURATION = TimeUnit.DAYS.toMillis(30);
@@ -184,17 +181,16 @@ public class EpgFetcher {
try {
Address address = LocationUtils.getCurrentAddress(mContext);
- if (address == null) {
- if (DEBUG) Log.d(TAG, "Failed to get the current address.");
- return false;
- }
- if (!TextUtils.equals(address.getCountryCode(), SUPPORTED_COUNTRY_CODE)) {
+ if (address != null
+ && !TextUtils.equals(address.getCountryCode(), SUPPORTED_COUNTRY_CODE)) {
if (DEBUG) Log.d(TAG, "Country not supported: " + address.getCountryCode());
return false;
}
- } catch (IOException | SecurityException e) {
- Log.w(TAG, "Exception when getting the current location", e);
+ } catch (SecurityException e) {
+ Log.w(TAG, "No permission to get the current location", e);
return false;
+ } catch (IOException e) {
+ Log.w(TAG, "IO Exception when getting the current location", e);
}
return true;
}
@@ -319,15 +315,6 @@ public class EpgFetcher {
final boolean epgUpdated = updated;
setLastUpdatedEpgTimestamp(epgTimestamp);
mHandler.removeMessages(MSG_FETCH_EPG);
- new Handler(Looper.getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
- mRecurringRunner.resetNextRunTime();
- if (epgUpdated && CommonFeatures.DVR.isEnabled(mContext)) {
- SeriesRecordingScheduler.getInstance(mContext).updateSchedules();
- }
- }
- });
if (DEBUG) Log.d(TAG, "Fetching EPG is finished.");
}
diff --git a/src/com/android/tv/dvr/BaseDvrDataManager.java b/src/com/android/tv/dvr/BaseDvrDataManager.java
index 6af77940..89661df3 100644
--- a/src/com/android/tv/dvr/BaseDvrDataManager.java
+++ b/src/com/android/tv/dvr/BaseDvrDataManager.java
@@ -30,9 +30,10 @@ import com.android.tv.dvr.ScheduledRecording.RecordingState;
import com.android.tv.util.Clock;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -136,35 +137,35 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
}
/**
- * Calls {@link RecordedProgramListener#onRecordedProgramAdded(RecordedProgram)}
+ * Calls {@link RecordedProgramListener#onRecordedProgramsAdded}
* for each listener.
*/
- protected final void notifyRecordedProgramAdded(RecordedProgram recordedProgram) {
+ protected final void notifyRecordedProgramsAdded(RecordedProgram... recordedPrograms) {
for (RecordedProgramListener l : mRecordedProgramListeners) {
- if (DEBUG) Log.d(TAG, "notify " + l + "added " + recordedProgram);
- l.onRecordedProgramAdded(recordedProgram);
+ if (DEBUG) Log.d(TAG, "notify " + l + " added " + Arrays.asList(recordedPrograms));
+ l.onRecordedProgramsAdded(recordedPrograms);
}
}
/**
- * Calls {@link RecordedProgramListener#onRecordedProgramChanged(RecordedProgram)}
+ * Calls {@link RecordedProgramListener#onRecordedProgramsChanged}
* for each listener.
*/
- protected final void notifyRecordedProgramChanged(RecordedProgram recordedProgram) {
+ protected final void notifyRecordedProgramsChanged(RecordedProgram... recordedPrograms) {
for (RecordedProgramListener l : mRecordedProgramListeners) {
- if (DEBUG) Log.d(TAG, "notify " + l + "changed " + recordedProgram);
- l.onRecordedProgramChanged(recordedProgram);
+ if (DEBUG) Log.d(TAG, "notify " + l + " changed " + Arrays.asList(recordedPrograms));
+ l.onRecordedProgramsChanged(recordedPrograms);
}
}
/**
- * Calls {@link RecordedProgramListener#onRecordedProgramRemoved(RecordedProgram)}
+ * Calls {@link RecordedProgramListener#onRecordedProgramsRemoved}
* for each listener.
*/
- protected final void notifyRecordedProgramRemoved(RecordedProgram recordedProgram) {
+ protected final void notifyRecordedProgramsRemoved(RecordedProgram... recordedPrograms) {
for (RecordedProgramListener l : mRecordedProgramListeners) {
- if (DEBUG) Log.d(TAG, "notify " + l + "removed " + recordedProgram);
- l.onRecordedProgramRemoved(recordedProgram);
+ if (DEBUG) Log.d(TAG, "notify " + l + " removed " + Arrays.asList(recordedPrograms));
+ l.onRecordedProgramsRemoved(recordedPrograms);
}
}
@@ -174,7 +175,7 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
*/
protected final void notifySeriesRecordingAdded(SeriesRecording... seriesRecordings) {
for (SeriesRecordingListener l : mSeriesRecordingListeners) {
- if (DEBUG) Log.d(TAG, "notify " + l + "added " + seriesRecordings);
+ if (DEBUG) Log.d(TAG, "notify " + l + " added " + Arrays.asList(seriesRecordings));
l.onSeriesRecordingAdded(seriesRecordings);
}
}
@@ -185,7 +186,7 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
*/
protected final void notifySeriesRecordingRemoved(SeriesRecording... seriesRecordings) {
for (SeriesRecordingListener l : mSeriesRecordingListeners) {
- if (DEBUG) Log.d(TAG, "notify " + l + "removed " + seriesRecordings);
+ if (DEBUG) Log.d(TAG, "notify " + l + " removed " + Arrays.asList(seriesRecordings));
l.onSeriesRecordingRemoved(seriesRecordings);
}
}
@@ -197,7 +198,7 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
*/
protected final void notifySeriesRecordingChanged(SeriesRecording... seriesRecordings) {
for (SeriesRecordingListener l : mSeriesRecordingListeners) {
- if (DEBUG) Log.d(TAG, "notify " + l + "changed " + seriesRecordings);
+ if (DEBUG) Log.d(TAG, "notify " + l + " changed " + Arrays.asList(seriesRecordings));
l.onSeriesRecordingChanged(seriesRecordings);
}
}
@@ -208,7 +209,7 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
*/
protected final void notifyScheduledRecordingAdded(ScheduledRecording... scheduledRecording) {
for (ScheduledRecordingListener l : mScheduledRecordingListeners) {
- if (DEBUG) Log.d(TAG, "notify " + l + "added " + scheduledRecording);
+ if (DEBUG) Log.d(TAG, "notify " + l + " added " + Arrays.asList(scheduledRecording));
l.onScheduledRecordingAdded(scheduledRecording);
}
}
@@ -219,7 +220,7 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
*/
protected final void notifyScheduledRecordingRemoved(ScheduledRecording... scheduledRecording) {
for (ScheduledRecordingListener l : mScheduledRecordingListeners) {
- if (DEBUG) Log.d(TAG, "notify " + l + "removed " + scheduledRecording);
+ if (DEBUG) Log.d(TAG, "notify " + l + " removed " + Arrays.asList(scheduledRecording));
l.onScheduledRecordingRemoved(scheduledRecording);
}
}
@@ -232,7 +233,7 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
protected final void notifyScheduledRecordingStatusChanged(
ScheduledRecording... scheduledRecording) {
for (ScheduledRecordingListener l : mScheduledRecordingListeners) {
- if (DEBUG) Log.d(TAG, "notify " + l + "changed " + scheduledRecording);
+ if (DEBUG) Log.d(TAG, "notify " + l + " changed " + Arrays.asList(scheduledRecording));
l.onScheduledRecordingStatusChanged(scheduledRecording);
}
}
@@ -259,14 +260,6 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
}
@Override
- public List<ScheduledRecording> getAvailableAndCanceledScheduledRecordings() {
- return filterEndTimeIsPast(getRecordingsWithState(
- ScheduledRecording.STATE_RECORDING_IN_PROGRESS,
- ScheduledRecording.STATE_RECORDING_NOT_STARTED,
- ScheduledRecording.STATE_RECORDING_CANCELED));
- }
-
- @Override
public List<ScheduledRecording> getStartedRecordings() {
return filterEndTimeIsPast(getRecordingsWithState(
ScheduledRecording.STATE_RECORDING_IN_PROGRESS));
@@ -274,8 +267,6 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
@Override
public List<ScheduledRecording> getNonStartedScheduledRecordings() {
- Set<Integer> states = new HashSet<>();
- states.add(ScheduledRecording.STATE_RECORDING_NOT_STARTED);
return filterEndTimeIsPast(getRecordingsWithState(
ScheduledRecording.STATE_RECORDING_NOT_STARTED));
}
@@ -314,6 +305,9 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
@Override
public List<RecordedProgram> getRecordedPrograms(long seriesRecordingId) {
SeriesRecording seriesRecording = getSeriesRecording(seriesRecordingId);
+ if (seriesRecording == null) {
+ return Collections.emptyList();
+ }
List<RecordedProgram> result = new ArrayList<>();
for (RecordedProgram r : getRecordedPrograms()) {
if (seriesRecording.getSeriesId().equals(r.getSeriesId())) {
@@ -322,4 +316,7 @@ public abstract class BaseDvrDataManager implements WritableDvrDataManager {
}
return result;
}
+
+ @Override
+ public void forgetStorage(String inputId) { }
}
diff --git a/src/com/android/tv/dvr/DvrDataManager.java b/src/com/android/tv/dvr/DvrDataManager.java
index 126f3e74..06613667 100644
--- a/src/com/android/tv/dvr/DvrDataManager.java
+++ b/src/com/android/tv/dvr/DvrDataManager.java
@@ -69,11 +69,6 @@ public interface DvrDataManager {
List<ScheduledRecording> getAvailableScheduledRecordings();
/**
- * Return all available and canceled {@link ScheduledRecording}.
- */
- List<ScheduledRecording> getAvailableAndCanceledScheduledRecordings();
-
- /**
* Returns started recordings that expired.
*/
List<ScheduledRecording> getStartedRecordings();
@@ -260,10 +255,10 @@ public interface DvrDataManager {
* Listens for changes to {@link RecordedProgram}s.
*/
interface RecordedProgramListener {
- void onRecordedProgramAdded(RecordedProgram recordedProgram);
+ void onRecordedProgramsAdded(RecordedProgram... recordedPrograms);
- void onRecordedProgramChanged(RecordedProgram recordedProgram);
+ void onRecordedProgramsChanged(RecordedProgram... recordedPrograms);
- void onRecordedProgramRemoved(RecordedProgram recordedProgram);
+ void onRecordedProgramsRemoved(RecordedProgram... recordedPrograms);
}
}
diff --git a/src/com/android/tv/dvr/DvrDataManagerImpl.java b/src/com/android/tv/dvr/DvrDataManagerImpl.java
index 5ae2c4ea..46682a48 100644
--- a/src/com/android/tv/dvr/DvrDataManagerImpl.java
+++ b/src/com/android/tv/dvr/DvrDataManagerImpl.java
@@ -16,12 +16,16 @@
package com.android.tv.dvr;
+import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.ContentObserver;
+import android.database.sqlite.SQLiteException;
import android.media.tv.TvContract.RecordedPrograms;
+import android.media.tv.TvInputInfo;
+import android.media.tv.TvInputManager.TvInputCallback;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
@@ -37,7 +41,7 @@ import android.util.Range;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
-import com.android.tv.data.ChannelDataManager;
+import com.android.tv.dvr.DvrStorageStatusManager.OnStorageMountChangedListener;
import com.android.tv.dvr.ScheduledRecording.RecordingState;
import com.android.tv.dvr.provider.AsyncDvrDbTask.AsyncAddScheduleTask;
import com.android.tv.dvr.provider.AsyncDvrDbTask.AsyncAddSeriesRecordingTask;
@@ -47,9 +51,13 @@ 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.util.AsyncDbTask;
import com.android.tv.util.AsyncDbTask.AsyncRecordedProgramQueryTask;
import com.android.tv.util.Clock;
+import com.android.tv.util.Filter;
+import com.android.tv.util.TvInputManagerHelper;
import com.android.tv.util.TvProviderUriMatcher;
+import com.android.tv.util.Utils;
import java.util.ArrayList;
import java.util.Collections;
@@ -69,6 +77,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
private static final String TAG = "DvrDataManagerImpl";
private static final boolean DEBUG = false;
+ private final TvInputManagerHelper mInputManager;
+
private final HashMap<Long, ScheduledRecording> mScheduledRecordings = new HashMap<>();
private final HashMap<Long, RecordedProgram> mRecordedPrograms = new HashMap<>();
private final HashMap<Long, SeriesRecording> mSeriesRecordings = new HashMap<>();
@@ -76,6 +86,11 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
new HashMap<>();
private final HashMap<String, SeriesRecording> mSeriesId2SeriesRecordings = new HashMap<>();
+ private final HashMap<Long, ScheduledRecording> mScheduledRecordingsForRemovedInput =
+ new HashMap<>();
+ private final HashMap<Long, RecordedProgram> mRecordedProgramsForRemovedInput = new HashMap<>();
+ private final HashMap<Long, SeriesRecording> mSeriesRecordingsForRemovedInput = new HashMap<>();
+
private final Context mContext;
private final ContentObserver mContentObserver = new ContentObserver(new Handler(
Looper.getMainLooper())) {
@@ -96,15 +111,68 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
private boolean mDvrLoadFinished;
private boolean mRecordedProgramLoadFinished;
private final Set<AsyncTask> mPendingTasks = new ArraySet<>();
- private final DvrDbSync mDbSync;
+ private DvrDbSync mDbSync;
+ private DvrStorageStatusManager mStorageStatusManager;
+
+ private final TvInputCallback mInputCallback = new TvInputCallback() {
+ @Override
+ public void onInputAdded(String inputId) {
+ if (DEBUG) Log.d(TAG, "onInputAdded " + inputId);
+ if (!isInputAvailable(inputId)) {
+ if (DEBUG) Log.d(TAG, "Not available for recording");
+ return;
+ }
+ unhideInput(inputId);
+ }
+
+ @Override
+ public void onInputRemoved(String inputId) {
+ if (DEBUG) Log.d(TAG, "onInputRemoved " + inputId);
+ hideInput(inputId);
+ }
+ };
+
+ private final OnStorageMountChangedListener mStorageMountChangedListener =
+ new OnStorageMountChangedListener() {
+ @Override
+ public void onStorageMountChanged(boolean storageMounted) {
+ for (TvInputInfo input : mInputManager.getTvInputInfos(true, true)) {
+ if (Utils.isBundledInput(input.getId())) {
+ if (storageMounted) {
+ unhideInput(input.getId());
+ } else {
+ hideInput(input.getId());
+ }
+ }
+ }
+ }
+ };
+
+ private static <T> List<T> moveElements(HashMap<Long, T> from, HashMap<Long, T> to,
+ Filter<T> filter) {
+ List<T> moved = new ArrayList<>();
+ Iterator<Entry<Long, T>> iter = from.entrySet().iterator();
+ while (iter.hasNext()) {
+ Entry<Long, T> entry = iter.next();
+ if (filter.filter(entry.getValue())) {
+ to.put(entry.getKey(), entry.getValue());
+ iter.remove();
+ moved.add(entry.getValue());
+ }
+ }
+ return moved;
+ }
public DvrDataManagerImpl(Context context, Clock clock) {
super(context, clock);
mContext = context;
- mDbSync = new DvrDbSync(context, this);
+ mInputManager = TvApplication.getSingletons(context).getTvInputManagerHelper();
+ mStorageStatusManager = TvApplication.getSingletons(context).getDvrStorageStatusManager();
}
public void start() {
+ mInputManager.addCallback(mInputCallback);
+ mStorageStatusManager.addListener(mStorageMountChangedListener);
AsyncDvrQuerySeriesRecordingTask dvrQuerySeriesRecordingTask
= new AsyncDvrQuerySeriesRecordingTask(mContext) {
@Override
@@ -116,9 +184,18 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
protected void onPostExecute(List<SeriesRecording> seriesRecordings) {
mPendingTasks.remove(this);
long maxId = 0;
+ HashSet<String> seriesIds = new HashSet<>();
for (SeriesRecording r : seriesRecordings) {
- mSeriesRecordings.put(r.getId(), r);
- mSeriesId2SeriesRecordings.put(r.getSeriesId(), r);
+ if (SoftPreconditions.checkState(!seriesIds.contains(r.getSeriesId()), TAG,
+ "Skip loading series recording with duplicate series ID: " + r)) {
+ seriesIds.add(r.getSeriesId());
+ if (isInputAvailable(r.getInputId())) {
+ mSeriesRecordings.put(r.getId(), r);
+ mSeriesId2SeriesRecordings.put(r.getSeriesId(), r);
+ } else {
+ mSeriesRecordingsForRemovedInput.put(r.getId(), r);
+ }
+ }
if (maxId < r.getId()) {
maxId = r.getId();
}
@@ -128,20 +205,25 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
};
dvrQuerySeriesRecordingTask.executeOnDbThread();
mPendingTasks.add(dvrQuerySeriesRecordingTask);
- AsyncDvrQueryScheduleTask dvrQueryRecordingTask
+ AsyncDvrQueryScheduleTask dvrQueryScheduleTask
= new AsyncDvrQueryScheduleTask(mContext) {
@Override
protected void onCancelled(List<ScheduledRecording> scheduledRecordings) {
mPendingTasks.remove(this);
}
+ @SuppressLint("SwitchIntDef")
@Override
protected void onPostExecute(List<ScheduledRecording> result) {
mPendingTasks.remove(this);
long maxId = 0;
+ List<SeriesRecording> seriesRecordingsToAdd = new ArrayList<>();
List<ScheduledRecording> toUpdate = new ArrayList<>();
+ List<ScheduledRecording> toDelete = new ArrayList<>();
for (ScheduledRecording r : result) {
- if (r.getState() == ScheduledRecording.STATE_RECORDING_DELETED) {
+ if (!isInputAvailable(r.getInputId())) {
+ mScheduledRecordingsForRemovedInput.put(r.getId(), r);
+ } else if (r.getState() == ScheduledRecording.STATE_RECORDING_DELETED) {
getDeletedScheduleMap().put(r.getProgramId(), r);
} else {
mScheduledRecordings.put(r.getId(), r);
@@ -149,22 +231,29 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
mProgramId2ScheduledRecordings.put(r.getProgramId(), r);
}
// Adjust the state of the schedules before DB loading is finished.
- if (r.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- if (r.getEndTimeMs() <= mClock.currentTimeMillis()) {
- toUpdate.add(ScheduledRecording.buildFrom(r)
- .setState(ScheduledRecording.STATE_RECORDING_FAILED)
- .build());
- } else {
- toUpdate.add(ScheduledRecording.buildFrom(r)
- .setState(ScheduledRecording.STATE_RECORDING_NOT_STARTED)
- .build());
- }
- } else if (r.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED) {
- if (r.getEndTimeMs() <= mClock.currentTimeMillis()) {
- toUpdate.add(ScheduledRecording.buildFrom(r)
- .setState(ScheduledRecording.STATE_RECORDING_FAILED)
- .build());
- }
+ switch (r.getState()) {
+ case ScheduledRecording.STATE_RECORDING_IN_PROGRESS:
+ if (r.getEndTimeMs() <= mClock.currentTimeMillis()) {
+ toUpdate.add(ScheduledRecording.buildFrom(r)
+ .setState(ScheduledRecording.STATE_RECORDING_FAILED)
+ .build());
+ } else {
+ toUpdate.add(ScheduledRecording.buildFrom(r)
+ .setState(
+ ScheduledRecording.STATE_RECORDING_NOT_STARTED)
+ .build());
+ }
+ break;
+ case ScheduledRecording.STATE_RECORDING_NOT_STARTED:
+ if (r.getEndTimeMs() <= mClock.currentTimeMillis()) {
+ toUpdate.add(ScheduledRecording.buildFrom(r)
+ .setState(ScheduledRecording.STATE_RECORDING_FAILED)
+ .build());
+ }
+ break;
+ case ScheduledRecording.STATE_RECORDING_CANCELED:
+ toDelete.add(r);
+ break;
}
}
if (maxId < r.getId()) {
@@ -172,19 +261,23 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
}
}
if (!toUpdate.isEmpty()) {
- updateScheduledRecording(true, ScheduledRecording.toArray(toUpdate));
+ updateScheduledRecording(ScheduledRecording.toArray(toUpdate));
+ }
+ if (!toDelete.isEmpty()) {
+ removeScheduledRecording(ScheduledRecording.toArray(toDelete));
}
IdGenerator.SCHEDULED_RECORDING.setMaxId(maxId);
mDvrLoadFinished = true;
notifyDvrScheduleLoadFinished();
+ mDbSync = new DvrDbSync(mContext, DvrDataManagerImpl.this);
mDbSync.start();
if (isInitialized()) {
SeriesRecordingScheduler.getInstance(mContext).start();
}
}
};
- dvrQueryRecordingTask.executeOnDbThread();
- mPendingTasks.add(dvrQueryRecordingTask);
+ dvrQueryScheduleTask.executeOnDbThread();
+ mPendingTasks.add(dvrQueryScheduleTask);
RecordedProgramsQueryTask mRecordedProgramQueryTask =
new RecordedProgramsQueryTask(mContext.getContentResolver(), null);
mRecordedProgramQueryTask.executeOnDbThread();
@@ -193,8 +286,12 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
}
public void stop() {
+ mInputManager.removeCallback(mInputCallback);
+ mStorageStatusManager.removeListener(mStorageMountChangedListener);
SeriesRecordingScheduler.getInstance(mContext).stop();
- mDbSync.stop();
+ if (mDbSync != null) {
+ mDbSync.stop();
+ }
ContentResolver cr = mContext.getContentResolver();
cr.unregisterContentObserver(mContentObserver);
Iterator<AsyncTask> i = mPendingTasks.iterator();
@@ -213,52 +310,76 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
if (match == TvProviderUriMatcher.MATCH_RECORDED_PROGRAM) {
if (!mRecordedProgramLoadFinished) {
for (RecordedProgram recorded : recordedPrograms) {
- mRecordedPrograms.put(recorded.getId(), recorded);
+ if (isInputAvailable(recorded.getInputId())) {
+ mRecordedPrograms.put(recorded.getId(), recorded);
+ } else {
+ mRecordedProgramsForRemovedInput.put(recorded.getId(), recorded);
+ }
}
mRecordedProgramLoadFinished = true;
notifyRecordedProgramLoadFinished();
} else if (recordedPrograms == null || recordedPrograms.isEmpty()) {
- for (RecordedProgram recorded : mRecordedPrograms.values()) {
- notifyRecordedProgramRemoved(recorded);
- }
+ List<RecordedProgram> oldRecordedPrograms =
+ new ArrayList<>(mRecordedPrograms.values());
mRecordedPrograms.clear();
+ mRecordedProgramsForRemovedInput.clear();
+ notifyRecordedProgramsRemoved(RecordedProgram.toArray(oldRecordedPrograms));
} else {
HashMap<Long, RecordedProgram> oldRecordedPrograms
= new HashMap<>(mRecordedPrograms);
mRecordedPrograms.clear();
+ mRecordedProgramsForRemovedInput.clear();
+ List<RecordedProgram> addedRecordedPrograms = new ArrayList<>();
+ List<RecordedProgram> changedRecordedPrograms = new ArrayList<>();
for (RecordedProgram recorded : recordedPrograms) {
- mRecordedPrograms.put(recorded.getId(), recorded);
- RecordedProgram old = oldRecordedPrograms.remove(recorded.getId());
- if (old == null) {
- notifyRecordedProgramAdded(recorded);
+ if (isInputAvailable(recorded.getInputId())) {
+ mRecordedPrograms.put(recorded.getId(), recorded);
+ if (oldRecordedPrograms.remove(recorded.getId()) == null) {
+ addedRecordedPrograms.add(recorded);
+ } else {
+ changedRecordedPrograms.add(recorded);
+ }
} else {
- notifyRecordedProgramChanged(recorded);
+ mRecordedProgramsForRemovedInput.put(recorded.getId(), recorded);
}
}
- for (RecordedProgram recorded : oldRecordedPrograms.values()) {
- notifyRecordedProgramRemoved(recorded);
+ if (!addedRecordedPrograms.isEmpty()) {
+ notifyRecordedProgramsAdded(RecordedProgram.toArray(addedRecordedPrograms));
+ }
+ if (!changedRecordedPrograms.isEmpty()) {
+ notifyRecordedProgramsChanged(RecordedProgram.toArray(changedRecordedPrograms));
+ }
+ if (!oldRecordedPrograms.isEmpty()) {
+ notifyRecordedProgramsRemoved(
+ RecordedProgram.toArray(oldRecordedPrograms.values()));
}
}
if (isInitialized()) {
SeriesRecordingScheduler.getInstance(mContext).start();
}
} else if (match == TvProviderUriMatcher.MATCH_RECORDED_PROGRAM_ID) {
+ if (!mRecordedProgramLoadFinished) {
+ return;
+ }
long id = ContentUris.parseId(uri);
if (DEBUG) Log.d(TAG, "changed recorded program #" + id + " to " + recordedPrograms);
if (recordedPrograms == null || recordedPrograms.isEmpty()) {
+ mRecordedProgramsForRemovedInput.remove(id);
RecordedProgram old = mRecordedPrograms.remove(id);
if (old != null) {
- notifyRecordedProgramRemoved(old);
- } else {
- Log.w(TAG, "Could not find old version of deleted program #" + id);
+ notifyRecordedProgramsRemoved(old);
}
} else {
- RecordedProgram newRecorded = recordedPrograms.get(0);
- RecordedProgram old = mRecordedPrograms.put(id, newRecorded);
- if (old == null) {
- notifyRecordedProgramAdded(newRecorded);
+ RecordedProgram recordedProgram = recordedPrograms.get(0);
+ if (isInputAvailable(recordedProgram.getInputId())) {
+ RecordedProgram old = mRecordedPrograms.put(id, recordedProgram);
+ if (old == null) {
+ notifyRecordedProgramsAdded(recordedProgram);
+ } else {
+ notifyRecordedProgramsChanged(recordedProgram);
+ }
} else {
- notifyRecordedProgramChanged(newRecorded);
+ mRecordedProgramsForRemovedInput.put(id, recordedProgram);
}
}
}
@@ -432,7 +553,9 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
@Override
public void addScheduledRecording(ScheduledRecording... schedules) {
for (ScheduledRecording r : schedules) {
- r.setId(IdGenerator.SCHEDULED_RECORDING.newId());
+ if (r.getId() == ScheduledRecording.ID_NOT_SET) {
+ r.setId(IdGenerator.SCHEDULED_RECORDING.newId());
+ }
mScheduledRecordings.put(r.getId(), r);
if (r.getProgramId() != ScheduledRecording.ID_NOT_SET) {
mProgramId2ScheduledRecordings.put(r.getProgramId(), r);
@@ -450,7 +573,9 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
for (SeriesRecording r : seriesRecordings) {
r.setId(IdGenerator.SERIES_RECORDING.newId());
mSeriesRecordings.put(r.getId(), r);
- mSeriesId2SeriesRecordings.put(r.getSeriesId(), r);
+ SeriesRecording previousSeries = mSeriesId2SeriesRecordings.put(r.getSeriesId(), r);
+ SoftPreconditions.checkArgument(previousSeries == null, TAG, "Attempt to add series"
+ + " recording with the duplicate series ID: " + r.getSeriesId());
}
if (mDvrLoadFinished) {
notifySeriesRecordingAdded(seriesRecordings);
@@ -463,18 +588,22 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
removeScheduledRecording(false, schedules);
}
- private void removeScheduledRecording(boolean forceDelete, ScheduledRecording... schedules) {
+ @Override
+ public void removeScheduledRecording(boolean forceRemove, ScheduledRecording... schedules) {
List<ScheduledRecording> schedulesToDelete = new ArrayList<>();
List<ScheduledRecording> schedulesNotToDelete = new ArrayList<>();
for (ScheduledRecording r : schedules) {
mScheduledRecordings.remove(r.getId());
- if (r.getProgramId() != ScheduledRecording.ID_NOT_SET) {
- mProgramId2ScheduledRecordings.remove(r.getProgramId());
- }
- // If it belongs to the series recording and it's not started yet, do not delete.
- // Instead mark deleted.
- if (!forceDelete && r.getSeriesRecordingId() != SeriesRecording.ID_NOT_SET
- && r.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED) {
+ getDeletedScheduleMap().remove(r.getId());
+ mProgramId2ScheduledRecordings.remove(r.getProgramId());
+ boolean isScheduleForRemovedInput =
+ mScheduledRecordingsForRemovedInput.remove(r.getProgramId()) != null;
+ // If it belongs to the series recording and it's not started yet, just mark delete
+ // instead of deleting it.
+ if (!isScheduleForRemovedInput && !forceRemove
+ && r.getSeriesRecordingId() != SeriesRecording.ID_NOT_SET
+ && (r.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED
+ || r.getState() == ScheduledRecording.STATE_RECORDING_CANCELED)) {
SoftPreconditions.checkState(r.getProgramId() != ScheduledRecording.ID_NOT_SET);
ScheduledRecording deleted = ScheduledRecording.buildFrom(r)
.setState(ScheduledRecording.STATE_RECORDING_DELETED).build();
@@ -538,8 +667,7 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
updateScheduledRecording(true, schedules);
}
- private void updateScheduledRecording(boolean updateDb,
- final ScheduledRecording... schedules) {
+ private void updateScheduledRecording(boolean updateDb, final ScheduledRecording... schedules) {
List<ScheduledRecording> toUpdate = new ArrayList<>();
for (ScheduledRecording r : schedules) {
if (!SoftPreconditions.checkState(mScheduledRecordings.containsKey(r.getId()), TAG,
@@ -550,9 +678,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
ScheduledRecording oldScheduledRecording = mScheduledRecordings.put(r.getId(), r);
// The channel ID should not be changed.
SoftPreconditions.checkState(r.getChannelId() == oldScheduledRecording.getChannelId());
- if (DEBUG) Log.d(TAG, "Updating " + oldScheduledRecording + " with " + r);
long programId = r.getProgramId();
- if (oldScheduledRecording != null && oldScheduledRecording.getProgramId() != programId
+ if (oldScheduledRecording.getProgramId() != programId
&& oldScheduledRecording.getProgramId() != ScheduledRecording.ID_NOT_SET) {
ScheduledRecording oldValueForProgramId = mProgramId2ScheduledRecordings
.get(oldScheduledRecording.getProgramId());
@@ -565,6 +692,9 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
mProgramId2ScheduledRecordings.put(programId, r);
}
}
+ if (toUpdate.isEmpty()) {
+ return;
+ }
ScheduledRecording[] scheduleArray = ScheduledRecording.toArray(toUpdate);
if (mDvrLoadFinished) {
notifyScheduledRecordingStatusChanged(scheduleArray);
@@ -572,17 +702,16 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
if (updateDb) {
new AsyncUpdateScheduleTask(mContext).executeOnDbThread(scheduleArray);
}
- removeDeletedSchedules(scheduleArray);
+ removeDeletedSchedules(schedules);
}
@Override
public void updateSeriesRecording(final SeriesRecording... seriesRecordings) {
for (SeriesRecording r : seriesRecordings) {
- SeriesRecording old = mSeriesRecordings.put(r.getId(), r);
- if (old != null) {
- mSeriesId2SeriesRecordings.remove(old.getSeriesId());
- }
- mSeriesId2SeriesRecordings.put(r.getSeriesId(), r);
+ SeriesRecording old1 = mSeriesRecordings.put(r.getId(), r);
+ SeriesRecording old2 = mSeriesId2SeriesRecordings.put(r.getSeriesId(), r);
+ SoftPreconditions.checkArgument(old1.equals(old2), TAG, "Series ID cannot be"
+ + " updated: " + r);
}
if (mDvrLoadFinished) {
notifySeriesRecordingChanged(seriesRecordings);
@@ -590,6 +719,11 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
new AsyncUpdateSeriesRecordingTask(mContext).executeOnDbThread(seriesRecordings);
}
+ private boolean isInputAvailable(String inputId) {
+ return mInputManager.hasTvInputInfo(inputId)
+ && (!Utils.isBundledInput(inputId) || mStorageStatusManager.isStorageMounted());
+ }
+
private void removeDeletedSchedules(ScheduledRecording... addedSchedules) {
List<ScheduledRecording> schedulesToDelete = new ArrayList<>();
for (ScheduledRecording r : addedSchedules) {
@@ -625,6 +759,148 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
}
}
+ private void unhideInput(String inputId) {
+ if (DEBUG) Log.d(TAG, "unhideInput " + inputId);
+ List<ScheduledRecording> movedSchedules =
+ moveElements(mScheduledRecordingsForRemovedInput, mScheduledRecordings,
+ new Filter<ScheduledRecording>() {
+ @Override
+ public boolean filter(ScheduledRecording r) {
+ 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>() {
+ @Override
+ public boolean filter(RecordedProgram r) {
+ return r.getInputId().equals(inputId);
+ }
+ });
+ if (!movedSchedules.isEmpty()) {
+ for (ScheduledRecording schedule : movedSchedules) {
+ mProgramId2ScheduledRecordings.put(schedule.getProgramId(), schedule);
+ }
+ }
+ if (!movedSeriesRecordings.isEmpty()) {
+ for (SeriesRecording seriesRecording : movedSeriesRecordings) {
+ mSeriesId2SeriesRecordings.put(seriesRecording.getSeriesId(), seriesRecording);
+ }
+ }
+ // Notify after all the data are moved.
+ if (!movedSchedules.isEmpty()) {
+ notifyScheduledRecordingAdded(ScheduledRecording.toArray(movedSchedules));
+ }
+ if (!movedSeriesRecordings.isEmpty()) {
+ notifySeriesRecordingAdded(SeriesRecording.toArray(movedSeriesRecordings));
+ }
+ if (!movedRecordedPrograms.isEmpty()) {
+ notifyRecordedProgramsAdded(RecordedProgram.toArray(movedRecordedPrograms));
+ }
+ }
+
+ private void hideInput(String inputId) {
+ 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);
+ }
+ });
+ List<SeriesRecording> movedSeriesRecordings =
+ moveElements(mSeriesRecordings, mSeriesRecordingsForRemovedInput,
+ new Filter<SeriesRecording>() {
+ @Override
+ public boolean filter(SeriesRecording r) {
+ return r.getInputId().equals(inputId);
+ }
+ });
+ List<RecordedProgram> movedRecordedPrograms =
+ moveElements(mRecordedPrograms, mRecordedProgramsForRemovedInput,
+ new Filter<RecordedProgram>() {
+ @Override
+ public boolean filter(RecordedProgram r) {
+ return r.getInputId().equals(inputId);
+ }
+ });
+ if (!movedSchedules.isEmpty()) {
+ for (ScheduledRecording schedule : movedSchedules) {
+ mProgramId2ScheduledRecordings.remove(schedule.getProgramId());
+ }
+ }
+ if (!movedSeriesRecordings.isEmpty()) {
+ for (SeriesRecording seriesRecording : movedSeriesRecordings) {
+ mSeriesId2SeriesRecordings.remove(seriesRecording.getSeriesId());
+ }
+ }
+ // Notify after all the data are moved.
+ if (!movedSchedules.isEmpty()) {
+ notifyScheduledRecordingRemoved(ScheduledRecording.toArray(movedSchedules));
+ }
+ if (!movedSeriesRecordings.isEmpty()) {
+ notifySeriesRecordingRemoved(SeriesRecording.toArray(movedSeriesRecordings));
+ }
+ if (!movedRecordedPrograms.isEmpty()) {
+ notifyRecordedProgramsRemoved(RecordedProgram.toArray(movedRecordedPrograms));
+ }
+ }
+
+ @Override
+ public void forgetStorage(String inputId) {
+ List<ScheduledRecording> schedulesToDelete = new ArrayList<>();
+ for (Iterator<ScheduledRecording> i =
+ mScheduledRecordingsForRemovedInput.values().iterator(); i.hasNext(); ) {
+ ScheduledRecording r = i.next();
+ if (inputId.equals(r.getInputId())) {
+ schedulesToDelete.add(r);
+ i.remove();
+ }
+ }
+ List<SeriesRecording> seriesRecordingsToDelete = new ArrayList<>();
+ for (Iterator<SeriesRecording> i =
+ mSeriesRecordingsForRemovedInput.values().iterator(); i.hasNext(); ) {
+ SeriesRecording r = i.next();
+ if (inputId.equals(r.getInputId())) {
+ seriesRecordingsToDelete.add(r);
+ i.remove();
+ }
+ }
+ for (Iterator<RecordedProgram> i =
+ mRecordedProgramsForRemovedInput.values().iterator(); i.hasNext(); ) {
+ if (inputId.equals(i.next().getInputId())) {
+ i.remove();
+ }
+ }
+ new AsyncDeleteScheduleTask(mContext).executeOnDbThread(
+ ScheduledRecording.toArray(schedulesToDelete));
+ new AsyncDeleteSeriesRecordingTask(mContext).executeOnDbThread(
+ SeriesRecording.toArray(seriesRecordingsToDelete));
+ new AsyncDbTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ ContentResolver resolver = mContext.getContentResolver();
+ String args[] = { inputId };
+ try {
+ resolver.delete(RecordedPrograms.CONTENT_URI,
+ RecordedPrograms.COLUMN_INPUT_ID + " = ?", args);
+ } catch (SQLiteException e) {
+ Log.e(TAG, "Failed to delete recorded programs for inputId: " + inputId, e);
+ }
+ return null;
+ }
+ }.executeOnDbThread();
+ }
+
private final class RecordedProgramsQueryTask extends AsyncRecordedProgramQueryTask {
private final Uri mUri;
diff --git a/src/com/android/tv/dvr/DvrDbSync.java b/src/com/android/tv/dvr/DvrDbSync.java
index baa7f3d9..df181455 100644
--- a/src/com/android/tv/dvr/DvrDbSync.java
+++ b/src/com/android/tv/dvr/DvrDbSync.java
@@ -28,73 +28,132 @@ import android.os.Handler;
import android.os.Looper;
import android.support.annotation.MainThread;
import android.support.annotation.VisibleForTesting;
+import android.util.Log;
+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.util.AsyncDbTask.AsyncQueryProgramTask;
import com.android.tv.util.TvProviderUriMatcher;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.LinkedList;
+import java.util.List;
import java.util.Objects;
import java.util.Queue;
+import java.util.Set;
/**
* A class to synchronizes DVR DB with TvProvider.
+ *
+ * <p>The current implementation of AsyncDbTask allows only one task to run at a time, and all the
+ * other tasks are blocked until the current one finishes. As this class performs the low priority
+ * jobs which take long time, it should not block others if possible. For this reason, only one
+ * program is queried at a time and others are queued and will be executed on the other
+ * AsyncDbTask's after the current one finishes to minimize the execution time of one AsyncDbTask.
*/
@MainThread
@TargetApi(Build.VERSION_CODES.N)
class DvrDbSync {
+ private static final String TAG = "DvrDbSync";
+ private static final boolean DEBUG = false;
+
private final Context mContext;
private final DvrDataManagerImpl mDataManager;
- private UpdateProgramTask mUpdateProgramTask;
+ private final ChannelDataManager mChannelDataManager;
private final Queue<Long> mProgramIdQueue = new LinkedList<>();
- private final ContentObserver mProgramsContentObserver = new ContentObserver(new Handler(
+ private QueryProgramTask mQueryProgramTask;
+ private final SeriesRecordingScheduler mSeriesRecordingScheduler;
+ private final ContentObserver mContentObserver = new ContentObserver(new Handler(
Looper.getMainLooper())) {
@SuppressLint("SwitchIntDef")
@Override
public void onChange(boolean selfChange, Uri uri) {
switch (TvProviderUriMatcher.match(uri)) {
case TvProviderUriMatcher.MATCH_PROGRAM:
+ if (DEBUG) Log.d(TAG, "onProgramsUpdated");
onProgramsUpdated();
break;
case TvProviderUriMatcher.MATCH_PROGRAM_ID:
- addProgramIdToCheckIfNeeded(mDataManager.getScheduledRecordingForProgramId(
- ContentUris.parseId(uri)));
+ if (DEBUG) {
+ Log.d(TAG, "onProgramUpdated: programId=" + ContentUris.parseId(uri));
+ }
+ onProgramUpdated(ContentUris.parseId(uri));
break;
}
}
};
+
+ private final ChannelDataManager.Listener mChannelDataManagerListener =
+ new ChannelDataManager.Listener() {
+ @Override
+ public void onLoadFinished() {
+ start();
+ }
+
+ @Override
+ public void onChannelListUpdated() {
+ onChannelsUpdated();
+ }
+
+ @Override
+ public void onChannelBrowsableChanged() { }
+ };
+
private final ScheduledRecordingListener mScheduleListener = new ScheduledRecordingListener() {
@Override
public void onScheduledRecordingAdded(ScheduledRecording... schedules) {
for (ScheduledRecording schedule : schedules) {
addProgramIdToCheckIfNeeded(schedule);
}
+ startNextUpdateIfNeeded();
}
@Override
- public void onScheduledRecordingRemoved(ScheduledRecording... schedules) { }
+ public void onScheduledRecordingRemoved(ScheduledRecording... schedules) {
+ for (ScheduledRecording schedule : schedules) {
+ mProgramIdQueue.remove(schedule.getProgramId());
+ }
+ }
@Override
public void onScheduledRecordingStatusChanged(ScheduledRecording... schedules) {
for (ScheduledRecording schedule : schedules) {
mProgramIdQueue.remove(schedule.getProgramId());
+ addProgramIdToCheckIfNeeded(schedule);
}
+ startNextUpdateIfNeeded();
}
};
- public DvrDbSync(Context context, DvrDataManagerImpl dataManager) {
+ DvrDbSync(Context context, DvrDataManagerImpl dataManager) {
+ this(context, dataManager, TvApplication.getSingletons(context).getChannelDataManager());
+ }
+
+ @VisibleForTesting
+ DvrDbSync(Context context, DvrDataManagerImpl dataManager,
+ ChannelDataManager channelDataManager) {
mContext = context;
mDataManager = dataManager;
+ mChannelDataManager = channelDataManager;
+ mSeriesRecordingScheduler = SeriesRecordingScheduler.getInstance(context);
}
/**
* Starts the DB sync.
*/
public void start() {
+ if (!mChannelDataManager.isDbLoadFinished()) {
+ mChannelDataManager.addListener(mChannelDataManagerListener);
+ return;
+ }
mContext.getContentResolver().registerContentObserver(Programs.CONTENT_URI, true,
- mProgramsContentObserver);
+ mContentObserver);
mDataManager.addScheduledRecordingListener(mScheduleListener);
+ onChannelsUpdated();
onProgramsUpdated();
}
@@ -103,17 +162,51 @@ class DvrDbSync {
*/
public void stop() {
mProgramIdQueue.clear();
- if (mUpdateProgramTask != null) {
- mUpdateProgramTask.cancel(true);
+ if (mQueryProgramTask != null) {
+ mQueryProgramTask.cancel(true);
}
+ mChannelDataManager.removeListener(mChannelDataManagerListener);
mDataManager.removeScheduledRecordingListener(mScheduleListener);
- mContext.getContentResolver().unregisterContentObserver(mProgramsContentObserver);
+ mContext.getContentResolver().unregisterContentObserver(mContentObserver);
+ }
+
+ private void onChannelsUpdated() {
+ List<SeriesRecording> seriesRecordingsToUpdate = new ArrayList<>();
+ for (SeriesRecording r : mDataManager.getSeriesRecordings()) {
+ if (r.getChannelOption() == SeriesRecording.OPTION_CHANNEL_ONE
+ && !mChannelDataManager.doesChannelExistInDb(r.getChannelId())) {
+ seriesRecordingsToUpdate.add(SeriesRecording.buildFrom(r)
+ .setChannelOption(SeriesRecording.OPTION_CHANNEL_ALL)
+ .setState(SeriesRecording.STATE_SERIES_STOPPED).build());
+ }
+ }
+ if (!seriesRecordingsToUpdate.isEmpty()) {
+ mDataManager.updateSeriesRecording(
+ SeriesRecording.toArray(seriesRecordingsToUpdate));
+ }
+ List<ScheduledRecording> schedulesToRemove = new ArrayList<>();
+ for (ScheduledRecording r : mDataManager.getAvailableScheduledRecordings()) {
+ if (!mChannelDataManager.doesChannelExistInDb(r.getChannelId())) {
+ schedulesToRemove.add(r);
+ mProgramIdQueue.remove(r.getProgramId());
+ }
+ }
+ if (!schedulesToRemove.isEmpty()) {
+ mDataManager.removeScheduledRecording(
+ ScheduledRecording.toArray(schedulesToRemove));
+ }
}
private void onProgramsUpdated() {
- for (ScheduledRecording schedule : mDataManager.getAllScheduledRecordings()) {
+ for (ScheduledRecording schedule : mDataManager.getAvailableScheduledRecordings()) {
addProgramIdToCheckIfNeeded(schedule);
}
+ startNextUpdateIfNeeded();
+ }
+
+ private void onProgramUpdated(long programId) {
+ addProgramIdToCheckIfNeeded(mDataManager.getScheduledRecordingForProgramId(programId));
+ startNextUpdateIfNeeded();
}
private void addProgramIdToCheckIfNeeded(ScheduledRecording schedule) {
@@ -125,34 +218,48 @@ class DvrDbSync {
&& !mProgramIdQueue.contains(programId)
&& (schedule.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED
|| schedule.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS)) {
+ if (DEBUG) Log.d(TAG, "Program ID enqueued: " + programId);
mProgramIdQueue.offer(programId);
- startNextUpdateIfNeeded();
+ // There are schedules to be updated. Pause the SeriesRecordingScheduler until all the
+ // schedule updates finish.
+ // Note that the SeriesRecordingScheduler should be paused even though the program to
+ // check is not episodic because it can be changed to the episodic program after the
+ // update, which affect the SeriesRecordingScheduler.
+ mSeriesRecordingScheduler.pauseUpdate();
}
}
private void startNextUpdateIfNeeded() {
- if (mProgramIdQueue.isEmpty()) {
+ if (mQueryProgramTask != null && !mQueryProgramTask.isCancelled()) {
return;
}
- if (mUpdateProgramTask == null || mUpdateProgramTask.isCancelled()) {
- mUpdateProgramTask = new UpdateProgramTask(mProgramIdQueue.poll());
- mUpdateProgramTask.executeOnDbThread();
+ if (!mProgramIdQueue.isEmpty()) {
+ if (DEBUG) Log.d(TAG, "Program ID dequeued: " + mProgramIdQueue.peek());
+ mQueryProgramTask = new QueryProgramTask(mProgramIdQueue.poll());
+ mQueryProgramTask.executeOnDbThread();
+ } else {
+ mSeriesRecordingScheduler.resumeUpdate();
}
}
@VisibleForTesting
void handleUpdateProgram(Program program, long programId) {
+ Set<SeriesRecording> seriesRecordingsToUpdate = new HashSet<>();
ScheduledRecording schedule = mDataManager.getScheduledRecordingForProgramId(programId);
if (schedule != null
&& (schedule.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED
|| schedule.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS)) {
if (program == null) {
mDataManager.removeScheduledRecording(schedule);
+ if (schedule.getSeriesRecordingId() != SeriesRecording.ID_NOT_SET) {
+ SeriesRecording seriesRecording =
+ mDataManager.getSeriesRecording(schedule.getSeriesRecordingId());
+ if (seriesRecording != null) {
+ seriesRecordingsToUpdate.add(seriesRecording);
+ }
+ }
} else {
long currentTimeMs = System.currentTimeMillis();
- // Change start time only when the recording start time has not passed.
- boolean needToChangeStartTime = schedule.getStartTimeMs() > currentTimeMs
- && program.getStartTimeUtcMillis() != schedule.getStartTimeMs();
ScheduledRecording.Builder builder = ScheduledRecording.buildFrom(schedule)
.setEndTimeMs(program.getEndTimeUtcMillis())
.setSeasonNumber(program.getSeasonNumber())
@@ -162,10 +269,51 @@ class DvrDbSync {
.setProgramLongDescription(program.getLongDescription())
.setProgramPosterArtUri(program.getPosterArtUri())
.setProgramThumbnailUri(program.getThumbnailUri());
+ boolean needUpdate = false;
+ // Check the series recording.
+ SeriesRecording seriesRecordingForOldSchedule =
+ mDataManager.getSeriesRecording(schedule.getSeriesRecordingId());
+ if (program.getSeriesId() != null) {
+ // New program belongs to a series.
+ SeriesRecording seriesRecording =
+ mDataManager.getSeriesRecording(program.getSeriesId());
+ if (seriesRecording == null) {
+ // The new program is episodic while the previous one isn't.
+ 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()) {
+ // The new program belongs to the other series.
+ builder.setSeriesRecordingId(seriesRecording.getId());
+ needUpdate = true;
+ seriesRecordingsToUpdate.add(seriesRecording);
+ if (seriesRecordingForOldSchedule != null) {
+ seriesRecordingsToUpdate.add(seriesRecordingForOldSchedule);
+ }
+ } else if (!Objects.equals(schedule.getSeasonNumber(),
+ program.getSeasonNumber())
+ || !Objects.equals(schedule.getEpisodeNumber(),
+ program.getEpisodeNumber())) {
+ // The episode number has been changed.
+ if (seriesRecordingForOldSchedule != null) {
+ seriesRecordingsToUpdate.add(seriesRecordingForOldSchedule);
+ }
+ }
+ } else if (seriesRecordingForOldSchedule != null) {
+ // Old program belongs to a series but the new one doesn't.
+ seriesRecordingsToUpdate.add(seriesRecordingForOldSchedule);
+ }
+ // Change start time only when the recording start time has not passed.
+ boolean needToChangeStartTime = schedule.getStartTimeMs() > currentTimeMs
+ && program.getStartTimeUtcMillis() != schedule.getStartTimeMs();
if (needToChangeStartTime) {
- mDataManager.updateScheduledRecording(
- builder.setStartTimeMs(program.getStartTimeUtcMillis()).build());
- } else if (schedule.getEndTimeMs() != program.getEndTimeUtcMillis()
+ builder.setStartTimeMs(program.getStartTimeUtcMillis());
+ needUpdate = true;
+ }
+ if (needUpdate || schedule.getEndTimeMs() != program.getEndTimeUtcMillis()
|| !Objects.equals(schedule.getSeasonNumber(), program.getSeasonNumber())
|| !Objects.equals(schedule.getEpisodeNumber(), program.getEpisodeNumber())
|| !Objects.equals(schedule.getEpisodeTitle(), program.getEpisodeTitle())
@@ -179,27 +327,35 @@ class DvrDbSync {
program.getThumbnailUri())) {
mDataManager.updateScheduledRecording(builder.build());
}
+ if (!seriesRecordingsToUpdate.isEmpty()) {
+ // The series recordings will be updated after it's resumed.
+ mSeriesRecordingScheduler.updateSchedules(seriesRecordingsToUpdate);
+ }
}
}
}
- private class UpdateProgramTask extends AsyncQueryProgramTask {
+ private class QueryProgramTask extends AsyncQueryProgramTask {
private final long mProgramId;
- public UpdateProgramTask(long programId) {
+ QueryProgramTask(long programId) {
super(mContext.getContentResolver(), programId);
mProgramId = programId;
}
@Override
protected void onCancelled(Program program) {
- mUpdateProgramTask = null;
+ if (mQueryProgramTask == this) {
+ mQueryProgramTask = null;
+ }
startNextUpdateIfNeeded();
}
@Override
protected void onPostExecute(Program program) {
- mUpdateProgramTask = null;
+ if (mQueryProgramTask == this) {
+ mQueryProgramTask = null;
+ }
handleUpdateProgram(program, mProgramId);
startNextUpdateIfNeeded();
}
diff --git a/src/com/android/tv/dvr/DvrManager.java b/src/com/android/tv/dvr/DvrManager.java
index 48ca6eee..5fa6f90f 100644
--- a/src/com/android/tv/dvr/DvrManager.java
+++ b/src/com/android/tv/dvr/DvrManager.java
@@ -17,29 +17,36 @@
package com.android.tv.dvr;
import android.annotation.TargetApi;
+import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
+import android.content.OperationApplicationException;
import android.media.tv.TvContract;
import android.media.tv.TvInputInfo;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Build;
import android.os.Handler;
+import android.os.RemoteException;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.support.annotation.WorkerThread;
import android.util.Log;
+import android.util.Range;
import com.android.tv.ApplicationSingletons;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.common.feature.CommonFeatures;
import com.android.tv.data.Channel;
-import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.Program;
-import com.android.tv.dvr.SeriesRecordingScheduler.ProgramLoadCallback;
+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.SeriesRecording.SeriesState;
import com.android.tv.util.AsyncDbTask;
import com.android.tv.util.Utils;
@@ -63,7 +70,6 @@ public class DvrManager {
private static final boolean DEBUG = false;
private final WritableDvrDataManager mDataManager;
- private final ChannelDataManager mChannelDataManager;
private final DvrScheduleManager mScheduleManager;
// @GuardedBy("mListener")
private final Map<Listener, Handler> mListener = new HashMap<>();
@@ -71,64 +77,124 @@ public class DvrManager {
public DvrManager(Context context) {
SoftPreconditions.checkFeatureEnabled(context, CommonFeatures.DVR, TAG);
+ mAppContext = context.getApplicationContext();
ApplicationSingletons appSingletons = TvApplication.getSingletons(context);
mDataManager = (WritableDvrDataManager) appSingletons.getDvrDataManager();
- mAppContext = context.getApplicationContext();
- mChannelDataManager = appSingletons.getChannelDataManager();
mScheduleManager = appSingletons.getDvrScheduleManager();
+ if (mDataManager.isInitialized() && mScheduleManager.isInitialized()) {
+ createSeriesRecordingsForRecordedProgramsIfNeeded(mDataManager.getRecordedPrograms());
+ } else {
+ // No need to handle DVR schedule load finished because schedule manager is initialized
+ // after the all the schedules are loaded.
+ if (!mDataManager.isRecordedProgramLoadFinished()) {
+ mDataManager.addRecordedProgramLoadFinishedListener(
+ new OnRecordedProgramLoadFinishedListener() {
+ @Override
+ public void onRecordedProgramLoadFinished() {
+ mDataManager.removeRecordedProgramLoadFinishedListener(this);
+ if (mDataManager.isInitialized()
+ && mScheduleManager.isInitialized()) {
+ createSeriesRecordingsForRecordedProgramsIfNeeded(
+ mDataManager.getRecordedPrograms());
+ }
+ }
+ });
+ }
+ if (!mScheduleManager.isInitialized()) {
+ mScheduleManager.addOnInitializeListener(new OnInitializeListener() {
+ @Override
+ public void onInitialize() {
+ mScheduleManager.removeOnInitializeListener(this);
+ if (mDataManager.isInitialized() && mScheduleManager.isInitialized()) {
+ createSeriesRecordingsForRecordedProgramsIfNeeded(
+ mDataManager.getRecordedPrograms());
+ }
+ }
+ });
+ }
+ }
+ mDataManager.addRecordedProgramListener(new RecordedProgramListener() {
+ @Override
+ public void onRecordedProgramsAdded(RecordedProgram... recordedPrograms) {
+ if (!mDataManager.isInitialized() || !mScheduleManager.isInitialized()) {
+ return;
+ }
+ for (RecordedProgram recordedProgram : recordedPrograms) {
+ createSeriesRecordingForRecordedProgramIfNeeded(recordedProgram);
+ }
+ }
+
+ @Override
+ public void onRecordedProgramsChanged(RecordedProgram... recordedPrograms) { }
+
+ @Override
+ public void onRecordedProgramsRemoved(RecordedProgram... recordedPrograms) {
+ // Removing series recording is handled in the SeriesRecordingDetailsFragment.
+ }
+ });
+ }
+
+ private void createSeriesRecordingsForRecordedProgramsIfNeeded(
+ List<RecordedProgram> recordedPrograms) {
+ for (RecordedProgram recordedProgram : recordedPrograms) {
+ createSeriesRecordingForRecordedProgramIfNeeded(recordedProgram);
+ }
+ }
+
+ private void createSeriesRecordingForRecordedProgramIfNeeded(RecordedProgram recordedProgram) {
+ if (recordedProgram.getSeriesId() != null) {
+ SeriesRecording seriesRecording =
+ mDataManager.getSeriesRecording(recordedProgram.getSeriesId());
+ if (seriesRecording == null) {
+ addSeriesRecording(recordedProgram);
+ }
+ }
}
/**
* Schedules a recording for {@code program}.
*/
- public void addSchedule(Program program) {
+ public ScheduledRecording addSchedule(Program program) {
if (!SoftPreconditions.checkState(mDataManager.isDvrScheduleLoadFinished())) {
- return;
- }
- TvInputInfo input = Utils.getTvInputInfoForProgram(mAppContext, program);
- if (input == null) {
- Log.e(TAG, "Can't find input for program: " + program);
- return;
+ return null;
}
- ScheduledRecording schedule;
SeriesRecording seriesRecording = getSeriesRecording(program);
- if (seriesRecording == null) {
- schedule = createScheduledRecordingBuilder(input.getId(), program)
- .setPriority(mScheduleManager.suggestNewPriority())
- .build();
- } else {
- schedule = createScheduledRecordingBuilder(input.getId(), program)
- .setPriority(seriesRecording.getPriority())
- .setSeriesRecordingId(seriesRecording.getId())
- .build();
- }
- mDataManager.addScheduledRecording(schedule);
+ return addSchedule(program, seriesRecording == null
+ ? mScheduleManager.suggestNewPriority()
+ : seriesRecording.getPriority());
}
/**
- * Schedules a recording for {@code program} instead of the list of recording that conflict.
- *
- * @param program the program to record
- * @param recordingsToOverride the possible empty list of recordings that will not be recorded
+ * Schedules a recording for {@code program} with the highest priority so that the schedule
+ * can be recorded.
*/
- public void addSchedule(Program program, List<ScheduledRecording> recordingsToOverride) {
- Log.i(TAG, "Adding scheduled recording of " + program + " instead of " +
- recordingsToOverride);
+ public ScheduledRecording addScheduleWithHighestPriority(Program program) {
if (!SoftPreconditions.checkState(mDataManager.isDvrScheduleLoadFinished())) {
- return;
+ return null;
}
+ SeriesRecording seriesRecording = getSeriesRecording(program);
+ return addSchedule(program, seriesRecording == null
+ ? mScheduleManager.suggestNewPriority()
+ : mScheduleManager.suggestHighestPriority(seriesRecording.getInputId(),
+ new Range(program.getStartTimeUtcMillis(), program.getEndTimeUtcMillis()),
+ seriesRecording.getPriority()));
+ }
+
+ private ScheduledRecording addSchedule(Program program, long priority) {
TvInputInfo input = Utils.getTvInputInfoForProgram(mAppContext, program);
if (input == null) {
Log.e(TAG, "Can't find input for program: " + program);
- return;
+ return null;
}
- Collections.sort(recordingsToOverride, ScheduledRecording.PRIORITY_COMPARATOR);
- long priority = recordingsToOverride.isEmpty() ? Long.MAX_VALUE
- : recordingsToOverride.get(0).getPriority() + 1;
- ScheduledRecording r = createScheduledRecordingBuilder(input.getId(), program)
+ ScheduledRecording schedule;
+ SeriesRecording seriesRecording = getSeriesRecording(program);
+ schedule = createScheduledRecordingBuilder(input.getId(), program)
.setPriority(priority)
+ .setSeriesRecordingId(seriesRecording == null ? SeriesRecording.ID_NOT_SET
+ : seriesRecording.getId())
.build();
- mDataManager.addScheduledRecording(r);
+ mDataManager.addScheduledRecording(schedule);
+ return schedule;
}
/**
@@ -148,6 +214,15 @@ public class DvrManager {
addScheduleInternal(input.getId(), channel.getId(), startTime, endTime);
}
+ /**
+ * Adds the schedule.
+ */
+ public void addSchedule(ScheduledRecording schedule) {
+ if (mDataManager.isDvrScheduleLoadFinished()) {
+ mDataManager.addScheduledRecording(schedule);
+ }
+ }
+
private void addScheduleInternal(String inputId, long channelId, long startTime, long endTime) {
mDataManager.addScheduledRecording(ScheduledRecording
.builder(inputId, channelId, startTime, endTime)
@@ -156,10 +231,10 @@ public class DvrManager {
}
/**
- * Adds a new series recording and schedules for the programs.
+ * Adds a new series recording and schedules for the programs with the initial state.
*/
public SeriesRecording addSeriesRecording(Program selectedProgram,
- List<Program> programsToSchedule) {
+ List<Program> programsToSchedule, @SeriesState int initialState) {
Log.i(TAG, "Adding series recording for program " + selectedProgram + ", and schedules: "
+ programsToSchedule);
if (!SoftPreconditions.checkState(mDataManager.isInitialized())) {
@@ -172,6 +247,7 @@ public class DvrManager {
}
SeriesRecording seriesRecording = SeriesRecording.builder(input.getId(), selectedProgram)
.setPriority(mScheduleManager.suggestNewSeriesPriority())
+ .setState(initialState)
.build();
mDataManager.addSeriesRecording(seriesRecording);
// The schedules for the recorded programs should be added not to create the schedule the
@@ -181,6 +257,18 @@ public class DvrManager {
return seriesRecording;
}
+ private void addSeriesRecording(RecordedProgram recordedProgram) {
+ SeriesRecording seriesRecording =
+ SeriesRecording.builder(recordedProgram.getInputId(), recordedProgram)
+ .setPriority(mScheduleManager.suggestNewSeriesPriority())
+ .setState(SeriesRecording.STATE_SERIES_STOPPED)
+ .build();
+ mDataManager.addSeriesRecording(seriesRecording);
+ // The schedules for the recorded programs should be added not to create the schedule the
+ // duplicate episodes.
+ addRecordedProgramToSeriesRecording(seriesRecording);
+ }
+
private void addRecordedProgramToSeriesRecording(SeriesRecording series) {
List<ScheduledRecording> toAdd = new ArrayList<>();
for (RecordedProgram recordedProgram : mDataManager.getRecordedPrograms()) {
@@ -221,11 +309,8 @@ public class DvrManager {
mDataManager.getScheduledRecordingForProgramId(program.getId());
if (scheduleWithSameProgram != null) {
if (scheduleWithSameProgram.getState()
- == ScheduledRecording.STATE_RECORDING_NOT_STARTED
- || scheduleWithSameProgram.getState()
- == ScheduledRecording.STATE_RECORDING_CANCELED) {
+ == ScheduledRecording.STATE_RECORDING_NOT_STARTED) {
ScheduledRecording r = ScheduledRecording.buildFrom(scheduleWithSameProgram)
- .setPriority(series.getPriority())
.setSeriesRecordingId(series.getId())
.build();
if (!r.equals(scheduleWithSameProgram)) {
@@ -233,15 +318,10 @@ public class DvrManager {
}
}
} else {
- ScheduledRecording.Builder scheduledRecordingBuilder =
- createScheduledRecordingBuilder(input.getId(), program)
+ toAdd.add(createScheduledRecordingBuilder(input.getId(), program)
.setPriority(series.getPriority())
- .setSeriesRecordingId(series.getId());
- if (series.getState() == SeriesRecording.STATE_SERIES_CANCELED) {
- scheduledRecordingBuilder.setState(
- ScheduledRecording.STATE_RECORDING_CANCELED);
- }
- toAdd.add(scheduledRecordingBuilder.build());
+ .setSeriesRecordingId(series.getId())
+ .build());
}
}
if (!toAdd.isEmpty()) {
@@ -257,29 +337,33 @@ public class DvrManager {
*/
public void updateSeriesRecording(SeriesRecording series) {
if (SoftPreconditions.checkState(mDataManager.isDvrScheduleLoadFinished())) {
- // TODO: revise this method. b/30946239
- boolean isPreviousCanceled = false;
- long oldPriority = 0;
+ SeriesRecordingScheduler scheduler = SeriesRecordingScheduler.getInstance(mAppContext);
+ scheduler.pauseUpdate();
SeriesRecording previousSeries = mDataManager.getSeriesRecording(series.getId());
if (previousSeries != null) {
- isPreviousCanceled = previousSeries.getState()
- == SeriesRecording.STATE_SERIES_CANCELED;
- oldPriority = previousSeries.getPriority();
+ if (previousSeries.getChannelOption() != series.getChannelOption()
+ || (previousSeries.getChannelOption() == SeriesRecording.OPTION_CHANNEL_ONE
+ && previousSeries.getChannelId() != series.getChannelId())) {
+ List<ScheduledRecording> schedules =
+ mDataManager.getScheduledRecordings(series.getId());
+ List<ScheduledRecording> schedulesToRemove = new ArrayList<>();
+ for (ScheduledRecording schedule : schedules) {
+ if (schedule.isNotStarted()) {
+ schedulesToRemove.add(schedule);
+ }
+ }
+ mDataManager.removeScheduledRecording(true,
+ ScheduledRecording.toArray(schedulesToRemove));
+ }
}
mDataManager.updateSeriesRecording(series);
- if (!isPreviousCanceled && series.getState() == SeriesRecording.STATE_SERIES_CANCELED) {
- cancelScheduleToSeriesRecording(series);
- } else if (isPreviousCanceled
- && series.getState() == SeriesRecording.STATE_SERIES_NORMAL) {
- resumeScheduleToSeriesRecording(series);
- }
- if (oldPriority != series.getPriority()) {
+ if (previousSeries == null
+ || previousSeries.getPriority() != series.getPriority()) {
long priority = series.getPriority();
List<ScheduledRecording> schedulesToUpdate = new ArrayList<>();
for (ScheduledRecording schedule
: mDataManager.getScheduledRecordings(series.getId())) {
- if (schedule.getState() != ScheduledRecording.STATE_RECORDING_IN_PROGRESS
- && schedule.getStartTimeMs() > System.currentTimeMillis()) {
+ if (schedule.isNotStarted()) {
schedulesToUpdate.add(ScheduledRecording.buildFrom(schedule)
.setPriority(priority).build());
}
@@ -289,59 +373,10 @@ public class DvrManager {
ScheduledRecording.toArray(schedulesToUpdate));
}
}
+ scheduler.resumeUpdate();
}
}
- private void cancelScheduleToSeriesRecording(SeriesRecording series) {
- List<ScheduledRecording> allRecordings = mDataManager.getAvailableScheduledRecordings();
- for (ScheduledRecording recording : allRecordings) {
- if (recording.getSeriesRecordingId() == series.getId()) {
- if (recording.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- stopRecording(recording);
- continue;
- }
- updateScheduledRecording(ScheduledRecording.buildFrom(recording).setState
- (ScheduledRecording.STATE_RECORDING_CANCELED).build());
- }
- }
- }
-
- private void resumeScheduleToSeriesRecording(SeriesRecording series) {
- List<ScheduledRecording> allRecording = mDataManager
- .getAvailableAndCanceledScheduledRecordings();
- for (ScheduledRecording recording : allRecording) {
- if (recording.getSeriesRecordingId() == series.getId()) {
- if (recording.getState() == ScheduledRecording.STATE_RECORDING_CANCELED &&
- recording.getEndTimeMs() > System.currentTimeMillis()) {
- updateScheduledRecording(ScheduledRecording.buildFrom(recording)
- .setState(ScheduledRecording.STATE_RECORDING_NOT_STARTED).build());
- }
- }
- }
- }
-
- /**
- * Queries the programs which belong to the same series as {@code seriesProgram}.
- * <p>
- * It's done in the background because it needs the DB access, and the callback will be called
- * when it finishes.
- */
- public void queryProgramsForSeries(Program seriesProgram, ProgramLoadCallback callback) {
- if (!SoftPreconditions.checkState(mDataManager.isInitialized())) {
- callback.onProgramLoadFinished(Collections.emptyList());
- return;
- }
- TvInputInfo input = Utils.getTvInputInfoForProgram(mAppContext, seriesProgram);
- if (input == null) {
- Log.e(TAG, "Can't find input for program: " + seriesProgram);
- return;
- }
- SeriesRecordingScheduler.getInstance(mAppContext).queryPrograms(
- SeriesRecording.builder(input.getId(), seriesProgram)
- .setPriority(mScheduleManager.suggestNewPriority())
- .build(), callback);
- }
-
/**
* Removes the series recording and all the corresponding schedules which are not started yet.
*/
@@ -365,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) {
@@ -401,6 +463,23 @@ public class DvrManager {
}
/**
+ * Removes scheduled recordings without changing to the DELETED state.
+ */
+ public void forceRemoveScheduledRecording(ScheduledRecording... schedules) {
+ Log.i(TAG, "Force removing " + Arrays.asList(schedules));
+ if (!SoftPreconditions.checkState(mDataManager.isDvrScheduleLoadFinished())) {
+ return;
+ }
+ for (ScheduledRecording r : schedules) {
+ if (r.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
+ stopRecording(r);
+ } else {
+ mDataManager.removeScheduledRecording(true, r);
+ }
+ }
+ }
+
+ /**
* Removes the recorded program. It deletes the file if possible.
*/
public void removeRecordedProgram(Uri recordedProgramUri) {
@@ -434,51 +513,51 @@ public class DvrManager {
@Override
protected Void doInBackground(Void... params) {
ContentResolver resolver = mAppContext.getContentResolver();
- resolver.delete(recordedProgram.getUri(), null, null);
- try {
- Uri dataUri = recordedProgram.getDataUri();
- if (dataUri != null && ContentResolver.SCHEME_FILE.equals(dataUri.getScheme())
- && dataUri.getPath() != null) {
- File recordedProgramPath = new File(dataUri.getPath());
- if (!recordedProgramPath.exists()) {
- if (DEBUG) Log.d(TAG, "File to delete not exist: "
- + recordedProgramPath);
- } else {
- Utils.deleteDirOrFile(recordedProgramPath);
- if (DEBUG) {
- Log.d(TAG, "Sucessfully deleted files of the recorded program: "
- + recordedProgram.getDataUri());
- }
+ int deletedCounts = resolver.delete(recordedProgram.getUri(), null, null);
+ if (deletedCounts > 0) {
+ // TODO: executeOnExecutor should be called on the main thread.
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ removeRecordedData(recordedProgram.getDataUri());
+ return null;
}
- }
- } catch (SecurityException e) {
- if (DEBUG) {
- Log.d(TAG, "To delete " + recordedProgram
- + "\nyou should manually delete video data at"
- + "\nadb shell rm -rf " + recordedProgram.getDataUri());
- }
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
return null;
}
}.executeOnDbThread();
}
- /**
- * Remove all recorded programs due to missing storage.
- *
- * @param inputId for the recorded programs to remove
- */
- public void removeRecordedProgramByMissingStorage(final String inputId) {
- if (!SoftPreconditions.checkState(mDataManager.isInitialized())) {
- return;
+ public void removeRecordedPrograms(List<Long> recordedProgramIds) {
+ final ArrayList<ContentProviderOperation> dbOperations = new ArrayList<>();
+ final List<Uri> dataUris = new ArrayList<>();
+ for (Long rId : recordedProgramIds) {
+ RecordedProgram r = mDataManager.getRecordedProgram(rId);
+ if (r != null) {
+ dataUris.add(r.getDataUri());
+ dbOperations.add(ContentProviderOperation.newDelete(r.getUri()).build());
+ }
}
new AsyncDbTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
ContentResolver resolver = mAppContext.getContentResolver();
- String args[] = { inputId };
- resolver.delete(TvContract.RecordedPrograms.CONTENT_URI,
- TvContract.RecordedPrograms.COLUMN_INPUT_ID + " = ?", args);
+ try {
+ resolver.applyBatch(TvContract.AUTHORITY, dbOperations);
+ // TODO: executeOnExecutor should be called on the main thread.
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ for (Uri dataUri : dataUris) {
+ removeRecordedData(dataUri);
+ }
+ return null;
+ }
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ } catch (RemoteException | OperationApplicationException e) {
+ Log.w(TAG, "Remove reocrded programs from DB failed.", e);
+ }
return null;
}
}.executeOnDbThread();
@@ -527,10 +606,9 @@ public class DvrManager {
* {@code false}.
*/
public boolean isConflicting(ScheduledRecording schedule) {
- if (!SoftPreconditions.checkState(mDataManager.isDvrScheduleLoadFinished())) {
- return false;
- }
- return mScheduleManager.isConflicting(schedule);
+ return schedule != null
+ && SoftPreconditions.checkState(mDataManager.isDvrScheduleLoadFinished())
+ && mScheduleManager.isConflicting(schedule);
}
/**
@@ -547,20 +625,26 @@ public class DvrManager {
}
/**
- * Returns the earliest end time of the current recording for the TV input. If there are no
- * recordings, Long.MAX_VALUE is returned.
+ * Sets the highest priority to the schedule.
*/
- public long getEarliestRecordingEndTime(String inputId) {
- long result = Long.MAX_VALUE;
- for (ScheduledRecording schedule : mDataManager.getStartedRecordings()) {
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mAppContext,
- schedule.getChannelId());
- if (input != null && input.getId().equals(inputId)
- && schedule.getEndTimeMs() < result) {
- result = schedule.getEndTimeMs();
+ public void setHighestPriority(ScheduledRecording schedule) {
+ if (SoftPreconditions.checkState(mDataManager.isDvrScheduleLoadFinished())) {
+ long newPriority = mScheduleManager.suggestHighestPriority(schedule);
+ if (newPriority != schedule.getPriority()) {
+ mDataManager.updateScheduledRecording(ScheduledRecording.buildFrom(schedule)
+ .setPriority(newPriority).build());
}
}
- return result;
+ }
+
+ /**
+ * Suggests the higher priority than the schedules which overlap with {@code schedule}.
+ */
+ public long suggestHighestPriority(ScheduledRecording schedule) {
+ if (SoftPreconditions.checkState(mDataManager.isDvrScheduleLoadFinished())) {
+ return mScheduleManager.suggestHighestPriority(schedule);
+ }
+ return DvrScheduleManager.DEFAULT_PRIORITY;
}
/**
@@ -622,6 +706,23 @@ public class DvrManager {
}
/**
+ * Returns schedules which is available (i.e., isNotStarted or isInProgress) and belongs to
+ * the series recording {@code seriesRecordingId}.
+ */
+ public List<ScheduledRecording> getAvailableScheduledRecording(long seriesRecordingId) {
+ if (!mDataManager.isDvrScheduleLoadFinished()) {
+ return Collections.emptyList();
+ }
+ List<ScheduledRecording> schedules = new ArrayList<>();
+ for (ScheduledRecording schedule : mDataManager.getScheduledRecordings(seriesRecordingId)) {
+ if (schedule.isInProgress() || schedule.isNotStarted()) {
+ schedules.add(schedule);
+ }
+ }
+ return schedules;
+ }
+
+ /**
* Returns the series recording related to the program.
*/
@Nullable
@@ -704,6 +805,40 @@ public class DvrManager {
return null;
}
+ @WorkerThread
+ private void removeRecordedData(Uri dataUri) {
+ try {
+ if (dataUri != null && ContentResolver.SCHEME_FILE.equals(dataUri.getScheme())
+ && dataUri.getPath() != null) {
+ File recordedProgramPath = new File(dataUri.getPath());
+ if (!recordedProgramPath.exists()) {
+ if (DEBUG) Log.d(TAG, "File to delete not exist: " + recordedProgramPath);
+ } else {
+ Utils.deleteDirOrFile(recordedProgramPath);
+ if (DEBUG) {
+ Log.d(TAG, "Sucessfully deleted files of the recorded program: " + dataUri);
+ }
+ }
+ }
+ } catch (SecurityException e) {
+ if (DEBUG) {
+ Log.d(TAG, "To delete this recorded program, please manually delete video data at"
+ + "\nadb shell rm -rf " + dataUri);
+ }
+ }
+ }
+
+ /**
+ * Remove all the records related to the input.
+ * <p>
+ * Note that this should be called after the input was removed.
+ */
+ public void forgetStorage(String inputId) {
+ if (mDataManager.isInitialized()) {
+ mDataManager.forgetStorage(inputId);
+ }
+ }
+
/**
* Listener internally used inside dvr package.
*/
diff --git a/src/com/android/tv/dvr/DvrPlaybackActivity.java b/src/com/android/tv/dvr/DvrPlaybackActivity.java
index 3320e0fd..5deda44a 100644
--- a/src/com/android/tv/dvr/DvrPlaybackActivity.java
+++ b/src/com/android/tv/dvr/DvrPlaybackActivity.java
@@ -23,6 +23,7 @@ import android.os.Bundle;
import android.util.Log;
import com.android.tv.R;
+import com.android.tv.TvApplication;
import com.android.tv.dvr.ui.DvrPlaybackOverlayFragment;
/**
@@ -36,6 +37,7 @@ public class DvrPlaybackActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
+ TvApplication.setCurrentRunningProcess(this, true);
if (DEBUG) Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dvr_playback);
diff --git a/src/com/android/tv/dvr/DvrPlaybackMediaSessionHelper.java b/src/com/android/tv/dvr/DvrPlaybackMediaSessionHelper.java
index da815712..9759a856 100644
--- a/src/com/android/tv/dvr/DvrPlaybackMediaSessionHelper.java
+++ b/src/com/android/tv/dvr/DvrPlaybackMediaSessionHelper.java
@@ -17,6 +17,7 @@
package com.android.tv.dvr;
import android.app.Activity;
+import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaMetadata;
@@ -32,8 +33,10 @@ 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.ui.DvrPlaybackOverlayFragment;
import com.android.tv.util.ImageLoader;
import com.android.tv.util.TimeShiftUtils;
+import com.android.tv.util.Utils;
public class DvrPlaybackMediaSessionHelper {
private static final String TAG = "DvrPlaybackMediaSessionHelper";
@@ -50,8 +53,8 @@ public class DvrPlaybackMediaSessionHelper {
private final DvrWatchedPositionManager mDvrWatchedPositionManager;
private final ChannelDataManager mChannelDataManager;
- public DvrPlaybackMediaSessionHelper(Activity activity,
- String mediaSessionTag, DvrPlayer dvrPlayer) {
+ public DvrPlaybackMediaSessionHelper(Activity activity, String mediaSessionTag,
+ DvrPlayer dvrPlayer, DvrPlaybackOverlayFragment overlayFragment) {
mActivity = activity;
mDvrPlayer = dvrPlayer;
mDvrWatchedPositionManager =
@@ -71,6 +74,21 @@ public class DvrPlaybackMediaSessionHelper {
.setWatchedPosition(mDvrPlayer.getProgram().getId(), positionMs);
}
}
+
+ @Override
+ public void onPlaybackEnded() {
+ // TODO: Deal with watched over recordings in DVR library
+ RecordedProgram nextEpisode =
+ overlayFragment.getNextEpisode(mDvrPlayer.getProgram());
+ if (nextEpisode == null) {
+ mDvrPlayer.reset();
+ mActivity.finish();
+ } else {
+ Intent intent = new Intent(activity, DvrPlaybackActivity.class);
+ intent.putExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_ID, nextEpisode.getId());
+ mActivity.startActivity(intent);
+ }
+ }
});
initializeMediaSession(mediaSessionTag);
}
@@ -122,7 +140,7 @@ public class DvrPlaybackMediaSessionHelper {
* Checks if the recorded program is the same as now playing one.
*/
public boolean isCurrentProgram(RecordedProgram program) {
- return program == null ? false : program.equals(getProgram());
+ return program != null && program.equals(getProgram());
}
/**
@@ -216,7 +234,7 @@ public class DvrPlaybackMediaSessionHelper {
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> () {
+ new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... arg0) {
MediaMetadata.Builder builder = new MediaMetadata.Builder();
@@ -252,16 +270,23 @@ public class DvrPlaybackMediaSessionHelper {
@Override
public void onPlay() {
- mDvrPlayer.play();
+ if (mDvrPlayer.isPlaybackPrepared()) {
+ mDvrPlayer.play();
+ }
}
@Override
public void onPause() {
- mDvrPlayer.pause();
+ if (mDvrPlayer.isPlaybackPrepared()) {
+ mDvrPlayer.pause();
+ }
}
@Override
public void onFastForward() {
+ if (!mDvrPlayer.isPlaybackPrepared()) {
+ return;
+ }
if (mDvrPlayer.getPlaybackState() == PlaybackState.STATE_FAST_FORWARDING) {
if (mSpeedLevel < TimeShiftUtils.MAX_SPEED_LEVEL) {
mSpeedLevel++;
@@ -277,6 +302,9 @@ public class DvrPlaybackMediaSessionHelper {
@Override
public void onRewind() {
+ if (!mDvrPlayer.isPlaybackPrepared()) {
+ return;
+ }
if (mDvrPlayer.getPlaybackState() == PlaybackState.STATE_REWINDING) {
if (mSpeedLevel < TimeShiftUtils.MAX_SPEED_LEVEL) {
mSpeedLevel++;
@@ -291,7 +319,9 @@ public class DvrPlaybackMediaSessionHelper {
@Override
public void onSeekTo(long positionMs) {
- mDvrPlayer.seekTo(positionMs);
+ if (mDvrPlayer.isPlaybackPrepared()) {
+ mDvrPlayer.seekTo(positionMs);
+ }
}
}
}
diff --git a/src/com/android/tv/dvr/DvrPlayer.java b/src/com/android/tv/dvr/DvrPlayer.java
index 027d99f4..5656655c 100644
--- a/src/com/android/tv/dvr/DvrPlayer.java
+++ b/src/com/android/tv/dvr/DvrPlayer.java
@@ -55,6 +55,8 @@ public class DvrPlayer {
private boolean mPauseOnPrepared;
private final PlaybackParams mPlaybackParams = new PlaybackParams();
private final DvrPlayerCallback mEmptyCallback = new DvrPlayerCallback();
+ private long mStartPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
+ private boolean mTimeShiftPlayAvailable;
public static class DvrPlayerCallback {
/**
@@ -67,6 +69,10 @@ public class DvrPlayer {
* Called when the playback state or the playback speed is changed.
*/
public void onPlaybackStateChanged(int playbackState, int playbackSpeed) { }
+ /**
+ * Called when the playback toward the end.
+ */
+ public void onPlaybackEnded() { }
}
public interface AspectRatioChangedListener {
@@ -208,7 +214,7 @@ public class DvrPlayer {
}
positionMs = getRealSeekPosition(positionMs, SEEK_POSITION_MARGIN_MS);
if (DEBUG) Log.d(TAG, "Now: " + getPlaybackPosition() + ", shift to: " + positionMs);
- mTvView.timeShiftSeekTo(positionMs);
+ mTvView.timeShiftSeekTo(positionMs + mStartPositionMs);
if (mPlaybackState == PlaybackState.STATE_FAST_FORWARDING ||
mPlaybackState == PlaybackState.STATE_REWINDING) {
mPlaybackState = PlaybackState.STATE_PLAYING;
@@ -222,12 +228,14 @@ public class DvrPlayer {
*/
public void reset() {
if (DEBUG) Log.d(TAG, "reset()");
- mTvView.reset();
+ mCallback.onPlaybackStateChanged(PlaybackState.STATE_NONE, 1);
mPlaybackState = PlaybackState.STATE_NONE;
+ mTvView.reset();
+ mTimeShiftPlayAvailable = false;
+ mStartPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
mTimeShiftCurrentPositionMs = 0;
mPlaybackParams.setSpeed(1.0f);
mProgram = null;
- mCallback.onPlaybackStateChanged(mPlaybackState, 1);
}
/**
@@ -317,43 +325,50 @@ public class DvrPlayer {
private void setTvViewCallbacks() {
mTvView.setTimeShiftPositionCallback(new TvView.TimeShiftPositionCallback() {
@Override
+ public void onTimeShiftStartPositionChanged(String inputId, long timeMs) {
+ if (DEBUG) Log.d(TAG, "onTimeShiftStartPositionChanged:" + timeMs);
+ mStartPositionMs = timeMs;
+ if (mTimeShiftPlayAvailable) {
+ resumeToWatchedPositionIfNeeded();
+ }
+ }
+
+ @Override
public void onTimeShiftCurrentPositionChanged(String inputId, long timeMs) {
- // Workaround solution for b/29994826:
- // prevents rewinding and fast-forwarding over the ends.
+ if (DEBUG) Log.d(TAG, "onTimeShiftCurrentPositionChanged: " + timeMs);
+ if (!mTimeShiftPlayAvailable) {
+ // Workaround of b/31436263
+ return;
+ }
+ // Workaround of b/32211561, TIF won't report start position when TIS report
+ // its start position as 0. In that case, we have to do the prework of playback
+ // on the first time we get current position, and the start position should be 0
+ // at that time.
+ if (mStartPositionMs == TvInputManager.TIME_SHIFT_INVALID_TIME) {
+ mStartPositionMs = 0;
+ resumeToWatchedPositionIfNeeded();
+ }
+ timeMs -= mStartPositionMs;
if (mPlaybackState == PlaybackState.STATE_REWINDING
&& timeMs <= REWIND_POSITION_MARGIN_MS) {
play();
- } else if (mPlaybackState == PlaybackState.STATE_FAST_FORWARDING
- && timeMs >= mProgram.getDurationMillis() - SEEK_POSITION_MARGIN_MS) {
- mTvView.timeShiftSeekTo(mProgram.getDurationMillis() - SEEK_POSITION_MARGIN_MS);
- pause();
- }
- else {
+ } else {
mTimeShiftCurrentPositionMs = getRealSeekPosition(timeMs, 0);
mCallback.onPlaybackPositionChanged(mTimeShiftCurrentPositionMs);
+ if (timeMs >= mProgram.getDurationMillis()) {
+ pause();
+ mCallback.onPlaybackEnded();
+ }
}
}
});
mTvView.setCallback(new TvView.TvInputCallback() {
@Override
public void onTimeShiftStatusChanged(String inputId, int status) {
- if (DEBUG) Log.d(TAG, "onTimeShiftStatusChanged");
+ if (DEBUG) Log.d(TAG, "onTimeShiftStatusChanged:" + status);
if (status == TvInputManager.TIME_SHIFT_STATUS_AVAILABLE
&& mPlaybackState == PlaybackState.STATE_CONNECTING) {
- if (mInitialSeekPositionMs != TvInputManager.TIME_SHIFT_INVALID_TIME) {
- mTvView.timeShiftSeekTo(getRealSeekPosition(
- mInitialSeekPositionMs, SEEK_POSITION_MARGIN_MS));
- mInitialSeekPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
- }
- if (mPauseOnPrepared) {
- mTvView.timeShiftPause();
- mPlaybackState = PlaybackState.STATE_PAUSED;
- mPauseOnPrepared = false;
- } else {
- mTvView.timeShiftResume();
- mPlaybackState = PlaybackState.STATE_PLAYING;
- }
- mCallback.onPlaybackStateChanged(mPlaybackState, 1);
+ mTimeShiftPlayAvailable = true;
}
}
@@ -390,4 +405,21 @@ public class DvrPlayer {
}
});
}
+
+ private void resumeToWatchedPositionIfNeeded() {
+ if (mInitialSeekPositionMs != TvInputManager.TIME_SHIFT_INVALID_TIME) {
+ mTvView.timeShiftSeekTo(getRealSeekPosition(mInitialSeekPositionMs,
+ SEEK_POSITION_MARGIN_MS) + mStartPositionMs);
+ mInitialSeekPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
+ }
+ if (mPauseOnPrepared) {
+ mTvView.timeShiftPause();
+ mPlaybackState = PlaybackState.STATE_PAUSED;
+ mPauseOnPrepared = false;
+ } else {
+ mTvView.timeShiftResume();
+ mPlaybackState = PlaybackState.STATE_PLAYING;
+ }
+ mCallback.onPlaybackStateChanged(mPlaybackState, 1);
+ }
} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/DvrRecordingService.java b/src/com/android/tv/dvr/DvrRecordingService.java
index 39be7961..8c40aaa8 100644
--- a/src/com/android/tv/dvr/DvrRecordingService.java
+++ b/src/com/android/tv/dvr/DvrRecordingService.java
@@ -70,7 +70,6 @@ public class DvrRecordingService extends Service {
super.onCreate();
SoftPreconditions.checkFeatureEnabled(this, CommonFeatures.DVR, TAG);
ApplicationSingletons singletons = TvApplication.getSingletons(this);
- DvrManager dvrManager = singletons.getDvrManager();
WritableDvrDataManager dataManager = (WritableDvrDataManager) singletons.getDvrDataManager();
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
@@ -103,7 +102,7 @@ public class DvrRecordingService extends Service {
mScheduler.stop();
mScheduler = null;
if (mHandlerThread != null) {
- mHandlerThread.quit();
+ mHandlerThread.quitSafely();
mHandlerThread = null;
}
super.onDestroy();
diff --git a/src/com/android/tv/dvr/DvrScheduleManager.java b/src/com/android/tv/dvr/DvrScheduleManager.java
index aa77c400..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,16 +35,18 @@ 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.util.CompositeComparator;
import com.android.tv.util.Utils;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
/**
* A class to manage the schedules.
@@ -64,15 +67,34 @@ public class DvrScheduleManager {
// The new priority will have the offset from the existing one.
private static final long PRIORITY_OFFSET = 1024;
+ private static final Comparator<ScheduledRecording> RESULT_COMPARATOR =
+ new CompositeComparator<>(
+ ScheduledRecording.PRIORITY_COMPARATOR.reversed(),
+ ScheduledRecording.START_TIME_COMPARATOR,
+ ScheduledRecording.ID_COMPARATOR.reversed());
+
+ // The candidate comparator should be the consistent with
+ // InputTaskScheduler#CANDIDATE_COMPARATOR.
+ private static final Comparator<ScheduledRecording> CANDIDATE_COMPARATOR =
+ new CompositeComparator<>(
+ ScheduledRecording.PRIORITY_COMPARATOR,
+ ScheduledRecording.END_TIME_COMPARATOR,
+ ScheduledRecording.ID_COMPARATOR);
+
private final Context mContext;
private final DvrDataManagerImpl mDataManager;
private final ChannelDataManager mChannelDataManager;
private final Map<String, List<ScheduledRecording>> mInputScheduleMap = new HashMap<>();
- private final Map<String, List<ScheduledRecording>> mInputConflictMap = 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 conflictit, it might still be recorded partially.
+ private final Map<String, Map<ScheduledRecording, Boolean>> mInputConflictInfoMap =
+ new HashMap<>();
private boolean mInitialized;
+ private final Set<OnInitializeListener> mOnInitializeListeners = new CopyOnWriteArraySet<>();
private final Set<ScheduledRecordingListener> mScheduledRecordingListeners = new ArraySet<>();
private final Set<OnConflictStateChangeListener> mOnConflictStateChangeListeners =
new ArraySet<>();
@@ -106,10 +128,13 @@ public class DvrScheduleManager {
if (!schedule.isNotStarted() && !schedule.isInProgress()) {
continue;
}
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mContext,
- schedule.getChannelId());
- if (input == null) {
+ TvInputInfo input = Utils
+ .getTvInputInfoForInputId(mContext, schedule.getInputId());
+ if (!SoftPreconditions.checkArgument(input != null, TAG,
+ "Input was removed for : " + schedule)) {
// Input removed.
+ mInputScheduleMap.remove(schedule.getInputId());
+ mInputConflictInfoMap.remove(schedule.getInputId());
continue;
}
String inputId = input.getId();
@@ -131,9 +156,11 @@ public class DvrScheduleManager {
}
for (ScheduledRecording schedule : scheduledRecordings) {
TvInputInfo input = Utils
- .getTvInputInfoForChannelId(mContext, schedule.getChannelId());
+ .getTvInputInfoForInputId(mContext, schedule.getInputId());
if (input == null) {
// Input removed.
+ mInputScheduleMap.remove(schedule.getInputId());
+ mInputConflictInfoMap.remove(schedule.getInputId());
continue;
}
String inputId = input.getId();
@@ -144,6 +171,14 @@ public class DvrScheduleManager {
mInputScheduleMap.remove(inputId);
}
}
+ Map<ScheduledRecording, Boolean> conflictInfo =
+ mInputConflictInfoMap.get(inputId);
+ if (conflictInfo != null) {
+ conflictInfo.remove(schedule);
+ if (conflictInfo.isEmpty()) {
+ mInputConflictInfoMap.remove(inputId);
+ }
+ }
}
onSchedulesChanged();
notifyScheduledRecordingRemoved(scheduledRecordings);
@@ -157,9 +192,12 @@ public class DvrScheduleManager {
}
for (ScheduledRecording schedule : scheduledRecordings) {
TvInputInfo input = Utils
- .getTvInputInfoForChannelId(mContext, schedule.getChannelId());
- if (input == null) {
+ .getTvInputInfoForInputId(mContext, schedule.getInputId());
+ if (!SoftPreconditions.checkArgument(input != null, TAG,
+ "Input was removed for : " + schedule)) {
// Input removed.
+ mInputScheduleMap.remove(schedule.getInputId());
+ mInputConflictInfoMap.remove(schedule.getInputId());
continue;
}
String inputId = input.getId();
@@ -170,8 +208,7 @@ public class DvrScheduleManager {
}
// Compare ID because ScheduledRecording.equals() doesn't work if the state
// is changed.
- Iterator<ScheduledRecording> i = schedules.iterator();
- while (i.hasNext()) {
+ for (Iterator<ScheduledRecording> i = schedules.iterator(); i.hasNext(); ) {
if (i.next().getId() == schedule.getId()) {
i.remove();
break;
@@ -183,6 +220,24 @@ public class DvrScheduleManager {
if (schedules.isEmpty()) {
mInputScheduleMap.remove(inputId);
}
+ // Update conflict list as well
+ Map<ScheduledRecording, Boolean> conflictInfo =
+ mInputConflictInfoMap.get(inputId);
+ if (conflictInfo != null) {
+ // 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);
+ }
+ }
}
onSchedulesChanged();
notifyScheduledRecordingStatusChanged(scheduledRecordings);
@@ -249,33 +304,39 @@ public class DvrScheduleManager {
schedules.add(schedule);
}
}
- mInitialized = true;
+ if (!mInitialized) {
+ mInitialized = true;
+ notifyInitialize();
+ }
onSchedulesChanged();
}
private void onSchedulesChanged() {
+ // TODO: notify conflict state change when some conflicting recording becomes partially
+ // conflicting, vice versa.
List<ScheduledRecording> addedConflicts = new ArrayList<>();
List<ScheduledRecording> removedConflicts = new ArrayList<>();
for (String inputId : mInputScheduleMap.keySet()) {
- List<ScheduledRecording> oldConflicts = mInputConflictMap.get(inputId);
+ Map<ScheduledRecording, Boolean> oldConflictsInfo = mInputConflictInfoMap.get(inputId);
Map<Long, ScheduledRecording> oldConflictMap = new HashMap<>();
- if (oldConflicts != null) {
- for (ScheduledRecording r : oldConflicts) {
+ if (oldConflictsInfo != null) {
+ for (ScheduledRecording r : oldConflictsInfo.keySet()) {
oldConflictMap.put(r.getId(), r);
}
}
- List<ScheduledRecording> conflicts = getConflictingSchedules(inputId);
- for (ScheduledRecording r : conflicts) {
- if (oldConflictMap.remove(r.getId()) == null) {
- addedConflicts.add(r);
+ Map<ScheduledRecording, Boolean> conflictInfo = getConflictingSchedulesInfo(inputId);
+ if (conflictInfo.isEmpty()) {
+ mInputConflictInfoMap.remove(inputId);
+ } else {
+ mInputConflictInfoMap.put(inputId, conflictInfo);
+ List<ScheduledRecording> conflicts = new ArrayList<>(conflictInfo.keySet());
+ for (ScheduledRecording r : conflicts) {
+ if (oldConflictMap.remove(r.getId()) == null) {
+ addedConflicts.add(r);
+ }
}
}
removedConflicts.addAll(oldConflictMap.values());
- if (conflicts.isEmpty()) {
- mInputConflictMap.remove(inputId);
- } else {
- mInputConflictMap.put(inputId, conflicts);
- }
}
if (!removedConflicts.isEmpty()) {
notifyConflictStateChange(false, ScheduledRecording.toArray(removedConflicts));
@@ -334,6 +395,29 @@ public class DvrScheduleManager {
}
/**
+ * Adds a {@link OnInitializeListener}.
+ */
+ public final void addOnInitializeListener(OnInitializeListener listener) {
+ mOnInitializeListeners.add(listener);
+ }
+
+ /**
+ * Removes a {@link OnInitializeListener}.
+ */
+ public final void removeOnInitializeListener(OnInitializeListener listener) {
+ mOnInitializeListeners.remove(listener);
+ }
+
+ /**
+ * Calls {@link OnInitializeListener#onInitialize} for each listener.
+ */
+ private void notifyInitialize() {
+ for (OnInitializeListener l : mOnInitializeListeners) {
+ l.onInitialize();
+ }
+ }
+
+ /**
* Adds a {@link OnConflictStateChangeListener}.
*/
public final void addOnConflictStateChangeListener(OnConflictStateChangeListener listener) {
@@ -380,6 +464,47 @@ public class DvrScheduleManager {
}
/**
+ * Suggests the higher priority than the schedules which overlap with {@code schedule}.
+ */
+ public long suggestHighestPriority(ScheduledRecording schedule) {
+ List<ScheduledRecording> schedules = mInputScheduleMap.get(schedule.getInputId());
+ if (schedules == null) {
+ return DEFAULT_PRIORITY;
+ }
+ long highestPriority = Long.MIN_VALUE;
+ for (ScheduledRecording r : schedules) {
+ if (!r.equals(schedule) && r.isOverLapping(schedule)
+ && r.getPriority() > highestPriority) {
+ highestPriority = r.getPriority();
+ }
+ }
+ if (highestPriority == Long.MIN_VALUE || highestPriority < schedule.getPriority()) {
+ return schedule.getPriority();
+ }
+ return highestPriority + PRIORITY_OFFSET;
+ }
+
+ /**
+ * Suggests the higher priority than the schedules which overlap with {@code schedule}.
+ */
+ public long suggestHighestPriority(String inputId, Range<Long> peroid, long basePriority) {
+ List<ScheduledRecording> schedules = mInputScheduleMap.get(inputId);
+ if (schedules == null) {
+ return DEFAULT_PRIORITY;
+ }
+ long highestPriority = Long.MIN_VALUE;
+ for (ScheduledRecording r : schedules) {
+ if (r.isOverLapping(peroid) && r.getPriority() > highestPriority) {
+ highestPriority = r.getPriority();
+ }
+ }
+ if (highestPriority == Long.MIN_VALUE || highestPriority < basePriority) {
+ return basePriority;
+ }
+ return highestPriority + PRIORITY_OFFSET;
+ }
+
+ /**
* Returns the priority for a series recording.
* <p>
* The recording will have the higher priority than the existing series.
@@ -411,11 +536,12 @@ public class DvrScheduleManager {
}
/**
- * Returns priority ordered list of all scheduled recordings that will not be recorded if
- * this program is.
+ * Returns a sorted list of all scheduled recordings that will not be recorded if
+ * this program is going to be recorded, with their priorities in decending order.
* <p>
- * Any empty list means there is no conflicts. If there is conflict the program must be
- * scheduled to record with a priority higher than the first recording in the list returned.
+ * An empty list means there is no conflicts. If there is conflict, a priority higher than
+ * the first recording in the returned list should be assigned to the new schedule of this
+ * program to guarantee the program would be completely recorded.
*/
public List<ScheduledRecording> getConflictingSchedules(Program program) {
SoftPreconditions.checkState(mInitialized, TAG, "Not initialized yet");
@@ -439,11 +565,34 @@ public class DvrScheduleManager {
}
/**
- * Returns priority ordered list of all scheduled recordings that will not be recorded if
- * this channel is.
+ * Returns list of all conflicting scheduled recordings with schedules belonging to {@code
+ * seriesRecording}
+ * recording.
+ * <p>
+ * Any empty list means there is no conflicts.
+ */
+ public List<ScheduledRecording> getConflictingSchedules(SeriesRecording seriesRecording) {
+ SoftPreconditions.checkState(mInitialized, TAG, "Not initialized yet");
+ SoftPreconditions.checkState(seriesRecording != null, TAG, "series recording is null");
+ if (!mInitialized || seriesRecording == null) {
+ return Collections.emptyList();
+ }
+ TvInputInfo input = Utils.getTvInputInfoForInputId(mContext, seriesRecording.getInputId());
+ if (input == null || !input.canRecord() || input.getTunerCount() <= 0) {
+ return Collections.emptyList();
+ }
+ List<ScheduledRecording> schedulesForSeries = mDataManager.getScheduledRecordings(
+ seriesRecording.getId());
+ return getConflictingSchedules(input, schedulesForSeries);
+ }
+
+ /**
+ * Returns a sorted list of all scheduled recordings that will not be recorded if
+ * this channel is going to be recorded, with their priority in decending order.
* <p>
- * Any empty list means there is no conflicts. If there is conflict the channel must be
- * scheduled to record with a priority higher than the first recording in the list returned.
+ * An empty list means there is no conflicts. If there is conflict, a priority higher than
+ * the first recording in the returned list should be assigned to the new schedule of this
+ * channel to guarantee the channel would be completely recorded in the designated time range.
*/
public List<ScheduledRecording> getConflictingSchedules(long channelId, long startTimeMs,
long endTimeMs) {
@@ -468,18 +617,18 @@ public class DvrScheduleManager {
* the given input.
*/
@NonNull
- private List<ScheduledRecording> getConflictingSchedules(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 getConflictingSchedules(schedules, input.getTunerCount());
+ return getConflictingSchedulesInfo(schedules, input.getTunerCount());
}
/**
@@ -490,14 +639,33 @@ public class DvrScheduleManager {
*/
public boolean isConflicting(ScheduledRecording schedule) {
SoftPreconditions.checkState(mInitialized, TAG, "Not initialized yet");
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mContext, schedule.getChannelId());
+ TvInputInfo input = Utils.getTvInputInfoForInputId(mContext, schedule.getInputId());
+ SoftPreconditions.checkState(input != null, TAG, "Can't find input for channel ID : "
+ + schedule.getChannelId());
+ if (!mInitialized || input == null) {
+ return false;
+ }
+ Map<ScheduledRecording, Boolean> conflicts = mInputConflictInfoMap.get(input.getId());
+ return conflicts != null && conflicts.containsKey(schedule);
+ }
+
+ /**
+ * Checks if the schedule is partially conflicting, i.e., part of the scheduled program might be
+ * recorded even if the priority of the schedule is not raised.
+ * <p>
+ * If the given schedule is not conflicting or is totally conflicting, i.e., cannot be recorded
+ * at all, this method returns {@code false} in both cases.
+ */
+ public boolean isPartiallyConflicting(@NonNull ScheduledRecording schedule) {
+ SoftPreconditions.checkState(mInitialized, TAG, "Not initialized yet");
+ TvInputInfo input = Utils.getTvInputInfoForInputId(mContext, schedule.getInputId());
SoftPreconditions.checkState(input != null, TAG, "Can't find input for channel ID : "
+ schedule.getChannelId());
if (!mInitialized || input == null) {
return false;
}
- List<ScheduledRecording> conflicts = mInputConflictMap.get(input.getId());
- return conflicts != null && conflicts.contains(schedule);
+ Map<ScheduledRecording, Boolean> conflicts = mInputConflictInfoMap.get(input.getId());
+ return conflicts != null && conflicts.getOrDefault(schedule, false);
}
/**
@@ -599,7 +767,7 @@ public class DvrScheduleManager {
List<ScheduledRecording> result = new ArrayList<>();
result.addAll(getConflictingSchedules(schedulesSameChannel, 1));
result.addAll(getConflictingSchedules(schedulesToCheck, tunerCount));
- Collections.sort(result, ScheduledRecording.PRIORITY_COMPARATOR);
+ Collections.sort(result, RESULT_COMPARATOR);
return result;
}
@@ -639,66 +807,161 @@ public class DvrScheduleManager {
*/
public static List<ScheduledRecording> getConflictingSchedules(
List<ScheduledRecording> schedules, int tunerCount) {
- return getConflictingSchedules(schedules, tunerCount,
- Collections.singletonList(new Range<>(Long.MIN_VALUE, Long.MAX_VALUE)));
+ return getConflictingSchedules(schedules, tunerCount, null);
}
@VisibleForTesting
- static List<ScheduledRecording> getConflictingSchedules(List<ScheduledRecording> schedules,
- int tunerCount, List<Range<Long>> periods) {
- List<ScheduledRecording> schedulesToCheck = new ArrayList<>();
- // Filter out non-overlapping or empty duration of schedules.
- for (ScheduledRecording schedule : schedules) {
- for (Range<Long> period : periods) {
- if (schedule.isOverLapping(period)
- && schedule.getStartTimeMs() < schedule.getEndTimeMs()) {
- schedulesToCheck.add(schedule);
- break;
+ static List<ScheduledRecording> getConflictingSchedules(
+ List<ScheduledRecording> schedules, int tunerCount, List<Range<Long>> periods) {
+ List<ScheduledRecording> result = new ArrayList<>(
+ getConflictingSchedulesInfo(schedules, tunerCount, periods).keySet());
+ Collections.sort(result, RESULT_COMPARATOR);
+ return result;
+ }
+
+ @VisibleForTesting
+ static Map<ScheduledRecording, Boolean> getConflictingSchedulesInfo(
+ List<ScheduledRecording> schedules, int tunerCount) {
+ return getConflictingSchedulesInfo(schedules, tunerCount, null);
+ }
+
+ /**
+ * This is the core method to calculate all the conflicting schedules (in given periods).
+ * <p>
+ * Note that this method will ignore duplicated schedules with a same hash code. (Please refer
+ * to {@link ScheduledRecording#hashCode}.)
+ *
+ * @return A {@link HashMap} from {@link ScheduledRecording} to {@link Boolean}. The boolean
+ * value denotes if the scheduled recording is partially conflicting, i.e., is possible
+ * to be partially recorded under the given schedules and tuner count {@code true},
+ * or not {@code false}.
+ */
+ 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, Boolean> conflicts = new HashMap<>();
+ Map<ScheduledRecording, ScheduledRecording> modified2OriginalSchedules = new HashMap<>();
+ // Simulate InputTaskScheduler.
+ while (!schedulesToCheck.isEmpty()) {
+ ScheduledRecording schedule = schedulesToCheck.remove(0);
+ removeFinishedRecordings(recordings, schedule.getStartTimeMs());
+ if (recordings.size() < tunerCount) {
+ recordings.add(schedule);
+ if (modified2OriginalSchedules.containsKey(schedule)) {
+ // Schedule has been modified, which means it's already conflicted.
+ // Modify its state to partially conflicted.
+ conflicts.put(modified2OriginalSchedules.get(schedule), true);
}
- }
- }
- // Sort by the end time.
- // If a.end <= b.end <= c.end and a overlaps with b and c, then b overlaps with c.
- // Likewise, if a1.end <= a2.end <= ... , all the schedules which overlap with a1 overlap
- // with each other.
- Collections.sort(schedulesToCheck, ScheduledRecording.END_TIME_COMPARATOR);
- Set<ScheduledRecording> conflicts = new ArraySet<>();
- List<ScheduledRecording> overlaps = new ArrayList<>();
- for (int i = 0; i < schedulesToCheck.size(); ++i) {
- ScheduledRecording r1 = schedulesToCheck.get(i);
- if (conflicts.contains(r1)) {
- // No need to check r1 because it's a conflicting schedule already.
- continue;
- }
- overlaps.clear();
- overlaps.add(r1);
- // Find schedules which overlap with r1.
- for (int j = i + 1; j < schedulesToCheck.size(); ++j) {
- ScheduledRecording r2 = schedulesToCheck.get(j);
- if (!conflicts.contains(r2) && r1.getEndTimeMs() > r2.getStartTimeMs()) {
- overlaps.add(r2);
+ } else {
+ ScheduledRecording candidate = findReplaceableRecording(recordings, schedule);
+ if (candidate != null) {
+ if (!modified2OriginalSchedules.containsKey(candidate)) {
+ 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.
+ 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, false);
+ }
+ long earliestEndTime = getEarliestEndTime(recordings);
+ if (earliestEndTime < schedule.getEndTimeMs()) {
+ // The schedule can starts when other recording ends even though it's
+ // clipped.
+ ScheduledRecording modifiedSchedule = ScheduledRecording.buildFrom(schedule)
+ .setStartTimeMs(earliestEndTime).build();
+ ScheduledRecording originalSchedule =
+ modified2OriginalSchedules.getOrDefault(schedule, schedule);
+ modified2OriginalSchedules.put(modifiedSchedule, originalSchedule);
+ int insertPosition = Collections.binarySearch(schedulesToCheck,
+ modifiedSchedule,
+ ScheduledRecording.START_TIME_THEN_PRIORITY_THEN_ID_COMPARATOR);
+ if (insertPosition >= 0) {
+ schedulesToCheck.add(insertPosition, modifiedSchedule);
+ } else {
+ schedulesToCheck.add(-insertPosition - 1, modifiedSchedule);
+ }
+ }
}
}
- Collections.sort(overlaps, ScheduledRecording.PRIORITY_COMPARATOR);
- // If there are more than one overlapping schedules for the same channel, only one
- // schedule will be recorded.
- HashSet<Long> channelIds = new HashSet<>();
- for (Iterator<ScheduledRecording> iter = overlaps.iterator(); iter.hasNext(); ) {
+ }
+ // Returns only the schedules with the given range.
+ if (periods != null && !periods.isEmpty()) {
+ for (Iterator<ScheduledRecording> iter = conflicts.keySet().iterator();
+ iter.hasNext(); ) {
+ boolean overlapping = false;
ScheduledRecording schedule = iter.next();
- if (channelIds.contains(schedule.getChannelId())) {
- conflicts.add(schedule);
+ for (Range<Long> period : periods) {
+ if (schedule.isOverLapping(period)) {
+ overlapping = true;
+ break;
+ }
+ }
+ if (!overlapping) {
iter.remove();
- } else {
- channelIds.add(schedule.getChannelId());
}
}
- if (overlaps.size() > tunerCount) {
- conflicts.addAll(overlaps.subList(tunerCount, overlaps.size()));
+ }
+ return conflicts;
+ }
+
+ private static void removeFinishedRecordings(List<ScheduledRecording> recordings,
+ long currentTimeMs) {
+ for (Iterator<ScheduledRecording> iter = recordings.iterator(); iter.hasNext(); ) {
+ if (iter.next().getEndTimeMs() <= currentTimeMs) {
+ iter.remove();
}
}
- List<ScheduledRecording> result = new ArrayList<>(conflicts);
- Collections.sort(result, ScheduledRecording.PRIORITY_COMPARATOR);
- return result;
+ }
+
+ /**
+ * @see InputTaskScheduler#getReplacableTask
+ */
+ private static ScheduledRecording findReplaceableRecording(List<ScheduledRecording> recordings,
+ ScheduledRecording schedule) {
+ // Returns the recording with the following priority.
+ // 1. The recording with the lowest priority is returned.
+ // 2. If the priorities are the same, the recording which finishes early is returned.
+ // 3. If 1) and 2) are the same, the early created schedule is returned.
+ ScheduledRecording candidate = null;
+ for (ScheduledRecording recording : recordings) {
+ if (schedule.getPriority() > recording.getPriority()) {
+ if (candidate == null || CANDIDATE_COMPARATOR.compare(candidate, recording) > 0) {
+ candidate = recording;
+ }
+ }
+ }
+ return candidate;
+ }
+
+ private static long getEarliestEndTime(List<ScheduledRecording> recordings) {
+ long earliest = Long.MAX_VALUE;
+ for (ScheduledRecording recording : recordings) {
+ if (earliest > recording.getEndTimeMs()) {
+ earliest = recording.getEndTimeMs();
+ }
+ }
+ return earliest;
+ }
+
+ /**
+ * A listener which is notified the initialization of schedule manager.
+ */
+ public interface OnInitializeListener {
+ /**
+ * Called when the schedule manager has been initialized.
+ */
+ void onInitialize();
}
/**
@@ -714,4 +977,4 @@ public class DvrScheduleManager {
*/
void onConflictStateChange(boolean conflict, ScheduledRecording... schedules);
}
-}
+} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/DvrStorageStatusManager.java b/src/com/android/tv/dvr/DvrStorageStatusManager.java
new file mode 100644
index 00000000..a653b5f4
--- /dev/null
+++ b/src/com/android/tv/dvr/DvrStorageStatusManager.java
@@ -0,0 +1,376 @@
+/*
+ * 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.content.BroadcastReceiver;
+import android.content.ContentProviderOperation;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.OperationApplicationException;
+import android.database.Cursor;
+import android.media.tv.TvContract;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Environment;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.os.StatFs;
+import android.support.annotation.AnyThread;
+import android.support.annotation.IntDef;
+import android.support.annotation.WorkerThread;
+import android.util.Log;
+
+import com.android.tv.common.SoftPreconditions;
+import com.android.tv.common.feature.CommonFeatures;
+import com.android.tv.util.Utils;
+
+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.Objects;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+/**
+ * Signals DVR storage status change such as plugging/unplugging.
+ */
+public class DvrStorageStatusManager {
+ private static final String TAG = "DvrStorageStatusManager";
+ private static final boolean DEBUG = false;
+
+ /**
+ * Minimum storage size to support DVR
+ */
+ public static final long MIN_STORAGE_SIZE_FOR_DVR_IN_BYTES = 50 * 1024 * 1024 * 1024L; // 50GB
+ private static final long MIN_FREE_STORAGE_SIZE_FOR_DVR_IN_BYTES
+ = 10 * 1024 * 1024 * 1024L; // 10GB
+ private static final String RECORDING_DATA_SUB_PATH = "/recording";
+
+ private static final String[] PROJECTION = {
+ TvContract.RecordedPrograms._ID,
+ TvContract.RecordedPrograms.COLUMN_PACKAGE_NAME,
+ TvContract.RecordedPrograms.COLUMN_RECORDING_DATA_URI
+ };
+ private final static int BATCH_OPERATION_COUNT = 100;
+
+ @IntDef({STORAGE_STATUS_OK, STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL,
+ STORAGE_STATUS_FREE_SPACE_INSUFFICIENT, STORAGE_STATUS_MISSING})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface StorageStatus {
+ }
+
+ /**
+ * Current storage is OK to record a program.
+ */
+ public static final int STORAGE_STATUS_OK = 0;
+
+ /**
+ * Current storage's total capacity is smaller than DVR requirement.
+ */
+ public static final int STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL = 1;
+
+ /**
+ * Current storage's free space is insufficient to record programs.
+ */
+ public static final int STORAGE_STATUS_FREE_SPACE_INSUFFICIENT = 2;
+
+ /**
+ * Current storage is missing.
+ */
+ public static final int STORAGE_STATUS_MISSING = 3;
+
+ private final Context mContext;
+ private final Set<OnStorageMountChangedListener> mOnStorageMountChangedListeners =
+ new CopyOnWriteArraySet<>();
+ private final boolean mRunningInMainProcess;
+ private MountedStorageStatus mMountedStorageStatus;
+ private boolean mStorageValid;
+ private CleanUpDbTask mCleanUpDbTask;
+
+ private class MountedStorageStatus {
+ private final boolean mStorageMounted;
+ private final File mStorageMountedDir;
+ private final long mStorageMountedCapacity;
+
+ private MountedStorageStatus(boolean mounted, File mountedDir, long capacity) {
+ mStorageMounted = mounted;
+ mStorageMountedDir = mountedDir;
+ mStorageMountedCapacity = capacity;
+ }
+
+ private boolean isValidForDvr() {
+ return mStorageMounted && mStorageMountedCapacity >= MIN_STORAGE_SIZE_FOR_DVR_IN_BYTES;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof MountedStorageStatus)) {
+ return false;
+ }
+ MountedStorageStatus status = (MountedStorageStatus) other;
+ return mStorageMounted == status.mStorageMounted
+ && Objects.equals(mStorageMountedDir, status.mStorageMountedDir)
+ && mStorageMountedCapacity == status.mStorageMountedCapacity;
+ }
+ }
+
+ public interface OnStorageMountChangedListener {
+
+ /**
+ * Listener for DVR storage status change.
+ *
+ * @param storageMounted {@code true} when DVR possible storage is mounted,
+ * {@code false} otherwise.
+ */
+ void onStorageMountChanged(boolean storageMounted);
+ }
+
+ private final class StorageStatusBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ MountedStorageStatus result = getStorageStatusInternal();
+ if (mMountedStorageStatus.equals(result)) {
+ return;
+ }
+ mMountedStorageStatus = result;
+ if (result.mStorageMounted && mRunningInMainProcess) {
+ // Cleans up DB in LC process.
+ // Tuner process is not always on.
+ if (mCleanUpDbTask != null) {
+ mCleanUpDbTask.cancel(true);
+ }
+ mCleanUpDbTask = new CleanUpDbTask();
+ mCleanUpDbTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+ boolean valid = result.isValidForDvr();
+ if (valid == mStorageValid) {
+ return;
+ }
+ mStorageValid = valid;
+ for (OnStorageMountChangedListener l : mOnStorageMountChangedListeners) {
+ l.onStorageMountChanged(valid);
+ }
+ }
+ }
+
+ /**
+ * Creates DvrStorageStatusManager.
+ *
+ * @param context {@link Context}
+ */
+ public DvrStorageStatusManager(final Context context, boolean runningInMainProcess) {
+ mContext = context;
+ mRunningInMainProcess = runningInMainProcess;
+ mMountedStorageStatus = getStorageStatusInternal();
+ mStorageValid = mMountedStorageStatus.isValidForDvr();
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
+ filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
+ filter.addAction(Intent.ACTION_MEDIA_EJECT);
+ filter.addAction(Intent.ACTION_MEDIA_REMOVED);
+ filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
+ filter.addDataScheme(ContentResolver.SCHEME_FILE);
+ mContext.registerReceiver(new StorageStatusBroadcastReceiver(), filter);
+ }
+
+ /**
+ * Adds the listener for receiving storage status change.
+ *
+ * @param listener
+ */
+ public void addListener(OnStorageMountChangedListener listener) {
+ mOnStorageMountChangedListeners.add(listener);
+ }
+
+ /**
+ * Removes the current listener.
+ */
+ public void removeListener(OnStorageMountChangedListener listener) {
+ mOnStorageMountChangedListeners.remove(listener);
+ }
+
+ /**
+ * Returns true if a storage is mounted.
+ */
+ public boolean isStorageMounted() {
+ return mMountedStorageStatus.mStorageMounted;
+ }
+
+ /**
+ * Returns the path to DVR recording data directory.
+ * This can take for a while sometimes.
+ */
+ @WorkerThread
+ public File getRecordingRootDataDirectory() {
+ SoftPreconditions.checkState(Looper.myLooper() != Looper.getMainLooper());
+ if (mMountedStorageStatus.mStorageMountedDir == null) {
+ return null;
+ }
+ File root = mContext.getExternalFilesDir(null);
+ String rootPath;
+ try {
+ rootPath = root != null ? root.getCanonicalPath() : null;
+ } catch (IOException | SecurityException e) {
+ return null;
+ }
+ return rootPath == null ? null : new File(rootPath + RECORDING_DATA_SUB_PATH);
+ }
+
+ /**
+ * Returns the current storage status for DVR recordings.
+ *
+ * @return {@link StorageStatus}
+ */
+ @AnyThread
+ public @StorageStatus int getDvrStorageStatus() {
+ MountedStorageStatus status = mMountedStorageStatus;
+ if (status.mStorageMountedDir == null) {
+ return STORAGE_STATUS_MISSING;
+ }
+ if (CommonFeatures.FORCE_RECORDING_UNTIL_NO_SPACE.isEnabled(mContext)) {
+ return STORAGE_STATUS_OK;
+ }
+ if (status.mStorageMountedCapacity < MIN_STORAGE_SIZE_FOR_DVR_IN_BYTES) {
+ return STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL;
+ }
+ try {
+ StatFs statFs = new StatFs(status.mStorageMountedDir.toString());
+ if (statFs.getAvailableBytes() < MIN_FREE_STORAGE_SIZE_FOR_DVR_IN_BYTES) {
+ return STORAGE_STATUS_FREE_SPACE_INSUFFICIENT;
+ }
+ } catch (IllegalArgumentException e) {
+ // In rare cases, storage status change was not notified yet.
+ SoftPreconditions.checkState(false);
+ return STORAGE_STATUS_FREE_SPACE_INSUFFICIENT;
+ }
+ return STORAGE_STATUS_OK;
+ }
+
+ /**
+ * Returns whether the storage has sufficient storage.
+ *
+ * @return {@code true} when there is sufficient storage, {@code false} otherwise
+ */
+ public boolean isStorageSufficient() {
+ return getDvrStorageStatus() == STORAGE_STATUS_OK;
+ }
+
+ private MountedStorageStatus getStorageStatusInternal() {
+ boolean storageMounted =
+ Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
+ File storageMountedDir = storageMounted ? Environment.getExternalStorageDirectory() : null;
+ storageMounted = storageMounted && storageMountedDir != null;
+ long storageMountedCapacity = 0L;
+ if (storageMounted) {
+ try {
+ StatFs statFs = new StatFs(storageMountedDir.toString());
+ storageMountedCapacity = statFs.getTotalBytes();
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Storage mount status was changed.");
+ storageMounted = false;
+ storageMountedDir = null;
+ }
+ }
+ return new MountedStorageStatus(
+ storageMounted, storageMountedDir, storageMountedCapacity);
+ }
+
+ private class CleanUpDbTask extends AsyncTask<Void, Void, Void> {
+ private final ContentResolver mContentResolver;
+
+ private CleanUpDbTask() {
+ mContentResolver = mContext.getContentResolver();
+ }
+
+ @Override
+ protected Void doInBackground(Void... params) {
+ @DvrStorageStatusManager.StorageStatus int storageStatus = getDvrStorageStatus();
+ if (storageStatus == DvrStorageStatusManager.STORAGE_STATUS_MISSING) {
+ return null;
+ }
+ List<ContentProviderOperation> ops = getDeleteOps(storageStatus
+ == DvrStorageStatusManager.STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL);
+ if (ops == null || ops.isEmpty()) {
+ return null;
+ }
+ Log.i(TAG, "New device storage mounted. # of recordings to be forgotten : "
+ + ops.size());
+ for (int i = 0 ; i < ops.size() && !isCancelled() ; i += BATCH_OPERATION_COUNT) {
+ int toIndex = (i + BATCH_OPERATION_COUNT) > ops.size()
+ ? ops.size() : (i + BATCH_OPERATION_COUNT);
+ ArrayList<ContentProviderOperation> batchOps =
+ new ArrayList<>(ops.subList(i, toIndex));
+ try {
+ mContext.getContentResolver().applyBatch(TvContract.AUTHORITY, batchOps);
+ } catch (RemoteException | OperationApplicationException e) {
+ Log.e(TAG, "Failed to clean up RecordedPrograms.", e);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ if (mCleanUpDbTask == this) {
+ mCleanUpDbTask = null;
+ }
+ }
+
+ private List<ContentProviderOperation> getDeleteOps(boolean deleteAll) {
+ List<ContentProviderOperation> ops = new ArrayList<>();
+
+ try (Cursor c = mContentResolver.query(
+ TvContract.RecordedPrograms.CONTENT_URI, PROJECTION, null, null, null)) {
+ if (c == null) {
+ return null;
+ }
+ while (c.moveToNext()) {
+ @DvrStorageStatusManager.StorageStatus int storageStatus =
+ getDvrStorageStatus();
+ if (isCancelled()
+ || storageStatus == DvrStorageStatusManager.STORAGE_STATUS_MISSING) {
+ ops.clear();
+ break;
+ }
+ String id = c.getString(0);
+ String packageName = c.getString(1);
+ String dataUriString = c.getString(2);
+ if (dataUriString == null) {
+ continue;
+ }
+ Uri dataUri = Uri.parse(dataUriString);
+ if (!Utils.isInBundledPackageSet(packageName)
+ || dataUri == null || dataUri.getPath() == null
+ || !ContentResolver.SCHEME_FILE.equals(dataUri.getScheme())) {
+ continue;
+ }
+ File recordedProgramDir = new File(dataUri.getPath());
+ if (deleteAll || !recordedProgramDir.exists()) {
+ ops.add(ContentProviderOperation.newDelete(
+ TvContract.buildRecordedProgramUri(Long.parseLong(id))).build());
+ }
+ }
+ return ops;
+ }
+ }
+ }
+}
diff --git a/src/com/android/tv/dvr/DvrUiHelper.java b/src/com/android/tv/dvr/DvrUiHelper.java
index be934fd4..c0d3b0c5 100644
--- a/src/com/android/tv/dvr/DvrUiHelper.java
+++ b/src/com/android/tv/dvr/DvrUiHelper.java
@@ -36,7 +36,6 @@ 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.ui.DvrCancelAllSeriesRecordingDialogFragment;
import com.android.tv.dvr.ui.DvrDetailsActivity;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment;
import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrAlreadyRecordedDialogFragment;
@@ -44,13 +43,19 @@ import com.android.tv.dvr.ui.DvrHalfSizedDialogFragment.DvrAlreadyScheduledDialo
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.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.DvrHalfSizedDialogFragment.DvrMissingStorageErrorDialogFragment;
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.Utils;
@@ -82,7 +87,7 @@ public class DvrUiHelper {
}
} else {
SeriesRecording seriesRecording = dvrManager.getSeriesRecording(program);
- if (seriesRecording == null) {
+ if (seriesRecording == null || seriesRecording.isStopped()) {
DvrUiHelper.showScheduleDialog(activity, program);
return false;
} else {
@@ -111,6 +116,32 @@ public class DvrUiHelper {
}
/**
+ * Checks if the storage status is good for recording and shows error messages if needed.
+ *
+ * @return true if the storage status is fine to be recorded for {@code inputId}.
+ */
+ 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;
+ }
+ }
+
+ /**
* Shows the schedule dialog.
*/
public static void showScheduleDialog(MainActivity activity, Program program) {
@@ -170,7 +201,7 @@ public class DvrUiHelper {
/**
* Shows DVR missing storage error dialog.
*/
- public static void showDvrMissingStorageErrorDialog(Activity activity, String inputId) {
+ private static void showDvrMissingStorageErrorDialog(Activity activity, String inputId) {
SoftPreconditions.checkArgument(!TextUtils.isEmpty(inputId));
Bundle args = new Bundle();
args.putString(DvrHalfSizedDialogFragment.KEY_INPUT_ID, inputId);
@@ -178,15 +209,23 @@ public class DvrUiHelper {
}
/**
+ * Shows DVR small sized storage error dialog.
+ */
+ public static void showDvrSmallSizedStorageErrorDialog(Activity activity) {
+ showDialogFragment(activity, new DvrSmallSizedStorageErrorDialogFragment(), null);
+ }
+
+ /**
* Shows stop recording dialog.
*/
- public static void showStopRecordingDialog(MainActivity activity, Channel channel) {
- if (channel == null) {
- return;
- }
+ public static void showStopRecordingDialog(Activity activity, long channelId, int reason,
+ HalfSizedDialogFragment.OnActionClickListener listener) {
Bundle args = new Bundle();
- args.putLong(DvrHalfSizedDialogFragment.KEY_CHANNEL_ID, channel.getId());
- showDialogFragment(activity, new DvrStopRecordingDialogFragment(), args);
+ args.putLong(DvrHalfSizedDialogFragment.KEY_CHANNEL_ID, channelId);
+ args.putInt(DvrStopRecordingFragment.KEY_REASON, reason);
+ DvrHalfSizedDialogFragment fragment = new DvrStopRecordingDialogFragment();
+ fragment.setOnActionClickListener(listener);
+ showDialogFragment(activity, fragment, args);
}
/**
@@ -244,7 +283,8 @@ public class DvrUiHelper {
recordings) {
ScheduledRecording earlistScheduledRecording = null;
if (!recordings.isEmpty()) {
- Collections.sort(recordings, ScheduledRecording.START_TIME_THEN_PRIORITY_COMPARATOR);
+ Collections.sort(recordings,
+ ScheduledRecording.START_TIME_THEN_PRIORITY_THEN_ID_COMPARATOR);
earlistScheduledRecording = recordings.get(0);
}
return earlistScheduledRecording;
@@ -300,32 +340,72 @@ public class DvrUiHelper {
/**
* Shows the series settings activity.
+ *
+ * @param channelIds Channel ID list which has programs belonging to the series.
*/
- public static void startSeriesSettingsActivity(Context context, long seriesRecordingId) {
+ public static void startSeriesSettingsActivity(Context context, long seriesRecordingId,
+ @Nullable long[] channelIds, boolean removeEmptySeriesSchedule,
+ boolean isWindowTranslucent, boolean showViewScheduleOptionInDialog) {
Intent intent = new Intent(context, DvrSeriesSettingsActivity.class);
intent.putExtra(DvrSeriesSettingsActivity.SERIES_RECORDING_ID, seriesRecordingId);
+ 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);
context.startActivity(intent);
}
/**
- * Shows the details activity for the schedule.
+ * Shows "series recording scheduled" dialog activity.
*/
- public static void startDetailsActivity(Activity activity, ScheduledRecording schedule,
+ public static void StartSeriesScheduledDialogActivity(Context context,
+ SeriesRecording seriesRecording, boolean showViewScheduleOptionInDialog) {
+ if (seriesRecording == null) {
+ return;
+ }
+ Intent intent = new Intent(context, DvrSeriesScheduledDialogActivity.class);
+ intent.putExtra(DvrSeriesScheduledDialogActivity.SERIES_RECORDING_ID,
+ seriesRecording.getId());
+ intent.putExtra(DvrSeriesScheduledDialogActivity.SHOW_VIEW_SCHEDULE_OPTION,
+ showViewScheduleOptionInDialog);
+ context.startActivity(intent);
+ }
+
+ /**
+ * Shows the details activity for the DVR items. The type of DVR items may be
+ * {@link ScheduledRecording}, {@link RecordedProgram}, or {@link SeriesRecording}.
+ */
+ public static void startDetailsActivity(Activity activity, Object dvrItem,
@Nullable ImageView imageView, boolean hideViewSchedule) {
- if (schedule == null) {
+ if (dvrItem == null) {
return;
}
+ Intent intent = new Intent(activity, DvrDetailsActivity.class);
+ long recordingId;
int viewType;
- if (schedule.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED) {
- viewType = DvrDetailsActivity.SCHEDULED_RECORDING_VIEW;
- } else if (schedule.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- viewType = DvrDetailsActivity.CURRENT_RECORDING_VIEW;
+ if (dvrItem instanceof ScheduledRecording) {
+ ScheduledRecording schedule = (ScheduledRecording) dvrItem;
+ recordingId = schedule.getId();
+ if (schedule.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED) {
+ viewType = DvrDetailsActivity.SCHEDULED_RECORDING_VIEW;
+ } else if (schedule.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
+ viewType = DvrDetailsActivity.CURRENT_RECORDING_VIEW;
+ } else {
+ return;
+ }
+ } else if (dvrItem instanceof RecordedProgram) {
+ recordingId = ((RecordedProgram) dvrItem).getId();
+ viewType = DvrDetailsActivity.RECORDED_PROGRAM_VIEW;
+ } else if (dvrItem instanceof SeriesRecording) {
+ recordingId = ((SeriesRecording) dvrItem).getId();
+ viewType = DvrDetailsActivity.SERIES_RECORDING_VIEW;
} else {
return;
}
- Intent intent = new Intent(activity, DvrDetailsActivity.class);
+ intent.putExtra(DvrDetailsActivity.RECORDING_ID, recordingId);
intent.putExtra(DvrDetailsActivity.DETAILS_VIEW_TYPE, viewType);
- intent.putExtra(DvrDetailsActivity.RECORDING_ID, schedule.getId());
intent.putExtra(DvrDetailsActivity.HIDE_VIEW_SCHEDULE, hideViewSchedule);
Bundle bundle = null;
if (imageView != null) {
@@ -336,30 +416,18 @@ public class DvrUiHelper {
}
/**
- * Shows the details activity for the recorded program.
- */
- public static void startDetailsActivity(Activity activity, RecordedProgram recordedProgram,
- @Nullable ImageView imageView) {
- Intent intent = new Intent(activity, DvrDetailsActivity.class);
- intent.putExtra(DvrDetailsActivity.RECORDING_ID, recordedProgram.getId());
- intent.putExtra(DvrDetailsActivity.DETAILS_VIEW_TYPE,
- DvrDetailsActivity.RECORDED_PROGRAM_VIEW);
- Bundle bundle = null;
- if (imageView != null) {
- bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, imageView,
- DvrDetailsActivity.SHARED_ELEMENT_NAME).toBundle();
- }
- activity.startActivity(intent, bundle);
- }
-
- /**
* Shows the cancel all dialog for series schedules list.
*/
- public static void showCancelAllSeriesRecordingDialog(DvrSchedulesActivity activity) {
- DvrCancelAllSeriesRecordingDialogFragment dvrCancelAllSeriesRecordingDialogFragment =
- new DvrCancelAllSeriesRecordingDialogFragment();
- dvrCancelAllSeriesRecordingDialogFragment.show(activity.getFragmentManager(),
- DvrCancelAllSeriesRecordingDialogFragment.DIALOG_TAG);
+ public static void showCancelAllSeriesRecordingDialog(DvrSchedulesActivity activity,
+ SeriesRecording seriesRecording) {
+ DvrStopSeriesRecordingDialogFragment dvrStopSeriesRecordingDialogFragment =
+ new DvrStopSeriesRecordingDialogFragment();
+ Bundle arguments = new Bundle();
+ arguments.putParcelable(DvrStopSeriesRecordingFragment.KEY_SERIES_RECORDING,
+ seriesRecording);
+ dvrStopSeriesRecordingDialogFragment.setArguments(arguments);
+ dvrStopSeriesRecordingDialogFragment.show(activity.getFragmentManager(),
+ DvrStopSeriesRecordingDialogFragment.DIALOG_TAG);
}
/**
diff --git a/src/com/android/tv/dvr/DvrWatchedPositionManager.java b/src/com/android/tv/dvr/DvrWatchedPositionManager.java
index cb723f83..4eada742 100644
--- a/src/com/android/tv/dvr/DvrWatchedPositionManager.java
+++ b/src/com/android/tv/dvr/DvrWatchedPositionManager.java
@@ -19,9 +19,12 @@ package com.android.tv.dvr;
import android.content.Context;
import android.content.SharedPreferences;
import android.media.tv.TvInputManager;
+import android.support.annotation.IntDef;
import com.android.tv.common.SharedPreferencesUtils;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -37,13 +40,33 @@ public class DvrWatchedPositionManager {
private final boolean DEBUG = false;
private SharedPreferences mWatchedPositions;
- private final Context mContext;
private final Map<Long, Set> mListeners = new HashMap<>();
+ /**
+ * The minimum percentage of recorded program being watched that will be considered as being
+ * completely watched.
+ */
+ public static final float DVR_WATCHED_THRESHOLD_RATE = 0.98f;
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({DVR_WATCHED_STATUS_NEW, DVR_WATCHED_STATUS_WATCHING, DVR_WATCHED_STATUS_WATCHED})
+ public @interface DvrWatchedStatus {}
+ /**
+ * The status indicates the recorded program has not been watched at all.
+ */
+ public static final int DVR_WATCHED_STATUS_NEW = 0;
+ /**
+ * The status indicates the recorded program is being watched.
+ */
+ public static final int DVR_WATCHED_STATUS_WATCHING = 1;
+ /**
+ * The status indicates the recorded program was completely watched.
+ */
+ public static final int DVR_WATCHED_STATUS_WATCHED = 2;
+
public DvrWatchedPositionManager(Context context) {
- mContext = context.getApplicationContext();
- mWatchedPositions = mContext.getSharedPreferences(SharedPreferencesUtils
- .SHARED_PREF_DVR_WATCHED_POSITION, Context.MODE_PRIVATE);
+ mWatchedPositions = context.getSharedPreferences(
+ SharedPreferencesUtils.SHARED_PREF_DVR_WATCHED_POSITION, Context.MODE_PRIVATE);
}
/**
@@ -62,6 +85,18 @@ public class DvrWatchedPositionManager {
TvInputManager.TIME_SHIFT_INVALID_TIME);
}
+ @DvrWatchedStatus public int getWatchedStatus(RecordedProgram recordedProgram) {
+ long watchedPosition = getWatchedPosition(recordedProgram.getId());
+ if (watchedPosition == TvInputManager.TIME_SHIFT_INVALID_TIME) {
+ return DVR_WATCHED_STATUS_NEW;
+ } else if (watchedPosition > recordedProgram
+ .getDurationMillis() * DVR_WATCHED_THRESHOLD_RATE) {
+ return DVR_WATCHED_STATUS_WATCHED;
+ } else {
+ return DVR_WATCHED_STATUS_WATCHING;
+ }
+ }
+
/**
* Adds {@link WatchedPositionChangedListener}.
*/
diff --git a/src/com/android/tv/dvr/EpisodicProgramLoadTask.java b/src/com/android/tv/dvr/EpisodicProgramLoadTask.java
new file mode 100644
index 00000000..15ca2700
--- /dev/null
+++ b/src/com/android/tv/dvr/EpisodicProgramLoadTask.java
@@ -0,0 +1,382 @@
+/*
+ * 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.annotation.TargetApi;
+import android.content.Context;
+import android.database.Cursor;
+import android.media.tv.TvContract;
+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.util.AsyncDbTask.AsyncProgramQueryTask;
+import com.android.tv.util.AsyncDbTask.CursorFilter;
+import com.android.tv.util.PermissionUtils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * A wrapper of AsyncProgramQueryTask to load the episodic programs for the series recordings.
+ */
+@TargetApi(Build.VERSION_CODES.N)
+abstract public class EpisodicProgramLoadTask {
+ private static final String TAG = "EpisodicProgramLoadTask";
+
+ private static final int PROGRAM_ID_INDEX = Program.getColumnIndex(Programs._ID);
+ private static final int START_TIME_INDEX =
+ Program.getColumnIndex(Programs.COLUMN_START_TIME_UTC_MILLIS);
+ private static final int RECORDING_PROHIBITED_INDEX =
+ Program.getColumnIndex(Programs.COLUMN_RECORDING_PROHIBITED);
+
+ private static final String PARAM_START_TIME = "start_time";
+ private static final String PARAM_END_TIME = "end_time";
+
+ private static final String PROGRAM_PREDICATE =
+ Programs.COLUMN_START_TIME_UTC_MILLIS + ">? AND "
+ + Programs.COLUMN_RECORDING_PROHIBITED + "=0";
+ private static final String PROGRAM_PREDICATE_WITH_CURRENT_PROGRAM =
+ Programs.COLUMN_END_TIME_UTC_MILLIS + ">? AND "
+ + Programs.COLUMN_RECORDING_PROHIBITED + "=0";
+ private static final String CHANNEL_ID_PREDICATE = Programs.COLUMN_CHANNEL_ID + "=?";
+ private static final String PROGRAM_TITLE_PREDICATE = Programs.COLUMN_TITLE + "=?";
+
+ private final Context mContext;
+ private final DvrDataManager mDataManager;
+ private boolean mQueryAllChannels;
+ private boolean mLoadCurrentProgram;
+ private boolean mLoadScheduledEpisode;
+ private boolean mLoadDisallowedProgram;
+ // If true, match programs with OPTION_CHANNEL_ALL.
+ private boolean mIgnoreChannelOption;
+ private final ArrayList<SeriesRecording> mSeriesRecordings = new ArrayList<>();
+ private AsyncProgramQueryTask mProgramQueryTask;
+
+ /**
+ *
+ * Constructor used to load programs for one series recording with the given channel option.
+ */
+ public EpisodicProgramLoadTask(Context context, SeriesRecording seriesRecording) {
+ this(context, Collections.singletonList(seriesRecording));
+ }
+
+ /**
+ * Constructor used to load programs for multiple series recordings. The channel option is
+ * {@link SeriesRecording#OPTION_CHANNEL_ALL}.
+ */
+ public EpisodicProgramLoadTask(Context context, Collection<SeriesRecording> seriesRecordings) {
+ mContext = context.getApplicationContext();
+ mDataManager = TvApplication.getSingletons(context).getDvrDataManager();
+ mSeriesRecordings.addAll(seriesRecordings);
+ }
+
+ /**
+ * Returns the series recordings.
+ */
+ public List<SeriesRecording> getSeriesRecordings() {
+ return mSeriesRecordings;
+ }
+
+ /**
+ * Returns the program query task. It is {@code null} until it is executed.
+ */
+ @Nullable
+ public AsyncProgramQueryTask getTask() {
+ return mProgramQueryTask;
+ }
+
+ /**
+ * Enables loading current programs. The default value is {@code false}.
+ */
+ public EpisodicProgramLoadTask setLoadCurrentProgram(boolean loadCurrentProgram) {
+ SoftPreconditions.checkState(mProgramQueryTask == null, TAG,
+ "Can't change setting after execution.");
+ mLoadCurrentProgram = loadCurrentProgram;
+ return this;
+ }
+
+ /**
+ * Enables already schedules episodes. The default value is {@code false}.
+ */
+ public EpisodicProgramLoadTask setLoadScheduledEpisode(boolean loadScheduledEpisode) {
+ SoftPreconditions.checkState(mProgramQueryTask == null, TAG,
+ "Can't change setting after execution.");
+ mLoadScheduledEpisode = loadScheduledEpisode;
+ return this;
+ }
+
+ /**
+ * Enables loading disallowed programs whose schedules were removed manually by the user.
+ * The default value is {@code false}.
+ */
+ public EpisodicProgramLoadTask setLoadDisallowedProgram(boolean loadDisallowedProgram) {
+ SoftPreconditions.checkState(mProgramQueryTask == null, TAG,
+ "Can't change setting after execution.");
+ mLoadDisallowedProgram = loadDisallowedProgram;
+ return this;
+ }
+
+ /**
+ * Gives the option whether to ignore the channel option when matching programs.
+ * If {@code ignoreChannelOption} is {@code true}, the program will be matched with
+ * {@link SeriesRecording#OPTION_CHANNEL_ALL} option.
+ */
+ public EpisodicProgramLoadTask setIgnoreChannelOption(boolean ignoreChannelOption) {
+ SoftPreconditions.checkState(mProgramQueryTask == null, TAG,
+ "Can't change setting after execution.");
+ mIgnoreChannelOption = ignoreChannelOption;
+ return this;
+ }
+
+ /**
+ * Executes the task.
+ *
+ * @see com.android.tv.util.AsyncDbTask#executeOnDbThread
+ */
+ public void execute() {
+ if (SoftPreconditions.checkState(mProgramQueryTask == null, TAG,
+ "Can't execute task: the task is already running.")) {
+ mQueryAllChannels = mSeriesRecordings.size() > 1
+ || mSeriesRecordings.get(0).getChannelOption()
+ == SeriesRecording.OPTION_CHANNEL_ALL
+ || mIgnoreChannelOption;
+ mProgramQueryTask = createTask();
+ mProgramQueryTask.executeOnDbThread();
+ }
+ }
+
+ /**
+ * Cancels the task.
+ *
+ * @see android.os.AsyncTask#cancel
+ */
+ public void cancel(boolean mayInterruptIfRunning) {
+ if (mProgramQueryTask != null) {
+ mProgramQueryTask.cancel(mayInterruptIfRunning);
+ }
+ }
+
+ /**
+ * Runs on the UI thread after the program loading finishes successfully.
+ */
+ protected void onPostExecute(List<Program> programs) {
+ }
+
+ /**
+ * Runs on the UI thread after the program loading was canceled.
+ */
+ protected void onCancelled(List<Program> programs) {
+ }
+
+ private AsyncProgramQueryTask createTask() {
+ SqlParams sqlParams = createSqlParams();
+ return new AsyncProgramQueryTask(mContext.getContentResolver(), sqlParams.uri,
+ sqlParams.selection, sqlParams.selectionArgs, null, sqlParams.filter) {
+ @Override
+ protected void onPostExecute(List<Program> programs) {
+ EpisodicProgramLoadTask.this.onPostExecute(programs);
+ }
+
+ @Override
+ protected void onCancelled(List<Program> programs) {
+ EpisodicProgramLoadTask.this.onCancelled(programs);
+ }
+ };
+ }
+
+ private SqlParams createSqlParams() {
+ SqlParams sqlParams = new SqlParams();
+ if (PermissionUtils.hasAccessAllEpg(mContext)) {
+ sqlParams.uri = Programs.CONTENT_URI;
+ // Base
+ StringBuilder selection = new StringBuilder(mLoadCurrentProgram
+ ? PROGRAM_PREDICATE_WITH_CURRENT_PROGRAM : PROGRAM_PREDICATE);
+ List<String> args = new ArrayList<>();
+ args.add(Long.toString(System.currentTimeMillis()));
+ // Channel option
+ if (!mQueryAllChannels) {
+ selection.append(" AND ").append(CHANNEL_ID_PREDICATE);
+ args.add(Long.toString(mSeriesRecordings.get(0).getChannelId()));
+ }
+ // Title
+ if (mSeriesRecordings.size() == 1) {
+ selection.append(" AND ").append(PROGRAM_TITLE_PREDICATE);
+ args.add(mSeriesRecordings.get(0).getTitle());
+ }
+ sqlParams.selection = selection.toString();
+ sqlParams.selectionArgs = args.toArray(new String[args.size()]);
+ sqlParams.filter = new SeriesRecordingCursorFilter(mSeriesRecordings);
+ } else {
+ // The query includes the current program. Will be filtered if needed.
+ if (mQueryAllChannels) {
+ sqlParams.uri = Programs.CONTENT_URI.buildUpon()
+ .appendQueryParameter(PARAM_START_TIME,
+ String.valueOf(System.currentTimeMillis()))
+ .appendQueryParameter(PARAM_END_TIME, String.valueOf(Long.MAX_VALUE))
+ .build();
+ } else {
+ sqlParams.uri = TvContract.buildProgramsUriForChannel(
+ mSeriesRecordings.get(0).getChannelId(),
+ System.currentTimeMillis(), Long.MAX_VALUE);
+ }
+ sqlParams.selection = null;
+ sqlParams.selectionArgs = null;
+ sqlParams.filter = new SeriesRecordingCursorFilterForNonSystem(mSeriesRecordings);
+ }
+ 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<ScheduledEpisode> mScheduledEpisodes = new HashSet<>();
+
+ SeriesRecordingCursorFilter(List<SeriesRecording> seriesRecordings) {
+ if (!mLoadDisallowedProgram) {
+ mDisallowedProgramIds.addAll(mDataManager.getDisallowedProgramIds());
+ }
+ if (!mLoadScheduledEpisode) {
+ Set<Long> seriesRecordingIds = new HashSet<>();
+ for (SeriesRecording r : seriesRecordings) {
+ seriesRecordingIds.add(r.getId());
+ }
+ for (ScheduledRecording r : mDataManager.getAllScheduledRecordings()) {
+ if (seriesRecordingIds.contains(r.getSeriesRecordingId())
+ && r.getState() != ScheduledRecording.STATE_RECORDING_FAILED
+ && r.getState() != ScheduledRecording.STATE_RECORDING_CLIPPED) {
+ mScheduledEpisodes.add(new ScheduledEpisode(r));
+ }
+ }
+ }
+ }
+
+ @Override
+ @WorkerThread
+ public boolean filter(Cursor c) {
+ if (!mLoadDisallowedProgram
+ && mDisallowedProgramIds.contains(c.getLong(PROGRAM_ID_INDEX))) {
+ return false;
+ }
+ Program program = Program.fromCursor(c);
+ for (SeriesRecording seriesRecording : mSeriesRecordings) {
+ boolean programMatches;
+ if (mIgnoreChannelOption) {
+ programMatches = seriesRecording.matchProgram(program,
+ SeriesRecording.OPTION_CHANNEL_ALL);
+ } else {
+ programMatches = seriesRecording.matchProgram(program);
+ }
+ if (programMatches) {
+ return mLoadScheduledEpisode
+ || !isEpisodeScheduled(mScheduledEpisodes, new ScheduledEpisode(
+ seriesRecording.getId(), program.getSeasonNumber(),
+ program.getEpisodeNumber()));
+ }
+ }
+ return false;
+ }
+ }
+
+ private class SeriesRecordingCursorFilterForNonSystem extends SeriesRecordingCursorFilter {
+ SeriesRecordingCursorFilterForNonSystem(List<SeriesRecording> seriesRecordings) {
+ super(seriesRecordings);
+ }
+
+ @Override
+ public boolean filter(Cursor c) {
+ return (mLoadCurrentProgram || c.getLong(START_TIME_INDEX) > System.currentTimeMillis())
+ && c.getInt(RECORDING_PROHIBITED_INDEX) != 0 && super.filter(c);
+ }
+ }
+
+ private static class SqlParams {
+ public Uri uri;
+ public String selection;
+ 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/InputTaskScheduler.java b/src/com/android/tv/dvr/InputTaskScheduler.java
index 23eacb73..53c89ebc 100644
--- a/src/com/android/tv/dvr/InputTaskScheduler.java
+++ b/src/com/android/tv/dvr/InputTaskScheduler.java
@@ -21,7 +21,6 @@ import android.media.tv.TvInputInfo;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.support.annotation.MainThread;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.util.ArrayMap;
@@ -32,9 +31,11 @@ import com.android.tv.InputSessionManager;
import com.android.tv.data.Channel;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.util.Clock;
+import com.android.tv.util.CompositeComparator;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -42,7 +43,6 @@ import java.util.Map;
/**
* The scheduler for a TV input.
*/
-@MainThread
public class InputTaskScheduler {
private static final String TAG = "InputTaskScheduler";
private static final boolean DEBUG = false;
@@ -51,6 +51,24 @@ public class InputTaskScheduler {
private static final int MSG_REMOVE_SCHEDULED_RECORDING = 2;
private static final int MSG_UPDATE_SCHEDULED_RECORDING = 3;
private static final int MSG_BUILD_SCHEDULE = 4;
+ private static final int MSG_STOP_SCHEDULE = 5;
+
+ private static final float MIN_REMAIN_DURATION_PERCENT = 0.05f;
+
+ // The candidate comparator should be the consistent with
+ // DvrScheduleManager#CANDIDATE_COMPARATOR.
+ private static final Comparator<RecordingTask> CANDIDATE_COMPARATOR =
+ new CompositeComparator<>(
+ RecordingTask.PRIORITY_COMPARATOR,
+ RecordingTask.END_TIME_COMPARATOR,
+ RecordingTask.ID_COMPARATOR);
+
+ /**
+ * Returns the comparator which the schedules are sorted with when executed.
+ */
+ public static Comparator<ScheduledRecording> getRecordingOrderComparator() {
+ return ScheduledRecording.START_TIME_THEN_PRIORITY_THEN_ID_COMPARATOR;
+ }
/**
* Wraps a {@link RecordingTask} removing it from {@link #mPendingRecordings} when it is done.
@@ -217,6 +235,23 @@ public class InputTaskScheduler {
}
}
+ /**
+ * Stops the input task scheduler.
+ */
+ public void stop() {
+ mHandler.removeCallbacksAndMessages(null);
+ mHandler.sendEmptyMessage(MSG_STOP_SCHEDULE);
+ }
+
+ private void handleStopSchedule() {
+ mWaitingSchedules.clear();
+ int size = mPendingRecordings.size();
+ for (int i = 0; i < size; ++i) {
+ RecordingTask task = mPendingRecordings.get(mPendingRecordings.keyAt(i)).mTask;
+ task.cleanUp();
+ }
+ }
+
@VisibleForTesting
void handleBuildSchedule() {
if (mWaitingSchedules.isEmpty()) {
@@ -227,7 +262,8 @@ public class InputTaskScheduler {
for (Iterator<ScheduledRecording> iter = mWaitingSchedules.values().iterator();
iter.hasNext(); ) {
ScheduledRecording schedule = iter.next();
- if (schedule.getEndTimeMs() <= currentTimeMs) {
+ if (schedule.getEndTimeMs() - currentTimeMs
+ <= MIN_REMAIN_DURATION_PERCENT * schedule.getDuration()) {
fail(schedule);
iter.remove();
}
@@ -244,7 +280,13 @@ public class InputTaskScheduler {
schedulesToStart.add(schedule);
}
}
- Collections.sort(schedulesToStart, ScheduledRecording.START_TIME_THEN_PRIORITY_COMPARATOR);
+ // The schedules will be executed with the following order.
+ // 1. The schedule which starts early. It can be replaced later when the schedule with the
+ // higher priority needs to start.
+ // 2. The schedule with the higher priority. It can be replaced later when the schedule with
+ // the higher priority needs to start.
+ // 3. The schedule which was created recently.
+ Collections.sort(schedulesToStart, getRecordingOrderComparator());
int tunerCount;
synchronized (mInputLock) {
tunerCount = mInput.canRecord() ? mInput.getTunerCount() : 0;
@@ -266,11 +308,6 @@ public class InputTaskScheduler {
task.stop();
// Just return. The schedules will be rebuilt after the task is stopped.
return;
- } else {
- // TODO: Do not fail immediately. Start the recording later when available.
- // There are no replaceable task. Remove it.
- fail(schedule);
- mWaitingSchedules.remove(schedule.getId());
}
}
}
@@ -280,12 +317,20 @@ public class InputTaskScheduler {
// Set next scheduling.
long earliest = Long.MAX_VALUE;
for (ScheduledRecording schedule : mWaitingSchedules.values()) {
- if (earliest > schedule.getStartTimeMs()) {
- earliest = schedule.getStartTimeMs();
+ // The conflicting schedules will be removed if they end before conflicting resolved.
+ if (schedulesToStart.contains(schedule)) {
+ if (earliest > schedule.getEndTimeMs()) {
+ earliest = schedule.getEndTimeMs();
+ }
+ } else {
+ if (earliest > schedule.getStartTimeMs()
+ - RecordingTask.RECORDING_EARLY_START_OFFSET_MS) {
+ earliest = schedule.getStartTimeMs()
+ - RecordingTask.RECORDING_EARLY_START_OFFSET_MS;
+ }
}
}
- mHandler.sendEmptyMessageDelayed(MSG_BUILD_SCHEDULE, earliest
- - RecordingTask.RECORDING_EARLY_START_OFFSET_MS - currentTimeMs);
+ mHandler.sendEmptyMessageDelayed(MSG_BUILD_SCHEDULE, earliest - currentTimeMs);
}
private RecordingTask createRecordingTask(ScheduledRecording schedule) {
@@ -309,13 +354,18 @@ public class InputTaskScheduler {
}
private RecordingTask getReplacableTask(ScheduledRecording schedule) {
+ // Returns the recording with the following priority.
+ // 1. The recording with the lowest priority is returned.
+ // 2. If the priorities are the same, the recording which finishes early is returned.
+ // 3. If 1) and 2) are the same, the early created schedule is returned.
int size = mPendingRecordings.size();
RecordingTask candidate = null;
for (int i = 0; i < size; ++i) {
RecordingTask task = mPendingRecordings.get(mPendingRecordings.keyAt(i)).mTask;
- if (schedule.getPriority() > task.getPriority()
- && (candidate == null || candidate.getPriority() > task.getPriority())) {
- candidate = task;
+ if (schedule.getPriority() > task.getPriority()) {
+ if (candidate == null || CANDIDATE_COMPARATOR.compare(candidate, task) > 0) {
+ candidate = task;
+ }
}
}
return candidate;
@@ -372,6 +422,9 @@ public class InputTaskScheduler {
case MSG_BUILD_SCHEDULE:
handleBuildSchedule();
break;
+ case MSG_STOP_SCHEDULE:
+ handleStopSchedule();
+ break;
}
}
}
diff --git a/src/com/android/tv/dvr/RecordedProgram.java b/src/com/android/tv/dvr/RecordedProgram.java
index 085402a4..dd744f80 100644
--- a/src/com/android/tv/dvr/RecordedProgram.java
+++ b/src/com/android/tv/dvr/RecordedProgram.java
@@ -18,21 +18,25 @@ package com.android.tv.dvr;
import static android.media.tv.TvContract.RecordedPrograms;
+import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.media.tv.TvContract;
import android.net.Uri;
+import android.os.Build;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.android.tv.common.R;
import com.android.tv.data.BaseProgram;
+import com.android.tv.data.GenreItems;
import com.android.tv.data.InternalDataUtils;
import com.android.tv.util.Utils;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Comparator;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@@ -40,6 +44,7 @@ import java.util.concurrent.TimeUnit;
/**
* Immutable instance of {@link android.media.tv.TvContract.RecordedPrograms}.
*/
+@TargetApi(Build.VERSION_CODES.N)
public class RecordedProgram extends BaseProgram {
public static final int ID_NOT_SET = -1;
@@ -553,6 +558,21 @@ public class RecordedProgram extends BaseProgram {
return mCanonicalGenres;
}
+ /**
+ * Returns array of canonical genre ID's for this recorded program.
+ */
+ @Override
+ public int[] getCanonicalGenreIds() {
+ if (mCanonicalGenres == null) {
+ return null;
+ }
+ int[] genreIds = new int[mCanonicalGenres.length];
+ for (int i = 0; i < mCanonicalGenres.length; i++) {
+ genreIds[i] = GenreItems.getId(mCanonicalGenres[i]);
+ }
+ return genreIds;
+ }
+
@Override
public long getChannelId() {
return mChannelId;
@@ -622,6 +642,21 @@ public class RecordedProgram extends BaseProgram {
}
}
+ @Nullable
+ public String getEpisodeDisplayNumber(Context context) {
+ if (!TextUtils.isEmpty(mEpisodeNumber)) {
+ if (TextUtils.equals(mSeasonNumber, "0")) {
+ // Do not show "S0: ".
+ return String.format(context.getResources().getString(
+ R.string.display_episode_number_format_no_season_number), mEpisodeNumber);
+ } else {
+ return String.format(context.getResources().getString(
+ R.string.display_episode_number_format), mSeasonNumber, mEpisodeNumber);
+ }
+ }
+ return null;
+ }
+
public long getExpireTimeUtcMillis() {
return mExpireTimeUtcMillis;
}
@@ -678,6 +713,7 @@ public class RecordedProgram extends BaseProgram {
return mSearchable;
}
+ @Override
public String getSeriesId() {
return mSeriesId;
}
@@ -822,4 +858,11 @@ public class RecordedProgram extends BaseProgram {
private static String safeEncode(@Nullable String[] genres) {
return genres == null ? null : TvContract.Programs.Genres.encode(genres);
}
+
+ /**
+ * Returns an array containing all of the elements in the list.
+ */
+ public static RecordedProgram[] toArray(Collection<RecordedProgram> recordedPrograms) {
+ return recordedPrograms.toArray(new RecordedProgram[recordedPrograms.size()]);
+ }
}
diff --git a/src/com/android/tv/dvr/RecordingTask.java b/src/com/android/tv/dvr/RecordingTask.java
index 2373f15c..c3d236b0 100644
--- a/src/com/android/tv/dvr/RecordingTask.java
+++ b/src/com/android/tv/dvr/RecordingTask.java
@@ -41,6 +41,7 @@ import com.android.tv.dvr.InputTaskScheduler.HandlerWrapper;
import com.android.tv.util.Clock;
import com.android.tv.util.Utils;
+import java.util.Comparator;
import java.util.concurrent.TimeUnit;
/**
@@ -57,6 +58,39 @@ public class RecordingTask extends RecordingCallback implements Handler.Callback
private static final String TAG = "RecordingTask";
private static final boolean DEBUG = false;
+ /**
+ * Compares the end time in ascending order.
+ */
+ public static final Comparator<RecordingTask> END_TIME_COMPARATOR
+ = new Comparator<RecordingTask>() {
+ @Override
+ public int compare(RecordingTask lhs, RecordingTask rhs) {
+ return Long.compare(lhs.getEndTimeMs(), rhs.getEndTimeMs());
+ }
+ };
+
+ /**
+ * Compares ID in ascending order.
+ */
+ public static final Comparator<RecordingTask> ID_COMPARATOR
+ = new Comparator<RecordingTask>() {
+ @Override
+ public int compare(RecordingTask lhs, RecordingTask rhs) {
+ return Long.compare(lhs.getScheduleId(), rhs.getScheduleId());
+ }
+ };
+
+ /**
+ * Compares the priority in ascending order.
+ */
+ public static final Comparator<RecordingTask> PRIORITY_COMPARATOR
+ = new Comparator<RecordingTask>() {
+ @Override
+ public int compare(RecordingTask lhs, RecordingTask rhs) {
+ return Long.compare(lhs.getPriority(), rhs.getPriority());
+ }
+ };
+
@VisibleForTesting
static final int MSG_INITIALIZE = 1;
@VisibleForTesting
@@ -169,6 +203,14 @@ public class RecordingTask extends RecordingCallback implements Handler.Callback
}
@Override
+ public void onConnectionFailed(String inputId) {
+ if (DEBUG) Log.d(TAG, "onConnectionFailed(" + inputId + ")");
+ if (mRecordingSession != null) {
+ failAndQuit();
+ }
+ }
+
+ @Override
public void onTuned(Uri channelUri) {
if (DEBUG) Log.d(TAG, "onTuned");
if (mRecordingSession == null) {
@@ -252,7 +294,8 @@ public class RecordingTask extends RecordingCallback implements Handler.Callback
String inputId = mChannel.getInputId();
mRecordingSession = mSessionManager.createRecordingSession(inputId,
- "recordingTask-" + mScheduledRecording.getId(), this, mHandler);
+ "recordingTask-" + mScheduledRecording.getId(), this,
+ mHandler, mScheduledRecording.getEndTimeMs());
mState = State.SESSION_ACQUIRED;
mDvrManager.addListener(this, mHandler);
mRecordingSession.tune(inputId, mChannel.getUri());
@@ -302,11 +345,15 @@ public class RecordingTask extends RecordingCallback implements Handler.Callback
private void handleUpdateSchedule(ScheduledRecording schedule) {
mScheduledRecording = schedule;
// Check end time only. The start time is checked in InputTaskScheduler.
- if (schedule.getEndTimeMs() != mScheduledRecording.getEndTimeMs()
- && mState == State.RECORDING_STARTED) {
- mHandler.removeMessages(MSG_STOP_RECORDING);
- if (!sendEmptyMessageAtAbsoluteTime(MSG_STOP_RECORDING, schedule.getEndTimeMs())) {
- failAndQuit();
+ if (schedule.getEndTimeMs() != mScheduledRecording.getEndTimeMs()) {
+ if (mRecordingSession != null) {
+ mRecordingSession.setEndTimeMs(schedule.getEndTimeMs());
+ }
+ if (mState == State.RECORDING_STARTED) {
+ mHandler.removeMessages(MSG_STOP_RECORDING);
+ if (!sendEmptyMessageAtAbsoluteTime(MSG_STOP_RECORDING, schedule.getEndTimeMs())) {
+ failAndQuit();
+ }
}
}
}
@@ -316,6 +363,10 @@ public class RecordingTask extends RecordingCallback implements Handler.Callback
return mState;
}
+ private long getScheduleId() {
+ return mScheduledRecording.getId();
+ }
+
/**
* Returns the priority.
*/
@@ -359,7 +410,7 @@ public class RecordingTask extends RecordingCallback implements Handler.Callback
if (DEBUG) Log.d(TAG, "Updating the state of " + mScheduledRecording + " to " + state);
mScheduledRecording = ScheduledRecording.buildFrom(mScheduledRecording).setState(state)
.build();
- mMainThreadHandler.post(new Runnable() {
+ runOnMainThread(new Runnable() {
@Override
public void run() {
ScheduledRecording schedule = mDataManager.getScheduledRecording(
@@ -429,6 +480,19 @@ public class RecordingTask extends RecordingCallback implements Handler.Callback
removeRecordedProgram();
}
+ /**
+ * Clean up the task.
+ */
+ public void cleanUp() {
+ if (mState == State.RECORDING_STARTED || mState == State.RECORDING_STOP_REQUESTED) {
+ updateRecordingState(ScheduledRecording.STATE_RECORDING_FAILED);
+ }
+ release();
+ if (mHandler != null) {
+ mHandler.removeCallbacksAndMessages(null);
+ }
+ }
+
@Override
public String toString() {
return getClass().getName() + "(" + mScheduledRecording + ")";
diff --git a/src/com/android/tv/dvr/ScheduledRecording.java b/src/com/android/tv/dvr/ScheduledRecording.java
index a9673b40..2bda10ea 100644
--- a/src/com/android/tv/dvr/ScheduledRecording.java
+++ b/src/com/android/tv/dvr/ScheduledRecording.java
@@ -31,6 +31,7 @@ import com.android.tv.common.SoftPreconditions;
import com.android.tv.data.Channel;
import com.android.tv.data.Program;
import com.android.tv.dvr.provider.DvrContract.Schedules;
+import com.android.tv.util.CompositeComparator;
import com.android.tv.util.Utils;
import java.lang.annotation.Retention;
@@ -56,6 +57,9 @@ public final class ScheduledRecording implements Parcelable {
*/
public static final long DEFAULT_PRIORITY = Long.MAX_VALUE >> 1;
+ /**
+ * Compares the start time in ascending order.
+ */
public static final Comparator<ScheduledRecording> START_TIME_COMPARATOR
= new Comparator<ScheduledRecording>() {
@Override
@@ -65,7 +69,7 @@ public final class ScheduledRecording implements Parcelable {
};
/**
- * Compare the end time in ascending order.
+ * Compares the end time in ascending order.
*/
public static final Comparator<ScheduledRecording> END_TIME_COMPARATOR
= new Comparator<ScheduledRecording>() {
@@ -76,34 +80,36 @@ public final class ScheduledRecording implements Parcelable {
};
/**
- * Compare priority in descending order.
+ * Compares ID in ascending order. The schedule with the larger ID was created later.
*/
- public static final Comparator<ScheduledRecording> PRIORITY_COMPARATOR
+ public static final Comparator<ScheduledRecording> ID_COMPARATOR
= new Comparator<ScheduledRecording>() {
@Override
public int compare(ScheduledRecording lhs, ScheduledRecording rhs) {
- int value = Long.compare(rhs.mPriority, lhs.mPriority);
- if (value == 0) {
- // New recording has the higher priority.
- value = Long.compare(rhs.mId, lhs.mId);
- }
- return value;
+ return Long.compare(lhs.mId, rhs.mId);
}
};
- public static final Comparator<ScheduledRecording> START_TIME_THEN_PRIORITY_COMPARATOR
+ /**
+ * Compares the priority in ascending order.
+ */
+ public static final Comparator<ScheduledRecording> PRIORITY_COMPARATOR
= new Comparator<ScheduledRecording>() {
@Override
public int compare(ScheduledRecording lhs, ScheduledRecording rhs) {
- int value = START_TIME_COMPARATOR.compare(lhs, rhs);
- if (value == 0) {
- value = PRIORITY_COMPARATOR.compare(lhs, rhs);
- }
- return value;
+ return Long.compare(lhs.mPriority, rhs.mPriority);
}
};
/**
+ * Compares start time in ascending order and then priority in descending order and then ID in
+ * descending order.
+ */
+ public static final Comparator<ScheduledRecording> START_TIME_THEN_PRIORITY_THEN_ID_COMPARATOR
+ = new CompositeComparator<>(START_TIME_COMPARATOR, PRIORITY_COMPARATOR.reversed(),
+ ID_COMPARATOR.reversed());
+
+ /**
* Builds scheduled recordings from programs.
*/
public static Builder builder(String inputId, Program p) {
@@ -285,6 +291,7 @@ public final class ScheduledRecording implements Parcelable {
.setChannelId(orig.mChannelId)
.setEndTimeMs(orig.mEndTimeMs)
.setSeriesRecordingId(orig.mSeriesRecordingId)
+ .setPriority(orig.mPriority)
.setProgramId(orig.mProgramId)
.setProgramTitle(orig.mProgramTitle)
.setStartTimeMs(orig.mStartTimeMs)
@@ -766,6 +773,13 @@ public final class ScheduledRecording implements Parcelable {
return mStartTimeMs < period.getUpper() && mEndTimeMs > period.getLower();
}
+ /**
+ * Checks if the {@code schedule} overlaps with this schedule.
+ */
+ public boolean isOverLapping(ScheduledRecording schedule) {
+ return mStartTimeMs < schedule.getEndTimeMs() && mEndTimeMs > schedule.getStartTimeMs();
+ }
+
@Override
public String toString() {
return "ScheduledRecording[" + mId
@@ -775,8 +789,8 @@ public final class ScheduledRecording implements Parcelable {
+ ",programId=" + mProgramId
+ ",programTitle=" + mProgramTitle
+ ",type=" + mType
- + ",startTime=" + Utils.toIsoDateTimeString(mStartTimeMs)
- + ",endTime=" + Utils.toIsoDateTimeString(mEndTimeMs)
+ + ",startTime=" + Utils.toIsoDateTimeString(mStartTimeMs) + "(" + mStartTimeMs + ")"
+ + ",endTime=" + Utils.toIsoDateTimeString(mEndTimeMs) + "(" + mEndTimeMs + ")"
+ ",seasonNumber=" + mSeasonNumber
+ ",episodeNumber=" + mEpisodeNumber
+ ",episodeTitle=" + mEpisodeTitle
diff --git a/src/com/android/tv/dvr/Scheduler.java b/src/com/android/tv/dvr/Scheduler.java
index 25904ee4..ce78e1be 100644
--- a/src/com/android/tv/dvr/Scheduler.java
+++ b/src/com/android/tv/dvr/Scheduler.java
@@ -123,6 +123,9 @@ public class Scheduler extends TvInputCallback implements ScheduledRecordingList
* Stops the scheduler.
*/
public void stop() {
+ for (InputTaskScheduler inputTaskScheduler : mInputSchedulerMap.values()) {
+ inputTaskScheduler.stop();
+ }
mInputManager.removeCallback(this);
mDataManager.removeScheduledRecordingListener(this);
}
@@ -173,13 +176,7 @@ public class Scheduler extends TvInputCallback implements ScheduledRecordingList
}
boolean needToUpdateAlarm = false;
for (ScheduledRecording schedule : schedules) {
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mContext, schedule.getChannelId());
- if (input == null) {
- Log.e(TAG, "Can't find input for " + schedule);
- mDataManager.changeState(schedule, ScheduledRecording.STATE_RECORDING_FAILED);
- continue;
- }
- InputTaskScheduler scheduler = mInputSchedulerMap.get(input.getId());
+ InputTaskScheduler scheduler = mInputSchedulerMap.get(schedule.getInputId());
if (scheduler != null) {
scheduler.removeSchedule(schedule);
needToUpdateAlarm = true;
@@ -198,12 +195,7 @@ public class Scheduler extends TvInputCallback implements ScheduledRecordingList
}
// Update the recordings.
for (ScheduledRecording schedule : schedules) {
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mContext, schedule.getChannelId());
- if (input == null) {
- Log.e(TAG, "Can't find input for " + schedule);
- continue;
- }
- InputTaskScheduler scheduler = mInputSchedulerMap.get(input.getId());
+ InputTaskScheduler scheduler = mInputSchedulerMap.get(schedule.getInputId());
if (scheduler != null) {
scheduler.updateSchedule(schedule);
}
@@ -228,7 +220,7 @@ public class Scheduler extends TvInputCallback implements ScheduledRecordingList
}
private void scheduleRecordingSoon(ScheduledRecording schedule) {
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mContext, schedule.getChannelId());
+ TvInputInfo input = Utils.getTvInputInfoForInputId(mContext, schedule.getInputId());
if (input == null) {
Log.e(TAG, "Can't find input for " + schedule);
mDataManager.changeState(schedule, ScheduledRecording.STATE_RECORDING_FAILED);
@@ -260,7 +252,7 @@ public class Scheduler extends TvInputCallback implements ScheduledRecordingList
Intent intent = new Intent(mContext, DvrStartRecordingReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
// This will cancel the previous alarm.
- mAlarmManager.set(AlarmManager.RTC_WAKEUP, wakeAt, alarmIntent);
+ mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, wakeAt, alarmIntent);
} else {
if (DEBUG) Log.d(TAG, "No future recording, alarm not set");
}
diff --git a/src/com/android/tv/dvr/SeriesRecording.java b/src/com/android/tv/dvr/SeriesRecording.java
index fc68eaf7..f0690f5f 100644
--- a/src/com/android/tv/dvr/SeriesRecording.java
+++ b/src/com/android/tv/dvr/SeriesRecording.java
@@ -21,10 +21,10 @@ import android.database.Cursor;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
+import com.android.tv.data.BaseProgram;
import com.android.tv.data.Program;
import com.android.tv.dvr.provider.DvrContract.SeriesRecordings;
import com.android.tv.util.Utils;
@@ -69,8 +69,8 @@ public class SeriesRecording implements Parcelable {
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = true,
- value = {STATE_SERIES_NORMAL, STATE_SERIES_CANCELED})
- private @interface SeriesState {}
+ value = {STATE_SERIES_NORMAL, STATE_SERIES_STOPPED})
+ public @interface SeriesState {}
/**
* The state indicates that the series recording is a normal one.
@@ -78,9 +78,9 @@ public class SeriesRecording implements Parcelable {
public static final int STATE_SERIES_NORMAL = 0;
/**
- * The state indicates that the series recording is canceled.
+ * The state indicates that the series recording is stopped.
*/
- public static final int STATE_SERIES_CANCELED = 1;
+ public static final int STATE_SERIES_STOPPED = 1;
/**
* Compare priority in descending order.
@@ -110,9 +110,9 @@ public class SeriesRecording implements Parcelable {
};
/**
- * Creates a new Builder with the values set from the series information of {@link Program}.
+ * Creates a new Builder with the values set from the series information of {@link BaseProgram}.
*/
- public static Builder builder(String inputId, Program p) {
+ public static Builder builder(String inputId, BaseProgram p) {
return new Builder()
.setInputId(inputId)
.setSeriesId(p.getSeriesId())
@@ -190,7 +190,7 @@ public class SeriesRecording implements Parcelable {
.setCanonicalGenreIds(c.getString(++index))
.setPosterUri(c.getString(++index))
.setPhotoUri(c.getString(++index))
- .setState(seriesRecordingCanceled(c.getString(++index)))
+ .setState(seriesRecordingState(c.getString(++index)))
.build();
}
@@ -220,7 +220,7 @@ public class SeriesRecording implements Parcelable {
Utils.getCanonicalGenre(r.getCanonicalGenreIds()));
values.put(SeriesRecordings.COLUMN_POSTER_URI, r.getPosterUri());
values.put(SeriesRecordings.COLUMN_PHOTO_URI, r.getPhotoUri());
- values.put(SeriesRecordings.COLUMN_STATE, seriesRecordingCanceled(r.getState()));
+ values.put(SeriesRecordings.COLUMN_STATE, seriesRecordingState(r.getState()));
return values;
}
@@ -244,22 +244,22 @@ public class SeriesRecording implements Parcelable {
return OPTION_CHANNEL_ONE;
}
- private static String seriesRecordingCanceled(@SeriesState int state) {
+ private static String seriesRecordingState(@SeriesState int state) {
switch (state) {
case STATE_SERIES_NORMAL:
return SeriesRecordings.STATE_SERIES_NORMAL;
- case STATE_SERIES_CANCELED:
- return SeriesRecordings.STATE_SERIES_CANCELED;
+ case STATE_SERIES_STOPPED:
+ return SeriesRecordings.STATE_SERIES_STOPPED;
}
return SeriesRecordings.STATE_SERIES_NORMAL;
}
- @SeriesState private static int seriesRecordingCanceled(String state) {
+ @SeriesState private static int seriesRecordingState(String state) {
switch (state) {
case SeriesRecordings.STATE_SERIES_NORMAL:
return STATE_SERIES_NORMAL;
- case SeriesRecordings.STATE_SERIES_CANCELED:
- return STATE_SERIES_CANCELED;
+ case SeriesRecordings.STATE_SERIES_STOPPED:
+ return STATE_SERIES_STOPPED;
}
return STATE_SERIES_NORMAL;
}
@@ -331,6 +331,7 @@ public class SeriesRecording implements Parcelable {
mInputId = inputId;
return this;
}
+
/**
* @see #getChannelId()
*/
@@ -478,7 +479,7 @@ public class SeriesRecording implements Parcelable {
}
/**
- * The channelId to match.
+ * The channelId to match. The channel ID might not be valid when the channel option is "ALL".
*/
public long getChannelId() {
return mChannelId;
@@ -534,7 +535,6 @@ public class SeriesRecording implements Parcelable {
*
* <p>SeriesId is an opaque but stable string.
*/
- @NonNull
public String getSeriesId() {
return mSeriesId;
}
@@ -590,6 +590,13 @@ public class SeriesRecording implements Parcelable {
return mState;
}
+ /**
+ * Checks whether the series recording is stopped or not.
+ */
+ public boolean isStopped() {
+ return mState == STATE_SERIES_STOPPED;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -695,7 +702,7 @@ public class SeriesRecording implements Parcelable {
* episode constraints.
*/
public boolean matchProgram(Program program) {
- return matchProgram(program, true);
+ return matchProgram(program, mChannelOption);
}
/**
@@ -703,13 +710,12 @@ public class SeriesRecording implements Parcelable {
* episode constraints. It checks the channel option only if {@code checkChannelOption} is
* {@code true}.
*/
- public boolean matchProgram(Program program, boolean checkChannelOption) {
+ public boolean matchProgram(Program program, @ChannelOption int channelOption) {
String seriesId = program.getSeriesId();
long channelId = program.getChannelId();
String seasonNumber = program.getSeasonNumber();
String episodeNumber = program.getEpisodeNumber();
- if (!mSeriesId.equals(seriesId) || (checkChannelOption
- && mChannelOption == SeriesRecording.OPTION_CHANNEL_ONE
+ if (!mSeriesId.equals(seriesId) || (channelOption == SeriesRecording.OPTION_CHANNEL_ONE
&& mChannelId != channelId)) {
return false;
}
diff --git a/src/com/android/tv/dvr/SeriesRecordingScheduler.java b/src/com/android/tv/dvr/SeriesRecordingScheduler.java
index 9e9b3add..5ed12ce8 100644
--- a/src/com/android/tv/dvr/SeriesRecordingScheduler.java
+++ b/src/com/android/tv/dvr/SeriesRecordingScheduler.java
@@ -20,19 +20,14 @@ import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
-import android.database.Cursor;
-import android.media.tv.TvContract;
-import android.media.tv.TvContract.Programs;
-import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.support.annotation.MainThread;
-import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
-import android.support.annotation.WorkerThread;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
+import android.util.LongSparseArray;
import com.android.tv.ApplicationSingletons;
import com.android.tv.TvApplication;
@@ -43,10 +38,8 @@ import com.android.tv.data.Program;
import com.android.tv.data.epg.EpgFetcher;
import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
import com.android.tv.dvr.DvrDataManager.SeriesRecordingListener;
+import com.android.tv.dvr.EpisodicProgramLoadTask.ScheduledEpisode;
import com.android.tv.experiments.Experiments;
-import com.android.tv.util.AsyncDbTask.AsyncProgramQueryTask;
-import com.android.tv.util.AsyncDbTask.CursorFilter;
-import com.android.tv.util.PermissionUtils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -59,7 +52,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Objects;
+import java.util.concurrent.CopyOnWriteArraySet;
import java.util.Set;
/**
@@ -70,20 +63,7 @@ import java.util.Set;
@TargetApi(Build.VERSION_CODES.N)
public class SeriesRecordingScheduler {
private static final String TAG = "SeriesRecordingSchd";
-
- private static final int PROGRAM_ID_INDEX = Program.getColumnIndex(Programs._ID);
- private static final int RECORDING_PROHIBITED_INDEX =
- Program.getColumnIndex(Programs.COLUMN_RECORDING_PROHIBITED);
-
- private static final String PARAM_START_TIME = "start_time";
- private static final String PARAM_END_TIME = "end_time";
-
- private static final String PROGRAM_SELECTION =
- Programs.COLUMN_START_TIME_UTC_MILLIS + ">? AND (" +
- Programs.COLUMN_SEASON_DISPLAY_NUMBER + " IS NOT NULL OR " +
- Programs.COLUMN_EPISODE_DISPLAY_NUMBER + " IS NOT NULL) AND " +
- Programs.COLUMN_RECORDING_PROHIBITED + "=0";
- private static final String CHANNEL_ID_PREDICATE = Programs.COLUMN_CHANNEL_ID + "=?";
+ private static final boolean DEBUG = false;
private static final String KEY_FETCHED_SERIES_IDS =
"SeriesRecordingScheduler.fetched_series_ids";
@@ -109,6 +89,11 @@ public class SeriesRecordingScheduler {
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
@@ -124,7 +109,7 @@ public class SeriesRecordingScheduler {
for (Iterator<SeriesRecordingUpdateTask> iter = mScheduleTasks.iterator();
iter.hasNext(); ) {
SeriesRecordingUpdateTask task = iter.next();
- if (CollectionUtils.subtract(task.mSeriesRecordings, seriesRecordings,
+ if (CollectionUtils.subtract(task.getSeriesRecordings(), seriesRecordings,
SeriesRecording.ID_COMPARATOR).isEmpty()) {
task.cancel(true);
iter.remove();
@@ -134,7 +119,21 @@ public class SeriesRecordingScheduler {
@Override
public void onSeriesRecordingChanged(SeriesRecording... seriesRecordings) {
- updateSchedules(Arrays.asList(seriesRecordings));
+ List<SeriesRecording> stopped = new ArrayList<>();
+ List<SeriesRecording> normal = new ArrayList<>();
+ for (SeriesRecording r : seriesRecordings) {
+ if (r.isStopped()) {
+ stopped.add(r);
+ } else {
+ normal.add(r);
+ }
+ }
+ if (!stopped.isEmpty()) {
+ onSeriesRecordingRemoved(SeriesRecording.toArray(stopped));
+ }
+ if (!normal.isEmpty()) {
+ updateSchedules(normal);
+ }
}
};
@@ -174,8 +173,6 @@ public class SeriesRecordingScheduler {
Set<Long> seriesRecordingIds = new HashSet<>();
for (ScheduledRecording r : schedules) {
if (r.getSeriesRecordingId() != SeriesRecording.ID_NOT_SET) {
- SoftPreconditions.checkState(r.getState()
- != ScheduledRecording.STATE_RECORDING_FINISHED);
seriesRecordingIds.add(r.getSeriesRecordingId());
}
}
@@ -214,6 +211,7 @@ public class SeriesRecordingScheduler {
if (mStarted) {
return;
}
+ if (DEBUG) Log.d(TAG, "start");
mStarted = true;
mDataManager.addSeriesRecordingListener(mSeriesRecordingListener);
mDataManager.addScheduledRecordingListener(mScheduledRecordingListener);
@@ -226,13 +224,16 @@ public class SeriesRecordingScheduler {
if (!mStarted) {
return;
}
+ if (DEBUG) Log.d(TAG, "stop");
mStarted = false;
for (FetchSeriesInfoTask task : mFetchSeriesInfoTasks) {
task.cancel(true);
}
+ mFetchSeriesInfoTasks.clear();
for (SeriesRecordingUpdateTask task : mScheduleTasks) {
task.cancel(true);
}
+ mScheduleTasks.clear();
mDataManager.removeScheduledRecordingListener(mScheduledRecordingListener);
mDataManager.removeSeriesRecordingListener(mSeriesRecordingListener);
}
@@ -254,26 +255,81 @@ public class SeriesRecordingScheduler {
}
/**
- * Creates/Updates the schedules for all the series recordings.
+ * Pauses the updates of the series recordings.
*/
- @MainThread
- public void updateSchedules() {
+ public void pauseUpdate() {
+ if (DEBUG) Log.d(TAG, "Schedule paused");
+ if (mPaused) {
+ return;
+ }
+ mPaused = true;
if (!mStarted) {
return;
}
- updateSchedules(mDataManager.getSeriesRecordings());
+ for (SeriesRecordingUpdateTask task : mScheduleTasks) {
+ for (SeriesRecording r : task.getSeriesRecordings()) {
+ mPendingSeriesRecordings.add(r.getId());
+ }
+ task.cancel(true);
+ }
+ }
+
+ /**
+ * Resumes the updates of the series recordings.
+ */
+ public void resumeUpdate() {
+ if (DEBUG) Log.d(TAG, "Schedule resumed");
+ if (!mPaused) {
+ return;
+ }
+ mPaused = false;
+ if (!mStarted) {
+ return;
+ }
+ if (!mPendingSeriesRecordings.isEmpty()) {
+ List<SeriesRecording> seriesRecordings = new ArrayList<>();
+ for (long seriesRecordingId : mPendingSeriesRecordings) {
+ SeriesRecording seriesRecording =
+ mDataManager.getSeriesRecording(seriesRecordingId);
+ if (seriesRecording != null) {
+ seriesRecordings.add(seriesRecording);
+ }
+ }
+ if (!seriesRecordings.isEmpty()) {
+ updateSchedules(seriesRecordings);
+ }
+ }
}
- private void updateSchedules(Collection<SeriesRecording> seriesRecordings) {
+ /**
+ * Update schedules for the given series recordings. If it's paused, the update will be done
+ * after it's resumed.
+ */
+ public void updateSchedules(Collection<SeriesRecording> seriesRecordings) {
+ if (DEBUG) Log.d(TAG, "updateSchedules:" + seriesRecordings);
+ if (!mStarted) {
+ if (DEBUG) Log.d(TAG, "Not started yet.");
+ return;
+ }
+ if (mPaused) {
+ for (SeriesRecording r : seriesRecordings) {
+ mPendingSeriesRecordings.add(r.getId());
+ }
+ if (DEBUG) {
+ Log.d(TAG, "The scheduler has been paused. Adding to the pending list. size="
+ + mPendingSeriesRecordings.size());
+ }
+ return;
+ }
Set<SeriesRecording> previousSeriesRecordings = new HashSet<>();
for (Iterator<SeriesRecordingUpdateTask> iter = mScheduleTasks.iterator();
iter.hasNext(); ) {
SeriesRecordingUpdateTask task = iter.next();
- if (CollectionUtils.containsAny(task.mSeriesRecordings, seriesRecordings,
+ if (CollectionUtils.containsAny(task.getSeriesRecordings(), seriesRecordings,
SeriesRecording.ID_COMPARATOR)) {
// The task is affected by the seriesRecordings
task.cancel(true);
- previousSeriesRecordings.addAll(task.mSeriesRecordings);
+ previousSeriesRecordings.addAll(task.getSeriesRecordings());
iter.remove();
}
}
@@ -281,38 +337,44 @@ public class SeriesRecordingScheduler {
previousSeriesRecordings, SeriesRecording.ID_COMPARATOR);
for (Iterator<SeriesRecording> iter = seriesRecordingsToUpdate.iterator();
iter.hasNext(); ) {
- if (mDataManager.getSeriesRecording(iter.next().getId()) == null) {
- // Series recording has been removed.
+ SeriesRecording seriesRecording = mDataManager.getSeriesRecording(iter.next().getId());
+ if (seriesRecording == null || seriesRecording.isStopped()) {
+ // Series recording has been removed or stopped.
iter.remove();
}
}
if (seriesRecordingsToUpdate.isEmpty()) {
return;
}
- List<SeriesRecordingUpdateTask> tasksToRun = new ArrayList<>();
if (needToReadAllChannels(seriesRecordingsToUpdate)) {
- SeriesRecordingUpdateTask task = new SeriesRecordingUpdateTask(seriesRecordingsToUpdate,
- createSqlParams(seriesRecordingsToUpdate, null));
- tasksToRun.add(task);
+ SeriesRecordingUpdateTask task =
+ new SeriesRecordingUpdateTask(seriesRecordingsToUpdate);
mScheduleTasks.add(task);
+ if (DEBUG) Log.d(TAG, "Added schedule task: " + task);
+ task.execute();
} else {
for (SeriesRecording seriesRecording : seriesRecordingsToUpdate) {
SeriesRecordingUpdateTask task = new SeriesRecordingUpdateTask(
- Collections.singletonList(seriesRecording),
- createSqlParams(Collections.singletonList(seriesRecording), null));
- tasksToRun.add(task);
+ Collections.singletonList(seriesRecording));
mScheduleTasks.add(task);
+ if (DEBUG) Log.d(TAG, "Added schedule task: " + task);
+ task.execute();
}
}
- if (mDataManager.isDvrScheduleLoadFinished()) {
- runTasks(tasksToRun);
- }
}
- private void runTasks(List<SeriesRecordingUpdateTask> tasks) {
- for (SeriesRecordingUpdateTask task : tasks) {
- task.executeOnDbThread();
- }
+ /**
+ * 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) {
@@ -325,94 +387,6 @@ public class SeriesRecordingScheduler {
}
/**
- * Queries the programs which are related to the series.
- * <p>
- * This is called from the UI when the series recording is created.
- */
- public void queryPrograms(SeriesRecording series, ProgramLoadCallback callback) {
- SoftPreconditions.checkState(mDataManager.isInitialized());
- Set<ScheduledEpisode> scheduledEpisodes = new HashSet<>();
- for (RecordedProgram recordedProgram : mDataManager.getRecordedPrograms()) {
- if (series.getSeriesId().equals(recordedProgram.getSeriesId())) {
- scheduledEpisodes.add(new ScheduledEpisode(series.getId(),
- recordedProgram.getSeasonNumber(), recordedProgram.getEpisodeNumber()));
- }
- }
- SqlParams sqlParams = createSqlParams(Collections.singletonList(series), scheduledEpisodes);
- new AsyncProgramQueryTask(mContext.getContentResolver(), sqlParams.uri, sqlParams.selection,
- sqlParams.selectionArgs, null, sqlParams.filter) {
- @Override
- protected void onPostExecute(List<Program> programs) {
- SoftPreconditions.checkNotNull(programs);
- if (programs == null) {
- Log.e(TAG, "Creating schedules for series recording failed: " + series);
- callback.onProgramLoadFinished(Collections.emptyList());
- } else {
- Map<Long, List<Program>> seriesProgramMap = pickOneProgramPerEpisode(
- Collections.singletonList(series), programs);
- callback.onProgramLoadFinished(seriesProgramMap.get(series.getId()));
- }
- }
- }.executeOnDbThread();
- // To shorten the response time from UI, cancel and restart the background job.
- restartTasks();
- }
-
- private void restartTasks() {
- Set<SeriesRecording> seriesRecordings = new HashSet<>();
- for (SeriesRecordingUpdateTask task : mScheduleTasks) {
- seriesRecordings.addAll(task.mSeriesRecordings);
- task.cancel(true);
- }
- mScheduleTasks.clear();
- updateSchedules(seriesRecordings);
- }
-
- private SqlParams createSqlParams(List<SeriesRecording> seriesRecordings,
- Set<ScheduledEpisode> scheduledEpisodes) {
- SqlParams sqlParams = new SqlParams();
- if (PermissionUtils.hasAccessAllEpg(mContext)) {
- sqlParams.uri = Programs.CONTENT_URI;
- if (needToReadAllChannels(seriesRecordings)) {
- sqlParams.selection = PROGRAM_SELECTION;
- sqlParams.selectionArgs = new String[] {Long.toString(System.currentTimeMillis())};
- } else {
- SoftPreconditions.checkArgument(seriesRecordings.size() == 1);
- sqlParams.selection = PROGRAM_SELECTION + " AND " + CHANNEL_ID_PREDICATE;
- sqlParams.selectionArgs = new String[] {Long.toString(System.currentTimeMillis()),
- Long.toString(seriesRecordings.get(0).getChannelId())};
- }
- sqlParams.filter = new SeriesRecordingCursorFilter(seriesRecordings, scheduledEpisodes);
- } else {
- if (needToReadAllChannels(seriesRecordings)) {
- sqlParams.uri = Programs.CONTENT_URI.buildUpon()
- .appendQueryParameter(PARAM_START_TIME,
- String.valueOf(System.currentTimeMillis()))
- .appendQueryParameter(PARAM_END_TIME, String.valueOf(Long.MAX_VALUE))
- .build();
- } else {
- SoftPreconditions.checkArgument(seriesRecordings.size() == 1);
- sqlParams.uri = TvContract.buildProgramsUriForChannel(
- seriesRecordings.get(0).getChannelId(),
- System.currentTimeMillis(), Long.MAX_VALUE);
- }
- sqlParams.selection = null;
- sqlParams.selectionArgs = null;
- sqlParams.filter = new SeriesRecordingCursorFilterForNonSystem(seriesRecordings,
- scheduledEpisodes);
- }
- 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);
- }
-
- /**
* Pick one program per an episode.
*
* <p>Note that the programs which has been already scheduled have the highest priority, and all
@@ -421,7 +395,7 @@ public class SeriesRecordingScheduler {
* <p>If there are no existing schedules for an episode, one program which starts earlier is
* picked.
*/
- private Map<Long, List<Program>> pickOneProgramPerEpisode(
+ private LongSparseArray<List<Program>> pickOneProgramPerEpisode(
List<SeriesRecording> seriesRecordings, List<Program> programs) {
return pickOneProgramPerEpisode(mDataManager, seriesRecordings, programs);
}
@@ -430,10 +404,11 @@ public class SeriesRecordingScheduler {
* @see #pickOneProgramPerEpisode(List, List)
*/
@VisibleForTesting
- static Map<Long, List<Program>> pickOneProgramPerEpisode(DvrDataManager dataManager,
- List<SeriesRecording> seriesRecordings, List<Program> programs) {
+ static LongSparseArray<List<Program>> pickOneProgramPerEpisode(
+ DvrDataManager dataManager, List<SeriesRecording> seriesRecordings,
+ List<Program> programs) {
// Initialize.
- Map<Long, List<Program>> result = new HashMap<>();
+ LongSparseArray<List<Program>> result = new LongSparseArray<>();
Map<String, Long> seriesRecordingIds = new HashMap<>();
for (SeriesRecording seriesRecording : seriesRecordings) {
result.put(seriesRecording.getId(), new ArrayList<>());
@@ -508,27 +483,27 @@ public class SeriesRecordingScheduler {
* This works only for the existing series recordings. Do not use this task for the
* "adding series recording" UI.
*/
- private class SeriesRecordingUpdateTask extends AsyncProgramQueryTask {
- private final List<SeriesRecording> mSeriesRecordings = new ArrayList<>();
-
- SeriesRecordingUpdateTask(List<SeriesRecording> seriesRecordings, SqlParams sqlParams) {
- super(mContext.getContentResolver(), sqlParams.uri, sqlParams.selection,
- sqlParams.selectionArgs, null, sqlParams.filter);
- mSeriesRecordings.addAll(seriesRecordings);
+ private class SeriesRecordingUpdateTask extends EpisodicProgramLoadTask {
+ SeriesRecordingUpdateTask(List<SeriesRecording> seriesRecordings) {
+ super(mContext, seriesRecordings);
}
@Override
protected void onPostExecute(List<Program> programs) {
+ if (DEBUG) Log.d(TAG, "onPostExecute: updating schedules with programs:" + programs);
mScheduleTasks.remove(this);
if (programs == null) {
- Log.e(TAG, "Creating schedules for series recording failed: " + mSeriesRecordings);
+ Log.e(TAG, "Creating schedules for series recording failed: "
+ + getSeriesRecordings());
return;
}
- Map<Long, List<Program>> seriesProgramMap = pickOneProgramPerEpisode(
- mSeriesRecordings, programs);
- for (SeriesRecording seriesRecording : mSeriesRecordings) {
+ LongSparseArray<List<Program>> seriesProgramMap = pickOneProgramPerEpisode(
+ getSeriesRecordings(), programs);
+ for (SeriesRecording seriesRecording : getSeriesRecordings()) {
// Check the series recording is still valid.
- if (mDataManager.getSeriesRecording(seriesRecording.getId()) == null) {
+ SeriesRecording actualSeriesRecording = mDataManager.getSeriesRecording(
+ seriesRecording.getId());
+ if (actualSeriesRecording == null || actualSeriesRecording.isStopped()) {
continue;
}
List<Program> programsToSchedule = seriesProgramMap.get(seriesRecording.getId());
@@ -537,122 +512,25 @@ public class SeriesRecordingScheduler {
mDvrManager.addScheduleToSeriesRecording(seriesRecording, programsToSchedule);
}
}
- }
-
- @Override
- protected void onCancelled(List<Program> programs) {
- mScheduleTasks.remove(this);
- }
- }
-
- /**
- * 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 List<SeriesRecording> mSeriesRecording = new ArrayList<>();
- private final Set<Long> mDisallowedProgramIds = new HashSet<>();
- private final Set<ScheduledEpisode> mScheduledEpisodes = new HashSet<>();
-
- SeriesRecordingCursorFilter(List<SeriesRecording> seriesRecordings,
- Set<ScheduledEpisode> scheduledEpisodes) {
- mSeriesRecording.addAll(seriesRecordings);
- mDisallowedProgramIds.addAll(mDataManager.getDisallowedProgramIds());
- Set<Long> seriesRecordingIds = new HashSet<>();
- for (SeriesRecording r : seriesRecordings) {
- seriesRecordingIds.add(r.getId());
- }
- if (scheduledEpisodes != null) {
- mScheduledEpisodes.addAll(scheduledEpisodes);
- }
- for (ScheduledRecording r : mDataManager.getAllScheduledRecordings()) {
- if (seriesRecordingIds.contains(r.getSeriesRecordingId())
- && r.getState() != ScheduledRecording.STATE_RECORDING_FAILED
- && r.getState() != ScheduledRecording.STATE_RECORDING_CLIPPED) {
- mScheduledEpisodes.add(new ScheduledEpisode(r));
+ if (!mOnSeriesRecordingUpdatedListeners.isEmpty()) {
+ for (OnSeriesRecordingUpdatedListener listener
+ : mOnSeriesRecordingUpdatedListeners) {
+ listener.onSeriesRecordingUpdated(
+ SeriesRecording.toArray(getSeriesRecordings()));
}
}
}
@Override
- @WorkerThread
- public boolean filter(Cursor c) {
- if (mDisallowedProgramIds.contains(c.getLong(PROGRAM_ID_INDEX))) {
- return false;
- }
- Program program = Program.fromCursor(c);
- for (SeriesRecording seriesRecording : mSeriesRecording) {
- boolean programMatches = seriesRecording.matchProgram(program);
- if (programMatches && !isEpisodeScheduled(mScheduledEpisodes, new ScheduledEpisode(
- seriesRecording.getId(), program.getSeasonNumber(),
- program.getEpisodeNumber()))) {
- return true;
- }
- }
- return false;
- }
- }
-
- private class SeriesRecordingCursorFilterForNonSystem extends SeriesRecordingCursorFilter {
- SeriesRecordingCursorFilterForNonSystem(List<SeriesRecording> seriesRecordings,
- Set<ScheduledEpisode> scheduledEpisodes) {
- super(seriesRecordings, scheduledEpisodes);
- }
-
- @Override
- public boolean filter(Cursor c) {
- return c.getInt(RECORDING_PROHIBITED_INDEX) != 0 && super.filter(c);
- }
- }
-
- private static class SqlParams {
- public Uri uri;
- public String selection;
- public String[] selectionArgs;
- public CursorFilter filter;
- }
-
- @VisibleForTesting
- 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);
+ protected void onCancelled(List<Program> programs) {
+ mScheduleTasks.remove(this);
}
@Override
public String toString() {
- return "ScheduledEpisode{" +
- "seriesRecordingId=" + seriesRecordingId +
- ", seasonNumber='" + seasonNumber +
- ", episodeNumber=" + episodeNumber +
- '}';
+ return "SeriesRecordingUpdateTask:{"
+ + "series_recordings=" + getSeriesRecordings()
+ + "}";
}
}
@@ -663,10 +541,6 @@ public class SeriesRecordingScheduler {
mSeriesRecording = seriesRecording;
}
- String getSeriesId() {
- return mSeriesRecording.getSeriesId();
- }
-
@Override
protected SeriesInfo doInBackground(Void... voids) {
return EpgFetcher.createEpgReader(mContext)
@@ -697,9 +571,9 @@ public class SeriesRecordingScheduler {
}
/**
- * Called when the program loading is finished for the series recording.
+ * A listener to notify when series recording are updated.
*/
- public interface ProgramLoadCallback {
- void onProgramLoadFinished(@NonNull List<Program> programs);
+ 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 382f7112..bf72d912 100644
--- a/src/com/android/tv/dvr/WritableDvrDataManager.java
+++ b/src/com/android/tv/dvr/WritableDvrDataManager.java
@@ -44,9 +44,13 @@ interface WritableDvrDataManager extends DvrDataManager {
void removeScheduledRecording(ScheduledRecording... scheduledRecordings);
/**
+ * Removes recordings. If {@code forceRemove} is {@code true}, the schedule will be permanently
+ * removed instead of changing the state to DELETED.
+ */
+ void removeScheduledRecording(boolean forceRemove, ScheduledRecording... scheduledRecordings);
+
+ /**
* Removes series recordings.
- *
- * <p>Note that the finished or failed schedules are not deleted.
*/
void removeSeriesRecording(SeriesRecording... seasonSchedules);
@@ -64,4 +68,11 @@ interface WritableDvrDataManager extends DvrDataManager {
* Changes the state of the recording.
*/
void changeState(ScheduledRecording scheduledRecording, @RecordingState int newState);
+
+ /**
+ * Remove all the records related to the input.
+ * <p>
+ * Note that this should be called after the input was removed.
+ */
+ void forgetStorage(String inputId);
}
diff --git a/src/com/android/tv/dvr/provider/DvrContract.java b/src/com/android/tv/dvr/provider/DvrContract.java
index 3fe2d211..f0aca18e 100644
--- a/src/com/android/tv/dvr/provider/DvrContract.java
+++ b/src/com/android/tv/dvr/provider/DvrContract.java
@@ -233,9 +233,9 @@ public final class DvrContract {
public static final String STATE_SERIES_NORMAL = "STATE_SERIES_NORMAL";
/**
- * The state indicates that it is a canceled one.
+ * The state indicates that it is stopped.
*/
- public static final String STATE_SERIES_CANCELED = "STATE_SERIES_CANCELED";
+ public static final String STATE_SERIES_STOPPED = "STATE_SERIES_STOPPED";
/**
* The priority of this recording.
@@ -380,7 +380,7 @@ public final class DvrContract {
* The state of whether the series recording be canceled or not.
*
* <p>This value should be one of the followings: {@link #STATE_SERIES_NORMAL} and
- * {@link #STATE_SERIES_CANCELED}. The default value is STATE_SERIES_NORMAL.
+ * {@link #STATE_SERIES_STOPPED}. The default value is STATE_SERIES_NORMAL.
*
* <p>Type: TEXT
*/
diff --git a/src/com/android/tv/dvr/ui/DetailsContentPresenter.java b/src/com/android/tv/dvr/ui/DetailsContentPresenter.java
index d6e17161..175f05bc 100644
--- a/src/com/android/tv/dvr/ui/DetailsContentPresenter.java
+++ b/src/com/android/tv/dvr/ui/DetailsContentPresenter.java
@@ -16,27 +16,285 @@
package com.android.tv.dvr.ui;
-import android.content.Context;
-import android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter;
+import android.app.Activity;
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.graphics.Paint;
+import android.graphics.Paint.FontMetricsInt;
+import android.support.v17.leanback.widget.Presenter;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import com.android.tv.R;
+import com.android.tv.ui.ViewUtils;
import com.android.tv.util.Utils;
/**
- * Presents a {@link DetailsContent}.
+ * An {@link Presenter} for rendering a detailed description of an DVR item.
+ * 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}.
*/
-public class DetailsContentPresenter extends AbstractDetailsDescriptionPresenter {
+public class DetailsContentPresenter extends Presenter {
+ /**
+ * The ViewHolder for the {@link DetailsContentPresenter}.
+ */
+ public static class ViewHolder extends Presenter.ViewHolder {
+ final TextView mTitle;
+ final TextView mSubtitle;
+ final LinearLayout mDescriptionContainer;
+ final TextView mBody;
+ final TextView mReadMoreView;
+ final int mTitleMargin;
+ final int mUnderTitleBaselineMargin;
+ final int mUnderSubtitleBaselineMargin;
+ final int mTitleLineSpacing;
+ final int mBodyLineSpacing;
+ final int mBodyMaxLines;
+ final int mBodyMinLines;
+ final FontMetricsInt mTitleFontMetricsInt;
+ final FontMetricsInt mSubtitleFontMetricsInt;
+ final FontMetricsInt mBodyFontMetricsInt;
+ final int mTitleMaxLines;
+
+ private Activity mActivity;
+ private boolean mFullTextMode;
+ private int mFullTextAnimationDuration;
+ private boolean mIsListeningToPreDraw;
+
+ private ViewTreeObserver.OnPreDrawListener mPreDrawListener =
+ new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ if (mSubtitle.getVisibility() == View.VISIBLE
+ && mSubtitle.getTop() > view.getHeight()
+ && mTitle.getLineCount() > 1) {
+ mTitle.setMaxLines(mTitle.getLineCount() - 1);
+ return false;
+ }
+ final int bodyLines = mBody.getLineCount();
+ final int maxLines = mFullTextMode ? bodyLines :
+ (mTitle.getLineCount() > 1 ? mBodyMinLines : mBodyMaxLines);
+ if (bodyLines > maxLines) {
+ mReadMoreView.setVisibility(View.VISIBLE);
+ mDescriptionContainer.setFocusable(true);
+ mDescriptionContainer.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mFullTextMode = true;
+ mReadMoreView.setVisibility(View.GONE);
+ mDescriptionContainer.setFocusable(false);
+ mDescriptionContainer.setOnClickListener(null);
+ mBody.setMaxLines(bodyLines);
+ // Minus 1 from line difference to eliminate the space
+ // originally occupied by "READ MORE"
+ showFullText((bodyLines - maxLines - 1) * mBodyLineSpacing);
+ }
+ });
+ }
+ if (mBody.getMaxLines() != maxLines) {
+ mBody.setMaxLines(maxLines);
+ return false;
+ } else {
+ removePreDrawListener();
+ return true;
+ }
+ }
+ };
+
+ public ViewHolder(final View view) {
+ super(view);
+ 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);
+ mDescriptionContainer =
+ (LinearLayout) view.findViewById(R.id.dvr_details_description_container);
+ mReadMoreView = (TextView) view.findViewById(R.id.dvr_details_description_read_more);
+
+ FontMetricsInt titleFontMetricsInt = getFontMetricsInt(mTitle);
+ final int titleAscent = view.getResources().getDimensionPixelSize(
+ R.dimen.lb_details_description_title_baseline);
+ // Ascent is negative
+ mTitleMargin = titleAscent + titleFontMetricsInt.ascent;
+
+ mUnderTitleBaselineMargin = view.getResources().getDimensionPixelSize(
+ R.dimen.lb_details_description_under_title_baseline_margin);
+ mUnderSubtitleBaselineMargin = view.getResources().getDimensionPixelSize(
+ R.dimen.lb_details_description_under_subtitle_baseline_margin);
+
+ mTitleLineSpacing = view.getResources().getDimensionPixelSize(
+ R.dimen.lb_details_description_title_line_spacing);
+ mBodyLineSpacing = view.getResources().getDimensionPixelSize(
+ R.dimen.lb_details_description_body_line_spacing);
+
+ mBodyMaxLines = view.getResources().getInteger(
+ R.integer.lb_details_description_body_max_lines);
+ mBodyMinLines = view.getResources().getInteger(
+ R.integer.lb_details_description_body_min_lines);
+ mTitleMaxLines = mTitle.getMaxLines();
+
+ mTitleFontMetricsInt = getFontMetricsInt(mTitle);
+ mSubtitleFontMetricsInt = getFontMetricsInt(mSubtitle);
+ mBodyFontMetricsInt = getFontMetricsInt(mBody);
+ }
+
+ void addPreDrawListener() {
+ if (!mIsListeningToPreDraw) {
+ mIsListeningToPreDraw = true;
+ view.getViewTreeObserver().addOnPreDrawListener(mPreDrawListener);
+ }
+ }
+
+ void removePreDrawListener() {
+ if (mIsListeningToPreDraw) {
+ view.getViewTreeObserver().removeOnPreDrawListener(mPreDrawListener);
+ mIsListeningToPreDraw = false;
+ }
+ }
+
+ public TextView getTitle() {
+ return mTitle;
+ }
+
+ public TextView getSubtitle() {
+ return mSubtitle;
+ }
+
+ public TextView getBody() {
+ return mBody;
+ }
+
+ private FontMetricsInt getFontMetricsInt(TextView textView) {
+ Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ paint.setTextSize(textView.getTextSize());
+ paint.setTypeface(textView.getTypeface());
+ return paint.getFontMetricsInt();
+ }
+
+ private void showFullText(int heightDiff) {
+ final ViewGroup detailsFrame = (ViewGroup) mActivity.findViewById(R.id.details_frame);
+ int nowHeight = ViewUtils.getLayoutHeight(detailsFrame);
+ Animator expandAnimator = ViewUtils.createHeightAnimator(
+ detailsFrame, nowHeight, nowHeight + heightDiff);
+ expandAnimator.setDuration(mFullTextAnimationDuration);
+ Animator shiftAnimator = ObjectAnimator.ofPropertyValuesHolder(detailsFrame,
+ PropertyValuesHolder.ofFloat(View.TRANSLATION_Y,
+ 0f, -(heightDiff / 2)));
+ shiftAnimator.setDuration(mFullTextAnimationDuration);
+ AnimatorSet fullTextAnimator = new AnimatorSet();
+ fullTextAnimator.playTogether(expandAnimator, shiftAnimator);
+ fullTextAnimator.start();
+ }
+ }
+
+ private final Activity mActivity;
+ private final int mFullTextAnimationDuration;
+
+ public DetailsContentPresenter(Activity activity) {
+ super();
+ mActivity = activity;
+ mFullTextAnimationDuration = mActivity.getResources()
+ .getInteger(R.integer.dvr_details_full_text_animation_duration);
+ }
+
+ @Override
+ public final ViewHolder onCreateViewHolder(ViewGroup parent) {
+ View v = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.dvr_details_description, parent, false);
+ return new ViewHolder(v);
+ }
+
@Override
- protected void onBindDescription(final ViewHolder viewHolder, Object itemData) {
- DetailsContent detailsContent = (DetailsContent) itemData;
- Context context = viewHolder.view.getContext();
- viewHolder.getTitle().setText(detailsContent.getTitle());
+ public final void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
+ final ViewHolder vh = (ViewHolder) viewHolder;
+ final DetailsContent detailsContent = (DetailsContent) item;
+
+ vh.mActivity = mActivity;
+ vh.mFullTextAnimationDuration = mFullTextAnimationDuration;
+
+ boolean hasTitle = true;
+ if (TextUtils.isEmpty(detailsContent.getTitle())) {
+ vh.mTitle.setVisibility(View.GONE);
+ hasTitle = false;
+ } else {
+ vh.mTitle.setText(detailsContent.getTitle());
+ vh.mTitle.setVisibility(View.VISIBLE);
+ vh.mTitle.setLineSpacing(vh.mTitleLineSpacing - vh.mTitle.getLineHeight()
+ + vh.mTitle.getLineSpacingExtra(), vh.mTitle.getLineSpacingMultiplier());
+ vh.mTitle.setMaxLines(vh.mTitleMaxLines);
+ }
+ setTopMargin(vh.mTitle, vh.mTitleMargin);
+
+ boolean hasSubtitle = true;
if (detailsContent.getStartTimeUtcMillis() != DetailsContent.INVALID_TIME
&& detailsContent.getEndTimeUtcMillis() != DetailsContent.INVALID_TIME) {
- String playTime = Utils.getDurationString(context,
+ vh.mSubtitle.setText(Utils.getDurationString(viewHolder.view.getContext(),
detailsContent.getStartTimeUtcMillis(),
- detailsContent.getEndTimeUtcMillis(), false);
- viewHolder.getSubtitle().setText(playTime);
+ detailsContent.getEndTimeUtcMillis(), false));
+ vh.mSubtitle.setVisibility(View.VISIBLE);
+ if (hasTitle) {
+ setTopMargin(vh.mSubtitle, vh.mUnderTitleBaselineMargin
+ + vh.mSubtitleFontMetricsInt.ascent - vh.mTitleFontMetricsInt.descent);
+ } else {
+ setTopMargin(vh.mSubtitle, 0);
+ }
+ } else {
+ vh.mSubtitle.setVisibility(View.GONE);
+ hasSubtitle = false;
}
- viewHolder.getBody().setText(detailsContent.getDescription());
+
+ if (TextUtils.isEmpty(detailsContent.getDescription())) {
+ vh.mBody.setVisibility(View.GONE);
+ } else {
+ vh.mBody.setText(detailsContent.getDescription());
+ vh.mBody.setVisibility(View.VISIBLE);
+ vh.mBody.setLineSpacing(vh.mBodyLineSpacing - vh.mBody.getLineHeight()
+ + vh.mBody.getLineSpacingExtra(), vh.mBody.getLineSpacingMultiplier());
+ if (hasSubtitle) {
+ setTopMargin(vh.mDescriptionContainer, vh.mUnderSubtitleBaselineMargin
+ + vh.mBodyFontMetricsInt.ascent - vh.mSubtitleFontMetricsInt.descent
+ - vh.mBody.getPaddingTop());
+ } else if (hasTitle) {
+ setTopMargin(vh.mDescriptionContainer, vh.mUnderTitleBaselineMargin
+ + vh.mBodyFontMetricsInt.ascent - vh.mTitleFontMetricsInt.descent
+ - vh.mBody.getPaddingTop());
+ } else {
+ setTopMargin(vh.mDescriptionContainer, 0);
+ }
+ }
+ }
+
+ @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;
+ view.setLayoutParams(lp);
}
-}
+} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/DetailsViewBackgroundHelper.java b/src/com/android/tv/dvr/ui/DetailsViewBackgroundHelper.java
index 37f152f9..6714ecd3 100644
--- a/src/com/android/tv/dvr/ui/DetailsViewBackgroundHelper.java
+++ b/src/com/android/tv/dvr/ui/DetailsViewBackgroundHelper.java
@@ -76,13 +76,17 @@ public class DetailsViewBackgroundHelper {
* Sets the background color.
*/
public void setBackgroundColor(int color) {
- mBackgroundManager.setColor(color);
+ if (mBackgroundManager.isAttached()) {
+ mBackgroundManager.setColor(color);
+ }
}
/**
* Sets the background scrim.
*/
public void setScrim(int color) {
- mBackgroundManager.setDimLayer(new ColorDrawable(color));
+ if (mBackgroundManager.isAttached()) {
+ mBackgroundManager.setDimLayer(new ColorDrawable(color));
+ }
}
}
diff --git a/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java b/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java
index d7c2de88..9df228d1 100644
--- a/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java
@@ -96,7 +96,7 @@ public class DvrAlreadyRecordedFragment extends DvrGuidedStepFragment {
if (action.getId() == ACTION_RECORD_ANYWAY) {
getDvrManager().addSchedule(mProgram);
} else if (action.getId() == ACTION_WATCH) {
- DvrUiHelper.startDetailsActivity(getActivity(), mDuplicate, null);
+ DvrUiHelper.startDetailsActivity(getActivity(), mDuplicate, null, false);
}
dismissDialog();
}
diff --git a/src/com/android/tv/dvr/ui/DvrBrowseFragment.java b/src/com/android/tv/dvr/ui/DvrBrowseFragment.java
index 74d0ba0b..a6dd31d1 100644
--- a/src/com/android/tv/dvr/ui/DvrBrowseFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrBrowseFragment.java
@@ -26,23 +26,25 @@ 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 com.android.tv.ApplicationSingletons;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.dvr.RecordedProgram;
import com.android.tv.data.GenreItems;
import com.android.tv.dvr.DvrDataManager;
-import com.android.tv.dvr.DvrDataManager.RecordedProgramListener;
-import com.android.tv.dvr.DvrDataManager.SeriesRecordingListener;
-import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
import com.android.tv.dvr.DvrDataManager.OnDvrScheduleLoadFinishedListener;
import com.android.tv.dvr.DvrDataManager.OnRecordedProgramLoadFinishedListener;
+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.RecordedProgram;
import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.SeriesRecording;
-import com.android.tv.util.TvInputManagerHelper;
import java.util.ArrayList;
import java.util.Arrays;
@@ -64,7 +66,7 @@ public class DvrBrowseFragment extends BrowseFragment implements
private RecordedProgramAdapter mRecentAdapter;
private ScheduleAdapter mScheduleAdapter;
- private RecordedProgramAdapter mSeriesAdapter;
+ private SeriesAdapter mSeriesAdapter;
private RecordedProgramAdapter[] mGenreAdapters =
new RecordedProgramAdapter[GenreItems.getGenreCount() + 1];
private ListRow mRecentRow;
@@ -72,7 +74,7 @@ public class DvrBrowseFragment extends BrowseFragment implements
private ListRow[] mGenreRows = new ListRow[GenreItems.getGenreCount() + 1];
private List<String> mGenreLabels;
private DvrDataManager mDvrDataManager;
- private TvInputManagerHelper mTvInputManagerHelper;
+ private DvrScheduleManager mDvrScheudleManager;
private ArrayObjectAdapter mRowsAdapter;
private ClassPresenterSelector mPresenterSelector;
private final HashMap<String, RecordedProgram> mSeriesId2LatestProgram = new HashMap<>();
@@ -107,7 +109,7 @@ public class DvrBrowseFragment extends BrowseFragment implements
public int compare(Object lhs, Object rhs) {
if (lhs instanceof ScheduledRecording) {
if (rhs instanceof ScheduledRecording) {
- return ScheduledRecording.START_TIME_THEN_PRIORITY_COMPARATOR
+ return ScheduledRecording.START_TIME_THEN_PRIORITY_THEN_ID_COMPARATOR
.compare((ScheduledRecording) lhs, (ScheduledRecording) rhs);
} else {
return -1;
@@ -120,36 +122,15 @@ public class DvrBrowseFragment extends BrowseFragment implements
}
};
- private final TvInputCallback mTvInputCallback = new TvInputCallback() {
+ private final DvrScheduleManager.OnConflictStateChangeListener mOnConflictStateChangeListener =
+ new DvrScheduleManager.OnConflictStateChangeListener() {
@Override
- public void onInputAdded(String inputId) {
- List<ScheduledRecording> scheduleRecordings =
- mDvrDataManager.getScheduledRecordings(inputId);
- if (!scheduleRecordings.isEmpty()) {
- onScheduledRecordingStatusChanged(ScheduledRecording.toArray(scheduleRecordings));
- }
- handleSeriesRecordingsChanged(mDvrDataManager.getSeriesRecordings(inputId));
- for (RecordedProgram recordedProgram : mDvrDataManager.getRecordedPrograms()) {
- if (TextUtils.equals(recordedProgram.getInputId(), inputId)) {
- handleRecordedProgramChanged(recordedProgram);
+ public void onConflictStateChange(boolean conflict, ScheduledRecording... schedules) {
+ if (mScheduleAdapter != null) {
+ for (ScheduledRecording schedule : schedules) {
+ onScheduledRecordingStatusChanged(schedule);
}
}
- postUpdateRows();
- }
-
- @Override
- public void onInputRemoved(String inputId) {
- List<ScheduledRecording> scheduleRecordings =
- mDvrDataManager.getScheduledRecordings(inputId);
- onScheduledRecordingRemoved(
- scheduleRecordings.toArray(new ScheduledRecording[scheduleRecordings.size()]));
- handleSeriesRecordingsRemoved(mDvrDataManager.getSeriesRecordings(inputId));
- for (RecordedProgram recordedProgram : mDvrDataManager.getRecordedPrograms()) {
- if (TextUtils.equals(recordedProgram.getInputId(), inputId)) {
- handleRecordedProgramRemoved(recordedProgram);
- }
- }
- postUpdateRows();
}
};
@@ -165,8 +146,9 @@ public class DvrBrowseFragment extends BrowseFragment implements
if (DEBUG) Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
Context context = getContext();
- mDvrDataManager = TvApplication.getSingletons(context).getDvrDataManager();
- mTvInputManagerHelper = TvApplication.getSingletons(context).getTvInputManagerHelper();
+ ApplicationSingletons singletons = TvApplication.getSingletons(context);
+ mDvrDataManager = singletons.getDvrDataManager();
+ mDvrScheudleManager = singletons.getDvrScheduleManager();
mPresenterSelector = new ClassPresenterSelector()
.addClassPresenter(ScheduledRecording.class,
new ScheduledRecordingPresenter(context))
@@ -177,7 +159,7 @@ public class DvrBrowseFragment extends BrowseFragment implements
mGenreLabels.add(getString(R.string.dvr_main_others));
setupUiElements();
setupAdapters();
- mTvInputManagerHelper.addCallback(mTvInputCallback);
+ mDvrScheudleManager.addOnConflictStateChangeListener(mOnConflictStateChangeListener);
prepareEntranceTransition();
if (mDvrDataManager.isInitialized()) {
startEntranceTransition();
@@ -194,9 +176,8 @@ public class DvrBrowseFragment extends BrowseFragment implements
@Override
public void onDestroy() {
if (DEBUG) Log.d(TAG, "onDestroy");
- super.onDestroy();
mHandler.removeCallbacks(mUpdateRowsRunnable);
- mTvInputManagerHelper.removeCallback(mTvInputCallback);
+ mDvrScheudleManager.removeOnConflictStateChangeListener(mOnConflictStateChangeListener);
mDvrDataManager.removeRecordedProgramListener(this);
mDvrDataManager.removeScheduledRecordingListener(this);
mDvrDataManager.removeSeriesRecordingListener(this);
@@ -204,6 +185,12 @@ public class DvrBrowseFragment extends BrowseFragment implements
mDvrDataManager.removeRecordedProgramLoadFinishedListener(this);
mRowsAdapter.clear();
mSeriesId2LatestProgram.clear();
+ for (Presenter presenter : mPresenterSelector.getPresenters()) {
+ if (presenter instanceof DvrItemPresenter) {
+ ((DvrItemPresenter) presenter).unbindAllViewHolders();
+ }
+ }
+ super.onDestroy();
}
@Override
@@ -221,9 +208,7 @@ public class DvrBrowseFragment extends BrowseFragment implements
@Override
public void onRecordedProgramLoadFinished() {
for (RecordedProgram recordedProgram : mDvrDataManager.getRecordedPrograms()) {
- if (isInputExist(recordedProgram.getInputId())) {
- handleRecordedProgramAdded(recordedProgram, true);
- }
+ handleRecordedProgramAdded(recordedProgram, true);
}
updateRows();
if (mDvrDataManager.isInitialized()) {
@@ -233,27 +218,27 @@ public class DvrBrowseFragment extends BrowseFragment implements
}
@Override
- public void onRecordedProgramAdded(RecordedProgram recordedProgram) {
- if (isInputExist(recordedProgram.getInputId())) {
+ public void onRecordedProgramsAdded(RecordedProgram... recordedPrograms) {
+ for (RecordedProgram recordedProgram : recordedPrograms) {
handleRecordedProgramAdded(recordedProgram, true);
- postUpdateRows();
}
+ postUpdateRows();
}
@Override
- public void onRecordedProgramChanged(RecordedProgram recordedProgram) {
- if (isInputExist(recordedProgram.getInputId())) {
+ public void onRecordedProgramsChanged(RecordedProgram... recordedPrograms) {
+ for (RecordedProgram recordedProgram : recordedPrograms) {
handleRecordedProgramChanged(recordedProgram);
- postUpdateRows();
}
+ postUpdateRows();
}
@Override
- public void onRecordedProgramRemoved(RecordedProgram recordedProgram) {
- if (isInputExist(recordedProgram.getInputId())) {
+ public void onRecordedProgramsRemoved(RecordedProgram... recordedPrograms) {
+ for (RecordedProgram recordedProgram : recordedPrograms) {
handleRecordedProgramRemoved(recordedProgram);
- postUpdateRows();
}
+ postUpdateRows();
}
// No need to call updateRows() during ScheduledRecordings' change because
@@ -320,7 +305,7 @@ public class DvrBrowseFragment extends BrowseFragment implements
private void setupAdapters() {
mRecentAdapter = new RecordedProgramAdapter(MAX_RECENT_ITEM_COUNT);
mScheduleAdapter = new ScheduleAdapter(MAX_SCHEDULED_ITEM_COUNT);
- mSeriesAdapter = new RecordedProgramAdapter();
+ mSeriesAdapter = new SeriesAdapter();
for (int i = 0; i < mGenreAdapters.length; i++) {
mGenreAdapters[i] = new RecordedProgramAdapter();
}
@@ -330,9 +315,7 @@ public class DvrBrowseFragment extends BrowseFragment implements
mScheduleAdapter.addExtraItem(FullScheduleCardHolder.FULL_SCHEDULE_CARD_HOLDER);
// Recorded Programs.
for (RecordedProgram recordedProgram : mDvrDataManager.getRecordedPrograms()) {
- if (isInputExist(recordedProgram.getInputId())) {
- handleRecordedProgramAdded(recordedProgram, false);
- }
+ 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.
@@ -426,13 +409,11 @@ public class DvrBrowseFragment extends BrowseFragment implements
private void handleSeriesRecordingsAdded(List<SeriesRecording> seriesRecordings) {
for (SeriesRecording seriesRecording : seriesRecordings) {
- if (isInputExist(seriesRecording.getInputId())) {
- mSeriesAdapter.add(seriesRecording);
- if (mSeriesId2LatestProgram.get(seriesRecording.getSeriesId()) != null) {
- for (RecordedProgramAdapter adapter
- : getGenreAdapters(seriesRecording.getCanonicalGenreIds())) {
- adapter.add(seriesRecording);
- }
+ mSeriesAdapter.add(seriesRecording);
+ if (mSeriesId2LatestProgram.get(seriesRecording.getSeriesId()) != null) {
+ for (RecordedProgramAdapter adapter
+ : getGenreAdapters(seriesRecording.getCanonicalGenreIds())) {
+ adapter.add(seriesRecording);
}
}
}
@@ -450,15 +431,13 @@ public class DvrBrowseFragment extends BrowseFragment implements
private void handleSeriesRecordingsChanged(List<SeriesRecording> seriesRecordings) {
for (SeriesRecording seriesRecording : seriesRecordings) {
- if (isInputExist(seriesRecording.getInputId())) {
- mSeriesAdapter.change(seriesRecording);
- if (mSeriesId2LatestProgram.get(seriesRecording.getSeriesId()) != null) {
- updateGenreAdapters(getGenreAdapters(
- seriesRecording.getCanonicalGenreIds()), seriesRecording);
- } else {
- // Remove series recording from all genre rows if it has no recorded program
- updateGenreAdapters(new ArrayList<>(), seriesRecording);
- }
+ mSeriesAdapter.change(seriesRecording);
+ if (mSeriesId2LatestProgram.get(seriesRecording.getSeriesId()) != null) {
+ updateGenreAdapters(getGenreAdapters(
+ seriesRecording.getCanonicalGenreIds()), seriesRecording);
+ } else {
+ // Remove series recording from all genre rows if it has no recorded program
+ updateGenreAdapters(new ArrayList<>(), seriesRecording);
}
}
}
@@ -545,23 +524,18 @@ public class DvrBrowseFragment extends BrowseFragment implements
}
}
- private boolean isInputExist(String inputId) {
- return mTvInputManagerHelper.getTvInputInfo(inputId) != null;
- }
-
private boolean needToShowScheduledRecording(ScheduledRecording recording) {
int state = recording.getState();
- return isInputExist(recording.getInputId())
- && (state == ScheduledRecording.STATE_RECORDING_IN_PROGRESS
- || state == ScheduledRecording.STATE_RECORDING_NOT_STARTED);
+ return state == ScheduledRecording.STATE_RECORDING_IN_PROGRESS
+ || state == ScheduledRecording.STATE_RECORDING_NOT_STARTED;
}
private void updateLatestRecordedProgram(SeriesRecording seriesRecording) {
RecordedProgram latestProgram = null;
for (RecordedProgram program :
mDvrDataManager.getRecordedPrograms(seriesRecording.getId())) {
- if (isInputExist(program.getInputId()) && (latestProgram == null || RecordedProgram
- .START_TIME_THEN_ID_COMPARATOR.compare(latestProgram, program) < 0)) {
+ if (latestProgram == null || RecordedProgram
+ .START_TIME_THEN_ID_COMPARATOR.compare(latestProgram, program) < 0) {
latestProgram = program;
}
}
@@ -583,6 +557,27 @@ public class DvrBrowseFragment extends BrowseFragment implements
}
}
+ private class SeriesAdapter extends SortedArrayAdapter<SeriesRecording> {
+ SeriesAdapter() {
+ super(mPresenterSelector, new Comparator<SeriesRecording>() {
+ @Override
+ public int compare(SeriesRecording lhs, SeriesRecording rhs) {
+ if (lhs.isStopped() && !rhs.isStopped()) {
+ return 1;
+ } else if (!lhs.isStopped() && rhs.isStopped()) {
+ return -1;
+ }
+ return SeriesRecording.PRIORITY_COMPARATOR.compare(lhs, rhs);
+ }
+ });
+ }
+
+ @Override
+ public long getId(SeriesRecording item) {
+ return item.getId();
+ }
+ }
+
private class RecordedProgramAdapter extends SortedArrayAdapter<Object> {
RecordedProgramAdapter() {
this(Integer.MAX_VALUE);
diff --git a/src/com/android/tv/dvr/ui/DvrCancelAllSeriesRecordingFragment.java b/src/com/android/tv/dvr/ui/DvrCancelAllSeriesRecordingFragment.java
deleted file mode 100644
index 78f73fd5..00000000
--- a/src/com/android/tv/dvr/ui/DvrCancelAllSeriesRecordingFragment.java
+++ /dev/null
@@ -1,65 +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.app.Activity;
-import android.app.DialogFragment;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.support.v17.leanback.widget.GuidanceStylist;
-import android.support.v17.leanback.widget.GuidedAction;
-
-import com.android.tv.R;
-
-import java.util.List;
-
-/**
- * A fragment which asks the user to cancel all series schedules recordings.
- */
-public class DvrCancelAllSeriesRecordingFragment extends DvrGuidedStepFragment {
- private static final int ACTION_CANCEL_ALL = 1;
- private static final int ACTION_BACK = 2;
-
- @Override
- public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
- String title = getResources().getString(R.string.dvr_series_schedules_dialog_cancel_all);
- Drawable icon = getContext().getDrawable(R.drawable.ic_dvr_delete);
- return new GuidanceStylist.Guidance(title, null, null, icon);
- }
-
- @Override
- public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
- Activity activity = getActivity();
- actions.add(new GuidedAction.Builder(activity)
- .id(ACTION_CANCEL_ALL)
- .title(getResources().getString(R.string.dvr_series_schedules_cancel_all))
- .build());
- actions.add(new GuidedAction.Builder(activity)
- .id(ACTION_BACK)
- .title(getResources().getString(R.string.dvr_series_schedules_dialog_back))
- .build());
- }
-
- @Override
- public void onGuidedActionClicked(GuidedAction action) {
- DvrSchedulesActivity activity = (DvrSchedulesActivity) getActivity();
- if (action.getId() == ACTION_CANCEL_ALL) {
- activity.onCancelAllClicked();
- }
- dismissDialog();
- }
-}
diff --git a/src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java b/src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java
index fe65eebd..837d8ab2 100644
--- a/src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrChannelRecordDurationOptionFragment.java
@@ -26,7 +26,6 @@ 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.DvrManager;
import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.ui.DvrConflictFragment.DvrChannelRecordConflictFragment;
@@ -38,7 +37,6 @@ import java.util.concurrent.TimeUnit;
public class DvrChannelRecordDurationOptionFragment extends DvrGuidedStepFragment {
private final List<Long> mDurations = new ArrayList<>();
private Channel mChannel;
- private Program mProgram;
@Override
public void onCreate(Bundle savedInstanceState) {
diff --git a/src/com/android/tv/dvr/ui/DvrDetailsActivity.java b/src/com/android/tv/dvr/ui/DvrDetailsActivity.java
index b273c85c..806c775c 100644
--- a/src/com/android/tv/dvr/ui/DvrDetailsActivity.java
+++ b/src/com/android/tv/dvr/ui/DvrDetailsActivity.java
@@ -21,6 +21,7 @@ import android.os.Bundle;
import android.support.v17.leanback.app.DetailsFragment;
import com.android.tv.R;
+import com.android.tv.TvApplication;
/**
* Activity to show details view in DVR.
@@ -69,6 +70,7 @@ public class DvrDetailsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
+ TvApplication.setCurrentRunningProcess(this, true);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dvr_details);
long recordId = getIntent().getLongExtra(RECORDING_ID, -1);
diff --git a/src/com/android/tv/dvr/ui/DvrDetailsFragment.java b/src/com/android/tv/dvr/ui/DvrDetailsFragment.java
index be995fcb..21f9c4b4 100644
--- a/src/com/android/tv/dvr/ui/DvrDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrDetailsFragment.java
@@ -17,10 +17,14 @@
package com.android.tv.dvr.ui;
import android.content.Context;
+import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.media.tv.TvContentRating;
+import android.media.tv.TvInputManager;
+import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v17.leanback.app.DetailsFragment;
@@ -36,11 +40,22 @@ import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.TextAppearanceSpan;
+import android.widget.Toast;
import com.android.tv.R;
+import com.android.tv.TvApplication;
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.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;
+import com.android.tv.util.Utils;
+
+import java.io.File;
abstract class DvrDetailsFragment extends DetailsFragment {
private static final int LOAD_LOGO_IMAGE = 1;
@@ -59,6 +74,7 @@ abstract class DvrDetailsFragment extends DetailsFragment {
}
mBackgroundHelper = new DetailsViewBackgroundHelper(getActivity());
setupAdapter();
+ onCreateInternal();
}
@Override
@@ -74,8 +90,8 @@ abstract class DvrDetailsFragment extends DetailsFragment {
}
private void setupAdapter() {
- DetailsOverviewRowPresenter rowPresenter =
- new DetailsOverviewRowPresenter(new DetailsContentPresenter());
+ DetailsOverviewRowPresenter rowPresenter = new DetailsOverviewRowPresenter(
+ new DetailsContentPresenter(getActivity()));
rowPresenter.setBackgroundColor(getResources().getColor(R.color.common_tv_background,
null));
rowPresenter.setSharedElementEnterTransition(getActivity(),
@@ -105,13 +121,22 @@ abstract class DvrDetailsFragment extends DetailsFragment {
/**
* Creates and returns presenter selector will be used by rows adaptor.
*/
- protected PresenterSelector onCreatePresenterSelector(DetailsOverviewRowPresenter rowPresenter) {
+ protected PresenterSelector onCreatePresenterSelector(
+ DetailsOverviewRowPresenter rowPresenter) {
ClassPresenterSelector presenterSelector = new ClassPresenterSelector();
presenterSelector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
return presenterSelector;
}
/**
+ * Does customized initialization of subclasses. Since {@link #onCreate(Bundle)} might finish
+ * activity early when it cannot fetch valid recordings, subclasses' onCreate method should not
+ * do anything after calling {@link #onCreate(Bundle)}. If there's something subclasses have to
+ * do after the super class did onCreate, it should override this method and put the codes here.
+ */
+ protected void onCreateInternal() { }
+
+ /**
* Updates actions of details overview.
*/
protected void updateActions() {
@@ -198,6 +223,84 @@ abstract class DvrDetailsFragment extends DetailsFragment {
}
}
+ protected void startPlayback(RecordedProgram recordedProgram, long seekTimeMs) {
+ if (Utils.isInBundledPackageSet(recordedProgram.getPackageName()) &&
+ !isDataUriAccessible(recordedProgram.getDataUri())) {
+ // Since cleaning RecordedProgram from forgotten storage will take some time,
+ // ignore playback until cleaning is finished.
+ ToastUtils.show(getContext(),
+ getContext().getResources().getString(R.string.dvr_toast_recording_deleted),
+ Toast.LENGTH_SHORT);
+ return;
+ }
+ ParentalControlSettings parental = TvApplication.getSingletons(getActivity())
+ .getTvInputManagerHelper().getParentalControlSettings();
+ if (!parental.isParentalControlsEnabled()) {
+ launchPlaybackActivity(recordedProgram, seekTimeMs, false);
+ return;
+ }
+ ChannelDataManager channelDataManager =
+ TvApplication.getSingletons(getActivity()).getChannelDataManager();
+ Channel channel = channelDataManager.getChannel(recordedProgram.getChannelId());
+ if (channel != null && channel.isLocked()) {
+ checkPinToPlay(recordedProgram, seekTimeMs);
+ return;
+ }
+ String ratingString = recordedProgram.getContentRating();
+ if (TextUtils.isEmpty(ratingString)) {
+ launchPlaybackActivity(recordedProgram, seekTimeMs, false);
+ return;
+ }
+ String[] ratingList = ratingString.split(",");
+ TvContentRating[] programRatings = new TvContentRating[ratingList.length];
+ for (int i = 0; i < ratingList.length; i++) {
+ programRatings[i] = TvContentRating.unflattenFromString(ratingList[i]);
+ }
+ TvContentRating blockRatings = parental.getBlockedRating(programRatings);
+ if (blockRatings != null) {
+ checkPinToPlay(recordedProgram, seekTimeMs);
+ } else {
+ launchPlaybackActivity(recordedProgram, seekTimeMs, false);
+ }
+ }
+
+ private boolean isDataUriAccessible(Uri dataUri) {
+ if (dataUri == null || dataUri.getPath() == null) {
+ return false;
+ }
+ try {
+ File recordedProgramPath = new File(dataUri.getPath());
+ if (recordedProgramPath.exists()) {
+ return true;
+ }
+ } catch (SecurityException e) {
+ }
+ return false;
+ }
+
+ private void checkPinToPlay(RecordedProgram recordedProgram, long seekTimeMs) {
+ new PinDialogFragment(PinDialogFragment.PIN_DIALOG_TYPE_UNLOCK_PROGRAM,
+ new PinDialogFragment.ResultListener() {
+ @Override
+ public void done(boolean success) {
+ if (success) {
+ launchPlaybackActivity(recordedProgram, seekTimeMs, true);
+ }
+ }
+ }).show(getActivity().getFragmentManager(), PinDialogFragment.DIALOG_TAG);
+ }
+
+ private void launchPlaybackActivity(RecordedProgram mRecordedProgram, long seekTimeMs,
+ boolean pinChecked) {
+ Intent intent = new Intent(getActivity(), DvrPlaybackActivity.class);
+ intent.putExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_ID, mRecordedProgram.getId());
+ if (seekTimeMs != TvInputManager.TIME_SHIFT_INVALID_TIME) {
+ intent.putExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_SEEK_TIME, seekTimeMs);
+ }
+ intent.putExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_PIN_CHECKED, pinChecked);
+ getActivity().startActivity(intent);
+ }
+
private static class MyImageLoaderCallback extends
ImageLoader.ImageLoaderCallback<DvrDetailsFragment> {
private final Context mContext;
diff --git a/src/com/android/tv/dvr/ui/DvrForgetStorageErrorFragment.java b/src/com/android/tv/dvr/ui/DvrForgetStorageErrorFragment.java
index 6f287c70..73ddcdd0 100644
--- a/src/com/android/tv/dvr/ui/DvrForgetStorageErrorFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrForgetStorageErrorFragment.java
@@ -28,8 +28,6 @@ import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.ScheduledRecording;
-import com.android.tv.dvr.SeriesRecording;
import java.util.List;
@@ -77,14 +75,7 @@ public class DvrForgetStorageErrorFragment extends DvrGuidedStepFragment {
return;
}
DvrManager dvrManager = TvApplication.getSingletons(getContext()).getDvrManager();
- DvrDataManager dataManager = TvApplication.getSingletons(getContext()).getDvrDataManager();
- List<SeriesRecording> seriesRecordings = dataManager.getSeriesRecordings(mInputId);
- for(SeriesRecording series : seriesRecordings) {
- dvrManager.removeSeriesRecording(series.getId());
- }
- List<ScheduledRecording> scheduledRecordings = dataManager.getScheduledRecordings(mInputId);
- dvrManager.removeScheduledRecording(ScheduledRecording.toArray(scheduledRecordings));
- dvrManager.removeRecordedProgramByMissingStorage(mInputId);
+ dvrManager.forgetStorage(mInputId);
Activity activity = getActivity();
if (activity instanceof DvrDetailsActivity) {
// Since we removed everything, just finish the activity.
diff --git a/src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java b/src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java
index eaccd8ed..d26e6836 100644
--- a/src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrGuidedStepFragment.java
@@ -20,6 +20,7 @@ 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.GuidedAction;
import android.support.v17.leanback.widget.VerticalGridView;
import android.view.LayoutInflater;
import android.view.View;
@@ -30,9 +31,11 @@ import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.dialog.SafeDismissDialogFragment;
import com.android.tv.dvr.DvrManager;
+import com.android.tv.dvr.ui.HalfSizedDialogFragment.OnActionClickListener;
public class DvrGuidedStepFragment extends GuidedStepFragment {
private DvrManager mDvrManager;
+ private OnActionClickListener mOnActionClickListener;
protected DvrManager getDvrManager() {
return mDvrManager;
@@ -60,6 +63,14 @@ public class DvrGuidedStepFragment extends GuidedStepFragment {
return R.style.Theme_TV_Dvr_GuidedStep;
}
+ @Override
+ public void onGuidedActionClicked(GuidedAction action) {
+ if (mOnActionClickListener != null) {
+ mOnActionClickListener.onActionClick(action.getId());
+ }
+ dismissDialog();
+ }
+
protected void dismissDialog() {
if (getActivity() instanceof MainActivity) {
SafeDismissDialogFragment currentDialog =
@@ -71,4 +82,8 @@ public class DvrGuidedStepFragment extends GuidedStepFragment {
((DialogFragment) getParentFragment()).dismiss();
}
}
-}
+
+ protected void setOnActionClickListener(OnActionClickListener listener) {
+ mOnActionClickListener = listener;
+ }
+} \ 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 50187a56..2b132db8 100644
--- a/src/com/android/tv/dvr/ui/DvrHalfSizedDialogFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrHalfSizedDialogFragment.java
@@ -20,17 +20,21 @@ import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.android.tv.MainActivity;
import com.android.tv.R;
-import com.android.tv.data.ParcelableList;
+import com.android.tv.dvr.DvrStorageStatusManager;
import com.android.tv.dvr.ui.DvrConflictFragment.DvrChannelWatchConflictFragment;
import com.android.tv.dvr.ui.DvrConflictFragment.DvrProgramConflictFragment;
import com.android.tv.guide.ProgramGuide;
+import java.util.List;
+
public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
/**
* Key for input ID.
@@ -43,11 +47,6 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
*/
public static final String KEY_PROGRAM = "DvrHalfSizedDialogFragment.program";
/**
- * Key for the programs.
- * Type: {@link ParcelableList}.
- */
- public static final String KEY_PROGRAMS = "DvrHalfSizedDialogFragment.programs";
- /**
* Key for the channel ID.
* Type: long.
*/
@@ -90,23 +89,35 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
}
public abstract static class DvrGuidedStepDialogFragment extends DvrHalfSizedDialogFragment {
+ private DvrGuidedStepFragment mFragment;
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
- GuidedStepFragment fragment = onCreateGuidedStepFragment();
- fragment.setArguments(getArguments());
- GuidedStepFragment.add(getChildFragmentManager(), fragment, R.id.halfsized_dialog_host);
+ mFragment = onCreateGuidedStepFragment();
+ mFragment.setArguments(getArguments());
+ mFragment.setOnActionClickListener(getOnActionClickListener());
+ GuidedStepFragment.add(getChildFragmentManager(),
+ mFragment, R.id.halfsized_dialog_host);
return view;
}
- protected abstract GuidedStepFragment onCreateGuidedStepFragment();
+ @Override
+ public void setOnActionClickListener(OnActionClickListener listener) {
+ super.setOnActionClickListener(listener);
+ if (mFragment != null) {
+ mFragment.setOnActionClickListener(listener);
+ }
+ }
+
+ protected abstract DvrGuidedStepFragment onCreateGuidedStepFragment();
}
/** A dialog fragment for {@link DvrScheduleFragment}. */
public static class DvrScheduleDialogFragment extends DvrGuidedStepDialogFragment {
@Override
- protected GuidedStepFragment onCreateGuidedStepFragment() {
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
return new DvrScheduleFragment();
}
}
@@ -114,7 +125,7 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
/** A dialog fragment for {@link DvrProgramConflictFragment}. */
public static class DvrProgramConflictDialogFragment extends DvrGuidedStepDialogFragment {
@Override
- protected GuidedStepFragment onCreateGuidedStepFragment() {
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
return new DvrProgramConflictFragment();
}
}
@@ -122,7 +133,7 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
/** A dialog fragment for {@link DvrChannelWatchConflictFragment}. */
public static class DvrChannelWatchConflictDialogFragment extends DvrGuidedStepDialogFragment {
@Override
- protected GuidedStepFragment onCreateGuidedStepFragment() {
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
return new DvrChannelWatchConflictFragment();
}
}
@@ -131,7 +142,7 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
public static class DvrChannelRecordDurationOptionDialogFragment
extends DvrGuidedStepDialogFragment {
@Override
- protected GuidedStepFragment onCreateGuidedStepFragment() {
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
return new DvrChannelRecordDurationOptionFragment();
}
}
@@ -140,7 +151,7 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
public static class DvrInsufficientSpaceErrorDialogFragment
extends DvrGuidedStepDialogFragment {
@Override
- protected GuidedStepFragment onCreateGuidedStepFragment() {
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
return new DvrInsufficientSpaceErrorFragment();
}
}
@@ -149,15 +160,52 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
public static class DvrMissingStorageErrorDialogFragment
extends DvrGuidedStepDialogFragment {
@Override
- protected GuidedStepFragment onCreateGuidedStepFragment() {
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
return new DvrMissingStorageErrorFragment();
}
}
+ /**
+ * A dialog fragment to show error message when the current storage is too small to
+ * support DVR
+ */
+ public static class DvrSmallSizedStorageErrorDialogFragment
+ extends DvrGuidedStepDialogFragment {
+ @Override
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
+ return new DvrGuidedStepFragment() {
+ @Override
+ public Guidance onCreateGuidance(Bundle savedInstanceState) {
+ String title = getResources().getString(
+ R.string.dvr_error_small_sized_storage_title);
+ String description = getResources().getString(
+ R.string.dvr_error_small_sized_storage_description,
+ DvrStorageStatusManager.MIN_STORAGE_SIZE_FOR_DVR_IN_BYTES / 1024
+ / 1024 / 1024);
+ return new Guidance(title, description, null, null);
+ }
+
+ @Override
+ public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+ Activity activity = getActivity();
+ actions.add(new GuidedAction.Builder(activity)
+ .id(GuidedAction.ACTION_ID_OK)
+ .title(android.R.string.ok)
+ .build());
+ }
+
+ @Override
+ public void onGuidedActionClicked(GuidedAction action) {
+ dismissDialog();
+ }
+ };
+ }
+ }
+
/** A dialog fragment for {@link DvrStopRecordingFragment}. */
public static class DvrStopRecordingDialogFragment extends DvrGuidedStepDialogFragment {
@Override
- protected GuidedStepFragment onCreateGuidedStepFragment() {
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
return new DvrStopRecordingFragment();
}
}
@@ -165,7 +213,7 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
/** A dialog fragment for {@link DvrAlreadyScheduledFragment}. */
public static class DvrAlreadyScheduledDialogFragment extends DvrGuidedStepDialogFragment {
@Override
- protected GuidedStepFragment onCreateGuidedStepFragment() {
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
return new DvrAlreadyScheduledFragment();
}
}
@@ -173,8 +221,8 @@ public class DvrHalfSizedDialogFragment extends HalfSizedDialogFragment {
/** A dialog fragment for {@link DvrAlreadyRecordedFragment}. */
public static class DvrAlreadyRecordedDialogFragment extends DvrGuidedStepDialogFragment {
@Override
- protected GuidedStepFragment onCreateGuidedStepFragment() {
+ protected DvrGuidedStepFragment onCreateGuidedStepFragment() {
return new DvrAlreadyRecordedFragment();
}
}
-}
+} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/DvrItemPresenter.java b/src/com/android/tv/dvr/ui/DvrItemPresenter.java
new file mode 100644
index 00000000..339e5d2f
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/DvrItemPresenter.java
@@ -0,0 +1,80 @@
+/*
+ * 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.support.annotation.CallSuper;
+import android.support.v17.leanback.widget.Presenter;
+import android.view.View;
+import android.view.View.OnClickListener;
+
+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 ScheduledRecording},
+ * {@link RecordedProgram}, and {@link SeriesRecording}.
+ */
+public abstract class DvrItemPresenter extends Presenter {
+ private final Set<ViewHolder> mBoundViewHolders = new HashSet<>();
+ private final OnClickListener mOnClickListener = onCreateOnClickListener();
+
+ @Override
+ @CallSuper
+ public void onBindViewHolder(ViewHolder viewHolder, Object o) {
+ viewHolder.view.setTag(o);
+ viewHolder.view.setOnClickListener(mOnClickListener);
+ mBoundViewHolders.add(viewHolder);
+ }
+
+ @Override
+ @CallSuper
+ public void onUnbindViewHolder(ViewHolder viewHolder) {
+ mBoundViewHolders.remove(viewHolder);
+ }
+
+ /**
+ * Unbinds all bound view holders.
+ */
+ public void unbindAllViewHolders() {
+ // When browse fragments are destroyed, RecyclerView would not call presenters'
+ // onUnbindViewHolder(). We should handle it by ourselves to prevent resources leaks.
+ for (ViewHolder viewHolder : new HashSet<>(mBoundViewHolders)) {
+ onUnbindViewHolder(viewHolder);
+ }
+ }
+
+ /**
+ * Creates {@link OnClickListener} for DVR library's card views.
+ */
+ protected OnClickListener onCreateOnClickListener() {
+ return new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (view instanceof RecordingCardView) {
+ RecordingCardView v = (RecordingCardView) view;
+ DvrUiHelper.startDetailsActivity((Activity) v.getContext(),
+ v.getTag(), v.getImageView(), false);
+ }
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/DvrPlaybackCardPresenter.java b/src/com/android/tv/dvr/ui/DvrPlaybackCardPresenter.java
index 7be92f1e..8c4c856c 100644
--- a/src/com/android/tv/dvr/ui/DvrPlaybackCardPresenter.java
+++ b/src/com/android/tv/dvr/ui/DvrPlaybackCardPresenter.java
@@ -22,6 +22,7 @@ import android.content.res.Resources;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.android.tv.R;
@@ -36,8 +37,6 @@ public class DvrPlaybackCardPresenter extends RecordedProgramPresenter {
private static final String TAG = "DvrPlaybackCardPresenter";
private static final boolean DEBUG = false;
- private int mSelectedBackgroundColor = -1;
- private int mDefaultBackgroundColor = -1;
private final int mRelatedRecordingCardWidth;
private final int mRelatedRecordingCardHeight;
@@ -58,12 +57,17 @@ public class DvrPlaybackCardPresenter extends RecordedProgramPresenter {
}
@Override
- public void onClick(View v) {
- long programId = (long) v.getTag();
- if (DEBUG) Log.d(TAG, "Play Related Recording:" + programId);
- Intent intent = new Intent(getContext(), DvrPlaybackActivity.class);
- intent.putExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_ID, programId);
- getContext().startActivity(intent);
+ protected OnClickListener onCreateOnClickListener() {
+ return new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ long programId = ((RecordedProgram) v.getTag()).getId();
+ if (DEBUG) Log.d(TAG, "Play Related Recording:" + programId);
+ Intent intent = new Intent(getContext(), DvrPlaybackActivity.class);
+ intent.putExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_ID, programId);
+ getContext().startActivity(intent);
+ }
+ };
}
@Override
diff --git a/src/com/android/tv/dvr/ui/DvrPlaybackControlHelper.java b/src/com/android/tv/dvr/ui/DvrPlaybackControlHelper.java
index 1a3ae43c..0bc4ecb1 100644
--- a/src/com/android/tv/dvr/ui/DvrPlaybackControlHelper.java
+++ b/src/com/android/tv/dvr/ui/DvrPlaybackControlHelper.java
@@ -126,6 +126,13 @@ public class DvrPlaybackControlHelper extends PlaybackControlGlue {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (mReadyToControl) {
+ if (keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE && event.getAction() == KeyEvent.ACTION_DOWN
+ && (mPlaybackState == PlaybackState.STATE_FAST_FORWARDING
+ || mPlaybackState == PlaybackState.STATE_REWINDING)) {
+ // Workaround of b/31489271. Clicks play/pause button first to reset play controls
+ // to "play" state. Then we can pass MEDIA_PAUSE to let playback be paused.
+ onActionClicked(getControlsRow().getActionForKeyCode(keyCode));
+ }
return super.onKey(v, keyCode, event);
}
return false;
@@ -134,10 +141,7 @@ public class DvrPlaybackControlHelper extends PlaybackControlGlue {
@Override
public boolean hasValidMedia() {
PlaybackState playbackState = mMediaController.getPlaybackState();
- if (playbackState == null) {
- return false;
- }
- return true;
+ return playbackState != null;
}
@Override
diff --git a/src/com/android/tv/dvr/ui/DvrPlaybackOverlayFragment.java b/src/com/android/tv/dvr/ui/DvrPlaybackOverlayFragment.java
index 9184f4f7..51ec93b8 100644
--- a/src/com/android/tv/dvr/ui/DvrPlaybackOverlayFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrPlaybackOverlayFragment.java
@@ -33,6 +33,7 @@ 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;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
@@ -42,6 +43,7 @@ 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;
@@ -63,7 +65,8 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
private DvrPlaybackMediaSessionHelper mMediaSessionHelper;
private DvrPlaybackControlHelper mPlaybackControlHelper;
private ArrayObjectAdapter mRowsAdapter;
- private ArrayObjectAdapter mRelatedRecordingsRowAdapter;
+ private SortedArrayAdapter<BaseProgram> mRelatedRecordingsRowAdapter;
+ private DvrPlaybackCardPresenter mRelatedRecordingCardPresenter;
private DvrDataManager mDvrDataManager;
private ContentRatingsManager mContentRatingsManager;
private TvView mTvView;
@@ -108,7 +111,7 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
mTvView = (TvView) getActivity().findViewById(R.id.dvr_tv_view);
mBlockScreenView = getActivity().findViewById(R.id.block_screen);
mMediaSessionHelper = new DvrPlaybackMediaSessionHelper(
- getActivity(), MEDIA_SESSION_TAG, new DvrPlayer(mTvView));
+ getActivity(), MEDIA_SESSION_TAG, new DvrPlayer(mTvView), this);
mPlaybackControlHelper = new DvrPlaybackControlHelper(getActivity(), this);
setUpRows();
preparePlayback(getActivity().getIntent());
@@ -166,9 +169,10 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
@Override
public void onDestroy() {
if (DEBUG) Log.d(TAG, "onDestroy");
- super.onDestroy();
mPlaybackControlHelper.unregisterCallback();
mMediaSessionHelper.release();
+ mRelatedRecordingCardPresenter.unbindAllViewHolders();
+ super.onDestroy();
}
/**
@@ -196,6 +200,15 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
updateAspectRatio(mAppliedAspectRatio);
}
+ public RecordedProgram getNextEpisode(RecordedProgram program) {
+ int position = mRelatedRecordingsRowAdapter.findInsertPosition(program);
+ if (position == mRelatedRecordingsRowAdapter.size()) {
+ return null;
+ } else {
+ return (RecordedProgram) mRelatedRecordingsRowAdapter.get(position);
+ }
+ }
+
void onMediaControllerUpdated() {
mRowsAdapter.notifyArrayItemRangeChanged(0, 1);
}
@@ -261,8 +274,8 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
}
private ListRow getRelatedRecordingsRow() {
- mRelatedRecordingsRowAdapter =
- new ArrayObjectAdapter(new DvrPlaybackCardPresenter(getActivity()));
+ mRelatedRecordingCardPresenter = new DvrPlaybackCardPresenter(getActivity());
+ mRelatedRecordingsRowAdapter = new RelatedRecordingsAdapter(mRelatedRecordingCardPresenter);
HeaderItem header = new HeaderItem(0,
getActivity().getString(R.string.dvr_playback_related_recordings));
return new ListRow(header, mRelatedRecordingsRowAdapter);
@@ -277,4 +290,15 @@ public class DvrPlaybackOverlayFragment extends PlaybackOverlayFragment {
return intent.getLongExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_SEEK_TIME,
TvInputManager.TIME_SHIFT_INVALID_TIME);
}
+
+ private class RelatedRecordingsAdapter extends SortedArrayAdapter<BaseProgram> {
+ RelatedRecordingsAdapter(DvrPlaybackCardPresenter presenter) {
+ super(new SinglePresenterSelector(presenter), BaseProgram.EPISODE_COMPARATOR);
+ }
+
+ @Override
+ long getId(BaseProgram item) {
+ return item.getId();
+ }
+ }
} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/DvrScheduleFragment.java b/src/com/android/tv/dvr/ui/DvrScheduleFragment.java
index a907b198..da6d1637 100644
--- a/src/com/android/tv/dvr/ui/DvrScheduleFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrScheduleFragment.java
@@ -17,7 +17,6 @@
package com.android.tv.dvr.ui;
import android.annotation.TargetApi;
-import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
@@ -27,7 +26,6 @@ import android.support.v17.leanback.app.GuidedStepFragment;
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;
@@ -37,10 +35,10 @@ import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.DvrUiHelper;
import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.SeriesRecording;
-import com.android.tv.dvr.SeriesRecordingScheduler.ProgramLoadCallback;
import com.android.tv.dvr.ui.DvrConflictFragment.DvrProgramConflictFragment;
import com.android.tv.util.Utils;
+import java.util.Collections;
import java.util.List;
/**
@@ -50,6 +48,8 @@ import java.util.List;
*/
@TargetApi(Build.VERSION_CODES.N)
public class DvrScheduleFragment extends DvrGuidedStepFragment {
+ private static final String TAG = "DvrScheduleFragment";
+
private static final int ACTION_RECORD_EPISODE = 1;
private static final int ACTION_RECORD_SERIES = 2;
@@ -62,8 +62,12 @@ public class DvrScheduleFragment extends DvrGuidedStepFragment {
mProgram = args.getParcelable(DvrHalfSizedDialogFragment.KEY_PROGRAM);
}
DvrManager dvrManager = TvApplication.getSingletons(getContext()).getDvrManager();
- SoftPreconditions.checkArgument(mProgram != null && mProgram.isEpisodic()
- && dvrManager.getSeriesRecording(mProgram) == null);
+ SoftPreconditions.checkArgument(mProgram != null && mProgram.isEpisodic(), TAG,
+ "The program should be episodic: " + mProgram);
+ SeriesRecording seriesRecording = dvrManager.getSeriesRecording(mProgram);
+ SoftPreconditions.checkArgument(seriesRecording == null
+ || seriesRecording.isStopped(), TAG,
+ "The series recording should be stopped or null: " + seriesRecording);
super.onCreate(savedInstanceState);
}
@@ -122,19 +126,22 @@ public class DvrScheduleFragment extends DvrGuidedStepFragment {
R.id.halfsized_dialog_host);
}
} else if (action.getId() == ACTION_RECORD_SERIES) {
- ProgressDialog dialog = ProgressDialog.show(getContext(), null,
- getString(R.string.dvr_schedule_progress_message_reading_programs));
- getDvrManager().queryProgramsForSeries(mProgram, new ProgramLoadCallback() {
- @Override
- public void onProgramLoadFinished(@NonNull List<Program> programs) {
- dialog.dismiss();
- // TODO: Create series recording in series settings fragment.
- SeriesRecording seriesRecording =
- getDvrManager().addSeriesRecording(mProgram, programs);
- DvrUiHelper.startSeriesSettingsActivity(getContext(), seriesRecording.getId());
- dismissDialog();
- }
- });
+ SeriesRecording seriesRecording = TvApplication.getSingletons(getContext())
+ .getDvrDataManager().getSeriesRecording(mProgram.getSeriesId());
+ if (seriesRecording == null) {
+ seriesRecording = getDvrManager().addSeriesRecording(mProgram,
+ Collections.emptyList(), SeriesRecording.STATE_SERIES_STOPPED);
+ } else {
+ // Reset priority to the highest.
+ seriesRecording = SeriesRecording.buildFrom(seriesRecording)
+ .setPriority(TvApplication.getSingletons(getContext())
+ .getDvrScheduleManager().suggestNewSeriesPriority())
+ .build();
+ getDvrManager().updateSeriesRecording(seriesRecording);
+ }
+ DvrUiHelper.startSeriesSettingsActivity(getContext(),
+ seriesRecording.getId(), null, true, true, true);
+ dismissDialog();
}
}
}
diff --git a/src/com/android/tv/dvr/ui/DvrSchedulesActivity.java b/src/com/android/tv/dvr/ui/DvrSchedulesActivity.java
index 316cb381..f6e6ac26 100644
--- a/src/com/android/tv/dvr/ui/DvrSchedulesActivity.java
+++ b/src/com/android/tv/dvr/ui/DvrSchedulesActivity.java
@@ -17,16 +17,24 @@
package com.android.tv.dvr.ui;
import android.app.Activity;
+import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.annotation.IntDef;
-import android.support.v17.leanback.app.DetailsFragment;
import com.android.tv.R;
+import com.android.tv.TvApplication;
+import com.android.tv.data.Program;
+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;
/**
* Activity to show the list of recording schedules.
@@ -49,46 +57,48 @@ public class DvrSchedulesActivity extends Activity {
* A type which means the activity will display a scheduled recording list of a series
* recording.
*/
- public final static int TYPE_SERIES_SCHEDULE = 1;
-
- private Runnable mCancelAllClickedRunnable;
+ public static final int TYPE_SERIES_SCHEDULE = 1;
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public void onCreate(final Bundle savedInstanceState) {
+ TvApplication.setCurrentRunningProcess(this, true);
+ // Pass null to prevent automatically re-creating fragments
+ super.onCreate(null);
setContentView(R.layout.activity_dvr_schedules);
- if (savedInstanceState == null) {
- int schedulesType = getIntent().getIntExtra(KEY_SCHEDULES_TYPE, TYPE_FULL_SCHEDULE);
- DetailsFragment schedulesFragment = null;
- if (schedulesType == TYPE_FULL_SCHEDULE) {
- schedulesFragment = new DvrSchedulesFragment();
- schedulesFragment.setArguments(getIntent().getExtras());
- } else if (schedulesType == TYPE_SERIES_SCHEDULE) {
- schedulesFragment = new DvrSeriesSchedulesFragment();
- schedulesFragment.setArguments(getIntent().getExtras());
- }
- if (schedulesFragment != null) {
- getFragmentManager().beginTransaction().add(
- R.id.fragment_container, schedulesFragment).commit();
- } else {
- finish();
- }
- }
- }
-
- /**
- * Sets cancel all runnable which will implement operations after clicking cancel all dialog.
- */
- public void setCancelAllClickedRunnable(Runnable cancelAllClickedRunnable) {
- mCancelAllClickedRunnable = cancelAllClickedRunnable;
- }
-
- /**
- * Operations after clicking the cancel all.
- */
- public void onCancelAllClicked() {
- if (mCancelAllClickedRunnable != null) {
- mCancelAllClickedRunnable.run();
+ int scheduleType = getIntent().getIntExtra(KEY_SCHEDULES_TYPE, TYPE_FULL_SCHEDULE);
+ if (scheduleType == TYPE_FULL_SCHEDULE) {
+ DvrSchedulesFragment schedulesFragment = new DvrSchedulesFragment();
+ schedulesFragment.setArguments(getIntent().getExtras());
+ getFragmentManager().beginTransaction().add(
+ R.id.fragment_container, schedulesFragment).commit();
+ } else if (scheduleType == TYPE_SERIES_SCHEDULE) {
+ 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();
}
}
}
diff --git a/src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java b/src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java
index ab695234..f57e4b05 100644
--- a/src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java
+++ b/src/com/android/tv/dvr/ui/DvrSeriesDeletionActivity.java
@@ -37,6 +37,7 @@ public class DvrSeriesDeletionActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
+ TvApplication.setCurrentRunningProcess(this, true);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dvr_series_settings);
// Check savedInstanceState to prevent that activity is being showed with animation.
diff --git a/src/com/android/tv/dvr/ui/DvrSeriesScheduledDialogActivity.java b/src/com/android/tv/dvr/ui/DvrSeriesScheduledDialogActivity.java
new file mode 100644
index 00000000..1a0d13d3
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/DvrSeriesScheduledDialogActivity.java
@@ -0,0 +1,48 @@
+/*
+ * 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.v17.leanback.app.GuidedStepFragment;
+
+import com.android.tv.R;
+
+public class DvrSeriesScheduledDialogActivity extends Activity {
+ /**
+ * Name of series recording id added to the Intent.
+ */
+ public static final String SERIES_RECORDING_ID = "series_recording_id";
+
+ /**
+ * Name of flag to check if the dialog should show view schedule option.
+ */
+ public static final String SHOW_VIEW_SCHEDULE_OPTION = "show_view_schedule_option";
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.halfsized_dialog);
+ if (savedInstanceState == null) {
+ DvrSeriesScheduledFragment dvrSeriesScheduledFragment =
+ new DvrSeriesScheduledFragment();
+ dvrSeriesScheduledFragment.setArguments(getIntent().getExtras());
+ GuidedStepFragment.addAsRoot(this, dvrSeriesScheduledFragment,
+ R.id.halfsized_dialog_host);
+ }
+ }
+}
diff --git a/src/com/android/tv/dvr/ui/DvrSeriesScheduledFragment.java b/src/com/android/tv/dvr/ui/DvrSeriesScheduledFragment.java
new file mode 100644
index 00000000..1173df46
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/DvrSeriesScheduledFragment.java
@@ -0,0 +1,154 @@
+/*
+ * 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.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+
+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.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
+import com.android.tv.dvr.ui.list.DvrSeriesSchedulesFragment;
+
+import java.util.List;
+
+public class DvrSeriesScheduledFragment extends DvrGuidedStepFragment {
+ 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 int mSchedulesAddedCount = 0;
+ private boolean mHasConflict = false;
+ private int mInThisSeriesConflictCount = 0;
+ private int mOutThisSeriesConflictCount = 0;
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ long seriesRecordingId = getArguments().getLong(
+ DvrSeriesScheduledDialogActivity.SERIES_RECORDING_ID, SERIES_RECORDING_ID_NOT_SET);
+ if (seriesRecordingId == SERIES_RECORDING_ID_NOT_SET) {
+ getActivity().finish();
+ return;
+ }
+ 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;
+ }
+ mSchedulesAddedCount = TvApplication.getSingletons(getContext()).getDvrManager()
+ .getAvailableScheduledRecording(mSeriesRecording.getId()).size();
+ List<ScheduledRecording> conflictingRecordings =
+ mDvrScheduleManager.getConflictingSchedules(mSeriesRecording);
+ mHasConflict = !conflictingRecordings.isEmpty();
+ for (ScheduledRecording recording : conflictingRecordings) {
+ if (recording.getSeriesRecordingId() == mSeriesRecording.getId()) {
+ ++mInThisSeriesConflictCount;
+ } else {
+ ++mOutThisSeriesConflictCount;
+ }
+ }
+ }
+
+ @Override
+ public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+ String title = getString(R.string.dvr_series_recording_dialog_title);
+ Drawable icon;
+ if (!mHasConflict) {
+ icon = getResources().getDrawable(R.drawable.ic_check_circle_white_48dp, null);
+ } else {
+ icon = getResources().getDrawable(R.drawable.ic_error_white_48dp, null);
+ }
+ return new GuidanceStylist.Guidance(title, getDescription(), null, icon);
+ }
+
+ @Override
+ public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+ Context context = getContext();
+ actions.add(new GuidedAction.Builder(context)
+ .clickAction(GuidedAction.ACTION_ID_OK)
+ .build());
+ if (mShowViewScheduleOption) {
+ actions.add(new GuidedAction.Builder(context)
+ .id(ACTION_VIEW_SCHEDULES)
+ .title(R.string.dvr_action_view_schedules)
+ .build());
+ }
+ }
+
+ @Override
+ public void onGuidedActionClicked(GuidedAction action) {
+ if (action.getId() == ACTION_VIEW_SCHEDULES) {
+ Intent intent = new Intent(getActivity(), DvrSchedulesActivity.class);
+ intent.putExtra(DvrSchedulesActivity.KEY_SCHEDULES_TYPE, DvrSchedulesActivity
+ .TYPE_SERIES_SCHEDULE);
+ intent.putExtra(DvrSeriesSchedulesFragment.SERIES_SCHEDULES_KEY_SERIES_RECORDING,
+ mSeriesRecording);
+ startActivity(intent);
+ }
+ getActivity().finish();
+ }
+
+ private String getDescription() {
+ if (!mHasConflict) {
+ return getResources().getQuantityString(
+ 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_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,
+ mSchedulesAddedCount, mSchedulesAddedCount, mSeriesRecording.getTitle(),
+ mInThisSeriesConflictCount);
+ } else {
+ if (mOutThisSeriesConflictCount == 1) {
+ 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_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 2af78081..3f7671b3 100644
--- a/src/com/android/tv/dvr/ui/DvrSeriesSettingsActivity.java
+++ b/src/com/android/tv/dvr/ui/DvrSeriesSettingsActivity.java
@@ -17,13 +17,14 @@
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;
import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.common.SoftPreconditions;
-import com.android.tv.ui.sidepanel.SettingsFragment;
/**
* Activity to show details view in DVR.
@@ -31,22 +32,51 @@ import com.android.tv.ui.sidepanel.SettingsFragment;
public class DvrSeriesSettingsActivity extends Activity {
/**
* Name of series id added to the Intent.
+ * Type: Long
*/
public static final String SERIES_RECORDING_ID = "series_recording_id";
+ /**
+ * Name of the boolean flag to decide if the series recording with empty schedule and recording
+ * will be removed.
+ */
+ 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.
+ */
+ public static final String IS_WINDOW_TRANSLUCENT = "windows_translucent";
+ /**
+ * 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 CHANNEL_ID_LIST = "channel_id_list";
+
+ /**
+ * Name of the boolean flag to check if the confirm dialog should show view schedule option.
+ */
+ public static final String SHOW_VIEW_SCHEDULE_OPTION_IN_DIALOG =
+ "show_view_schedule_option_in_dialog";
@Override
public void onCreate(Bundle savedInstanceState) {
+ TvApplication.setCurrentRunningProcess(this, true);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dvr_series_settings);
long seriesRecordingId = getIntent().getLongExtra(SERIES_RECORDING_ID, -1);
SoftPreconditions.checkArgument(seriesRecordingId != -1);
if (savedInstanceState == null) {
- Bundle args = new Bundle();
- args.putLong(SeriesSettingsFragment.SERIES_RECORDING_ID, seriesRecordingId);
SeriesSettingsFragment settingFragment = new SeriesSettingsFragment();
- settingFragment.setArguments(args);
+ settingFragment.setArguments(getIntent().getExtras());
GuidedStepFragment.addAsRoot(this, settingFragment, R.id.dvr_settings_view_frame);
}
}
-}
+
+ @Override
+ public void onAttachedToWindow() {
+ if (!getIntent().getExtras().getBoolean(IS_WINDOW_TRANSLUCENT, true)) {
+ getWindow().setBackgroundDrawable(
+ new ColorDrawable(getColor(R.color.common_tv_background)));
+ }
+ }
+} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java b/src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java
index c0e21a18..c3867886 100644
--- a/src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrStopRecordingFragment.java
@@ -21,16 +21,22 @@ import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
+import android.support.annotation.IntDef;
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.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.ScheduledRecording;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
@@ -41,10 +47,33 @@ import java.util.List;
*/
@TargetApi(Build.VERSION_CODES.N)
public class DvrStopRecordingFragment extends DvrGuidedStepFragment {
- private static final int ACTION_STOP = 1;
+ /**
+ * The action ID for the stop action.
+ */
+ public static final int ACTION_STOP = 1;
+ /**
+ * Key for the program.
+ * Type: {@link com.android.tv.data.Program}.
+ */
+ public static final String KEY_REASON = "DvrStopRecordingFragment.type";
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({REASON_USER_STOP, REASON_ON_CONFLICT})
+ public @interface ReasonType {}
+ /**
+ * The dialog is shown because users want to stop some currently recording program.
+ */
+ public static final int REASON_USER_STOP = 1;
+ /**
+ * The dialog is shown because users want to record some program that is conflict to the
+ * current recording program.
+ */
+ public static final int REASON_ON_CONFLICT = 2;
private ScheduledRecording mSchedule;
private DvrDataManager mDvrDataManager;
+ private @ReasonType int mStopReason;
+
private final ScheduledRecordingListener mScheduledRecordingListener =
new ScheduledRecordingListener() {
@Override
@@ -85,6 +114,7 @@ public class DvrStopRecordingFragment extends DvrGuidedStepFragment {
}
mDvrDataManager = TvApplication.getSingletons(context).getDvrDataManager();
mDvrDataManager.addScheduledRecordingListener(mScheduledRecordingListener);
+ mStopReason = args.getInt(KEY_REASON);
}
@Override
@@ -99,7 +129,20 @@ public class DvrStopRecordingFragment extends DvrGuidedStepFragment {
@Override
public Guidance onCreateGuidance(Bundle savedInstanceState) {
String title = getString(R.string.dvr_stop_recording_dialog_title);
- String description = getString(R.string.dvr_stop_recording_dialog_description);
+ 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.getProgramTitle());
+ } else {
+ description = getString(R.string.dvr_stop_recording_dialog_description);
+ }
Drawable image = getResources().getDrawable(R.drawable.ic_warning_white_96dp, null);
return new Guidance(title, description, null, image);
}
@@ -115,12 +158,4 @@ public class DvrStopRecordingFragment extends DvrGuidedStepFragment {
.clickAction(GuidedAction.ACTION_ID_CANCEL)
.build());
}
-
- @Override
- public void onGuidedActionClicked(GuidedAction action) {
- if (action.getId() == ACTION_STOP) {
- getDvrManager().stopRecording(mSchedule);
- }
- dismissDialog();
- }
-}
+} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/DvrCancelAllSeriesRecordingDialogFragment.java b/src/com/android/tv/dvr/ui/DvrStopSeriesRecordingDialogFragment.java
index d1cf57a6..5b880bd6 100644
--- a/src/com/android/tv/dvr/ui/DvrCancelAllSeriesRecordingDialogFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrStopSeriesRecordingDialogFragment.java
@@ -26,16 +26,16 @@ import android.view.ViewGroup;
import com.android.tv.R;
/**
- * A dialog fragment which contains {@link DvrCancelAllSeriesRecordingFragment}.
+ * A dialog fragment which contains {@link DvrStopSeriesRecordingFragment}.
*/
-public class DvrCancelAllSeriesRecordingDialogFragment extends DialogFragment {
+public class DvrStopSeriesRecordingDialogFragment extends DialogFragment {
public static final String DIALOG_TAG = "dialog_tag";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.halfsized_dialog, container, false);
- GuidedStepFragment fragment = new DvrCancelAllSeriesRecordingFragment();
+ GuidedStepFragment fragment = new DvrStopSeriesRecordingFragment();
fragment.setArguments(getArguments());
GuidedStepFragment.add(getChildFragmentManager(), fragment, R.id.halfsized_dialog_host);
return view;
diff --git a/src/com/android/tv/dvr/ui/DvrStopSeriesRecordingFragment.java b/src/com/android/tv/dvr/ui/DvrStopSeriesRecordingFragment.java
new file mode 100644
index 00000000..feaa2357
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/DvrStopSeriesRecordingFragment.java
@@ -0,0 +1,104 @@
+/*
+ * 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.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.tv.ApplicationSingletons;
+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.ScheduledRecording;
+import com.android.tv.dvr.SeriesRecording;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A fragment which asks the user to stop series recording.
+ */
+public class DvrStopSeriesRecordingFragment extends DvrGuidedStepFragment {
+ /**
+ * Key for the series recording to be stopped.
+ */
+ public static final String KEY_SERIES_RECORDING = "key_series_recoridng";
+
+ private static final int ACTION_STOP_SERIES_RECORDING = 1;
+
+ private SeriesRecording mSeriesRecording;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ mSeriesRecording = getArguments().getParcelable(KEY_SERIES_RECORDING);
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+
+ @NonNull
+ @Override
+ public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+ String title = getString(R.string.dvr_series_schedules_stop_dialog_title);
+ String description = getString(R.string.dvr_series_schedules_stop_dialog_description);
+ Drawable icon = getContext().getDrawable(R.drawable.ic_dvr_delete);
+ return new GuidanceStylist.Guidance(title, description, null, icon);
+ }
+
+ @Override
+ public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
+ Activity activity = getActivity();
+ actions.add(new GuidedAction.Builder(activity)
+ .id(ACTION_STOP_SERIES_RECORDING)
+ .title(R.string.dvr_series_schedules_stop_dialog_action_stop)
+ .build());
+ actions.add(new GuidedAction.Builder(activity)
+ .clickAction(GuidedAction.ACTION_ID_CANCEL)
+ .build());
+ }
+
+ @Override
+ public void onGuidedActionClicked(GuidedAction action) {
+ if (action.getId() == ACTION_STOP_SERIES_RECORDING) {
+ ApplicationSingletons singletons = TvApplication.getSingletons(getContext());
+ DvrManager dvrManager = singletons.getDvrManager();
+ DvrDataManager dataManager = singletons.getDvrDataManager();
+ List<ScheduledRecording> toDelete = new ArrayList<>();
+ for (ScheduledRecording r : dataManager.getAvailableScheduledRecordings()) {
+ if (r.getSeriesRecordingId() == mSeriesRecording.getId()) {
+ if (r.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED) {
+ toDelete.add(r);
+ } else {
+ dvrManager.stopRecording(r);
+ }
+ }
+ }
+ if (!toDelete.isEmpty()) {
+ dvrManager.forceRemoveScheduledRecording(ScheduledRecording.toArray(toDelete));
+ }
+ dvrManager.updateSeriesRecording(SeriesRecording.buildFrom(mSeriesRecording)
+ .setState(SeriesRecording.STATE_SERIES_STOPPED).build());
+ }
+ dismissDialog();
+ }
+}
diff --git a/src/com/android/tv/dvr/ui/HalfSizedDialogFragment.java b/src/com/android/tv/dvr/ui/HalfSizedDialogFragment.java
index fcf0925b..d320816e 100644
--- a/src/com/android/tv/dvr/ui/HalfSizedDialogFragment.java
+++ b/src/com/android/tv/dvr/ui/HalfSizedDialogFragment.java
@@ -35,6 +35,8 @@ public class HalfSizedDialogFragment extends SafeDismissDialogFragment {
private static final long AUTO_DISMISS_TIME_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(30);
+ private OnActionClickListener mOnActionClickListener;
+
private Handler mHandler = new Handler();
private Runnable mAutoDismisser = new Runnable() {
@Override
@@ -63,6 +65,16 @@ public class HalfSizedDialogFragment extends SafeDismissDialogFragment {
}
@Override
+ public void onPause() {
+ super.onPause();
+ if (mOnActionClickListener != null) {
+ // Dismisses the dialog to prevent the callback being forgotten during
+ // fragment re-creating.
+ dismiss();
+ }
+ }
+
+ @Override
public void onStop() {
super.onStop();
mHandler.removeCallbacks(mAutoDismisser);
@@ -77,4 +89,29 @@ public class HalfSizedDialogFragment extends SafeDismissDialogFragment {
public String getTrackerLabel() {
return TRACKER_LABEL;
}
+
+ /**
+ * Sets {@link OnActionClickListener} for the dialog fragment. If listener is set, the dialog
+ * will be automatically closed when it's paused to prevent the fragment being re-created by
+ * the framework, which will result the listener being forgotten.
+ */
+ public void setOnActionClickListener(OnActionClickListener listener) {
+ mOnActionClickListener = listener;
+ }
+
+ /**
+ * Returns {@link OnActionClickListener} for sub-classes or any inner fragments.
+ */
+ protected OnActionClickListener getOnActionClickListener() {
+ return mOnActionClickListener;
+ }
+
+ /**
+ * An interface to provide callbacks for half-sized dialogs. Subclasses or inner fragments
+ * should invoke {@link OnActionClickListener#onActionClick(long)} and provide the identifier
+ * of the action user clicked.
+ */
+ public interface OnActionClickListener {
+ void onActionClick(long actionId);
+ }
} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/PrioritySettingsFragment.java b/src/com/android/tv/dvr/ui/PrioritySettingsFragment.java
index 9f78985f..158bd824 100644
--- a/src/com/android/tv/dvr/ui/PrioritySettingsFragment.java
+++ b/src/com/android/tv/dvr/ui/PrioritySettingsFragment.java
@@ -52,7 +52,6 @@ public class PrioritySettingsFragment extends GuidedStepFragment {
// button action's IDs are negative.
private static final long ACTION_ID_SAVE = -100L;
- private DvrDataManager mDvrDataManager;
private final List<SeriesRecording> mSeriesRecordings = new ArrayList<>();
private SeriesRecording mSelectedRecording;
@@ -64,23 +63,23 @@ public class PrioritySettingsFragment extends GuidedStepFragment {
@Override
public void onAttach(Context context) {
super.onAttach(context);
- mDvrDataManager = TvApplication.getSingletons(context).getDvrDataManager();
mSeriesRecordings.clear();
mSeriesRecordings.add(new SeriesRecording.Builder()
.setTitle(getString(R.string.dvr_priority_action_one_time_recording))
.setPriority(Long.MAX_VALUE)
.setId(ONE_TIME_RECORDING_ID)
.build());
+ DvrDataManager dvrDataManager = TvApplication.getSingletons(context).getDvrDataManager();
long comeFromSeriesRecordingId =
getArguments().getLong(COME_FROM_SERIES_RECORDING_ID, -1);
- for (SeriesRecording series : mDvrDataManager.getSeriesRecordings()) {
+ for (SeriesRecording series : dvrDataManager.getSeriesRecordings()) {
if (series.getState() == SeriesRecording.STATE_SERIES_NORMAL
|| series.getId() == comeFromSeriesRecordingId) {
mSeriesRecordings.add(series);
}
}
mSeriesRecordings.sort(SeriesRecording.PRIORITY_COMPARATOR);
- mComeFromSeriesRecording = mDvrDataManager.getSeriesRecording(comeFromSeriesRecordingId);
+ mComeFromSeriesRecording = dvrDataManager.getSeriesRecording(comeFromSeriesRecordingId);
mSelectedActionElevation = getResources().getDimension(R.dimen.card_elevation_normal);
mActionColor = getResources().getColor(R.color.dvr_guided_step_action_text_color, null);
mSelectedActionColor =
diff --git a/src/com/android/tv/dvr/ui/RecordedProgramDetailsFragment.java b/src/com/android/tv/dvr/ui/RecordedProgramDetailsFragment.java
index 9eb7e385..e698b8a2 100644
--- a/src/com/android/tv/dvr/ui/RecordedProgramDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/RecordedProgramDetailsFragment.java
@@ -16,11 +16,8 @@
package com.android.tv.dvr.ui;
-import android.content.Intent;
import android.content.res.Resources;
-import android.media.tv.TvContentRating;
import android.media.tv.TvInputManager;
-import android.net.Uri;
import android.os.Bundle;
import android.support.v17.leanback.widget.Action;
import android.support.v17.leanback.widget.OnActionClickedListener;
@@ -30,40 +27,38 @@ import android.text.TextUtils;
import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.data.Channel;
-import com.android.tv.dialog.PinDialogFragment;
+import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
-import com.android.tv.dvr.DvrPlaybackActivity;
-import com.android.tv.dvr.DvrUiHelper;
import com.android.tv.dvr.DvrWatchedPositionManager;
import com.android.tv.dvr.RecordedProgram;
-import com.android.tv.parental.ParentalControlSettings;
-import com.android.tv.util.TvInputManagerHelper;
-import com.android.tv.util.Utils;
-
-import java.io.File;
/**
* {@link DetailsFragment} for recorded program in DVR.
*/
-public class RecordedProgramDetailsFragment extends DvrDetailsFragment {
+public class RecordedProgramDetailsFragment extends DvrDetailsFragment
+ implements DvrDataManager.RecordedProgramListener {
private static final int ACTION_RESUME_PLAYING = 1;
private static final int ACTION_PLAY_FROM_BEGINNING = 2;
private static final int ACTION_DELETE_RECORDING = 3;
private DvrWatchedPositionManager mDvrWatchedPositionManager;
- private TvInputManagerHelper mTvInputManagerHelper;
private RecordedProgram mRecordedProgram;
private DetailsContent mDetailsContent;
private boolean mPaused;
+ private DvrDataManager mDvrDataManager;
@Override
public void onCreate(Bundle savedInstanceState) {
+ mDvrDataManager = TvApplication.getSingletons(getContext()).getDvrDataManager();
+ mDvrDataManager.addRecordedProgramListener(this);
super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void onCreateInternal() {
mDvrWatchedPositionManager = TvApplication.getSingletons(getActivity())
.getDvrWatchedPositionManager();
- mTvInputManagerHelper = TvApplication.getSingletons(getActivity())
- .getTvInputManagerHelper();
setDetailsOverviewRow(mDetailsContent);
}
@@ -83,10 +78,15 @@ public class RecordedProgramDetailsFragment extends DvrDetailsFragment {
}
@Override
+ public void onDestroy() {
+ mDvrDataManager.removeRecordedProgramListener(this);
+ super.onDestroy();
+ }
+
+ @Override
protected boolean onLoadRecordingDetails(Bundle args) {
long recordedProgramId = args.getLong(DvrDetailsActivity.RECORDING_ID);
- mRecordedProgram = TvApplication.getSingletons(getActivity()).getDvrDataManager()
- .getRecordedProgram(recordedProgramId);
+ mRecordedProgram = mDvrDataManager.getRecordedProgram(recordedProgramId);
if (mRecordedProgram == null) {
// notify super class to end activity before initializing anything
return false;
@@ -114,8 +114,8 @@ public class RecordedProgramDetailsFragment extends DvrDetailsFragment {
SparseArrayObjectAdapter adapter =
new SparseArrayObjectAdapter(new ActionPresenterSelector());
Resources res = getResources();
- if (mDvrWatchedPositionManager.getWatchedPosition(mRecordedProgram.getId())
- != TvInputManager.TIME_SHIFT_INVALID_TIME) {
+ if (mDvrWatchedPositionManager.getWatchedStatus(mRecordedProgram)
+ == DvrWatchedPositionManager.DVR_WATCHED_STATUS_WATCHING) {
adapter.set(ACTION_RESUME_PLAYING, new Action(ACTION_RESUME_PLAYING,
res.getString(R.string.dvr_detail_resume_play), null,
res.getDrawable(R.drawable.lb_ic_play)));
@@ -139,9 +139,9 @@ public class RecordedProgramDetailsFragment extends DvrDetailsFragment {
@Override
public void onActionClicked(Action action) {
if (action.getId() == ACTION_PLAY_FROM_BEGINNING) {
- startPlayback(TvInputManager.TIME_SHIFT_INVALID_TIME);
+ startPlayback(mRecordedProgram, TvInputManager.TIME_SHIFT_INVALID_TIME);
} else if (action.getId() == ACTION_RESUME_PLAYING) {
- startPlayback(mDvrWatchedPositionManager
+ startPlayback(mRecordedProgram, mDvrWatchedPositionManager
.getWatchedPosition(mRecordedProgram.getId()));
} else if (action.getId() == ACTION_DELETE_RECORDING) {
DvrManager dvrManager = TvApplication
@@ -153,66 +153,18 @@ public class RecordedProgramDetailsFragment extends DvrDetailsFragment {
};
}
- private boolean isDataUriAccessible(Uri dataUri) {
- if (dataUri == null || dataUri.getPath() == null) {
- return false;
- }
- try {
- File recordedProgramPath = new File(dataUri.getPath());
- if (recordedProgramPath.exists()) {
- return true;
- }
- } catch (SecurityException e) {
- }
- return false;
- }
+ @Override
+ public void onRecordedProgramsAdded(RecordedProgram... recordedPrograms) { }
- private void startPlayback(long seekTimeMs) {
- if (Utils.isInBundledPackageSet(mRecordedProgram.getPackageName())
- && !isDataUriAccessible(mRecordedProgram.getDataUri())) {
- // Currently missing storage is handled only for TunerTvInput.
- DvrUiHelper.showDvrMissingStorageErrorDialog(getActivity(),
- mRecordedProgram.getInputId());
- return;
- }
- ParentalControlSettings parental = mTvInputManagerHelper.getParentalControlSettings();
- if (!parental.isParentalControlsEnabled()) {
- launchPlaybackActivity(seekTimeMs, false);
- return;
- }
- String ratingString = mRecordedProgram.getContentRating();
- if (TextUtils.isEmpty(ratingString)) {
- launchPlaybackActivity(seekTimeMs, false);
- return;
- }
- String[] ratingList = ratingString.split(",");
- TvContentRating[] programRatings = new TvContentRating[ratingList.length];
- for (int i = 0; i < ratingList.length; i++) {
- programRatings[i] = TvContentRating.unflattenFromString(ratingList[i]);
- }
- TvContentRating blockRatings = parental.getBlockedRating(programRatings);
- if (blockRatings != null) {
- new PinDialogFragment(PinDialogFragment.PIN_DIALOG_TYPE_UNLOCK_PROGRAM,
- new PinDialogFragment.ResultListener() {
- @Override
- public void done(boolean success) {
- if (success) {
- launchPlaybackActivity(seekTimeMs, true);
- }
- }
- }).show(getActivity().getFragmentManager(), PinDialogFragment.DIALOG_TAG);
- } else {
- launchPlaybackActivity(seekTimeMs, false);
- }
- }
+ @Override
+ public void onRecordedProgramsChanged(RecordedProgram... recordedPrograms) { }
- private void launchPlaybackActivity(long seekTimeMs, boolean pinChecked) {
- Intent intent = new Intent(getActivity(), DvrPlaybackActivity.class);
- intent.putExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_ID, mRecordedProgram.getId());
- if (seekTimeMs != TvInputManager.TIME_SHIFT_INVALID_TIME) {
- intent.putExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_SEEK_TIME, seekTimeMs);
+ @Override
+ public void onRecordedProgramsRemoved(RecordedProgram... recordedPrograms) {
+ for (RecordedProgram recordedProgram : recordedPrograms) {
+ if (recordedProgram.getId() == mRecordedProgram.getId()) {
+ getActivity().finish();
+ }
}
- intent.putExtra(Utils.EXTRA_KEY_RECORDED_PROGRAM_PIN_CHECKED, pinChecked);
- getActivity().startActivity(intent);
}
}
diff --git a/src/com/android/tv/dvr/ui/RecordedProgramPresenter.java b/src/com/android/tv/dvr/ui/RecordedProgramPresenter.java
index 704d3a3f..1bf34310 100644
--- a/src/com/android/tv/dvr/ui/RecordedProgramPresenter.java
+++ b/src/com/android/tv/dvr/ui/RecordedProgramPresenter.java
@@ -21,13 +21,11 @@ import android.content.Context;
import android.media.tv.TvContract;
import android.media.tv.TvInputManager;
import android.net.Uri;
-import android.support.v17.leanback.widget.Presenter;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.TextAppearanceSpan;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.android.tv.R;
@@ -35,7 +33,6 @@ 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.DvrUiHelper;
import com.android.tv.dvr.DvrWatchedPositionManager;
import com.android.tv.dvr.DvrWatchedPositionManager.WatchedPositionChangedListener;
import com.android.tv.util.Utils;
@@ -45,7 +42,7 @@ import java.util.concurrent.TimeUnit;
/**
* Presents a {@link RecordedProgram} in the {@link DvrBrowseFragment}.
*/
-public class RecordedProgramPresenter extends Presenter implements OnClickListener {
+public class RecordedProgramPresenter extends DvrItemPresenter {
private final ChannelDataManager mChannelDataManager;
private final DvrWatchedPositionManager mDvrWatchedPositionManager;
private final Context mContext;
@@ -108,20 +105,16 @@ public class RecordedProgramPresenter extends Presenter implements OnClickListen
public void onBindViewHolder(ViewHolder viewHolder, Object o) {
final RecordedProgram program = (RecordedProgram) o;
final RecordingCardView cardView = (RecordingCardView) viewHolder.view;
- cardView.setTag(program);
Channel channel = mChannelDataManager.getChannel(program.getChannelId());
- SpannableString title;
- if (mShowEpisodeTitle) {
- title = new SpannableString(program.getEpisodeDisplayTitle(mContext));
- } else {
- String titleWithEpisodeNumber = program.getTitleWithEpisodeNumber(mContext);
- title = titleWithEpisodeNumber == null ? null
- : new SpannableString(titleWithEpisodeNumber);
- }
+ String titleString = mShowEpisodeTitle ? program.getEpisodeDisplayTitle(mContext)
+ : program.getTitleWithEpisodeNumber(mContext);
+ SpannableString title = titleString == null ? null : new SpannableString(titleString);
if (TextUtils.isEmpty(title)) {
title = new SpannableString(channel != null ? channel.getDisplayName()
: mContext.getResources().getString(R.string.no_program_information));
} else if (!mShowEpisodeTitle) {
+ // TODO: Some translation may add delimiters in-between program titles, we should use
+ // a more robust way to get the span range.
String programTitle = program.getTitle();
title.setSpan(new TextAppearanceSpan(mContext,
R.style.text_appearance_card_view_episode_number), programTitle == null ? 0
@@ -144,7 +137,6 @@ public class RecordedProgramPresenter extends Presenter implements OnClickListen
String durationString = getContext().getResources().getQuantityString(
R.plurals.dvr_program_duration, durationMinutes, durationMinutes);
cardView.setContent(getDescription(program), durationString);
- viewHolder.view.setOnClickListener(this);
if (viewHolder instanceof RecordedProgramViewHolder) {
RecordedProgramViewHolder cardViewHolder = (RecordedProgramViewHolder) viewHolder;
cardViewHolder.setProgram(program);
@@ -152,6 +144,7 @@ public class RecordedProgramPresenter extends Presenter implements OnClickListen
cardViewHolder
.setProgressBar(mDvrWatchedPositionManager.getWatchedPosition(program.getId()));
}
+ super.onBindViewHolder(viewHolder, o);
}
@Override
@@ -161,14 +154,7 @@ public class RecordedProgramPresenter extends Presenter implements OnClickListen
((RecordedProgramViewHolder) viewHolder).mProgram.getId());
}
((RecordingCardView) viewHolder.view).reset();
- }
-
- @Override
- public void onClick(View v) {
- if (v instanceof RecordingCardView) {
- DvrUiHelper.startDetailsActivity((Activity) mContext, (RecordedProgram) v.getTag(),
- ((RecordingCardView) v).getImageView());
- }
+ super.onUnbindViewHolder(viewHolder);
}
/**
diff --git a/src/com/android/tv/dvr/ui/RecordingCardView.java b/src/com/android/tv/dvr/ui/RecordingCardView.java
index fa4562fd..51c3b03b 100644
--- a/src/com/android/tv/dvr/ui/RecordingCardView.java
+++ b/src/com/android/tv/dvr/ui/RecordingCardView.java
@@ -48,6 +48,8 @@ class RecordingCardView extends BaseCardView {
private final TextView mMajorContentView;
private final TextView mMinorContentView;
private final ProgressBar mProgressBar;
+ private final View mAffiliatedIconContainer;
+ private final ImageView mAffiliatedIcon;
private final Drawable mDefaultImage;
RecordingCardView(Context context) {
@@ -71,6 +73,8 @@ class RecordingCardView extends BaseCardView {
mImageWidth = imageWidth;
mImageHeight = imageHeight;
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);
@@ -138,6 +142,15 @@ class RecordingCardView extends BaseCardView {
}
}
+ public void setAffiliatedIcon(int imageResId) {
+ if (imageResId > 0) {
+ mAffiliatedIconContainer.setVisibility(View.VISIBLE);
+ mAffiliatedIcon.setImageResource(imageResId);
+ } else {
+ mAffiliatedIconContainer.setVisibility(View.INVISIBLE);
+ }
+ }
+
/**
* Returns image view.
*/
diff --git a/src/com/android/tv/dvr/ui/RecordingDetailsFragment.java b/src/com/android/tv/dvr/ui/RecordingDetailsFragment.java
index 2271d932..4e19ec3f 100644
--- a/src/com/android/tv/dvr/ui/RecordingDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/RecordingDetailsFragment.java
@@ -33,13 +33,10 @@ import com.android.tv.dvr.ScheduledRecording;
*/
abstract class RecordingDetailsFragment extends DvrDetailsFragment {
private ScheduledRecording mRecording;
- private DetailsContent mDetailsContent;
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mDetailsContent = createDetailsContent();
- setDetailsOverviewRow(mDetailsContent);
+ protected void onCreateInternal() {
+ setDetailsOverviewRow(createDetailsContent());
}
@Override
@@ -47,11 +44,7 @@ abstract class RecordingDetailsFragment extends DvrDetailsFragment {
long scheduledRecordingId = args.getLong(DvrDetailsActivity.RECORDING_ID);
mRecording = TvApplication.getSingletons(getContext()).getDvrDataManager()
.getScheduledRecording(scheduledRecordingId);
- if (mRecording == null) {
- // notify super class to end activity before initializing anything
- return false;
- }
- return true;
+ return mRecording != null;
}
/**
diff --git a/src/com/android/tv/dvr/ui/ScheduledRecordingDetailsFragment.java b/src/com/android/tv/dvr/ui/ScheduledRecordingDetailsFragment.java
index 5c1ba48c..60816bb5 100644
--- a/src/com/android/tv/dvr/ui/ScheduledRecordingDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/ScheduledRecordingDetailsFragment.java
@@ -89,7 +89,7 @@ public class ScheduledRecordingDetailsFragment extends RecordingDetailsFragment
private int getScheduleIconId() {
if (mDvrManager.isConflicting(getRecording())) {
- return R.drawable.ic_warning_white_36dp;
+ return R.drawable.ic_warning_white_32dp;
} else {
return R.drawable.ic_schedule_32dp;
}
diff --git a/src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java b/src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java
index 1f67bbe3..5f447f13 100644
--- a/src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java
+++ b/src/com/android/tv/dvr/ui/ScheduledRecordingPresenter.java
@@ -20,12 +20,10 @@ import android.app.Activity;
import android.content.Context;
import android.media.tv.TvContract;
import android.os.Handler;
-import android.support.v17.leanback.widget.Presenter;
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.ApplicationSingletons;
@@ -33,7 +31,7 @@ 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.DvrUiHelper;
+import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.util.Utils;
@@ -42,10 +40,11 @@ import java.util.concurrent.TimeUnit;
/**
* Presents a {@link ScheduledRecording} in the {@link DvrBrowseFragment}.
*/
-public class ScheduledRecordingPresenter extends Presenter {
+public class ScheduledRecordingPresenter extends DvrItemPresenter {
private static final long PROGRESS_UPDATE_INTERVAL_MS = TimeUnit.SECONDS.toMillis(5);
private final ChannelDataManager mChannelDataManager;
+ private final DvrManager mDvrManager;
private final Context mContext;
private final int mProgressBarColor;
@@ -95,6 +94,7 @@ public class ScheduledRecordingPresenter extends Presenter {
public ScheduledRecordingPresenter(Context context) {
ApplicationSingletons singletons = TvApplication.getSingletons(context);
mChannelDataManager = singletons.getChannelDataManager();
+ mDvrManager = singletons.getDvrManager();
mContext = context;
mProgressBarColor = context.getResources()
.getColor(R.color.play_controls_recording_icon_color_on_focus);
@@ -129,19 +129,15 @@ public class ScheduledRecordingPresenter extends Presenter {
cardView.setContent(Utils.getDurationString(context, recording.getStartTimeMs(),
recording.getStartTimeMs(), false, true, false, 0), null);
}
+ if (mDvrManager.isConflicting(recording)) {
+ cardView.setAffiliatedIcon(R.drawable.ic_warning_white_32dp);
+ } else {
+ cardView.setAffiliatedIcon(0);
+ }
viewHolder.updateProgressBar();
- View.OnClickListener clickListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (v instanceof RecordingCardView) {
- DvrUiHelper.startDetailsActivity((Activity) v.getContext(), recording,
- ((RecordingCardView) v).getImageView(), false);
- }
- }
- };
- baseHolder.view.setOnClickListener(clickListener);
viewHolder.mScheduledRecording = recording;
viewHolder.startUpdateProgressBar();
+ super.onBindViewHolder(viewHolder, o);
}
@Override
@@ -151,6 +147,7 @@ public class ScheduledRecordingPresenter extends Presenter {
final RecordingCardView cardView = (RecordingCardView) viewHolder.view;
viewHolder.mScheduledRecording = null;
cardView.reset();
+ super.onUnbindViewHolder(viewHolder);
}
private void setTitleAndImage(RecordingCardView cardView, ScheduledRecording recording) {
diff --git a/src/com/android/tv/dvr/ui/SeriesDeletionFragment.java b/src/com/android/tv/dvr/ui/SeriesDeletionFragment.java
index c29d62ae..36e3cfc1 100644
--- a/src/com/android/tv/dvr/ui/SeriesDeletionFragment.java
+++ b/src/com/android/tv/dvr/ui/SeriesDeletionFragment.java
@@ -37,6 +37,7 @@ import com.android.tv.dvr.RecordedProgram;
import com.android.tv.dvr.SeriesRecording;
import com.android.tv.ui.GuidedActionsStylistWithDivider;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -145,17 +146,19 @@ public class SeriesDeletionFragment extends GuidedStepFragment {
public void onGuidedActionClicked(GuidedAction action) {
long actionId = action.getId();
if (actionId == ACTION_ID_DELETE) {
- int deletionCount = 0;
- DvrManager dvrManager = TvApplication.getSingletons(getActivity()).getDvrManager();
+ List<Long> idsToDelete = new ArrayList<>();
for (GuidedAction guidedAction : getActions()) {
if (guidedAction.getCheckSetId() == GuidedAction.CHECKBOX_CHECK_SET_ID
&& guidedAction.isChecked()) {
- dvrManager.removeRecordedProgram(guidedAction.getId());
- deletionCount++;
+ idsToDelete.add(guidedAction.getId());
}
}
+ if (!idsToDelete.isEmpty()) {
+ DvrManager dvrManager = TvApplication.getSingletons(getActivity()).getDvrManager();
+ dvrManager.removeRecordedPrograms(idsToDelete);
+ }
Toast.makeText(getContext(), getResources().getQuantityString(
- R.plurals.dvr_msg_episodes_deleted, deletionCount, deletionCount,
+ R.plurals.dvr_msg_episodes_deleted, idsToDelete.size(), idsToDelete.size(),
mRecordings.size()), Toast.LENGTH_LONG).show();
finishGuidedStepFragments();
} else if (actionId == GuidedAction.ACTION_ID_CANCEL) {
diff --git a/src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java b/src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java
index 0156e9d9..e9e391d4 100644
--- a/src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java
+++ b/src/com/android/tv/dvr/ui/SeriesRecordingDetailsFragment.java
@@ -17,6 +17,8 @@
package com.android.tv.dvr.ui;
import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.media.tv.TvInputManager;
import android.os.Bundle;
import android.support.v17.leanback.app.DetailsFragment;
import android.support.v17.leanback.widget.Action;
@@ -37,8 +39,11 @@ 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.RecordedProgram;
+import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.SeriesRecording;
import java.util.Collections;
@@ -50,24 +55,44 @@ import java.util.List;
*/
public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implements
DvrDataManager.SeriesRecordingListener, DvrDataManager.RecordedProgramListener {
- private static final int ACTION_SERIES_SCHEDULES = 1;
- private static final int ACTION_DELETE = 2;
+ private static final int ACTION_WATCH = 1;
+ private static final int ACTION_SERIES_SCHEDULES = 2;
+ private static final int ACTION_DELETE = 3;
+ private DvrWatchedPositionManager mDvrWatchedPositionManager;
private DvrDataManager mDvrDataManager;
private SeriesRecording mSeries;
// NOTICE: mRecordedPrograms should only be used in creating details fragments.
// After fragments are created, it should be cleared to save resources.
private List<RecordedProgram> mRecordedPrograms;
+ private RecordedProgram mRecommendRecordedProgram;
private DetailsContent mDetailsContent;
private int mSeasonRowCount;
private SparseArrayObjectAdapter mActionsAdapter;
private Action mDeleteAction;
+ private boolean mPaused;
+ private long mInitialPlaybackPositionMs;
+ private String mWatchLabel;
+ private String mResumeLabel;
+ private Drawable mWatchDrawable;
+ private RecordedProgramPresenter mRecordedProgramPresenter;
+
@Override
public void onCreate(Bundle savedInstanceState) {
mDvrDataManager = TvApplication.getSingletons(getActivity()).getDvrDataManager();
+ 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);
super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ protected void onCreateInternal() {
+ mDvrWatchedPositionManager = TvApplication.getSingletons(getActivity())
+ .getDvrWatchedPositionManager();
setDetailsOverviewRow(mDetailsContent);
setupRecordedProgramsRow();
mDvrDataManager.addSeriesRecordingListener(this);
@@ -76,6 +101,45 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
}
@Override
+ public void onResume() {
+ super.onResume();
+ if (mPaused) {
+ updateWatchAction();
+ mPaused = false;
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mPaused = true;
+ }
+
+ private void updateWatchAction() {
+ List<RecordedProgram> programs = mDvrDataManager.getRecordedPrograms(mSeries.getId());
+ Collections.sort(programs, RecordedProgram.EPISODE_COMPARATOR);
+ mRecommendRecordedProgram = getRecommendProgram(programs);
+ if (mRecommendRecordedProgram == null) {
+ mActionsAdapter.clear(ACTION_WATCH);
+ } else {
+ String episodeStatus;
+ if(mDvrWatchedPositionManager.getWatchedStatus(mRecommendRecordedProgram)
+ == DvrWatchedPositionManager.DVR_WATCHED_STATUS_WATCHING) {
+ episodeStatus = mResumeLabel;
+ mInitialPlaybackPositionMs = mDvrWatchedPositionManager
+ .getWatchedPosition(mRecommendRecordedProgram.getId());
+ } else {
+ episodeStatus = mWatchLabel;
+ mInitialPlaybackPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
+ }
+ String episodeDisplayNumber = mRecommendRecordedProgram.getEpisodeDisplayNumber(
+ getContext());
+ mActionsAdapter.set(ACTION_WATCH, new Action(ACTION_WATCH,
+ episodeStatus, episodeDisplayNumber, mWatchDrawable));
+ }
+ }
+
+ @Override
protected boolean onLoadRecordingDetails(Bundle args) {
long recordId = args.getLong(DvrDetailsActivity.RECORDING_ID);
mSeries = TvApplication.getSingletons(getActivity()).getDvrDataManager()
@@ -114,6 +178,7 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
protected SparseArrayObjectAdapter onCreateActionsAdapter() {
mActionsAdapter = new SparseArrayObjectAdapter(new ActionPresenterSelector());
Resources res = getResources();
+ updateWatchAction();
mActionsAdapter.set(ACTION_SERIES_SCHEDULES, new Action(ACTION_SERIES_SCHEDULES,
getString(R.string.dvr_detail_view_schedule), null,
res.getDrawable(R.drawable.ic_schedule_32dp, null)));
@@ -137,11 +202,13 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
super.onDestroy();
mDvrDataManager.removeSeriesRecordingListener(this);
mDvrDataManager.removeRecordedProgramListener(this);
- if (mSeries.getState() == SeriesRecording.STATE_SERIES_CANCELED
- && mDvrDataManager.getRecordedPrograms(mSeries.getId()).isEmpty()) {
- TvApplication.getSingletons(getActivity()).getDvrManager()
- .removeSeriesRecording(mSeries.getId());
+ if (mSeries != null) {
+ DvrManager dvrManager = TvApplication.getSingletons(getActivity()).getDvrManager();
+ if (dvrManager.canRemoveSeriesRecording(mSeries.getId())) {
+ dvrManager.removeSeriesRecording(mSeries.getId());
+ }
}
+ mRecordedProgramPresenter.unbindAllViewHolders();
}
@Override
@@ -149,7 +216,9 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
return new OnActionClickedListener() {
@Override
public void onActionClicked(Action action) {
- if (action.getId() == ACTION_SERIES_SCHEDULES) {
+ if (action.getId() == ACTION_WATCH) {
+ startPlayback(mRecommendRecordedProgram, mInitialPlaybackPositionMs);
+ } else if (action.getId() == ACTION_SERIES_SCHEDULES) {
DvrUiHelper.startSchedulesActivityForSeries(getContext(), mSeries);
} else if (action.getId() == ACTION_DELETE) {
DvrUiHelper.startSeriesDeletionActivity(getContext(), mSeries.getId());
@@ -158,6 +227,28 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
};
}
+ /**
+ * The programs are sorted by season number and episode number.
+ */
+ private RecordedProgram getRecommendProgram(List<RecordedProgram> programs) {
+ for (int i = programs.size() - 1 ; i >= 0 ; i--) {
+ RecordedProgram program = programs.get(i);
+ int watchedStatus = mDvrWatchedPositionManager.getWatchedStatus(program);
+ if (watchedStatus == DvrWatchedPositionManager.DVR_WATCHED_STATUS_NEW) {
+ continue;
+ }
+ if (watchedStatus == DvrWatchedPositionManager.DVR_WATCHED_STATUS_WATCHING) {
+ return program;
+ }
+ if (i == programs.size() - 1) {
+ return program;
+ } else {
+ return programs.get(i + 1);
+ }
+ }
+ return programs.isEmpty() ? null : programs.get(0);
+ }
+
@Override
public void onSeriesRecordingAdded(SeriesRecording... seriesRecordings) { }
@@ -166,43 +257,57 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
for (SeriesRecording series : seriesRecordings) {
if (mSeries.getId() == series.getId()) {
mSeries = series;
- // TODO: change action label.
}
}
}
@Override
- public void onSeriesRecordingRemoved(SeriesRecording... seriesRecordings) { }
+ public void onSeriesRecordingRemoved(SeriesRecording... seriesRecordings) {
+ for (SeriesRecording series : seriesRecordings) {
+ if (series.getId() == mSeries.getId()) {
+ mSeries = null;
+ getActivity().finish();
+ return;
+ }
+ }
+ }
@Override
- public void onRecordedProgramAdded(RecordedProgram recordedProgram) {
- if (TextUtils.equals(recordedProgram.getSeriesId(), mSeries.getSeriesId())) {
- addProgram(recordedProgram);
- if (mActionsAdapter.lookup(ACTION_DELETE) == null) {
- mActionsAdapter.set(ACTION_DELETE, mDeleteAction);
+ public void onRecordedProgramsAdded(RecordedProgram... recordedPrograms) {
+ for (RecordedProgram recordedProgram : recordedPrograms) {
+ if (TextUtils.equals(recordedProgram.getSeriesId(), mSeries.getSeriesId())) {
+ addProgram(recordedProgram);
+ if (mActionsAdapter.lookup(ACTION_DELETE) == null) {
+ mActionsAdapter.set(ACTION_DELETE, mDeleteAction);
+ }
}
}
}
@Override
- public void onRecordedProgramChanged(RecordedProgram recordedProgram) {
+ public void onRecordedProgramsChanged(RecordedProgram... recordedPrograms) {
// Do nothing
}
@Override
- public void onRecordedProgramRemoved(RecordedProgram recordedProgram) {
- if (TextUtils.equals(recordedProgram.getSeriesId(), mSeries.getSeriesId())) {
- ListRow row = getSeasonRow(recordedProgram.getSeasonNumber(), false);
- if (row != null) {
- SeasonRowAdapter adapter = (SeasonRowAdapter) row.getAdapter();
- adapter.remove(recordedProgram);
- if (adapter.isEmpty()) {
- getRowsAdapter().remove(row);
- if (getRowsAdapter().size() == 1) {
- // No season rows left. Only DetailsOverviewRow
- mActionsAdapter.clear(ACTION_DELETE);
+ public void onRecordedProgramsRemoved(RecordedProgram... recordedPrograms) {
+ for (RecordedProgram recordedProgram : recordedPrograms) {
+ if (TextUtils.equals(recordedProgram.getSeriesId(), mSeries.getSeriesId())) {
+ ListRow row = getSeasonRow(recordedProgram.getSeasonNumber(), false);
+ if (row != null) {
+ SeasonRowAdapter adapter = (SeasonRowAdapter) row.getAdapter();
+ adapter.remove(recordedProgram);
+ if (adapter.isEmpty()) {
+ getRowsAdapter().remove(row);
+ if (getRowsAdapter().size() == 1) {
+ // No season rows left. Only DetailsOverviewRow
+ mActionsAdapter.clear(ACTION_DELETE);
+ }
}
}
+ if (recordedProgram.getId() == mRecommendRecordedProgram.getId()) {
+ updateWatchAction();
+ }
}
}
}
@@ -224,7 +329,7 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
for (int i = rowsAdaptor.size() - 1; i >= 0; i--) {
Object row = rowsAdaptor.get(i);
if (row instanceof ListRow) {
- int compareResult = RecordedProgram.numberCompare(seasonNumber,
+ int compareResult = BaseProgram.numberCompare(seasonNumber,
((SeasonRowAdapter) ((ListRow) row).getAdapter()).mSeasonNumber);
if (compareResult == 0) {
return (ListRow) row;
@@ -241,8 +346,7 @@ public class SeriesRecordingDetailsFragment extends DvrDetailsFragment implement
: getString(R.string.dvr_detail_series_season_title, seasonNumber);
HeaderItem header = new HeaderItem(mSeasonRowCount++, seasonTitle);
ClassPresenterSelector selector = new ClassPresenterSelector();
- selector.addClassPresenter(RecordedProgram.class,
- new RecordedProgramPresenter(getContext(), true));
+ selector.addClassPresenter(RecordedProgram.class, mRecordedProgramPresenter);
ListRow row = new ListRow(header, new SeasonRowAdapter(selector,
new Comparator<RecordedProgram>() {
@Override
diff --git a/src/com/android/tv/dvr/ui/SeriesRecordingPresenter.java b/src/com/android/tv/dvr/ui/SeriesRecordingPresenter.java
index d2f26dd1..c2c0f596 100644
--- a/src/com/android/tv/dvr/ui/SeriesRecordingPresenter.java
+++ b/src/com/android/tv/dvr/ui/SeriesRecordingPresenter.java
@@ -18,24 +18,20 @@ package com.android.tv.dvr.ui;
import android.app.Activity;
import android.content.Context;
-import android.content.Intent;
import android.media.tv.TvContract;
import android.media.tv.TvInputManager;
-import android.os.Bundle;
-import android.support.v17.leanback.widget.Presenter;
-import android.support.v4.app.ActivityOptionsCompat;
import android.text.TextUtils;
-import android.view.View;
import android.view.ViewGroup;
-import com.android.tv.R;
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.DvrDataManager.ScheduledRecordingListener;
import com.android.tv.dvr.DvrDataManager.RecordedProgramListener;
+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.RecordedProgram;
@@ -45,11 +41,12 @@ import com.android.tv.dvr.SeriesRecording;
import java.util.List;
/**
- * Presents a {@link SeriesRecording} in the {@link DvrBrowseFragment}.
+ * Presents a {@link SeriesRecording} in {@link DvrBrowseFragment}.
*/
-public class SeriesRecordingPresenter extends Presenter {
+public class SeriesRecordingPresenter extends DvrItemPresenter {
private final ChannelDataManager mChannelDataManager;
private final DvrDataManager mDvrDataManager;
+ private final DvrManager mDvrManager;
private final DvrWatchedPositionManager mWatchedPositionManager;
private static final class SeriesRecordingViewHolder extends ViewHolder implements
@@ -57,13 +54,15 @@ public class SeriesRecordingPresenter extends Presenter {
private SeriesRecording mSeriesRecording;
private RecordingCardView mCardView;
private DvrDataManager mDvrDataManager;
+ private DvrManager mDvrManager;
private DvrWatchedPositionManager mWatchedPositionManager;
SeriesRecordingViewHolder(RecordingCardView view, DvrDataManager dvrDataManager,
- DvrWatchedPositionManager watchedPositionManager) {
+ DvrManager dvrManager, DvrWatchedPositionManager watchedPositionManager) {
super(view);
mCardView = view;
mDvrDataManager = dvrDataManager;
+ mDvrManager = dvrManager;
mWatchedPositionManager = watchedPositionManager;
}
@@ -96,27 +95,41 @@ public class SeriesRecordingPresenter extends Presenter {
}
@Override
- public void onRecordedProgramAdded(RecordedProgram recordedProgram) {
- if (TextUtils.equals(recordedProgram.getTitle(), mSeriesRecording.getTitle())) {
- mDvrDataManager.removeScheduledRecordingListener(this);
- mWatchedPositionManager.addListener(this, recordedProgram.getId());
+ public void onRecordedProgramsAdded(RecordedProgram... recordedPrograms) {
+ boolean needToUpdateCardView = false;
+ for (RecordedProgram recordedProgram : recordedPrograms) {
+ if (TextUtils.equals(recordedProgram.getSeriesId(),
+ mSeriesRecording.getSeriesId())) {
+ mDvrDataManager.removeScheduledRecordingListener(this);
+ mWatchedPositionManager.addListener(this, recordedProgram.getId());
+ needToUpdateCardView = true;
+ }
+ }
+ if (needToUpdateCardView) {
updateCardViewContent();
}
}
@Override
- public void onRecordedProgramRemoved(RecordedProgram recordedProgram) {
- if (TextUtils.equals(recordedProgram.getTitle(), mSeriesRecording.getTitle())) {
- if (mWatchedPositionManager.getWatchedPosition(recordedProgram.getId())
- == TvInputManager.TIME_SHIFT_INVALID_TIME) {
- mWatchedPositionManager.removeListener(this, recordedProgram.getId());
+ public void onRecordedProgramsRemoved(RecordedProgram... recordedPrograms) {
+ boolean needToUpdateCardView = false;
+ for (RecordedProgram recordedProgram : recordedPrograms) {
+ if (TextUtils.equals(recordedProgram.getSeriesId(),
+ mSeriesRecording.getSeriesId())) {
+ if (mWatchedPositionManager.getWatchedPosition(recordedProgram.getId())
+ == TvInputManager.TIME_SHIFT_INVALID_TIME) {
+ mWatchedPositionManager.removeListener(this, recordedProgram.getId());
+ }
+ needToUpdateCardView = true;
}
+ }
+ if (needToUpdateCardView) {
updateCardViewContent();
}
}
@Override
- public void onRecordedProgramChanged(RecordedProgram recordedProgram) {
+ public void onRecordedProgramsChanged(RecordedProgram... recordedPrograms) {
// Do nothing
}
@@ -151,7 +164,7 @@ public class SeriesRecordingPresenter extends Presenter {
List<RecordedProgram> recordedPrograms =
mDvrDataManager.getRecordedPrograms(mSeriesRecording.getId());
if (recordedPrograms.size() == 0) {
- count = mDvrDataManager.getScheduledRecordings(mSeriesRecording.getId()).size();
+ count = mDvrManager.getAvailableScheduledRecording(mSeriesRecording.getId()).size();
quantityStringID = R.plurals.dvr_count_scheduled_recordings;
} else {
for (RecordedProgram recordedProgram : recordedPrograms) {
@@ -176,6 +189,7 @@ public class SeriesRecordingPresenter extends Presenter {
ApplicationSingletons singletons = TvApplication.getSingletons(context);
mChannelDataManager = singletons.getChannelDataManager();
mDvrDataManager = singletons.getDvrDataManager();
+ mDvrManager = singletons.getDvrManager();
mWatchedPositionManager = singletons.getDvrWatchedPositionManager();
}
@@ -183,7 +197,8 @@ public class SeriesRecordingPresenter extends Presenter {
public ViewHolder onCreateViewHolder(ViewGroup parent) {
Context context = parent.getContext();
RecordingCardView view = new RecordingCardView(context);
- return new SeriesRecordingViewHolder(view, mDvrDataManager, mWatchedPositionManager);
+ return new SeriesRecordingViewHolder(view, mDvrDataManager, mDvrManager,
+ mWatchedPositionManager);
}
@Override
@@ -193,33 +208,14 @@ public class SeriesRecordingPresenter extends Presenter {
final RecordingCardView cardView = (RecordingCardView) viewHolder.view;
viewHolder.onBound(seriesRecording);
setTitleAndImage(cardView, seriesRecording);
- View.OnClickListener clickListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- showSeriesRecordingDetails(v, seriesRecording);
- }
- };
- baseHolder.view.setOnClickListener(clickListener);
- }
-
- private void showSeriesRecordingDetails(View view, SeriesRecording seriesRecording) {
- if (view instanceof RecordingCardView) {
- Context context = view.getContext();
- Intent intent = new Intent(context, DvrDetailsActivity.class);
- intent.putExtra(DvrDetailsActivity.RECORDING_ID, seriesRecording.getId());
- intent.putExtra(DvrDetailsActivity.DETAILS_VIEW_TYPE,
- DvrDetailsActivity.SERIES_RECORDING_VIEW);
- Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) context,
- ((RecordingCardView) view).getImageView(),
- DvrDetailsActivity.SHARED_ELEMENT_NAME).toBundle();
- context.startActivity(intent, bundle);
- }
+ super.onBindViewHolder(baseHolder, o);
}
@Override
public void onUnbindViewHolder(ViewHolder viewHolder) {
((RecordingCardView) viewHolder.view).reset();
((SeriesRecordingViewHolder) viewHolder).onUnbound();
+ super.onUnbindViewHolder(viewHolder);
}
private void setTitleAndImage(RecordingCardView cardView, SeriesRecording recording) {
diff --git a/src/com/android/tv/dvr/ui/SeriesSettingsFragment.java b/src/com/android/tv/dvr/ui/SeriesSettingsFragment.java
index c550935c..6c05c9c6 100644
--- a/src/com/android/tv/dvr/ui/SeriesSettingsFragment.java
+++ b/src/com/android/tv/dvr/ui/SeriesSettingsFragment.java
@@ -17,45 +17,64 @@
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;
import com.android.tv.data.Channel;
+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.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.Comparator;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
/**
* Fragment for DVR series recording settings.
*/
public class SeriesSettingsFragment extends GuidedStepFragment
implements DvrDataManager.SeriesRecordingListener {
- /**
- * Name of series recording id added to the bundle.
- * Type: Long
- */
- public static final String SERIES_RECORDING_ID = "series_recording_id";
+ private static final String TAG = "SeriesSettingsFragment";
+ private static final boolean DEBUG = false;
private static final long ACTION_ID_PRIORITY = 10;
private static final long ACTION_ID_CHANNEL = 11;
- private static final long SUB_ACTION_ID_CHANNEL_ONE = 101;
private static final long SUB_ACTION_ID_CHANNEL_ALL = 102;
+ // Each channel's action id = SUB_ACTION_ID_CHANNEL_ONE_BASE + channel id
+ private static final long SUB_ACTION_ID_CHANNEL_ONE_BASE = 500;
private DvrDataManager mDvrDataManager;
+ private ChannelDataManager mChannelDataManager;
+ private DvrManager mDvrManager;
private SeriesRecording mSeriesRecording;
- private Channel mChannel;
private long mSeriesRecordingId;
@ChannelOption int mChannelOption;
+ private Comparator<Channel> mChannelComparator;
+ private long mSelectedChannelId;
+ private int mBackStackCount;
+ private boolean mShowViewScheduleOptionInDialog;
private String mFragmentTitle;
private String mProrityActionTitle;
@@ -63,6 +82,9 @@ public class SeriesSettingsFragment extends GuidedStepFragment
private String mProrityActionLowestText;
private String mChannelsActionTitle;
private String mChannelsActionAllText;
+ private LongSparseArray<Channel> mId2Channel = new LongSparseArray<>();
+ private List<Channel> mChannels = new ArrayList<>();
+ private EpisodicProgramLoadTask mEpisodicProgramLoadTask;
private GuidedAction mPriorityGuidedAction;
private GuidedAction mChannelsGuidedAction;
@@ -70,14 +92,49 @@ public class SeriesSettingsFragment extends GuidedStepFragment
@Override
public void onAttach(Context context) {
super.onAttach(context);
+ mBackStackCount = getFragmentManager().getBackStackEntryCount();
mDvrDataManager = TvApplication.getSingletons(context).getDvrDataManager();
- mSeriesRecordingId = getArguments().getLong(SERIES_RECORDING_ID);
+ mSeriesRecordingId = getArguments().getLong(DvrSeriesSettingsActivity.SERIES_RECORDING_ID);
mSeriesRecording = mDvrDataManager.getSeriesRecording(mSeriesRecordingId);
+ if (mSeriesRecording == null) {
+ getActivity().finish();
+ return;
+ }
+ mDvrManager = TvApplication.getSingletons(context).getDvrManager();
+ mShowViewScheduleOptionInDialog = getArguments().getBoolean(
+ DvrSeriesSettingsActivity.SHOW_VIEW_SCHEDULE_OPTION_IN_DIALOG);
mDvrDataManager.addSeriesRecordingListener(this);
+ 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);
+ }
+ }
+ }
mChannelOption = mSeriesRecording.getChannelOption();
- mChannel = TvApplication.getSingletons(context).getChannelDataManager()
- .getChannel(mSeriesRecording.getChannelId());
- // TODO: Handle when channel is null.
+ mSelectedChannelId = Channel.INVALID_ID;
+ if (mChannelOption == SeriesRecording.OPTION_CHANNEL_ONE) {
+ Channel channel = mChannelDataManager.getChannel(mSeriesRecording.getChannelId());
+ if (channel != null) {
+ mSelectedChannelId = channel.getId();
+ } else {
+ mChannelOption = SeriesRecording.OPTION_CHANNEL_ALL;
+ }
+ }
+ 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);
@@ -90,6 +147,22 @@ public class SeriesSettingsFragment extends GuidedStepFragment
public void onDetach() {
super.onDetach();
mDvrDataManager.removeSeriesRecordingListener(this);
+ if (mEpisodicProgramLoadTask != null) {
+ mEpisodicProgramLoadTask.cancel(true);
+ mEpisodicProgramLoadTask = null;
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ 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();
}
@Override
@@ -108,19 +181,10 @@ public class SeriesSettingsFragment extends GuidedStepFragment
updatePriorityGuidedAction(false);
actions.add(mPriorityGuidedAction);
- List<GuidedAction> channelSubActions = new ArrayList<GuidedAction>();
- channelSubActions.add(new GuidedAction.Builder(getActivity())
- .id(SUB_ACTION_ID_CHANNEL_ONE)
- .title(mChannel.getDisplayText())
- .build());
- channelSubActions.add(new GuidedAction.Builder(getActivity())
- .id(SUB_ACTION_ID_CHANNEL_ALL)
- .title(mChannelsActionAllText)
- .build());
mChannelsGuidedAction = new GuidedAction.Builder(getActivity())
.id(ACTION_ID_CHANNEL)
.title(mChannelsActionTitle)
- .subActions(channelSubActions)
+ .subActions(buildChannelSubAction())
.build();
actions.add(mChannelsGuidedAction);
updateChannelsGuidedAction(false);
@@ -140,13 +204,45 @@ public class SeriesSettingsFragment extends GuidedStepFragment
public void onGuidedActionClicked(GuidedAction action) {
long actionId = action.getId();
if (actionId == GuidedAction.ACTION_ID_OK) {
- if (mChannelOption != mSeriesRecording.getChannelOption()) {
+ if (mEpisodicProgramLoadTask != null) {
+ mEpisodicProgramLoadTask.cancel(true);
+ mEpisodicProgramLoadTask = null;
+ }
+ if (mChannelOption != mSeriesRecording.getChannelOption()
+ || mSeriesRecording.isStopped()
+ || (mChannelOption == SeriesRecording.OPTION_CHANNEL_ONE
+ && mSeriesRecording.getChannelId() != mSelectedChannelId)) {
+ SeriesRecording.Builder builder = SeriesRecording.buildFrom(mSeriesRecording)
+ .setChannelOption(mChannelOption)
+ .setState(SeriesRecording.STATE_SERIES_NORMAL);
+ if (mSelectedChannelId != Channel.INVALID_ID) {
+ builder.setChannelId(mSelectedChannelId);
+ }
TvApplication.getSingletons(getContext()).getDvrManager()
- .updateSeriesRecording(SeriesRecording.buildFrom(mSeriesRecording)
- .setChannelOption(mChannelOption)
- .build());
+ .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();
}
- finishGuidedStepFragments();
} else if (actionId == GuidedAction.ACTION_ID_CANCEL) {
finishGuidedStepFragments();
} else if (actionId == ACTION_ID_PRIORITY) {
@@ -165,10 +261,12 @@ public class SeriesSettingsFragment extends GuidedStepFragment
long actionId = action.getId();
if (actionId == SUB_ACTION_ID_CHANNEL_ALL) {
mChannelOption = SeriesRecording.OPTION_CHANNEL_ALL;
+ mSelectedChannelId = Channel.INVALID_ID;
updateChannelsGuidedAction(true);
return true;
- } else if (actionId == SUB_ACTION_ID_CHANNEL_ONE) {
+ } else if (actionId > SUB_ACTION_ID_CHANNEL_ONE_BASE) {
mChannelOption = SeriesRecording.OPTION_CHANNEL_ONE;
+ mSelectedChannelId = actionId - SUB_ACTION_ID_CHANNEL_ONE_BASE;
updateChannelsGuidedAction(true);
return true;
}
@@ -184,7 +282,8 @@ public class SeriesSettingsFragment extends GuidedStepFragment
if (mChannelOption == SeriesRecording.OPTION_CHANNEL_ALL) {
mChannelsGuidedAction.setDescription(mChannelsActionAllText);
} else {
- mChannelsGuidedAction.setDescription(mChannel.getDisplayText());
+ mChannelsGuidedAction.setDescription(mId2Channel.get(mSelectedChannelId)
+ .getDisplayText());
}
if (notifyActionChanged) {
notifyActionChanged(findActionPositionById(ACTION_ID_CHANNEL));
@@ -210,13 +309,75 @@ public class SeriesSettingsFragment extends GuidedStepFragment
} else if (priorityOrder >= totalSeriesCount - 1) {
mPriorityGuidedAction.setDescription(mProrityActionLowestText);
} else {
- mPriorityGuidedAction.setDescription(Integer.toString(priorityOrder + 1));
+ mPriorityGuidedAction.setDescription(getString(
+ R.string.dvr_series_settings_priority_rank, priorityOrder + 1));
}
if (notifyActionChanged) {
notifyActionChanged(findActionPositionById(ACTION_ID_PRIORITY));
}
}
+ private void collectChannelsInBackground() {
+ if (mEpisodicProgramLoadTask != null) {
+ mEpisodicProgramLoadTask.cancel(true);
+ }
+ 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");
+ }
+ }.setLoadCurrentProgram(true)
+ .setLoadDisallowedProgram(true)
+ .setLoadScheduledEpisode(true)
+ .setIgnoreChannelOption(true);
+ mEpisodicProgramLoadTask.execute();
+ }
+
+ private List<GuidedAction> buildChannelSubAction() {
+ List<GuidedAction> channelSubActions = new ArrayList<>();
+ channelSubActions.add(new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_CHANNEL_ALL)
+ .title(mChannelsActionAllText)
+ .build());
+ for (Channel channel : mChannels) {
+ channelSubActions.add(new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_CHANNEL_ONE_BASE + channel.getId())
+ .title(channel.getDisplayText())
+ .build());
+ }
+ return channelSubActions;
+ }
+
+ private void showConfirmDialog() {
+ DvrUiHelper.StartSeriesScheduledDialogActivity(
+ getContext(), mSeriesRecording, mShowViewScheduleOptionInDialog);
+ finishGuidedStepFragments();
+ }
+
@Override
public void onSeriesRecordingAdded(SeriesRecording... seriesRecordings) { }
diff --git a/src/com/android/tv/dvr/ui/SortedArrayAdapter.java b/src/com/android/tv/dvr/ui/SortedArrayAdapter.java
index 3a57d72e..393a5ff3 100644
--- a/src/com/android/tv/dvr/ui/SortedArrayAdapter.java
+++ b/src/com/android/tv/dvr/ui/SortedArrayAdapter.java
@@ -148,7 +148,10 @@ public abstract class SortedArrayAdapter<T> extends ArrayObjectAdapter {
return -1;
}
- private int findInsertPosition(T item) {
+ /**
+ * Finds the position that the given item should be inserted to keep the sorted order.
+ */
+ public int findInsertPosition(T item) {
for (int i = size() - mExtraItemCount - 1; i >=0; i--) {
T r = (T) get(i);
if (mComparator.compare(r, item) <= 0) {
diff --git a/src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java b/src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java
index 61de5764..d28f026c 100644
--- a/src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java
+++ b/src/com/android/tv/dvr/ui/list/BaseDvrSchedulesFragment.java
@@ -22,12 +22,13 @@ import android.support.v17.leanback.widget.ClassPresenterSelector;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
import android.widget.TextView;
+import com.android.tv.ApplicationSingletons;
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.ScheduledRecording;
/**
@@ -35,32 +36,39 @@ import com.android.tv.dvr.ScheduledRecording;
*/
public abstract class BaseDvrSchedulesFragment extends DetailsFragment
implements DvrDataManager.ScheduledRecordingListener,
- SchedulesHeaderRowPresenter.SchedulesHeaderRowListener,
- ScheduleRowPresenter.ScheduleRowClickListener {
+ DvrScheduleManager.OnConflictStateChangeListener {
/**
* The key for scheduled recording which has be selected in the list.
*/
public static String SCHEDULES_KEY_SCHEDULED_RECORDING = "schedules_key_scheduled_recording";
- private SchedulesHeaderRowPresenter mHeaderRowPresenter;
- private ScheduleRowPresenter mRowPresenter;
private ScheduleRowAdapter mRowsAdapter;
+ private TextView mEmptyInfoScreenView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ClassPresenterSelector presenterSelector = new ClassPresenterSelector();
- mHeaderRowPresenter = onCreateHeaderRowPresenter();
- mHeaderRowPresenter.addListener(this);
- mRowPresenter = onCreateRowPresenter();
- mRowPresenter.addListener(this);
- presenterSelector.addClassPresenter(SchedulesHeaderRow.class, mHeaderRowPresenter);
- presenterSelector.addClassPresenter(ScheduleRow.class, mRowPresenter);
+ presenterSelector.addClassPresenter(SchedulesHeaderRow.class, onCreateHeaderRowPresenter());
+ presenterSelector.addClassPresenter(ScheduleRow.class, onCreateRowPresenter());
mRowsAdapter = onCreateRowsAdapter(presenterSelector);
setAdapter(mRowsAdapter);
mRowsAdapter.start();
- TvApplication.getSingletons(getContext()).getDvrDataManager()
- .addScheduledRecordingListener(this);
+ ApplicationSingletons singletons = TvApplication.getSingletons(getContext());
+ singletons.getDvrDataManager().addScheduledRecordingListener(this);
+ singletons.getDvrScheduleManager().addOnConflictStateChangeListener(this);
+ mEmptyInfoScreenView = (TextView) getActivity().findViewById(R.id.empty_info_screen);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = super.onCreateView(inflater, container, savedInstanceState);
+ int firstItemPosition = getFirstItemPosition();
+ if (firstItemPosition != -1) {
+ getRowsFragment().setSelectedPosition(firstItemPosition, false);
+ }
+ return view;
}
/**
@@ -73,34 +81,20 @@ public abstract class BaseDvrSchedulesFragment extends DetailsFragment
/**
* Shows the empty message.
*/
- protected void showEmptyMessage(int message) {
- TextView emptyInfoScreenView = (TextView) getActivity().findViewById(
- R.id.empty_info_screen);
- emptyInfoScreenView.setText(message);
- emptyInfoScreenView.setVisibility(View.VISIBLE);
+ void showEmptyMessage(int messageId) {
+ mEmptyInfoScreenView.setText(messageId);
+ if (mEmptyInfoScreenView.getVisibility() != View.VISIBLE) {
+ mEmptyInfoScreenView.setVisibility(View.VISIBLE);
+ }
}
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = super.onCreateView(inflater, container, savedInstanceState);
- // setSelectedPosition works only after the view is attached to a window.
- view.getViewTreeObserver().addOnWindowAttachListener(
- new ViewTreeObserver.OnWindowAttachListener() {
- @Override
- public void onWindowAttached() {
- int firstItemPosition = getFirstItemPosition();
- if (firstItemPosition != -1) {
- setSelectedPosition(firstItemPosition, false);
- }
- view.getViewTreeObserver().removeOnWindowAttachListener(this);
- }
-
- @Override
- public void onWindowDetached() {
- }
- });
- return view;
+ /**
+ * Hides the empty message.
+ */
+ void hideEmptyMessage() {
+ if (mEmptyInfoScreenView.getVisibility() == View.VISIBLE) {
+ mEmptyInfoScreenView.setVisibility(View.GONE);
+ }
}
@Override
@@ -112,10 +106,9 @@ public abstract class BaseDvrSchedulesFragment extends DetailsFragment
@Override
public void onDestroy() {
- TvApplication.getSingletons(getContext()).getDvrDataManager()
- .removeScheduledRecordingListener(this);
- mHeaderRowPresenter.removeListener(this);
- mRowPresenter.removeListener(this);
+ ApplicationSingletons singletons = TvApplication.getSingletons(getContext());
+ singletons.getDvrScheduleManager().removeOnConflictStateChangeListener(this);
+ singletons.getDvrDataManager().removeScheduledRecordingListener(this);
mRowsAdapter.stop();
super.onDestroy();
}
@@ -139,16 +132,6 @@ public abstract class BaseDvrSchedulesFragment extends DetailsFragment
* Gets the first focus position in schedules list.
*/
protected int getFirstItemPosition() {
- Bundle args = getArguments();
- ScheduledRecording recording = null;
- if (args != null) {
- recording = args.getParcelable(SCHEDULES_KEY_SCHEDULED_RECORDING);
- }
- final int selectedPostion = mRowsAdapter.indexOf(
- mRowsAdapter.findRowByScheduledRecording(recording));
- if (selectedPostion != -1) {
- return selectedPostion;
- }
for (int i = 0; i < mRowsAdapter.size(); i++) {
if (mRowsAdapter.get(i) instanceof ScheduleRow) {
return i;
@@ -159,11 +142,8 @@ public abstract class BaseDvrSchedulesFragment extends DetailsFragment
@Override
public void onScheduledRecordingAdded(ScheduledRecording... scheduledRecordings) {
- for (ScheduledRecording recording : scheduledRecordings) {
- if (mRowPresenter != null) {
- mRowPresenter.onScheduledRecordingAdded(recording);
- }
- if (mRowsAdapter != null) {
+ if (mRowsAdapter != null) {
+ for (ScheduledRecording recording : scheduledRecordings) {
mRowsAdapter.onScheduledRecordingAdded(recording);
}
}
@@ -171,11 +151,8 @@ public abstract class BaseDvrSchedulesFragment extends DetailsFragment
@Override
public void onScheduledRecordingRemoved(ScheduledRecording... scheduledRecordings) {
- for (ScheduledRecording recording : scheduledRecordings) {
- if (mRowPresenter != null) {
- mRowPresenter.onScheduledRecordingRemoved(recording);
- }
- if (mRowsAdapter != null) {
+ if (mRowsAdapter != null) {
+ for (ScheduledRecording recording : scheduledRecordings) {
mRowsAdapter.onScheduledRecordingRemoved(recording);
}
}
@@ -183,27 +160,19 @@ public abstract class BaseDvrSchedulesFragment extends DetailsFragment
@Override
public void onScheduledRecordingStatusChanged(ScheduledRecording... scheduledRecordings) {
- for (ScheduledRecording recording : scheduledRecordings) {
- if (mRowPresenter != null) {
- mRowPresenter.onScheduledRecordingUpdated(recording);
- }
- if (mRowsAdapter != null) {
- mRowsAdapter.onScheduledRecordingUpdated(recording);
+ if (mRowsAdapter != null) {
+ for (ScheduledRecording recording : scheduledRecordings) {
+ mRowsAdapter.onScheduledRecordingUpdated(recording, false);
}
}
}
@Override
- public void onUpdateAllScheduleRows() {
- if (getRowsAdapter() != null) {
- getRowsAdapter().notifyArrayItemRangeChanged(0, getRowsAdapter().size());
- }
- }
-
- @Override
- public void onDeleteClicked(ScheduleRow scheduleRow) {
+ public void onConflictStateChange(boolean conflict, ScheduledRecording... schedules) {
if (mRowsAdapter != null) {
- mRowsAdapter.notifyArrayItemRangeChanged(0, mRowsAdapter.size());
+ for (ScheduledRecording recording : schedules) {
+ mRowsAdapter.onScheduledRecordingUpdated(recording, true);
+ }
}
}
-}
+} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java b/src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java
index f361ede3..722c9b6e 100644
--- a/src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java
+++ b/src/com/android/tv/dvr/ui/list/DvrSchedulesFragment.java
@@ -18,8 +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.ScheduledRecording;
import com.android.tv.dvr.ui.list.SchedulesHeaderRowPresenter.DateHeaderRowPresenter;
/**
@@ -48,4 +52,35 @@ public class DvrSchedulesFragment extends BaseDvrSchedulesFragment {
public ScheduleRowAdapter onCreateRowsAdapter(ClassPresenterSelector presenterSelecor) {
return new ScheduleRowAdapter(getContext(), presenterSelecor);
}
+
+ @Override
+ public void onScheduledRecordingAdded(ScheduledRecording... scheduledRecordings) {
+ super.onScheduledRecordingAdded(scheduledRecordings);
+ if (getRowsAdapter().size() > 0) {
+ hideEmptyMessage();
+ }
+ }
+
+ @Override
+ public void onScheduledRecordingRemoved(ScheduledRecording... scheduledRecordings) {
+ super.onScheduledRecordingRemoved(scheduledRecordings);
+ if (getRowsAdapter().size() == 0) {
+ showEmptyMessage(R.string.dvr_schedules_empty_state);
+ }
+ }
+
+ @Override
+ protected int getFirstItemPosition() {
+ Bundle args = getArguments();
+ ScheduledRecording recording = null;
+ if (args != null) {
+ recording = args.getParcelable(SCHEDULES_KEY_SCHEDULED_RECORDING);
+ }
+ final int selectedPostion = getRowsAdapter().indexOf(
+ getRowsAdapter().findRowByScheduledRecording(recording));
+ if (selectedPostion != -1) {
+ return selectedPostion;
+ }
+ return super.getFirstItemPosition();
+ }
} \ No newline at end of file
diff --git a/src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java b/src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java
index ba8b0c36..42a1e72b 100644
--- a/src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java
+++ b/src/com/android/tv/dvr/ui/list/DvrSeriesSchedulesFragment.java
@@ -16,71 +16,154 @@
package com.android.tv.dvr.ui.list;
+import android.annotation.TargetApi;
+import android.database.ContentObserver;
+import android.media.tv.TvContract.Programs;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.transition.Fade;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import com.android.tv.ApplicationSingletons;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.common.SoftPreconditions;
+import com.android.tv.data.ChannelDataManager;
+import com.android.tv.data.Program;
+import com.android.tv.dvr.DvrDataManager.SeriesRecordingListener;
+import com.android.tv.dvr.EpisodicProgramLoadTask;
import com.android.tv.dvr.SeriesRecording;
-import com.android.tv.dvr.ui.DvrSchedulesActivity;
-import com.android.tv.dvr.ui.list.SchedulesHeaderRow.SeriesRecordingHeaderRow;
import com.android.tv.dvr.ui.list.SchedulesHeaderRowPresenter.SeriesRecordingHeaderRowPresenter;
+import java.util.List;
+
/**
* A fragment to show the list of series schedule recordings.
*/
+@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.
*/
- public static String SERIES_SCHEDULES_KEY_SERIES_RECORDING =
+ public static final String SERIES_SCHEDULES_KEY_SERIES_RECORDING =
"series_schedules_key_series_recording";
+ /**
+ * 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 SeriesRecording mSeriesRecording;
+ private List<Program> mPrograms;
+ private EpisodicProgramLoadTask mProgramLoadTask;
+
+ private final SeriesRecordingListener mSeriesRecordingListener =
+ new SeriesRecordingListener() {
+ @Override
+ public void onSeriesRecordingAdded(SeriesRecording... seriesRecordings) { }
+
+ @Override
+ public void onSeriesRecordingRemoved(SeriesRecording... seriesRecordings) {
+ for (SeriesRecording r : seriesRecordings) {
+ if (r.getId() == mSeriesRecording.getId()) {
+ getActivity().finish();
+ return;
+ }
+ }
+ }
+
+ @Override
+ public void onSeriesRecordingChanged(SeriesRecording... seriesRecordings) {
+ for (SeriesRecording r : seriesRecordings) {
+ if (r.getId() == mSeriesRecording.getId()
+ && getRowsAdapter() instanceof SeriesScheduleRowAdapter) {
+ ((SeriesScheduleRowAdapter) getRowsAdapter())
+ .onSeriesRecordingUpdated(r);
+ return;
+ }
+ }
+ }
+ };
- private static String TAG = "DvrSeriesSchedulesFragment";
+ 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
+ public void onLoadFinished() { }
- private SeriesRecording mSeries;
+ @Override
+ public void onChannelListUpdated() {
+ executeProgramLoadingTask();
+ }
+
+ @Override
+ public void onChannelBrowsableChanged() { }
+ };
+
+ public DvrSeriesSchedulesFragment() {
+ setEnterTransition(new Fade(Fade.IN));
+ }
@Override
public void onCreate(Bundle savedInstanceState) {
Bundle args = getArguments();
if (args != null) {
- mSeries = args.getParcelable(SERIES_SCHEDULES_KEY_SERIES_RECORDING);
+ mSeriesRecording = args.getParcelable(SERIES_SCHEDULES_KEY_SERIES_RECORDING);
+ mPrograms = args.getParcelableArrayList(SERIES_SCHEDULES_KEY_SERIES_PROGRAMS);
}
super.onCreate(savedInstanceState);
- // "1" means there is only title row in series schedules list. So we should show an empty
- // state info view.
- if (getRowsAdapter().size() == 1) {
- showEmptyMessage(R.string.dvr_series_schedules_empty_state);
- }
- ((DvrSchedulesActivity) getActivity()).setCancelAllClickedRunnable(new Runnable() {
- @Override
- public void run() {
- SoftPreconditions.checkState(getRowsAdapter().get(0) instanceof
- SeriesRecordingHeaderRow, TAG, "First row is not SchedulesHeaderRow");
- SeriesRecordingHeaderRow headerRow =
- (SeriesRecordingHeaderRow) getRowsAdapter().get(0);
- headerRow.setCancelAllChecked(true);
- if (headerRow.getSeriesRecording() != null) {
- TvApplication.getSingletons(getContext()).getDvrManager()
- .updateSeriesRecording(SeriesRecording.buildFrom(
- headerRow.getSeriesRecording()).setState(
- SeriesRecording.STATE_SERIES_CANCELED).build());
- }
- onUpdateAllScheduleRows();
- }
- });
+ ApplicationSingletons singletons = TvApplication.getSingletons(getContext());
+ singletons.getDvrDataManager().addSeriesRecordingListener(mSeriesRecordingListener);
+ mChannelDataManager = singletons.getChannelDataManager();
+ mChannelDataManager.addListener(mChannelListener);
+ getContext().getContentResolver().registerContentObserver(Programs.CONTENT_URI, true,
+ mContentObserver);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
+ onProgramsUpdated();
return super.onCreateView(inflater, container, savedInstanceState);
}
+ private void onProgramsUpdated() {
+ ((SeriesScheduleRowAdapter) getRowsAdapter()).setPrograms(mPrograms);
+ if (mPrograms == null || mPrograms.isEmpty()) {
+ showEmptyMessage(R.string.dvr_series_schedules_empty_state);
+ } else {
+ hideEmptyMessage();
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ if (mProgramLoadTask != null) {
+ mProgramLoadTask.cancel(true);
+ mProgramLoadTask = null;
+ }
+ getContext().getContentResolver().unregisterContentObserver(mContentObserver);
+ mChannelDataManager.removeListener(mChannelListener);
+ TvApplication.getSingletons(getContext()).getDvrDataManager()
+ .removeSeriesRecordingListener(mSeriesRecordingListener);
+ super.onDestroy();
+ }
+
@Override
public SchedulesHeaderRowPresenter onCreateHeaderRowPresenter() {
return new SeriesRecordingHeaderRowPresenter(getContext());
@@ -93,20 +176,33 @@ public class DvrSeriesSchedulesFragment extends BaseDvrSchedulesFragment {
@Override
public ScheduleRowAdapter onCreateRowsAdapter(ClassPresenterSelector presenterSelector) {
- return new SeriesScheduleRowAdapter(getContext(), presenterSelector, mSeries);
+ return new SeriesScheduleRowAdapter(getContext(), presenterSelector, mSeriesRecording);
}
@Override
protected int getFirstItemPosition() {
- if (mSeries != null && mSeries.getState() == SeriesRecording.STATE_SERIES_CANCELED) {
- return -1;
+ if (mSeriesRecording != null
+ && mSeriesRecording.getState() == SeriesRecording.STATE_SERIES_STOPPED) {
+ return 0;
}
return super.getFirstItemPosition();
}
- @Override
- public void onDestroy() {
- ((DvrSchedulesActivity) getActivity()).setCancelAllClickedRunnable(null);
- super.onDestroy();
+ private void executeProgramLoadingTask() {
+ if (mProgramLoadTask != null) {
+ mProgramLoadTask.cancel(true);
+ }
+ mProgramLoadTask = new EpisodicProgramLoadTask(getContext(), mSeriesRecording) {
+ @Override
+ protected void onPostExecute(List<Program> programs) {
+ mPrograms = programs;
+ onProgramsUpdated();
+ }
+ };
+ mProgramLoadTask.setLoadCurrentProgram(true)
+ .setLoadDisallowedProgram(true)
+ .setLoadScheduledEpisode(true)
+ .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
new file mode 100644
index 00000000..23aebf59
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/list/EpisodicProgramRow.java
@@ -0,0 +1,89 @@
+/*
+ * 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.list;
+
+import android.content.Context;
+
+import com.android.tv.data.Program;
+import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.dvr.ScheduledRecording.Builder;
+
+/**
+ * A class for the episodic program.
+ */
+public class EpisodicProgramRow extends ScheduleRow {
+ private final String mInputId;
+ private final Program mProgram;
+
+ public EpisodicProgramRow(String inputId, Program program, ScheduledRecording recording,
+ SchedulesHeaderRow headerRow) {
+ super(recording, headerRow);
+ mInputId = inputId;
+ mProgram = program;
+ }
+
+ /**
+ * Returns the program.
+ */
+ public Program getProgram() {
+ return mProgram;
+ }
+
+ @Override
+ public long getChannelId() {
+ return mProgram.getChannelId();
+ }
+
+ @Override
+ public long getStartTimeMs() {
+ return mProgram.getStartTimeUtcMillis();
+ }
+
+ @Override
+ public long getEndTimeMs() {
+ return mProgram.getEndTimeUtcMillis();
+ }
+
+ @Override
+ public Builder createNewScheduleBuilder() {
+ return ScheduledRecording.builder(mInputId, mProgram);
+ }
+
+ @Override
+ public String getProgramTitleWithEpisodeNumber(Context context) {
+ return mProgram.getTitleWithEpisodeNumber(context);
+ }
+
+ @Override
+ public String getEpisodeDisplayTitle(Context context) {
+ return mProgram.getEpisodeDisplayTitle(context);
+ }
+
+ @Override
+ public boolean matchSchedule(ScheduledRecording schedule) {
+ return schedule.getType() == ScheduledRecording.TYPE_PROGRAM
+ && mProgram.getId() == schedule.getProgramId();
+ }
+
+ @Override
+ public String toString() {
+ return super.toString()
+ + "(inputId=" + mInputId
+ + ",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 1e258d2d..3fc92e8a 100644
--- a/src/com/android/tv/dvr/ui/list/ScheduleRow.java
+++ b/src/com/android/tv/dvr/ui/list/ScheduleRow.java
@@ -16,54 +16,188 @@
package com.android.tv.dvr.ui.list;
+import android.content.Context;
+import android.support.annotation.Nullable;
+
+import com.android.tv.common.SoftPreconditions;
import com.android.tv.dvr.ScheduledRecording;
/**
* A class for schedule recording row.
*/
public class ScheduleRow {
- private ScheduledRecording mRecording;
- private boolean mRemoveScheduleChecked;
- private SchedulesHeaderRow mHeaderRow;
+ private final SchedulesHeaderRow mHeaderRow;
+ @Nullable private ScheduledRecording mSchedule;
+ private boolean mStopRecordingRequested;
+ private boolean mStartRecordingRequested;
- public ScheduleRow(ScheduledRecording recording, SchedulesHeaderRow headerRow) {
- mRecording = recording;
- mRemoveScheduleChecked = false;
+ public ScheduleRow(@Nullable ScheduledRecording recording, SchedulesHeaderRow headerRow) {
+ mSchedule = recording;
mHeaderRow = headerRow;
}
/**
- * Sets scheduled recording.
+ * Gets which {@link SchedulesHeaderRow} this schedule row belongs to.
*/
- public void setRecording(ScheduledRecording recording) {
- mRecording = recording;
+ public SchedulesHeaderRow getHeaderRow() {
+ return mHeaderRow;
}
/**
- * Sets remove schedule checked status.
+ * Returns the recording schedule.
*/
- public void setRemoveScheduleChecked(boolean checked) {
- mRemoveScheduleChecked = checked;
+ @Nullable
+ public ScheduledRecording getSchedule() {
+ return mSchedule;
}
/**
- * Gets scheduled recording.
+ * Checks if the stop recording has been requested or not.
*/
- public ScheduledRecording getRecording() {
- return mRecording;
+ public boolean isStopRecordingRequested() {
+ return mStopRecordingRequested;
}
/**
- * Gets remove schedule checked status.
+ * Sets the flag of stop recording request.
*/
- public boolean isRemoveScheduleChecked() {
- return mRemoveScheduleChecked;
+ public void setStopRecordingRequested(boolean stopRecordingRequested) {
+ SoftPreconditions.checkState(!mStartRecordingRequested);
+ mStopRecordingRequested = stopRecordingRequested;
}
/**
- * Gets which {@link SchedulesHeaderRow} this schedule row belongs to.
+ * Checks if the start recording has been requested or not.
*/
- public SchedulesHeaderRow getHeaderRow() {
- return mHeaderRow;
+ public boolean isStartRecordingRequested() {
+ return mStartRecordingRequested;
+ }
+
+ /**
+ * Sets the flag of start recording request.
+ */
+ public void setStartRecordingRequested(boolean startRecordingRequested) {
+ SoftPreconditions.checkState(!mStopRecordingRequested);
+ mStartRecordingRequested = startRecordingRequested;
+ }
+
+ /**
+ * Sets the recording schedule.
+ */
+ public void setSchedule(@Nullable ScheduledRecording schedule) {
+ mSchedule = schedule;
+ }
+
+ /**
+ * Returns the channel ID.
+ */
+ public long getChannelId() {
+ return mSchedule != null ? mSchedule.getChannelId() : -1;
+ }
+
+ /**
+ * Returns the start time.
+ */
+ public long getStartTimeMs() {
+ return mSchedule != null ? mSchedule.getStartTimeMs() : -1;
+ }
+
+ /**
+ * Returns the end time.
+ */
+ public long getEndTimeMs() {
+ return mSchedule != null ? mSchedule.getEndTimeMs() : -1;
+ }
+
+ /**
+ * Returns the duration.
+ */
+ public final long getDuration() {
+ return getEndTimeMs() - getStartTimeMs();
+ }
+
+ /**
+ * Checks if the program is on air.
+ */
+ public final boolean isOnAir() {
+ long currentTimeMs = System.currentTimeMillis();
+ return getStartTimeMs() <= currentTimeMs && getEndTimeMs() > currentTimeMs;
+ }
+
+ /**
+ * Checks if the schedule is not started.
+ */
+ public final boolean isRecordingNotStarted() {
+ return mSchedule != null
+ && mSchedule.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED;
+ }
+
+ /**
+ * Checks if the schedule is in progress.
+ */
+ public final boolean isRecordingInProgress() {
+ return mSchedule != null
+ && mSchedule.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS;
+ }
+
+ /**
+ * Checks if the schedule has been canceled or not.
+ */
+ public final boolean isScheduleCanceled() {
+ return mSchedule != null
+ && mSchedule.getState() == ScheduledRecording.STATE_RECORDING_CANCELED;
+ }
+
+ public boolean isRecordingFinished() {
+ return mSchedule != null
+ && (mSchedule.getState() == ScheduledRecording.STATE_RECORDING_FAILED
+ || mSchedule.getState() == ScheduledRecording.STATE_RECORDING_CLIPPED
+ || mSchedule.getState() == ScheduledRecording.STATE_RECORDING_FINISHED);
+ }
+
+ /**
+ * Creates and returns the new schedule with the existing information.
+ */
+ public ScheduledRecording.Builder createNewScheduleBuilder() {
+ return mSchedule != null ? ScheduledRecording.buildFrom(mSchedule) : null;
+ }
+
+ /**
+ * Returns the program title with episode number.
+ */
+ public String getProgramTitleWithEpisodeNumber(Context context) {
+ return mSchedule != null ? mSchedule.getProgramTitleWithEpisodeNumber(context) : null;
+ }
+
+ /**
+ * Returns the program title including the season/episode number.
+ */
+ public String getEpisodeDisplayTitle(Context context) {
+ return mSchedule != null ? mSchedule.getEpisodeDisplayTitle(context) : null;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName()
+ + "(schedule=" + mSchedule
+ + ",stopRecordingRequested=" + mStopRecordingRequested
+ + ",startRecordingRequested=" + mStartRecordingRequested
+ + ")";
+ }
+
+ /**
+ * Checks if the {@code schedule} is for the program or channel.
+ */
+ public boolean matchSchedule(ScheduledRecording schedule) {
+ if (mSchedule == null) {
+ return false;
+ }
+ if (mSchedule.getType() == ScheduledRecording.TYPE_TIMED) {
+ return mSchedule.getChannelId() == schedule.getChannelId()
+ && mSchedule.getStartTimeMs() == schedule.getStartTimeMs()
+ && mSchedule.getEndTimeMs() == schedule.getEndTimeMs();
+ } else {
+ return mSchedule.getProgramId() == schedule.getProgramId();
+ }
}
}
diff --git a/src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java b/src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java
index 3e2630c7..9cc82653 100644
--- a/src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java
+++ b/src/com/android/tv/dvr/ui/list/ScheduleRowAdapter.java
@@ -17,12 +17,19 @@
package com.android.tv.dvr.ui.list;
import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ClassPresenterSelector;
import android.text.format.DateUtils;
+import android.util.ArraySet;
+import android.util.Log;
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.util.Utils;
@@ -30,16 +37,34 @@ import com.android.tv.util.Utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* An adapter for {@link ScheduleRow}.
*/
public class ScheduleRowAdapter extends ArrayObjectAdapter {
+ private static final String TAG = "ScheduleRowAdapter";
+ private static final boolean DEBUG = false;
+
private final static long ONE_DAY_MS = TimeUnit.DAYS.toMillis(1);
+ private static final int MSG_UPDATE_ROW = 1;
+
private Context mContext;
private final List<String> mTitles = new ArrayList<>();
+ private final Set<ScheduleRow> mPendingUpdate = new ArraySet<>();
+
+ private final Handler mHandler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == MSG_UPDATE_ROW) {
+ long currentTimeMs = System.currentTimeMillis();
+ handleUpdateRow(currentTimeMs);
+ sendNextUpdateMessage(currentTimeMs);
+ }
+ }
+ };
public ScheduleRowAdapter(Context context, ClassPresenterSelector classPresenterSelector) {
super(classPresenterSelector);
@@ -64,7 +89,8 @@ public class ScheduleRowAdapter extends ArrayObjectAdapter {
.getDvrDataManager().getNonStartedScheduledRecordings();
recordingList.addAll(TvApplication.getSingletons(mContext).getDvrDataManager()
.getStartedRecordings());
- Collections.sort(recordingList, ScheduledRecording.START_TIME_THEN_PRIORITY_COMPARATOR);
+ Collections.sort(recordingList,
+ ScheduledRecording.START_TIME_THEN_PRIORITY_THEN_ID_COMPARATOR);
long deadLine = Utils.getLastMillisecondOfDay(System.currentTimeMillis());
for (int i = 0; i < recordingList.size();) {
ArrayList<ScheduledRecording> section = new ArrayList<>();
@@ -83,6 +109,7 @@ public class ScheduleRowAdapter extends ArrayObjectAdapter {
}
deadLine += ONE_DAY_MS;
}
+ sendNextUpdateMessage(System.currentTimeMillis());
}
private String calculateHeaderDate(long deadLine) {
@@ -93,8 +120,8 @@ public class ScheduleRowAdapter extends ArrayObjectAdapter {
headerDate = mTitles.get(titleIndex);
} else {
headerDate = DateUtils.formatDateTime(getContext(), deadLine,
- DateUtils.FORMAT_SHOW_WEEKDAY| DateUtils.FORMAT_ABBREV_WEEKDAY
- | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH);
+ DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE
+ | DateUtils.FORMAT_ABBREV_MONTH);
}
return headerDate;
}
@@ -103,13 +130,13 @@ public class ScheduleRowAdapter extends ArrayObjectAdapter {
* Stops schedules row adapter.
*/
public void stop() {
- // TODO: Deal with other type of operation.
+ mHandler.removeCallbacksAndMessages(null);
+ DvrManager dvrManager = TvApplication.getSingletons(getContext()).getDvrManager();
for (int i = 0; i < size(); i++) {
if (get(i) instanceof ScheduleRow) {
- ScheduleRow scheduleRow = (ScheduleRow) get(i);
- if (scheduleRow.isRemoveScheduleChecked()) {
- TvApplication.getSingletons(mContext).getDvrManager()
- .removeScheduledRecording(scheduleRow.getRecording());
+ ScheduleRow row = (ScheduleRow) get(i);
+ if (row.isScheduleCanceled()) {
+ dvrManager.removeScheduledRecording(row.getSchedule());
}
}
}
@@ -124,8 +151,8 @@ public class ScheduleRowAdapter extends ArrayObjectAdapter {
}
for (int i = 0; i < size(); i++) {
Object item = get(i);
- if (item instanceof ScheduleRow) {
- if (((ScheduleRow) item).getRecording().getId() == recording.getId()) {
+ if (item instanceof ScheduleRow && ((ScheduleRow) item).getSchedule() != null) {
+ if (((ScheduleRow) item).getSchedule().getId() == recording.getId()) {
return (ScheduleRow) item;
}
}
@@ -133,19 +160,32 @@ public class ScheduleRowAdapter extends ArrayObjectAdapter {
return null;
}
- /**
- * Adds a {@link ScheduleRow} by {@link ScheduledRecording} and update
- * {@link SchedulesHeaderRow} information.
- */
- protected void addScheduleRow(ScheduledRecording recording) {
+ private ScheduleRow findRowWithStartRequest(ScheduledRecording schedule) {
+ for (int i = 0; i < size(); i++) {
+ Object item = get(i);
+ if (!(item instanceof ScheduleRow)) {
+ continue;
+ }
+ ScheduleRow row = (ScheduleRow) item;
+ if (row.getSchedule() != null && row.isStartRecordingRequested()
+ && row.matchSchedule(schedule)) {
+ return row;
+ }
+ }
+ return null;
+ }
+
+ private void addScheduleRow(ScheduledRecording recording) {
+ // This method must not be called from inherited class.
+ SoftPreconditions.checkState(getClass().equals(ScheduleRowAdapter.class));
if (recording != null) {
int pre = -1;
int index = 0;
for (; index < size(); index++) {
if (get(index) instanceof ScheduleRow) {
ScheduleRow scheduleRow = (ScheduleRow) get(index);
- if (ScheduledRecording.START_TIME_THEN_PRIORITY_COMPARATOR.compare(
- scheduleRow.getRecording(), recording) > 0) {
+ if (ScheduledRecording.START_TIME_THEN_PRIORITY_THEN_ID_COMPARATOR.compare(
+ scheduleRow.getSchedule(), recording) > 0) {
break;
}
pre = index;
@@ -157,11 +197,13 @@ public class ScheduleRowAdapter extends ArrayObjectAdapter {
headerRow.setItemCount(headerRow.getItemCount() + 1);
ScheduleRow addedRow = new ScheduleRow(recording, headerRow);
add(++pre, addedRow);
+ updateHeaderDescription(headerRow);
} else if (index < size() && getHeaderRow(index).getDeadLineMs() == deadLine) {
SchedulesHeaderRow headerRow = ((ScheduleRow) get(index)).getHeaderRow();
headerRow.setItemCount(headerRow.getItemCount() + 1);
ScheduleRow addedRow = new ScheduleRow(recording, headerRow);
add(index, addedRow);
+ updateHeaderDescription(headerRow);
} else {
SchedulesHeaderRow headerRow = new DateHeaderRow(calculateHeaderDate(deadLine),
mContext.getResources().getQuantityString(
@@ -177,11 +219,11 @@ public class ScheduleRowAdapter extends ArrayObjectAdapter {
return ((DateHeaderRow) ((ScheduleRow) get(index)).getHeaderRow());
}
- /**
- * Removes {@link ScheduleRow} and update {@link SchedulesHeaderRow} information.
- */
- protected void removeScheduleRow(ScheduleRow scheduleRow) {
+ private void removeScheduleRow(ScheduleRow scheduleRow) {
+ // This method must not be called from inherited class.
+ SoftPreconditions.checkState(getClass().equals(ScheduleRowAdapter.class));
if (scheduleRow != null) {
+ scheduleRow.setSchedule(null);
SchedulesHeaderRow headerRow = scheduleRow.getHeaderRow();
remove(scheduleRow);
// Changes the count information of header which the removed row belongs to.
@@ -191,58 +233,193 @@ public class ScheduleRowAdapter extends ArrayObjectAdapter {
if (headerRow.getItemCount() == 0) {
remove(headerRow);
} else {
- headerRow.setDescription(mContext.getResources().getQuantityString(
- R.plurals.dvr_schedules_section_subtitle,
- headerRow.getItemCount(), headerRow.getItemCount()));
replace(indexOf(headerRow), headerRow);
+ updateHeaderDescription(headerRow);
}
}
}
}
+ private void updateHeaderDescription(SchedulesHeaderRow headerRow) {
+ headerRow.setDescription(mContext.getResources().getQuantityString(
+ R.plurals.dvr_schedules_section_subtitle,
+ headerRow.getItemCount(), headerRow.getItemCount()));
+ }
+
/**
* Called when a schedule recording is added to dvr date manager.
*/
- public void onScheduledRecordingAdded(ScheduledRecording recording) {
- if (recording.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED
- || recording.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- addScheduleRow(recording);
- notifyArrayItemRangeChanged(0, size());
+ public void onScheduledRecordingAdded(ScheduledRecording schedule) {
+ if (DEBUG) Log.d(TAG, "onScheduledRecordingAdded: " + schedule);
+ ScheduleRow row = findRowWithStartRequest(schedule);
+ // If the start recording is requested, onScheduledRecordingAdded is called with NOT_STARTED
+ // state. And then onScheduleRecordingUpdated will be called with IN_PROGRESS.
+ // It happens in a short time and causes blinking. To avoid this intermediate state change,
+ // update the row in onScheduleRecordingUpdated when the state changes to IN_PROGRESS
+ // instead of in this method.
+ if (row == null) {
+ addScheduleRow(schedule);
+ sendNextUpdateMessage(System.currentTimeMillis());
}
}
/**
* Called when a schedule recording is removed from dvr date manager.
*/
- public void onScheduledRecordingRemoved(ScheduledRecording recording) {
- ScheduleRow scheduleRow = findRowByScheduledRecording(recording);
- if (scheduleRow != null) {
- removeScheduleRow(scheduleRow);
+ public void onScheduledRecordingRemoved(ScheduledRecording schedule) {
+ if (DEBUG) Log.d(TAG, "onScheduledRecordingRemoved: " + schedule);
+ ScheduleRow row = findRowByScheduledRecording(schedule);
+ if (row != null) {
+ removeScheduleRow(row);
+ notifyArrayItemRangeChanged(indexOf(row), 1);
+ sendNextUpdateMessage(System.currentTimeMillis());
}
- notifyArrayItemRangeChanged(0, size());
}
/**
* Called when a schedule recording is updated in dvr date manager.
*/
- public void onScheduledRecordingUpdated(ScheduledRecording recording) {
- ScheduleRow scheduleRow = findRowByScheduledRecording(recording);
- if (scheduleRow != null) {
- scheduleRow.setRecording(recording);
- if (!willBeKept(recording)) {
- removeScheduleRow(scheduleRow);
+ public void onScheduledRecordingUpdated(ScheduledRecording schedule, boolean conflictChange) {
+ if (DEBUG) Log.d(TAG, "onScheduledRecordingUpdated: " + schedule);
+ ScheduleRow row = findRowByScheduledRecording(schedule);
+ if (row != null) {
+ if (conflictChange && isStartOrStopRequested()) {
+ // Delay the conflict update until it gets the response of the start/stop request.
+ // The purpose is to avoid the intermediate conflict change.
+ addPendingUpdate(row);
+ return;
+ }
+ if (row.isStopRecordingRequested()) {
+ // Wait until the recording is finished
+ if (schedule.getState() == ScheduledRecording.STATE_RECORDING_FINISHED
+ || schedule.getState() == ScheduledRecording.STATE_RECORDING_CLIPPED
+ || schedule.getState() == ScheduledRecording.STATE_RECORDING_FAILED) {
+ row.setStopRecordingRequested(false);
+ if (!isStartOrStopRequested()) {
+ executePendingUpdate();
+ }
+ row.setSchedule(schedule);
+ }
+ } else {
+ row.setSchedule(schedule);
+ if (!willBeKept(schedule)) {
+ removeScheduleRow(row);
+ }
+ }
+ notifyArrayItemRangeChanged(indexOf(row), 1);
+ sendNextUpdateMessage(System.currentTimeMillis());
+ } else {
+ row = findRowWithStartRequest(schedule);
+ // When the start recording was requested, we give the highest priority. So it is
+ // guaranteed that the state will be changed from NOT_STARTED to the other state.
+ // Update the row with the next state not to show the intermediate state which causes
+ // blinking.
+ if (row != null
+ && schedule.getState() != ScheduledRecording.STATE_RECORDING_NOT_STARTED) {
+ // This can be called multiple times, so do not call
+ // ScheduleRow.setStartRecordingRequested(false) here.
+ row.setStartRecordingRequested(false);
+ if (!isStartOrStopRequested()) {
+ executePendingUpdate();
+ }
+ row.setSchedule(schedule);
+ notifyArrayItemRangeChanged(indexOf(row), 1);
+ sendNextUpdateMessage(System.currentTimeMillis());
}
- } else if (willBeKept(recording)) {
- addScheduleRow(recording);
}
- notifyArrayItemRangeChanged(0, size());
+ }
+
+ /**
+ * Checks if there is a row which requested start/stop recording.
+ */
+ protected boolean isStartOrStopRequested() {
+ for (int i = 0; i < size(); i++) {
+ Object item = get(i);
+ if (item instanceof ScheduleRow) {
+ ScheduleRow row = (ScheduleRow) item;
+ if (row.isStartRecordingRequested() || row.isStopRecordingRequested()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Delays update of the row.
+ */
+ protected void addPendingUpdate(ScheduleRow row) {
+ mPendingUpdate.add(row);
+ }
+
+ /**
+ * Executes the pending updates.
+ */
+ protected void executePendingUpdate() {
+ for (ScheduleRow row : mPendingUpdate) {
+ int index = indexOf(row);
+ if (index != -1) {
+ notifyArrayItemRangeChanged(index, 1);
+ }
+ }
+ mPendingUpdate.clear();
}
/**
* To check whether the recording should be kept or not.
*/
- protected boolean willBeKept(ScheduledRecording recording) {
- return recording.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS
- || recording.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED;
+ protected boolean willBeKept(ScheduledRecording schedule) {
+ // CANCELED state means that the schedule was removed temporarily, which should be shown
+ // in the list so that the user can reschedule it.
+ return schedule.getEndTimeMs() > System.currentTimeMillis()
+ && (schedule.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS
+ || schedule.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED
+ || schedule.getState() == ScheduledRecording.STATE_RECORDING_CANCELED);
+ }
+
+ /**
+ * Handle the message to update/remove rows.
+ */
+ protected void handleUpdateRow(long currentTimeMs) {
+ for (int i = 0; i < size(); i++) {
+ Object item = get(i);
+ if (item instanceof ScheduleRow) {
+ ScheduleRow row = (ScheduleRow) item;
+ if (row.getEndTimeMs() <= currentTimeMs) {
+ removeScheduleRow(row);
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the next update time. Return {@link Long#MAX_VALUE} if no timer is necessary.
+ */
+ protected long getNextTimerMs(long currentTimeMs) {
+ long earliest = Long.MAX_VALUE;
+ for (int i = 0; i < size(); i++) {
+ Object item = get(i);
+ if (item instanceof ScheduleRow) {
+ // If the schedule was finished earlier than the end time, it should be removed
+ // when it reaches the end time in this class.
+ ScheduleRow row = (ScheduleRow) item;
+ if (earliest > row.getEndTimeMs()) {
+ earliest = row.getEndTimeMs();
+ }
+ }
+ }
+ return earliest;
+ }
+
+ /**
+ * Send update message at the time returned by {@link #getNextTimerMs}.
+ */
+ protected final void sendNextUpdateMessage(long currentTimeMs) {
+ mHandler.removeMessages(MSG_UPDATE_ROW);
+ long nextTime = getNextTimerMs(currentTimeMs);
+ if (nextTime != Long.MAX_VALUE) {
+ mHandler.sendEmptyMessageDelayed(MSG_UPDATE_ROW,
+ nextTime - System.currentTimeMillis());
+ }
}
}
diff --git a/src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java b/src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java
index 23aaf4c3..1257e725 100644
--- a/src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java
+++ b/src/com/android/tv/dvr/ui/list/ScheduleRowPresenter.java
@@ -16,17 +16,20 @@
package com.android.tv.dvr.ui.list;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
+import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.media.tv.TvInputInfo;
+import android.content.res.Resources;
+import android.os.Build;
+import android.support.annotation.IntDef;
import android.support.v17.leanback.widget.RowPresenter;
import android.text.TextUtils;
-import android.util.ArraySet;
-import android.util.Range;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
@@ -37,140 +40,137 @@ import android.widget.Toast;
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.DvrScheduleManager;
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.HalfSizedDialogFragment;
+import com.android.tv.util.ToastUtils;
import com.android.tv.util.Utils;
-import java.util.ArrayList;
-import java.util.HashMap;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
-import java.util.Map;
-import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* A RowPresenter for {@link ScheduleRow}.
*/
+@TargetApi(Build.VERSION_CODES.N)
public class ScheduleRowPresenter extends RowPresenter {
- private Context mContext;
- private Set<ScheduleRowClickListener> mListeners = new ArraySet<>();
- private final Drawable mBeingRecordedDrawable;
-
- private final Map<String, HashMap<Long, ScheduledRecording>> mInputScheduleMap = new
- HashMap<>();
- private final List<ScheduledRecording> mConflicts = new ArrayList<>();
- // TODO: Handle input schedule map and conflicts info in the adapter.
-
- private final Drawable mOnAirDrawable;
- private final Drawable mCancelDrawable;
- private final Drawable mScheduleDrawable;
+ private static final String TAG = "ScheduleRowPresenter";
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({ACTION_START_RECORDING, ACTION_STOP_RECORDING, ACTION_CREATE_SCHEDULE,
+ ACTION_REMOVE_SCHEDULE})
+ public @interface ScheduleRowAction {}
+ /** An action to start recording. */
+ public static final int ACTION_START_RECORDING = 1;
+ /** An action to stop recording. */
+ public static final int ACTION_STOP_RECORDING = 2;
+ /** An action to create schedule for the row. */
+ public static final int ACTION_CREATE_SCHEDULE = 3;
+ /** An action to remove the schedule. */
+ public static final int ACTION_REMOVE_SCHEDULE = 4;
+
+ private final Context mContext;
+ private final DvrManager mDvrManager;
+ private final DvrScheduleManager mDvrScheduleManager;
private final String mTunerConflictWillNotBeRecordedInfo;
private final String mTunerConflictWillBePartiallyRecordedInfo;
- private final String mInfoSeparator;
+ private final int mAnimationDuration;
+
+ private int mLastFocusedViewId;
/**
* A ViewHolder for {@link ScheduleRow}
*/
public static class ScheduleRowViewHolder extends RowPresenter.ViewHolder {
+ private ScheduleRowPresenter mPresenter;
+ @ScheduleRowAction private int[] mActions;
private boolean mLtr;
private LinearLayout mInfoContainer;
- private RelativeLayout mScheduleActionContainer;
- private RelativeLayout mDeleteActionContainer;
+ // The first action is on the right of the second action.
+ private RelativeLayout mSecondActionContainer;
+ private RelativeLayout mFirstActionContainer;
private View mSelectorView;
private TextView mTimeView;
private TextView mProgramTitleView;
private TextView mInfoSeparatorView;
private TextView mChannelNameView;
private TextView mConflictInfoView;
- private ImageView mScheduleActionView;
- private ImageView mDeleteActionView;
-
- private ScheduledRecording mRecording;
+ private ImageView mSecondActionView;
+ private ImageView mFirstActionView;
+
+ private Runnable mPendingAnimationRunnable;
+
+ private final int mSelectorTranslationDelta;
+ private final int mSelectorWidthDelta;
+ private final int mInfoContainerTargetWidthWithNoAction;
+ private final int mInfoContainerTargetWidthWithOneAction;
+ private final int mInfoContainerTargetWidthWithTwoAction;
+ private final int mRoundRectRadius;
+
+ private final OnFocusChangeListener mOnFocusChangeListener =
+ new View.OnFocusChangeListener() {
+ @Override
+ public void onFocusChange(View view, boolean focused) {
+ view.post(new Runnable() {
+ @Override
+ public void run() {
+ if (view.isFocused()) {
+ mPresenter.mLastFocusedViewId = view.getId();
+ }
+ updateSelector();
+ }
+ });
+ }
+ };
- public ScheduleRowViewHolder(View view) {
+ public ScheduleRowViewHolder(View view, ScheduleRowPresenter presenter) {
super(view);
+ mPresenter = presenter;
mLtr = view.getContext().getResources().getConfiguration().getLayoutDirection()
== View.LAYOUT_DIRECTION_LTR;
mInfoContainer = (LinearLayout) view.findViewById(R.id.info_container);
- mScheduleActionContainer = (RelativeLayout) view.findViewById(
- R.id.action_schedule_container);
- mScheduleActionView = (ImageView) view.findViewById(R.id.action_schedule);
- mDeleteActionContainer = (RelativeLayout) view.findViewById(
- R.id.action_delete_container);
- mDeleteActionView = (ImageView) view.findViewById(R.id.action_delete);
+ mSecondActionContainer = (RelativeLayout) view.findViewById(
+ R.id.action_second_container);
+ mSecondActionView = (ImageView) view.findViewById(R.id.action_second);
+ mFirstActionContainer = (RelativeLayout) view.findViewById(
+ R.id.action_first_container);
+ mFirstActionView = (ImageView) view.findViewById(R.id.action_first);
mSelectorView = view.findViewById(R.id.selector);
mTimeView = (TextView) view.findViewById(R.id.time);
mProgramTitleView = (TextView) view.findViewById(R.id.program_title);
mInfoSeparatorView = (TextView) view.findViewById(R.id.info_separator);
mChannelNameView = (TextView) view.findViewById(R.id.channel_name);
mConflictInfoView = (TextView) view.findViewById(R.id.conflict_info);
-
- mInfoContainer.setOnFocusChangeListener(new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View view, boolean focused) {
- view.post(new Runnable() {
- @Override
- public void run() {
- updateSelector();
- }
- });
- }
- });
-
- mDeleteActionContainer.setOnFocusChangeListener(new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View view, boolean focused) {
- view.post(new Runnable() {
- @Override
- public void run() {
- updateSelector();
- }
- });
- }
- });
-
- mScheduleActionContainer.setOnFocusChangeListener(new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View view, boolean focused) {
- view.post(new Runnable() {
- @Override
- public void run() {
- updateSelector();
- }
- });
- }
- });
- }
-
- /**
- * Sets scheduled recording.
- */
- public void setRecording(ScheduledRecording recording) {
- mRecording = recording;
- }
-
- /**
- * Returns Info container.
- */
- public LinearLayout getInfoContainer() {
- return mInfoContainer;
- }
-
- /**
- * Returns schedule action container.
- */
- public RelativeLayout getScheduleActionContainer() {
- return mScheduleActionContainer;
- }
-
- /**
- * Returns delete action container.
- */
- public RelativeLayout getDeleteActionContainer() {
- return mDeleteActionContainer;
+ Resources res = view.getResources();
+ mSelectorTranslationDelta =
+ res.getDimensionPixelSize(R.dimen.dvr_schedules_item_section_margin)
+ - res.getDimensionPixelSize(R.dimen.dvr_schedules_item_focus_translation_delta);
+ mSelectorWidthDelta = res.getDimensionPixelSize(
+ R.dimen.dvr_schedules_item_focus_width_delta);
+ mRoundRectRadius = res.getDimensionPixelSize(R.dimen.dvr_schedules_selector_radius);
+ int fullWidth = res.getDimensionPixelSize(
+ R.dimen.dvr_schedules_item_width)
+ - 2 * res.getDimensionPixelSize(R.dimen.dvr_schedules_layout_padding);
+ mInfoContainerTargetWidthWithNoAction = fullWidth + 2 * mRoundRectRadius;
+ mInfoContainerTargetWidthWithOneAction = fullWidth
+ - res.getDimensionPixelSize(R.dimen.dvr_schedules_item_section_margin)
+ - res.getDimensionPixelSize(R.dimen.dvr_schedules_item_delete_width)
+ + mRoundRectRadius + mSelectorWidthDelta;
+ mInfoContainerTargetWidthWithTwoAction = mInfoContainerTargetWidthWithOneAction
+ - res.getDimensionPixelSize(R.dimen.dvr_schedules_item_section_margin)
+ - res.getDimensionPixelSize(R.dimen.dvr_schedules_item_icon_size);
+
+ mInfoContainer.setOnFocusChangeListener(mOnFocusChangeListener);
+ mFirstActionContainer.setOnFocusChangeListener(mOnFocusChangeListener);
+ mSecondActionContainer.setOnFocusChangeListener(mOnFocusChangeListener);
}
/**
@@ -187,92 +187,55 @@ public class ScheduleRowPresenter extends RowPresenter {
return mProgramTitleView;
}
- /**
- * Returns subtitle view.
- */
- public TextView getChannelNameView() {
- return mChannelNameView;
- }
-
- /**
- * Returns conflict information view.
- */
- public TextView getConflictInfoView() {
- return mConflictInfoView;
- }
-
- /**
- * Returns schedule action view.
- */
- public ImageView getScheduleActionView() {
- return mScheduleActionView;
- }
-
- /**
- * Returns delete action view.
- */
- public ImageView getDeleteActionView() {
- return mDeleteActionView;
- }
-
- /**
- * Returns scheduled recording.
- */
- public ScheduledRecording getRecording() {
- return mRecording;
- }
-
private void updateSelector() {
- // TODO: Support RTL language
int animationDuration = mSelectorView.getResources().getInteger(
android.R.integer.config_shortAnimTime);
DecelerateInterpolator interpolator = new DecelerateInterpolator();
- int roundRectRadius = view.getResources().getDimensionPixelSize(
- R.dimen.dvr_schedules_selector_radius);
- if (mInfoContainer.isFocused() || mScheduleActionContainer.isFocused()
- || mDeleteActionContainer.isFocused()) {
+ if (mInfoContainer.isFocused() || mSecondActionContainer.isFocused()
+ || mFirstActionContainer.isFocused()) {
final ViewGroup.LayoutParams lp = mSelectorView.getLayoutParams();
final int targetWidth;
if (mInfoContainer.isFocused()) {
- if (mScheduleActionContainer.getVisibility() == View.GONE
- && mDeleteActionContainer.getVisibility() == View.GONE) {
- targetWidth = mInfoContainer.getWidth() + 2 * roundRectRadius;
+ // Use actions to check the visibility of the actions instead of calling
+ // View.getVisibility() because the view could be on the hiding animation.
+ if (mActions == null || mActions.length == 0) {
+ targetWidth = mInfoContainerTargetWidthWithNoAction;
+ } else if (mActions.length == 1) {
+ targetWidth = mInfoContainerTargetWidthWithOneAction;
} else {
- targetWidth = mInfoContainer.getWidth() + roundRectRadius;
- }
- } else if (mScheduleActionContainer.isFocused()) {
- if (mScheduleActionContainer.getWidth() > 2 * roundRectRadius) {
- targetWidth = mScheduleActionContainer.getWidth();
- } else {
- targetWidth = 2 * roundRectRadius;
+ targetWidth = mInfoContainerTargetWidthWithTwoAction;
}
+ } else if (mSecondActionContainer.isFocused()) {
+ targetWidth = Math.max(mSecondActionContainer.getWidth(), 2 * mRoundRectRadius);
} else {
- targetWidth = mDeleteActionContainer.getWidth() + roundRectRadius;
+ targetWidth = mFirstActionContainer.getWidth() + mRoundRectRadius
+ + mSelectorTranslationDelta;
}
float targetTranslationX;
if (mInfoContainer.isFocused()) {
- targetTranslationX = mLtr ? mInfoContainer.getLeft() - roundRectRadius
+ targetTranslationX = mLtr ? mInfoContainer.getLeft() - mRoundRectRadius
- mSelectorView.getLeft() :
- mInfoContainer.getRight() + roundRectRadius - mInfoContainer.getRight();
- } else if (mScheduleActionContainer.isFocused()) {
- if (mScheduleActionContainer.getWidth() > 2 * roundRectRadius) {
- targetTranslationX = mLtr ? mScheduleActionContainer.getLeft() -
+ mInfoContainer.getRight() + mRoundRectRadius - mSelectorView.getRight();
+ } else if (mSecondActionContainer.isFocused()) {
+ if (mSecondActionContainer.getWidth() > 2 * mRoundRectRadius) {
+ targetTranslationX = mLtr ? mSecondActionContainer.getLeft() -
mSelectorView.getLeft()
- : mScheduleActionContainer.getRight() - mSelectorView.getRight();
+ : mSecondActionContainer.getRight() - mSelectorView.getRight();
} else {
- targetTranslationX = mLtr ? mScheduleActionContainer.getLeft() -
- (roundRectRadius - mScheduleActionContainer.getWidth() / 2) -
+ targetTranslationX = mLtr ? mSecondActionContainer.getLeft() -
+ (mRoundRectRadius - mSecondActionContainer.getWidth() / 2) -
mSelectorView.getLeft()
- : mScheduleActionContainer.getRight() +
- (roundRectRadius - mScheduleActionContainer.getWidth() / 2) -
+ : mSecondActionContainer.getRight() +
+ (mRoundRectRadius - mSecondActionContainer.getWidth() / 2) -
mSelectorView.getRight();
}
} else {
- targetTranslationX = mLtr ? mDeleteActionContainer.getLeft()
- - mSelectorView.getLeft()
- : mDeleteActionContainer.getRight() - mSelectorView.getRight();
+ targetTranslationX = mLtr ? mFirstActionContainer.getLeft()
+ - mSelectorTranslationDelta - mSelectorView.getLeft()
+ : mFirstActionContainer.getRight() + mSelectorTranslationDelta
+ - mSelectorView.getRight();
}
if (mSelectorView.getAlpha() == 0) {
@@ -294,10 +257,14 @@ public class ScheduleRowPresenter extends RowPresenter {
mSelectorView.requestLayout();
}
}).setDuration(animationDuration).setInterpolator(interpolator).start();
+ if (mPendingAnimationRunnable != null) {
+ mPendingAnimationRunnable.run();
+ mPendingAnimationRunnable = null;
+ }
} else {
mSelectorView.animate().cancel();
mSelectorView.animate().alpha(0f).setDuration(animationDuration)
- .setInterpolator(interpolator).start();
+ .setInterpolator(interpolator).setUpdateListener(null).start();
}
}
@@ -338,23 +305,20 @@ public class ScheduleRowPresenter extends RowPresenter {
setHeaderPresenter(null);
setSelectEffectEnabled(false);
mContext = context;
- mBeingRecordedDrawable = mContext.getDrawable(R.drawable.ic_record_stop);
- mOnAirDrawable = mContext.getDrawable(R.drawable.ic_record_start);
- mCancelDrawable = mContext.getDrawable(R.drawable.ic_dvr_cancel);
- mScheduleDrawable = mContext.getDrawable(R.drawable.ic_scheduled_recording);
+ mDvrManager = TvApplication.getSingletons(context).getDvrManager();
+ mDvrScheduleManager = TvApplication.getSingletons(context).getDvrScheduleManager();
mTunerConflictWillNotBeRecordedInfo = mContext.getString(
R.string.dvr_schedules_tuner_conflict_will_not_be_recorded_info);
mTunerConflictWillBePartiallyRecordedInfo = mContext.getString(
R.string.dvr_schedules_tuner_conflict_will_be_partially_recorded);
- mInfoSeparator = mContext.getString(R.string.dvr_schedules_information_separator);
- updateInputScheduleMap();
+ mAnimationDuration = mContext.getResources().getInteger(
+ android.R.integer.config_shortAnimTime);
}
@Override
public ViewHolder createRowViewHolder(ViewGroup parent) {
- View view = LayoutInflater.from(mContext).inflate(R.layout.dvr_schedules_item,
- parent, false);
- return onGetScheduleRowViewHolder(view);
+ return onGetScheduleRowViewHolder(LayoutInflater.from(mContext)
+ .inflate(R.layout.dvr_schedules_item, parent, false));
}
/**
@@ -365,396 +329,467 @@ public class ScheduleRowPresenter extends RowPresenter {
}
/**
- * Returns be recorded drawable which is for being recorded scheduled recordings.
- */
- protected Drawable getBeingRecordedDrawable() {
- return mBeingRecordedDrawable;
- }
-
- /**
- * Returns on air drawable which is for on air but not being recorded scheduled recordings.
+ * Returns DVR manager.
*/
- protected Drawable getOnAirDrawable() {
- return mOnAirDrawable;
- }
-
- /**
- * Returns cancel drawable which is for cancelling scheduled recording.
- */
- protected Drawable getCancelDrawable() {
- return mCancelDrawable;
- }
-
- /**
- * Returns schedule drawable which is for scheduling.
- */
- protected Drawable getScheduleDrawable() {
- return mScheduleDrawable;
- }
-
- /**
- * Returns conflicting scheduled recordings.
- */
- protected List<ScheduledRecording> getConflicts() {
- return mConflicts;
+ protected DvrManager getDvrManager() {
+ return mDvrManager;
}
@Override
protected void onBindRowViewHolder(RowPresenter.ViewHolder vh, Object item) {
super.onBindRowViewHolder(vh, item);
ScheduleRowViewHolder viewHolder = (ScheduleRowViewHolder) vh;
- ScheduleRow scheduleRow = (ScheduleRow) item;
- ScheduledRecording recording = scheduleRow.getRecording();
- // TODO: Do not show separator in the first row.
+ ScheduleRow row = (ScheduleRow) item;
+ @ScheduleRowAction int[] actions = getAvailableActions(row);
+ viewHolder.mActions = actions;
viewHolder.mInfoContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- onInfoClicked(scheduleRow);
+ onInfoClicked(row);
}
});
- viewHolder.mDeleteActionContainer.setOnClickListener(new View.OnClickListener() {
+ viewHolder.mFirstActionContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- onDeleteClicked(scheduleRow, viewHolder);
+ onActionClicked(actions[0], row);
}
});
- viewHolder.mScheduleActionContainer.setOnClickListener(new View.OnClickListener() {
+ viewHolder.mSecondActionContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- onScheduleClicked(scheduleRow);
+ onActionClicked(actions[1], row);
}
});
- viewHolder.mTimeView.setText(onGetRecordingTimeText(recording));
- Channel channel = TvApplication.getSingletons(mContext).getChannelDataManager()
- .getChannel(recording.getChannelId());
- String programInfoText = onGetProgramInfoText(recording);
+ viewHolder.mTimeView.setText(onGetRecordingTimeText(row));
+ String programInfoText = onGetProgramInfoText(row);
if (TextUtils.isEmpty(programInfoText)) {
int durationMins =
- Math.max((int) TimeUnit.MILLISECONDS.toMinutes(recording.getDuration()), 1);
+ Math.max((int) TimeUnit.MILLISECONDS.toMinutes(row.getDuration()), 1);
programInfoText = mContext.getResources().getQuantityString(
R.plurals.dvr_schedules_recording_duration, durationMins, durationMins);
}
- String channelName = channel != null ? channel.getDisplayName() : null;
+ String channelName = getChannelNameText(row);
viewHolder.mProgramTitleView.setText(programInfoText);
viewHolder.mInfoSeparatorView.setVisibility((!TextUtils.isEmpty(programInfoText)
&& !TextUtils.isEmpty(channelName)) ? View.VISIBLE : View.GONE);
viewHolder.mChannelNameView.setText(channelName);
- if (!scheduleRow.isRemoveScheduleChecked()) {
- if (recording.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- viewHolder.mDeleteActionView.setImageDrawable(mBeingRecordedDrawable);
- } else {
- viewHolder.mDeleteActionView.setImageDrawable(mCancelDrawable);
+ if (actions != null) {
+ switch (actions.length) {
+ case 2:
+ viewHolder.mSecondActionView.setImageResource(getImageForAction(actions[1]));
+ // pass through
+ case 1:
+ viewHolder.mFirstActionView.setImageResource(getImageForAction(actions[0]));
+ break;
}
- } else {
- if (recording.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- viewHolder.mDeleteActionView.setImageDrawable(mOnAirDrawable);
+ }
+ if (mDvrManager.isConflicting(row.getSchedule())) {
+ String conflictInfo;
+ if (mDvrScheduleManager.isPartiallyConflicting(row.getSchedule())) {
+ conflictInfo = mTunerConflictWillBePartiallyRecordedInfo;
} else {
- viewHolder.mDeleteActionView.setImageDrawable(mScheduleDrawable);
+ conflictInfo = mTunerConflictWillNotBeRecordedInfo;
}
- viewHolder.mProgramTitleView.setTextColor(
- mContext.getResources().getColor(R.color.dvr_schedules_item_info, null));
+ viewHolder.mConflictInfoView.setText(conflictInfo);
+ viewHolder.mConflictInfoView.setVisibility(View.VISIBLE);
+ } else {
+ viewHolder.mConflictInfoView.setVisibility(View.GONE);
+ }
+ if (shouldBeGrayedOut(row)) {
+ viewHolder.greyOutInfo();
+ } else {
+ viewHolder.whiteBackInfo();
+ }
+ updateActionContainer(viewHolder, viewHolder.isSelected());
+ }
+
+ private int getImageForAction(@ScheduleRowAction int action) {
+ switch (action) {
+ case ACTION_START_RECORDING:
+ return R.drawable.ic_record_start;
+ case ACTION_STOP_RECORDING:
+ return R.drawable.ic_record_stop;
+ case ACTION_CREATE_SCHEDULE:
+ return R.drawable.ic_scheduled_recording;
+ case ACTION_REMOVE_SCHEDULE:
+ return R.drawable.ic_dvr_cancel;
+ default:
+ return 0;
}
- viewHolder.mRecording = recording;
- onBindRowViewHolderInternal(viewHolder, scheduleRow);
}
/**
* Returns view holder for schedule row.
*/
protected ScheduleRowViewHolder onGetScheduleRowViewHolder(View view) {
- return new ScheduleRowViewHolder(view);
+ return new ScheduleRowViewHolder(view, this);
}
/**
* Returns time text for time view from scheduled recording.
*/
- protected String onGetRecordingTimeText(ScheduledRecording recording) {
- return Utils.getDurationString(mContext, recording.getStartTimeMs(),
- recording.getEndTimeMs(), true, false, true, 0);
+ protected String onGetRecordingTimeText(ScheduleRow row) {
+ return Utils.getDurationString(mContext, row.getStartTimeMs(), row.getEndTimeMs(), true,
+ false, true, 0);
}
/**
* Returns program info text for program title view.
*/
- protected String onGetProgramInfoText(ScheduledRecording recording) {
- if (recording != null) {
- return recording.getProgramTitle();
- }
- return null;
+ protected String onGetProgramInfoText(ScheduleRow row) {
+ return row.getProgramTitleWithEpisodeNumber(mContext);
}
- /**
- * Internal method for onBindRowViewHolder, can be customized by subclass.
- */
- protected void onBindRowViewHolderInternal(ScheduleRowViewHolder viewHolder, ScheduleRow
- scheduleRow) {
- if (mConflicts.contains(scheduleRow.getRecording())) {
- viewHolder.mScheduleActionView.setImageDrawable(mScheduleDrawable);
- String conflictInfo = mTunerConflictWillNotBeRecordedInfo;
- // TODO: It's also possible for the NonStarted schedules to be partially recorded.
- if (viewHolder.mRecording.getState()
- == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- conflictInfo = mTunerConflictWillBePartiallyRecordedInfo;
- }
- viewHolder.mConflictInfoView.setText(conflictInfo);
- // TODO: Add 12dp warning icon to conflict info.
- viewHolder.mConflictInfoView.setVisibility(View.VISIBLE);
- viewHolder.greyOutInfo();
- } else {
- viewHolder.mScheduleActionContainer.setVisibility(View.GONE);
- viewHolder.mConflictInfoView.setVisibility(View.GONE);
- if (!scheduleRow.isRemoveScheduleChecked()) {
- viewHolder.whiteBackInfo();
- }
- }
+ private String getChannelNameText(ScheduleRow row) {
+ Channel channel = TvApplication.getSingletons(mContext).getChannelDataManager()
+ .getChannel(row.getChannelId());
+ return channel == null ? null :
+ TextUtils.isEmpty(channel.getDisplayName()) ? channel.getDisplayNumber() :
+ channel.getDisplayName().trim() + " " + channel.getDisplayNumber();
}
/**
- * Updates input schedule map.
+ * Called when user click Info in {@link ScheduleRow}.
*/
- private void updateInputScheduleMap() {
- mInputScheduleMap.clear();
- List<ScheduledRecording> allRecordings = TvApplication.getSingletons(getContext())
- .getDvrDataManager().getAvailableScheduledRecordings();
- for(ScheduledRecording recording : allRecordings) {
- addScheduledRecordingToMap(recording);
+ protected void onInfoClicked(ScheduleRow scheduleRow) {
+ ScheduledRecording schedule = scheduleRow.getSchedule();
+ if (schedule != null) {
+ DvrUiHelper.startDetailsActivity((Activity) mContext, schedule, null, true);
}
- updateConflicts();
}
/**
- * Updates conflicting scheduled recordings.
+ * Called when the button in a row is clicked.
*/
- private void updateConflicts() {
- mConflicts.clear();
- for (String inputId : mInputScheduleMap.keySet()) {
- TvInputInfo input = Utils.getTvInputInfoForInputId(mContext, inputId);
- if (input == null) {
- continue;
- }
- mConflicts.addAll(DvrScheduleManager.getConflictingSchedules(
- new ArrayList<>(mInputScheduleMap.get(inputId).values()),
- input.getTunerCount()));
+ protected void onActionClicked(@ScheduleRowAction final int action, ScheduleRow row) {
+ switch (action) {
+ case ACTION_START_RECORDING:
+ onStartRecording(row);
+ break;
+ case ACTION_STOP_RECORDING:
+ onStopRecording(row);
+ break;
+ case ACTION_CREATE_SCHEDULE:
+ onCreateSchedule(row);
+ break;
+ case ACTION_REMOVE_SCHEDULE:
+ onRemoveSchedule(row);
+ break;
}
}
/**
- * Adds a scheduled recording to the map, it happens when user undo cancel.
+ * Action handler for {@link #ACTION_START_RECORDING}.
*/
- private void addScheduledRecordingToMap(ScheduledRecording recording) {
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mContext,
- recording.getChannelId());
- if (input == null) {
+ protected void onStartRecording(ScheduleRow row) {
+ ScheduledRecording schedule = row.getSchedule();
+ if (schedule == null) {
+ // This row has been deleted.
return;
}
- String inputId = input.getId();
- HashMap<Long, ScheduledRecording> schedulesMap = mInputScheduleMap.get(inputId);
- if (schedulesMap == null) {
- schedulesMap = new HashMap<>();
- mInputScheduleMap.put(inputId, schedulesMap);
+ // Checks if there are current recordings that will be stopped by schedule this program.
+ // If so, shows confirmation dialog to users.
+ List<ScheduledRecording> conflictSchedules = mDvrScheduleManager.getConflictingSchedules(
+ schedule.getChannelId(), System.currentTimeMillis(), schedule.getEndTimeMs());
+ for (int i = conflictSchedules.size() - 1; i >= 0; i--) {
+ ScheduledRecording conflictSchedule = conflictSchedules.get(i);
+ if (conflictSchedule.isInProgress()) {
+ DvrUiHelper.showStopRecordingDialog((Activity) mContext,
+ conflictSchedule.getChannelId(),
+ DvrStopRecordingFragment.REASON_ON_CONFLICT,
+ new HalfSizedDialogFragment.OnActionClickListener() {
+ @Override
+ public void onActionClick(long actionId) {
+ if (actionId == DvrStopRecordingFragment.ACTION_STOP) {
+ onStartRecordingInternal(row);
+ }
+ }
+ });
+ return;
+ }
}
- schedulesMap.put(recording.getId(), recording);
+ onStartRecordingInternal(row);
}
- /**
- * Called when a scheduled recording is added into dvr date manager.
- */
- public void onScheduledRecordingAdded(ScheduledRecording recording) {
- if (recording.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED || recording
- .getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- addScheduledRecordingToMap(recording);
- updateConflicts();
+ private void onStartRecordingInternal(ScheduleRow row) {
+ if (row.isOnAir() && !row.isRecordingInProgress() && !row.isStartRecordingRequested()) {
+ row.setStartRecordingRequested(true);
+ if (row.isRecordingNotStarted()) {
+ mDvrManager.setHighestPriority(row.getSchedule());
+ } else if (row.isRecordingFinished()) {
+ mDvrManager.addSchedule(ScheduledRecording.buildFrom(row.getSchedule())
+ .setId(ScheduledRecording.ID_NOT_SET)
+ .setState(ScheduledRecording.STATE_RECORDING_NOT_STARTED)
+ .setPriority(mDvrManager.suggestHighestPriority(row.getSchedule()))
+ .build());
+ } else {
+ SoftPreconditions.checkState(false, TAG, "Invalid row state to start recording: "
+ + row);
+ return;
+ }
+ String msg = mContext.getString(R.string.dvr_msg_current_program_scheduled,
+ row.getSchedule().getProgramTitle(),
+ Utils.toTimeString(row.getEndTimeMs(), false));
+ ToastUtils.show(mContext, msg, Toast.LENGTH_SHORT);
}
}
/**
- * Adds a scheduled recording to the map, it happens when user undo cancel.
+ * Action handler for {@link #ACTION_STOP_RECORDING}.
*/
- private void updateScheduledRecordingToMap(ScheduledRecording recording) {
- if (recording.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED ||
- recording.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mContext,
- recording.getChannelId());
- if (input == null) {
- return;
- }
- String inputId = input.getId();
- HashMap<Long, ScheduledRecording> schedulesMap = mInputScheduleMap.get(inputId);
- if (schedulesMap == null) {
- addScheduledRecordingToMap(recording);
- return;
+ protected void onStopRecording(ScheduleRow row) {
+ if (row.getSchedule() == null) {
+ // This row has been deleted.
+ return;
+ }
+ if (row.isOnAir() && row.isRecordingInProgress() && !row.isStopRecordingRequested()) {
+ row.setStopRecordingRequested(true);
+ mDvrManager.stopRecording(row.getSchedule());
+ CharSequence deletedInfo = onGetProgramInfoText(row);
+ if (TextUtils.isEmpty(deletedInfo)) {
+ deletedInfo = getChannelNameText(row);
}
- schedulesMap.put(recording.getId(), recording);
- } else {
- removeScheduledRecordingFromMap(recording);
+ ToastUtils.show(mContext, mContext.getResources()
+ .getString(R.string.dvr_schedules_deletion_info, deletedInfo),
+ Toast.LENGTH_SHORT);
}
}
/**
- * Called when a scheduled recording is updated in dvr date manager.
+ * Action handler for {@link #ACTION_CREATE_SCHEDULE}.
*/
- public void onScheduledRecordingUpdated(ScheduledRecording recording) {
- updateScheduledRecordingToMap(recording);
- updateConflicts();
+ protected void onCreateSchedule(ScheduleRow row) {
+ if (row.getSchedule() == null) {
+ // This row has been deleted.
+ return;
+ }
+ if (!row.isOnAir()) {
+ if (row.isScheduleCanceled()) {
+ mDvrManager.updateScheduledRecording(ScheduledRecording.buildFrom(row.getSchedule())
+ .setState(ScheduledRecording.STATE_RECORDING_NOT_STARTED)
+ .setPriority(mDvrManager.suggestHighestPriority(row.getSchedule()))
+ .build());
+ String msg = mContext.getString(R.string.dvr_msg_program_scheduled,
+ row.getSchedule().getProgramTitle());
+ ToastUtils.show(mContext, msg, Toast.LENGTH_SHORT);
+ } else if (mDvrManager.isConflicting(row.getSchedule())) {
+ mDvrManager.setHighestPriority(row.getSchedule());
+ }
+ }
}
/**
- * Removes a scheduled recording from the map, it happens when user cancel schedule.
+ * Action handler for {@link #ACTION_REMOVE_SCHEDULE}.
*/
- private void removeScheduledRecordingFromMap(ScheduledRecording recording) {
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mContext, recording.getChannelId());
- if (input == null) {
+ protected void onRemoveSchedule(ScheduleRow row) {
+ if (row.getSchedule() == null) {
+ // This row has been deleted.
return;
}
- String inputId = input.getId();
- HashMap<Long, ScheduledRecording> schedulesMap = mInputScheduleMap.get(inputId);
- if (schedulesMap == null) {
- return;
+ CharSequence deletedInfo = null;
+ if (row.isOnAir()) {
+ if (row.isRecordingNotStarted()) {
+ deletedInfo = getDeletedInfo(row);
+ mDvrManager.removeScheduledRecording(row.getSchedule());
+ }
+ } else {
+ if (mDvrManager.isConflicting(row.getSchedule())
+ && !shouldKeepScheduleAfterRemoving()) {
+ deletedInfo = getDeletedInfo(row);
+ mDvrManager.removeScheduledRecording(row.getSchedule());
+ } else if (row.isRecordingNotStarted()) {
+ deletedInfo = getDeletedInfo(row);
+ mDvrManager.updateScheduledRecording(ScheduledRecording.buildFrom(row.getSchedule())
+ .setState(ScheduledRecording.STATE_RECORDING_CANCELED)
+ .build());
+ }
}
- schedulesMap.remove(recording.getId());
- if (schedulesMap.isEmpty()) {
- mInputScheduleMap.remove(inputId);
+ if (deletedInfo != null) {
+ ToastUtils.show(mContext, mContext.getResources()
+ .getString(R.string.dvr_schedules_deletion_info, deletedInfo),
+ Toast.LENGTH_SHORT);
}
}
- /**
- * Called when a scheduled recording is removed from dvr date manager.
- */
- public void onScheduledRecordingRemoved(ScheduledRecording recording) {
- removeScheduledRecordingFromMap(recording);
- updateConflicts();
+ private CharSequence getDeletedInfo(ScheduleRow row) {
+ CharSequence deletedInfo = onGetProgramInfoText(row);
+ if (TextUtils.isEmpty(deletedInfo)) {
+ return getChannelNameText(row);
+ }
+ return deletedInfo;
}
- /**
- * Called when user click Info in {@link ScheduleRow}.
- */
- protected void onInfoClicked(ScheduleRow scheduleRow) {
- DvrUiHelper.startDetailsActivity((Activity) mContext,
- scheduleRow.getRecording(), null, true);
+ @Override
+ protected void onRowViewSelected(ViewHolder vh, boolean selected) {
+ super.onRowViewSelected(vh, selected);
+ updateActionContainer(vh, selected);
}
/**
- * Called when user click schedule in {@link ScheduleRow}.
+ * Internal method for onRowViewSelected, can be customized by subclass.
*/
- protected void onScheduleClicked(ScheduleRow scheduleRow) {
- ScheduledRecording scheduledRecording = scheduleRow.getRecording();
- TvInputInfo input = Utils.getTvInputInfoForChannelId(mContext,
- scheduledRecording.getChannelId());
- if (input == null) {
- return;
- }
- List<ScheduledRecording> allScheduledRecordings = new ArrayList<ScheduledRecording>(
- mInputScheduleMap.get(input.getId()).values());
- long maxPriority = scheduledRecording.getPriority();
- for (ScheduledRecording recording : allScheduledRecordings) {
- if (scheduledRecording.isOverLapping(
- new Range<>(recording.getStartTimeMs(), recording.getEndTimeMs()))) {
- if (maxPriority < recording.getPriority()) {
- maxPriority = recording.getPriority();
+ private void updateActionContainer(ViewHolder vh, boolean selected) {
+ ScheduleRowViewHolder viewHolder = (ScheduleRowViewHolder) vh;
+ viewHolder.mSecondActionContainer.animate().setListener(null).cancel();
+ viewHolder.mFirstActionContainer.animate().setListener(null).cancel();
+ if (selected && viewHolder.mActions != null) {
+ switch (viewHolder.mActions.length) {
+ case 2:
+ prepareShowActionView(viewHolder.mSecondActionContainer);
+ prepareShowActionView(viewHolder.mFirstActionContainer);
+ viewHolder.mPendingAnimationRunnable = new Runnable() {
+ @Override
+ public void run() {
+ showActionView(viewHolder.mSecondActionContainer);
+ showActionView(viewHolder.mFirstActionContainer);
+ }
+ };
+ break;
+ case 1:
+ prepareShowActionView(viewHolder.mFirstActionContainer);
+ viewHolder.mPendingAnimationRunnable = new Runnable() {
+ @Override
+ public void run() {
+ hideActionView(viewHolder.mSecondActionContainer, View.GONE);
+ showActionView(viewHolder.mFirstActionContainer);
+ }
+ };
+ if (mLastFocusedViewId == R.id.action_second_container) {
+ mLastFocusedViewId = R.id.info_container;
+ }
+ break;
+ case 0:
+ default:
+ viewHolder.mPendingAnimationRunnable = new Runnable() {
+ @Override
+ public void run() {
+ hideActionView(viewHolder.mSecondActionContainer, View.GONE);
+ hideActionView(viewHolder.mFirstActionContainer, View.GONE);
+ }
+ };
+ 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);
+ if (view != null && view.getVisibility() == View.VISIBLE) {
+ // When the row is selected, information container gets the initial focus.
+ // To give the focus to the same control as the previous row, we need to call
+ // requestFocus() explicitly.
+ if (view.hasFocus()) {
+ viewHolder.mPendingAnimationRunnable.run();
+ } else {
+ view.requestFocus();
}
}
+ } else {
+ viewHolder.mPendingAnimationRunnable = null;
+ hideActionView(viewHolder.mFirstActionContainer, View.GONE);
+ hideActionView(viewHolder.mSecondActionContainer, View.GONE);
+ }
+ }
+
+ private void prepareShowActionView(View view) {
+ if (view.getVisibility() != View.VISIBLE) {
+ view.setAlpha(0.0f);
}
- TvApplication.getSingletons(getContext()).getDvrManager()
- .updateScheduledRecording(ScheduledRecording.buildFrom(scheduledRecording)
- .setPriority(maxPriority + 1).build());
- updateConflicts();
+ view.setVisibility(View.VISIBLE);
}
/**
- * Called when user click delete in {@link ScheduleRow}.
+ * Add animation when view is visible.
*/
- protected void onDeleteClicked(ScheduleRow scheduleRow, ViewHolder vh) {
- ScheduledRecording recording = scheduleRow.getRecording();
- ScheduleRowViewHolder viewHolder = (ScheduleRowViewHolder) vh;
- if (!scheduleRow.isRemoveScheduleChecked()) {
- if (mConflicts.contains(recording)) {
- TvApplication.getSingletons(mContext)
- .getDvrManager().removeScheduledRecording(recording);
- }
+ private void showActionView(View view) {
+ view.animate().alpha(1.0f).setInterpolator(new DecelerateInterpolator())
+ .setDuration(mAnimationDuration).start();
+ }
- if (recording.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- viewHolder.mDeleteActionView.setImageDrawable(mOnAirDrawable);
- // TODO: Replace an icon whose size is the same as scheudle.
- } else {
- viewHolder.getDeleteActionView().setImageDrawable(mScheduleDrawable);
- }
- viewHolder.greyOutInfo();
- scheduleRow.setRemoveScheduleChecked(true);
- CharSequence deletedInfo = viewHolder.getProgramTitleView().getText();
- if (TextUtils.isEmpty(deletedInfo)) {
- deletedInfo = viewHolder.getChannelNameView().getText();
- }
- Toast.makeText(mContext, mContext.getResources()
- .getString(R.string.dvr_schedules_deletion_info, deletedInfo),
- Toast.LENGTH_SHORT).show();
- removeScheduledRecordingFromMap(recording);
- } else {
- if (recording.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS) {
- viewHolder.mDeleteActionView.setImageDrawable(mBeingRecordedDrawable);
- // TODO: Replace an icon whose size is the same as scheudle.
- } else {
- viewHolder.getDeleteActionView().setImageDrawable(mCancelDrawable);
+ /**
+ * Add animation when view change to invisible.
+ */
+ private void hideActionView(View view, int visibility) {
+ if (view.getVisibility() != View.VISIBLE) {
+ if (view.getVisibility() != visibility) {
+ view.setVisibility(visibility);
}
- viewHolder.whiteBackInfo();
- scheduleRow.setRemoveScheduleChecked(false);
- addScheduledRecordingToMap(recording);
- }
- updateConflicts();
- for (ScheduleRowClickListener l : mListeners) {
- l.onDeleteClicked(scheduleRow);
+ return;
}
+ view.animate().alpha(0.0f).setInterpolator(new DecelerateInterpolator())
+ .setDuration(mAnimationDuration)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ view.setVisibility(visibility);
+ view.animate().setListener(null);
+ }
+ }).start();
}
/**
- * Adds {@link ScheduleRowClickListener}.
+ * Returns the available actions according to the row's state. It should be the reverse order
+ * with that in the screen.
*/
- public void addListener(ScheduleRowClickListener scheduleRowClickListener) {
- mListeners.add(scheduleRowClickListener);
+ @ScheduleRowAction
+ protected int[] getAvailableActions(ScheduleRow row) {
+ if (row.getSchedule() != null) {
+ 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};
+ } else {
+ return new int[] {ACTION_REMOVE_SCHEDULE};
+ }
+ } else if (row.isRecordingFinished()) {
+ return new int[] {ACTION_START_RECORDING};
+ } else {
+ SoftPreconditions.checkState(false, TAG, "Invalid row state in checking the"
+ + " available actions(on air): " + row);
+ }
+ } else {
+ if (row.isScheduleCanceled()) {
+ return new int[] {ACTION_CREATE_SCHEDULE};
+ } else if (mDvrManager.isConflicting(row.getSchedule()) && canResolveConflict()) {
+ return new int[] {ACTION_REMOVE_SCHEDULE, ACTION_CREATE_SCHEDULE};
+ } else if (row.isRecordingNotStarted()) {
+ return new int[] {ACTION_REMOVE_SCHEDULE};
+ } else {
+ SoftPreconditions.checkState(false, TAG, "Invalid row state in checking the"
+ + " available actions(future schedule): " + row);
+ }
+ }
+ }
+ return null;
}
/**
- * Removes {@link ScheduleRowClickListener}.
+ * Check if the conflict can be resolved in this screen.
*/
- public void removeListener(ScheduleRowClickListener
- scheduleRowClickListener) {
- mListeners.remove(scheduleRowClickListener);
- }
-
- @Override
- protected void onRowViewSelected(ViewHolder vh, boolean selected) {
- super.onRowViewSelected(vh, selected);
- onRowViewSelectedInternal(vh, selected);
+ protected boolean canResolveConflict() {
+ return true;
}
/**
- * Internal method for onRowViewSelected, can be customized by subclass.
+ * Check if the schedule should be kept after removing it.
*/
- protected void onRowViewSelectedInternal(ViewHolder vh, boolean selected) {
- ScheduleRowViewHolder viewHolder = (ScheduleRowViewHolder) vh;
- boolean isRecordingConflicting = mConflicts.contains(viewHolder.mRecording);
- if (selected) {
- viewHolder.mDeleteActionContainer.setVisibility(View.VISIBLE);
- if (isRecordingConflicting) {
- viewHolder.mScheduleActionContainer.setVisibility(View.VISIBLE);
- }
- } else {
- viewHolder.mDeleteActionContainer.setVisibility(View.GONE);
- if (isRecordingConflicting) {
- viewHolder.mScheduleActionContainer.setVisibility(View.GONE);
- }
- }
+ protected boolean shouldKeepScheduleAfterRemoving() {
+ return false;
}
/**
- * A listener for clicking {@link ScheduleRow}.
+ * Checks if the row should be grayed out.
*/
- public interface ScheduleRowClickListener{
- /**
- * To notify other observers that delete button has been clicked.
- */
- void onDeleteClicked(ScheduleRow scheduleRow);
+ protected boolean shouldBeGrayedOut(ScheduleRow row) {
+ return row.getSchedule() == null
+ || (row.isOnAir() && !row.isRecordingInProgress())
+ || mDvrManager.isConflicting(row.getSchedule())
+ || row.isScheduleCanceled();
}
}
diff --git a/src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java b/src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java
index d103a533..0fb0924d 100644
--- a/src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java
+++ b/src/com/android/tv/dvr/ui/list/SchedulesHeaderRow.java
@@ -16,8 +16,6 @@
package com.android.tv.dvr.ui.list;
-import android.support.annotation.Nullable;
-
import com.android.tv.dvr.SeriesRecording;
/**
@@ -88,13 +86,6 @@ public abstract class SchedulesHeaderRow {
}
/**
- * Sets the latest time of the list which belongs to the header row.
- */
- public void setDeadLineMs(long deadLineMs) {
- mDeadLineMs = deadLineMs;
- }
-
- /**
* Returns the latest time of the list which belongs to the header row.
*/
public long getDeadLineMs() {
@@ -106,35 +97,26 @@ public abstract class SchedulesHeaderRow {
* The header row which represent the series recording.
*/
public static class SeriesRecordingHeaderRow extends SchedulesHeaderRow {
- private SeriesRecording mSeries;
- private boolean mCancelAllChecked;
+ private SeriesRecording mSeriesRecording;
public SeriesRecordingHeaderRow(String title, String description, int itemCount,
SeriesRecording series) {
super(title, description, itemCount);
- mSeries = series;
- mCancelAllChecked = series.getState() == SeriesRecording.STATE_SERIES_CANCELED;
- }
-
- /**
- * Sets cancel all checked status.
- */
- public void setCancelAllChecked(boolean checked) {
- mCancelAllChecked = checked;
+ mSeriesRecording = series;
}
/**
- * Returns cancel all checked status.
+ * Returns the series recording, it is for series schedules list.
*/
- public boolean isCancelAllChecked() {
- return mCancelAllChecked;
+ public SeriesRecording getSeriesRecording() {
+ return mSeriesRecording;
}
/**
- * Returns the series recording, it is for series schedules list.
+ * Sets the series recording.
*/
- public SeriesRecording getSeriesRecording() {
- return mSeries;
+ public void setSeriesRecording(SeriesRecording seriesRecording) {
+ mSeriesRecording = seriesRecording;
}
}
}
diff --git a/src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java b/src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java
index 483962e7..69c33a96 100644
--- a/src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java
+++ b/src/com/android/tv/dvr/ui/list/SchedulesHeaderRowPresenter.java
@@ -20,7 +20,6 @@ import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.v17.leanback.widget.RowPresenter;
-import android.util.ArraySet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -36,14 +35,11 @@ import com.android.tv.dvr.SeriesRecording;
import com.android.tv.dvr.ui.DvrSchedulesActivity;
import com.android.tv.dvr.ui.list.SchedulesHeaderRow.SeriesRecordingHeaderRow;
-import java.util.Set;
-
/**
* A base class for RowPresenter for {@link SchedulesHeaderRow}
*/
public abstract class SchedulesHeaderRowPresenter extends RowPresenter {
private Context mContext;
- private Set<SchedulesHeaderRowListener> mListeners = new ArraySet<>();
public SchedulesHeaderRowPresenter(Context context) {
setHeaderPresenter(null);
@@ -59,26 +55,6 @@ public abstract class SchedulesHeaderRowPresenter extends RowPresenter {
}
/**
- * Adds {@link SchedulesHeaderRowListener}.
- */
- public void addListener(SchedulesHeaderRowListener listener) {
- mListeners.add(listener);
- }
-
- /**
- * Removes {@link SchedulesHeaderRowListener}.
- */
- public void removeListener(SchedulesHeaderRowListener listener) {
- mListeners.remove(listener);
- }
-
- void notifyUpdateAllScheduleRows() {
- for (SchedulesHeaderRowListener listener : mListeners) {
- listener.onUpdateAllScheduleRows();
- }
- }
-
- /**
* A ViewHolder for {@link SchedulesHeaderRow}.
*/
public static class SchedulesHeaderRowViewHolder extends RowPresenter.ViewHolder {
@@ -147,54 +123,59 @@ public abstract class SchedulesHeaderRowPresenter extends RowPresenter {
mCancelDrawable = context.getDrawable(R.drawable.ic_dvr_cancel_large);
mResumeDrawable = context.getDrawable(R.drawable.ic_record_start);
mSettingsInfo = context.getString(R.string.dvr_series_schedules_settings);
- mCancelAllInfo = context.getString(R.string.dvr_series_schedules_cancel_all);
- mResumeInfo = context.getString(R.string.dvr_series_schedules_resume);
+ mCancelAllInfo = context.getString(R.string.dvr_series_schedules_stop);
+ mResumeInfo = context.getString(R.string.dvr_series_schedules_start);
}
@Override
protected ViewHolder createRowViewHolder(ViewGroup parent) {
- return new SeriesRecordingRowViewHolder(getContext(), parent);
+ return new SeriesHeaderRowViewHolder(getContext(), parent);
}
@Override
protected void onBindRowViewHolder(RowPresenter.ViewHolder viewHolder, Object item) {
super.onBindRowViewHolder(viewHolder, item);
- SeriesRecordingRowViewHolder headerViewHolder =
- (SeriesRecordingRowViewHolder) viewHolder;
+ SeriesHeaderRowViewHolder headerViewHolder =
+ (SeriesHeaderRowViewHolder) viewHolder;
SeriesRecordingHeaderRow header = (SeriesRecordingHeaderRow) item;
headerViewHolder.mSeriesSettingsButton.setVisibility(
- isSeriesScheduleCanceled(getContext(), header) ? View.INVISIBLE : View.VISIBLE);
+ header.getSeriesRecording().isStopped() ? View.INVISIBLE : View.VISIBLE);
headerViewHolder.mSeriesSettingsButton.setText(mSettingsInfo);
setTextDrawable(headerViewHolder.mSeriesSettingsButton, mSettingsDrawable);
- if (header.isCancelAllChecked()) {
- headerViewHolder.mTogglePauseButton.setText(mResumeInfo);
- setTextDrawable(headerViewHolder.mTogglePauseButton, mResumeDrawable);
+ if (header.getSeriesRecording().isStopped()) {
+ headerViewHolder.mToggleStartStopButton.setText(mResumeInfo);
+ setTextDrawable(headerViewHolder.mToggleStartStopButton, mResumeDrawable);
} else {
- headerViewHolder.mTogglePauseButton.setText(mCancelAllInfo);
- setTextDrawable(headerViewHolder.mTogglePauseButton, mCancelDrawable);
+ headerViewHolder.mToggleStartStopButton.setText(mCancelAllInfo);
+ setTextDrawable(headerViewHolder.mToggleStartStopButton, mCancelDrawable);
}
headerViewHolder.mSeriesSettingsButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
+ // TODO: pass channel list for settings.
DvrUiHelper.startSeriesSettingsActivity(getContext(),
- header.getSeriesRecording().getId());
+ header.getSeriesRecording().getId(), null, false, false, false);
}
});
- headerViewHolder.mTogglePauseButton.setOnClickListener(new OnClickListener() {
+ headerViewHolder.mToggleStartStopButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
- if (!header.isCancelAllChecked()) {
- DvrUiHelper.showCancelAllSeriesRecordingDialog((DvrSchedulesActivity) view
- .getContext());
+ if (header.getSeriesRecording().isStopped()) {
+ // Reset priority to the highest.
+ SeriesRecording seriesRecording = SeriesRecording
+ .buildFrom(header.getSeriesRecording())
+ .setPriority(TvApplication.getSingletons(getContext())
+ .getDvrScheduleManager().suggestNewSeriesPriority())
+ .build();
+ TvApplication.getSingletons(getContext()).getDvrManager()
+ .updateSeriesRecording(seriesRecording);
+ // TODO: pass channel list for settings.
+ DvrUiHelper.startSeriesSettingsActivity(getContext(),
+ header.getSeriesRecording().getId(), null, false, false, false);
} else {
- if (isSeriesScheduleCanceled(getContext(), header)) {
- TvApplication.getSingletons(getContext()).getDvrManager()
- .updateSeriesRecording(SeriesRecording.buildFrom(header
- .getSeriesRecording()).setState(SeriesRecording
- .STATE_SERIES_NORMAL).build());
- }
- header.setCancelAllChecked(false);
- notifyUpdateAllScheduleRows();
+ DvrUiHelper.showCancelAllSeriesRecordingDialog(
+ (DvrSchedulesActivity) view.getContext(),
+ header.getSeriesRecording());
}
}
});
@@ -208,97 +189,85 @@ public abstract class SchedulesHeaderRowPresenter extends RowPresenter {
}
}
- private static boolean isSeriesScheduleCanceled(Context context,
- SeriesRecordingHeaderRow header) {
- return TvApplication.getSingletons(context).getDvrDataManager()
- .getSeriesRecording(header.getSeriesRecording().getId()).getState()
- == SeriesRecording.STATE_SERIES_CANCELED;
- }
-
/**
* A ViewHolder for {@link SeriesRecordingHeaderRow}.
*/
- public static class SeriesRecordingRowViewHolder extends SchedulesHeaderRowViewHolder {
+ public static class SeriesHeaderRowViewHolder extends SchedulesHeaderRowViewHolder {
private final TextView mSeriesSettingsButton;
- private final TextView mTogglePauseButton;
+ private final TextView mToggleStartStopButton;
private final boolean mLtr;
private final View mSelector;
private View mLastFocusedView;
- public SeriesRecordingRowViewHolder(Context context, ViewGroup parent) {
+ public SeriesHeaderRowViewHolder(Context context, ViewGroup parent) {
super(context, parent);
mLtr = context.getResources().getConfiguration().getLayoutDirection()
== View.LAYOUT_DIRECTION_LTR;
view.findViewById(R.id.button_container).setVisibility(View.VISIBLE);
mSeriesSettingsButton = (TextView) view.findViewById(R.id.series_settings);
- mTogglePauseButton = (TextView) view.findViewById(R.id.series_toggle_pause);
+ mToggleStartStopButton =
+ (TextView) view.findViewById(R.id.series_toggle_start_stop);
mSelector = view.findViewById(R.id.selector);
OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean focused) {
- onIconFouseChange(view);
+ view.post(new Runnable() {
+ @Override
+ public void run() {
+ updateSelector(view);
+ }
+ });
}
};
mSeriesSettingsButton.setOnFocusChangeListener(onFocusChangeListener);
- mTogglePauseButton.setOnFocusChangeListener(onFocusChangeListener);
- }
-
- void onIconFouseChange(View focusedView) {
- updateSelector(focusedView, mSelector);
+ mToggleStartStopButton.setOnFocusChangeListener(onFocusChangeListener);
}
- private void updateSelector(View focusedView, final View selectorView) {
- int animationDuration = selectorView.getContext().getResources()
+ private void updateSelector(View focusedView) {
+ int animationDuration = mSelector.getContext().getResources()
.getInteger(android.R.integer.config_shortAnimTime);
DecelerateInterpolator interpolator = new DecelerateInterpolator();
if (focusedView.hasFocus()) {
- final ViewGroup.LayoutParams lp = selectorView.getLayoutParams();
+ ViewGroup.LayoutParams lp = mSelector.getLayoutParams();
final int targetWidth = focusedView.getWidth();
float targetTranslationX;
if (mLtr) {
- targetTranslationX = focusedView.getLeft() - selectorView.getLeft();
+ targetTranslationX = focusedView.getLeft() - mSelector.getLeft();
} else {
- targetTranslationX = focusedView.getRight() - selectorView.getRight();
+ targetTranslationX = focusedView.getRight() - mSelector.getRight();
}
// if the selector is invisible, set the width and translation X directly -
// don't animate.
- if (selectorView.getAlpha() == 0) {
- selectorView.setTranslationX(targetTranslationX);
+ if (mSelector.getAlpha() == 0) {
+ mSelector.setTranslationX(targetTranslationX);
lp.width = targetWidth;
- selectorView.requestLayout();
+ mSelector.requestLayout();
}
// animate the selector in and to the proper width and translation X.
final float deltaWidth = lp.width - targetWidth;
- selectorView.animate().cancel();
- selectorView.animate().translationX(targetTranslationX).alpha(1f)
+ mSelector.animate().cancel();
+ mSelector.animate().translationX(targetTranslationX).alpha(1f)
.setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// Set width to the proper width for this animation step.
lp.width = targetWidth + Math.round(
deltaWidth * (1f - animation.getAnimatedFraction()));
- selectorView.requestLayout();
+ mSelector.requestLayout();
}
}).setDuration(animationDuration).setInterpolator(interpolator).start();
mLastFocusedView = focusedView;
} else if (mLastFocusedView == focusedView) {
- selectorView.animate().cancel();
- selectorView.animate().alpha(0f).setDuration(animationDuration)
+ mSelector.animate().setUpdateListener(null).cancel();
+ mSelector.animate().alpha(0f).setDuration(animationDuration)
.setInterpolator(interpolator).start();
mLastFocusedView = null;
}
}
}
}
-
- public interface SchedulesHeaderRowListener {
- /**
- * Updates all schedule rows.
- */
- void onUpdateAllScheduleRows();
- }
}
diff --git a/src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java b/src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java
index 8b162c54..3b493774 100644
--- a/src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java
+++ b/src/com/android/tv/dvr/ui/list/SeriesScheduleRowAdapter.java
@@ -16,12 +16,20 @@
package com.android.tv.dvr.ui.list;
+import android.annotation.TargetApi;
import android.content.Context;
+import android.media.tv.TvInputInfo;
+import android.os.Build;
import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.util.ArrayMap;
+import android.util.Log;
+import com.android.tv.ApplicationSingletons;
import com.android.tv.R;
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.DvrManager;
import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.dvr.SeriesRecording;
@@ -30,127 +38,232 @@ import com.android.tv.util.Utils;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
/**
* An adapter for series schedule row.
*/
+@TargetApi(Build.VERSION_CODES.N)
public class SeriesScheduleRowAdapter extends ScheduleRowAdapter {
- private static final String TAG = "SeriesScheduleRowAdapter";
+ private static final String TAG = "SeriesRowAdapter";
+ private static final boolean DEBUG = false;
- private SeriesRecording mSeriesRecording;
+ private final SeriesRecording mSeriesRecording;
+ private final String mInputId;
+ private final DvrManager mDvrManager;
+ private final DvrDataManager mDataManager;
+ private final Map<Long, Program> mPrograms = new ArrayMap<>();
+ private SeriesRecordingHeaderRow mHeaderRow;
- public SeriesScheduleRowAdapter(Context context,
- ClassPresenterSelector classPresenterSelector, SeriesRecording seriesRecording) {
+ public SeriesScheduleRowAdapter(Context context, ClassPresenterSelector classPresenterSelector,
+ SeriesRecording seriesRecording) {
super(context, classPresenterSelector);
mSeriesRecording = seriesRecording;
+ TvInputInfo input = Utils.getTvInputInfoForInputId(context, mSeriesRecording.getInputId());
+ if (SoftPreconditions.checkNotNull(input) != null) {
+ mInputId = input.getId();
+ } else {
+ mInputId = null;
+ }
+ ApplicationSingletons singletons = TvApplication.getSingletons(context);
+ mDvrManager = singletons.getDvrManager();
+ mDataManager = singletons.getDvrDataManager();
+ setHasStableIds(true);
}
@Override
public void start() {
- List<ScheduledRecording> recordings = TvApplication.getSingletons(getContext())
- .getDvrDataManager().getAvailableAndCanceledScheduledRecordings();
- List<ScheduledRecording> seriesScheduledRecordings = new ArrayList<>();
- if (mSeriesRecording == null) {
- return;
+ setPrograms(Collections.emptyList());
+ }
+
+ @Override
+ public void stop() {
+ super.stop();
+ }
+
+ /**
+ * Sets the programs to show.
+ */
+ public void setPrograms(List<Program> programs) {
+ if (programs == null) {
+ programs = Collections.emptyList();
}
- for (ScheduledRecording recording : recordings) {
- if (recording.getSeriesRecordingId() == mSeriesRecording.getId()) {
- seriesScheduledRecordings.add(recording);
+ clear();
+ mPrograms.clear();
+ List<Program> sortedPrograms = new ArrayList<>(programs);
+ Collections.sort(sortedPrograms);
+ List<EpisodicProgramRow> rows = new ArrayList<>();
+ mHeaderRow = new SeriesRecordingHeaderRow(mSeriesRecording.getTitle(),
+ null, sortedPrograms.size(), mSeriesRecording);
+ for (Program program : sortedPrograms) {
+ ScheduledRecording schedule =
+ mDataManager.getScheduledRecordingForProgramId(program.getId());
+ if (schedule != null && !willBeKept(schedule)) {
+ schedule = null;
}
+ rows.add(new EpisodicProgramRow(mInputId, program, schedule, mHeaderRow));
+ mPrograms.put(program.getId(), program);
}
- Collections.sort(seriesScheduledRecordings,
- ScheduledRecording.START_TIME_THEN_PRIORITY_COMPARATOR);
- int dayCountToLastRecording = 0;
- if (!seriesScheduledRecordings.isEmpty()) {
- long lastRecordingStartTimeMs = seriesScheduledRecordings
- .get(seriesScheduledRecordings.size() - 1).getStartTimeMs();
- dayCountToLastRecording = Utils.computeDateDifference(System.currentTimeMillis(),
- lastRecordingStartTimeMs) + 1;
+ mHeaderRow.setDescription(getDescription());
+ add(mHeaderRow);
+ for (EpisodicProgramRow row : rows) {
+ add(row);
}
- SchedulesHeaderRow headerRow = new SeriesRecordingHeaderRow(mSeriesRecording.getTitle(),
- getContext().getResources().getQuantityString(
- R.plurals.dvr_series_schedules_header_description, dayCountToLastRecording,
- dayCountToLastRecording), seriesScheduledRecordings.size(), mSeriesRecording);
- add(headerRow);
- for (ScheduledRecording recording : seriesScheduledRecordings) {
- add(new ScheduleRow(recording, headerRow));
+ sendNextUpdateMessage(System.currentTimeMillis());
+ }
+
+ private String getDescription() {
+ int conflicts = 0;
+ for (long programId : mPrograms.keySet()) {
+ if (mDvrManager.isConflicting(
+ mDataManager.getScheduledRecordingForProgramId(programId))) {
+ ++conflicts;
+ }
}
+ return conflicts == 0 ? null : getContext().getResources().getQuantityString(
+ R.plurals.dvr_series_schedules_header_description, conflicts, conflicts);
}
@Override
- public void stop() {
- SoftPreconditions.checkState(get(0) instanceof SchedulesHeaderRow, TAG,
- "First row is not SchedulesHeaderRow");
- boolean cancelAll = size() > 0 && ((SeriesRecordingHeaderRow) get(0)).isCancelAllChecked();
- if (!cancelAll) {
- DvrManager dvrManager = TvApplication.getSingletons(getContext()).getDvrManager();
- for (int i = 0; i < size(); i++) {
- if (get(i) instanceof ScheduleRow) {
- ScheduleRow scheduleRow = (ScheduleRow) get(i);
- if (scheduleRow.isRemoveScheduleChecked()) {
- dvrManager.removeScheduledRecording(scheduleRow.getRecording());
- }
- }
+ public long getId(int position) {
+ Object obj = get(position);
+ if (obj instanceof EpisodicProgramRow) {
+ return ((EpisodicProgramRow) obj).getProgram().getId();
+ }
+ if (obj instanceof SeriesRecordingHeaderRow) {
+ return 0;
+ }
+ return super.getId(position);
+ }
+
+ @Override
+ public void onScheduledRecordingAdded(ScheduledRecording schedule) {
+ if (DEBUG) Log.d(TAG, "onScheduledRecordingAdded: " + schedule);
+ int index = findRowIndexByProgramId(schedule.getProgramId());
+ if (index != -1) {
+ EpisodicProgramRow row = (EpisodicProgramRow) get(index);
+ if (!row.isStartRecordingRequested()) {
+ row.setSchedule(schedule);
+ notifyArrayItemRangeChanged(index, 1);
}
}
}
@Override
- protected void addScheduleRow(ScheduledRecording recording) {
- if (recording != null && recording.getSeriesRecordingId() == mSeriesRecording.getId()) {
- int index = 0;
- for (; index < size(); index++) {
- if (get(index) instanceof ScheduleRow) {
- ScheduleRow scheduleRow = (ScheduleRow) get(index);
- if (ScheduledRecording.START_TIME_THEN_PRIORITY_COMPARATOR.compare(
- scheduleRow.getRecording(), recording) > 0) {
- break;
+ public void onScheduledRecordingRemoved(ScheduledRecording schedule) {
+ if (DEBUG) Log.d(TAG, "onScheduledRecordingRemoved: " + schedule);
+ int index = findRowIndexByProgramId(schedule.getProgramId());
+ if (index != -1) {
+ EpisodicProgramRow row = (EpisodicProgramRow) get(index);
+ row.setSchedule(null);
+ notifyArrayItemRangeChanged(index, 1);
+ }
+ }
+
+ @Override
+ public void onScheduledRecordingUpdated(ScheduledRecording schedule, boolean conflictChange) {
+ if (DEBUG) Log.d(TAG, "onScheduledRecordingUpdated: " + schedule);
+ int index = findRowIndexByProgramId(schedule.getProgramId());
+ if (index != -1) {
+ EpisodicProgramRow row = (EpisodicProgramRow) get(index);
+ if (conflictChange && isStartOrStopRequested()) {
+ // Delay the conflict update until it gets the response of the start/stop request.
+ // The purpose is to avoid the intermediate conflict change.
+ addPendingUpdate(row);
+ return;
+ }
+ if (row.isStopRecordingRequested()) {
+ // Wait until the recording is finished
+ if (schedule.getState() == ScheduledRecording.STATE_RECORDING_FINISHED
+ || schedule.getState() == ScheduledRecording.STATE_RECORDING_CLIPPED
+ || schedule.getState() == ScheduledRecording.STATE_RECORDING_FAILED) {
+ row.setStopRecordingRequested(false);
+ if (!isStartOrStopRequested()) {
+ executePendingUpdate();
}
+ row.setSchedule(null);
}
+ } else if (row.isStartRecordingRequested()) {
+ // When the start recording was requested, we give the highest priority. So it is
+ // guaranteed that the state will be changed from NOT_STARTED to the other state.
+ // Update the row with the next state not to show the intermediate state to avoid
+ // blinking.
+ if (schedule.getState() != ScheduledRecording.STATE_RECORDING_NOT_STARTED) {
+ row.setStartRecordingRequested(false);
+ if (!isStartOrStopRequested()) {
+ executePendingUpdate();
+ }
+ row.setSchedule(schedule);
+ }
+ } else if (willBeKept(schedule)) {
+ row.setSchedule(schedule);
+ } else {
+ row.setSchedule(null);
}
- SoftPreconditions.checkState(get(0) instanceof SchedulesHeaderRow, TAG,
- "First row is not SchedulesHeaderRow");
- if (index == 0) {
- index++;
- }
- SchedulesHeaderRow headerRow = (SchedulesHeaderRow) get(0);
- headerRow.setItemCount(headerRow.getItemCount() + 1);
- ScheduleRow addedRow = new ScheduleRow(recording, headerRow);
- add(index, addedRow);
- updateHeaderRowDescription(headerRow);
+ notifyArrayItemRangeChanged(index, 1);
}
}
- @Override
- protected void removeScheduleRow(ScheduleRow scheduleRow) {
- if (scheduleRow != null) {
- remove(scheduleRow);
- SchedulesHeaderRow headerRow = scheduleRow.getHeaderRow();
- // Changes the count information of header which the removed row belongs to.
- if (headerRow != null) {
- headerRow.setItemCount(headerRow.getItemCount() - 1);
- if (headerRow.getItemCount() == 0) {
- // TODO: Add a emtpy view.
- } else if (get(size() - 1) instanceof ScheduleRow) {
- updateHeaderRowDescription(headerRow);
+ public void onSeriesRecordingUpdated(SeriesRecording seriesRecording) {
+ if (seriesRecording.getId() == mSeriesRecording.getId()) {
+ mHeaderRow.setSeriesRecording(seriesRecording);
+ notifyArrayItemRangeChanged(0, 1);
+ }
+ }
+
+ private int findRowIndexByProgramId(long programId) {
+ for (int i = 0; i < size(); i++) {
+ Object item = get(i);
+ if (item instanceof EpisodicProgramRow) {
+ if (((EpisodicProgramRow) item).getProgram().getId() == programId) {
+ return i;
}
}
}
+ return -1;
}
@Override
- protected boolean willBeKept(ScheduledRecording recording) {
- return super.willBeKept(recording)
- || recording.getState() == ScheduledRecording.STATE_RECORDING_CANCELED;
+ public void notifyArrayItemRangeChanged(int positionStart, int itemCount) {
+ mHeaderRow.setDescription(getDescription());
+ super.notifyArrayItemRangeChanged(0, 1);
+ super.notifyArrayItemRangeChanged(positionStart, itemCount);
}
- private void updateHeaderRowDescription(SchedulesHeaderRow headerRow) {
- int nextDays = Utils.computeDateDifference(System.currentTimeMillis(),
- ((ScheduleRow) get(size() - 1)).getRecording().getStartTimeMs()) + 1;
- headerRow.setDescription(getContext().getResources()
- .getQuantityString(R.plurals.dvr_series_schedules_header_description,
- nextDays, nextDays));
- replace(indexOf(headerRow), headerRow);
+ @Override
+ protected void handleUpdateRow(long currentTimeMs) {
+ for (Iterator<Program> iter = mPrograms.values().iterator(); iter.hasNext(); ) {
+ Program program = iter.next();
+ if (program.getEndTimeUtcMillis() <= currentTimeMs) {
+ // Remove the old program.
+ removeItems(findRowIndexByProgramId(program.getId()), 1);
+ iter.remove();
+ } else if (program.getStartTimeUtcMillis() < currentTimeMs) {
+ // Change the button "START RECORDING"
+ notifyItemRangeChanged(findRowIndexByProgramId(program.getId()), 1);
+ }
+ }
+ }
+
+ /**
+ * Should take the current time argument which is the time when the programs are checked in
+ * handler.
+ */
+ @Override
+ protected long getNextTimerMs(long currentTimeMs) {
+ long earliest = Long.MAX_VALUE;
+ for (Program program : mPrograms.values()) {
+ if (earliest > program.getStartTimeUtcMillis()
+ && program.getStartTimeUtcMillis() >= currentTimeMs) {
+ // Need the button from "CREATE SCHEDULE" to "START RECORDING"
+ earliest = program.getStartTimeUtcMillis();
+ } else if (earliest > program.getEndTimeUtcMillis()) {
+ // Need to remove the row.
+ earliest = program.getEndTimeUtcMillis();
+ }
+ }
+ return earliest;
}
}
diff --git a/src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java b/src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java
index 4f31528c..5d88579a 100644
--- a/src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java
+++ b/src/com/android/tv/dvr/ui/list/SeriesScheduleRowPresenter.java
@@ -21,16 +21,16 @@ import android.view.View;
import android.view.ViewGroup;
import com.android.tv.R;
+import com.android.tv.common.SoftPreconditions;
import com.android.tv.dvr.DvrUiHelper;
-import com.android.tv.dvr.ScheduledRecording;
-import com.android.tv.dvr.ui.list.SchedulesHeaderRow.SeriesRecordingHeaderRow;
import com.android.tv.util.Utils;
/**
* A RowPresenter for series schedule row.
*/
public class SeriesScheduleRowPresenter extends ScheduleRowPresenter {
- private boolean mIsCancelAll;
+ private static final String TAG = "SeriesRowPresenter";
+
private boolean mLtr;
public SeriesScheduleRowPresenter(Context context) {
@@ -40,8 +40,8 @@ public class SeriesScheduleRowPresenter extends ScheduleRowPresenter {
}
public static class SeriesScheduleRowViewHolder extends ScheduleRowViewHolder {
- public SeriesScheduleRowViewHolder(View view) {
- super(view);
+ public SeriesScheduleRowViewHolder(View view, ScheduleRowPresenter presenter) {
+ super(view, presenter);
ViewGroup.LayoutParams lp = getTimeView().getLayoutParams();
lp.width = view.getResources().getDimensionPixelSize(
R.dimen.dvr_series_schedules_item_time_width);
@@ -51,37 +51,29 @@ public class SeriesScheduleRowPresenter extends ScheduleRowPresenter {
@Override
protected ScheduleRowViewHolder onGetScheduleRowViewHolder(View view) {
- return new SeriesScheduleRowViewHolder(view);
+ return new SeriesScheduleRowViewHolder(view, this);
}
@Override
- protected String onGetRecordingTimeText(ScheduledRecording recording) {
- return Utils.getDurationString(getContext(),
- recording.getStartTimeMs(), recording.getEndTimeMs(), false, true, true, 0);
+ protected String onGetRecordingTimeText(ScheduleRow row) {
+ return Utils.getDurationString(getContext(), row.getStartTimeMs(), row.getEndTimeMs(),
+ false, true, true, 0);
}
@Override
- protected String onGetProgramInfoText(ScheduledRecording recording) {
- if (recording != null) {
- return recording.getEpisodeDisplayTitle(getContext());
- }
- return null;
+ protected String onGetProgramInfoText(ScheduleRow row) {
+ return row.getEpisodeDisplayTitle(getContext());
}
@Override
- protected void onBindRowViewHolderInternal(ScheduleRowViewHolder viewHolder,
- ScheduleRow scheduleRow) {
- mIsCancelAll = ((SeriesRecordingHeaderRow) scheduleRow.getHeaderRow()).isCancelAllChecked();
- boolean isConflicting = getConflicts().contains(scheduleRow.getRecording());
- if (mIsCancelAll || isConflicting || scheduleRow.isRemoveScheduleChecked()) {
- viewHolder.greyOutInfo();
- } else {
- viewHolder.whiteBackInfo();
- }
- if (!mIsCancelAll && isConflicting) {
+ protected void onBindRowViewHolder(ViewHolder vh, Object item) {
+ super.onBindRowViewHolder(vh, item);
+ SeriesScheduleRowViewHolder viewHolder = (SeriesScheduleRowViewHolder) vh;
+ EpisodicProgramRow row = (EpisodicProgramRow) item;
+ if (getDvrManager().isConflicting(row.getSchedule())) {
viewHolder.getProgramTitleView().setCompoundDrawablePadding(getContext()
.getResources().getDimensionPixelOffset(
- R.dimen.dvr_schedules_warning_icon_padding));
+ R.dimen.dvr_schedules_warning_icon_padding));
if (mLtr) {
viewHolder.getProgramTitleView().setCompoundDrawablesWithIntrinsicBounds(
R.drawable.ic_warning_gray600_36dp, 0, 0, 0);
@@ -92,26 +84,60 @@ public class SeriesScheduleRowPresenter extends ScheduleRowPresenter {
} else {
viewHolder.getProgramTitleView().setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}
- if (mIsCancelAll) {
- viewHolder.getInfoContainer().setClickable(false);
- viewHolder.getDeleteActionContainer().setVisibility(View.GONE);
+ }
+
+ @Override
+ protected void onInfoClicked(ScheduleRow row) {
+ if (row.getSchedule() != null) {
+ DvrUiHelper.startSchedulesActivity(getContext(), row.getSchedule());
}
}
@Override
- protected void onRowViewSelectedInternal(ViewHolder vh, boolean selected) {
- ScheduleRowViewHolder viewHolder = (ScheduleRowViewHolder) vh;
- if (!mIsCancelAll) {
- if (selected) {
- viewHolder.getDeleteActionContainer().setVisibility(View.VISIBLE);
+ protected void onStartRecording(ScheduleRow row) {
+ SoftPreconditions.checkState(row.getSchedule() == null, TAG,
+ "Start request with the existing schedule: " + row);
+ row.setStartRecordingRequested(true);
+ getDvrManager().addScheduleWithHighestPriority(((EpisodicProgramRow) row).getProgram());
+ }
+
+ @Override
+ protected void onStopRecording(ScheduleRow row) {
+ SoftPreconditions.checkState(row.getSchedule() != null, TAG,
+ "Stop request with the null schedule: " + row);
+ row.setStopRecordingRequested(true);
+ getDvrManager().stopRecording(row.getSchedule());
+ }
+
+ @Override
+ protected void onCreateSchedule(ScheduleRow row) {
+ if (row.getSchedule() == null) {
+ getDvrManager().addScheduleWithHighestPriority(((EpisodicProgramRow) row).getProgram());
+ } else {
+ super.onCreateSchedule(row);
+ }
+ }
+
+ @Override
+ @ScheduleRowAction
+ protected int[] getAvailableActions(ScheduleRow row) {
+ if (row.getSchedule() == null) {
+ if (row.isOnAir()) {
+ return new int[] {ACTION_START_RECORDING};
} else {
- viewHolder.getDeleteActionContainer().setVisibility(View.GONE);
+ return new int[] {ACTION_CREATE_SCHEDULE};
}
}
+ return super.getAvailableActions(row);
+ }
+
+ @Override
+ protected boolean canResolveConflict() {
+ return false;
}
@Override
- protected void onInfoClicked(ScheduleRow scheduleRow) {
- DvrUiHelper.startSchedulesActivity(getContext(), scheduleRow.getRecording());
+ protected boolean shouldKeepScheduleAfterRemoving() {
+ return true;
}
}
diff --git a/src/com/android/tv/guide/ProgramGuide.java b/src/com/android/tv/guide/ProgramGuide.java
index a6ac4375..120b3dba 100644
--- a/src/com/android/tv/guide/ProgramGuide.java
+++ b/src/com/android/tv/guide/ProgramGuide.java
@@ -22,7 +22,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
-import android.animation.ValueAnimator;
+import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Point;
@@ -42,6 +42,7 @@ import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver;
+import android.view.accessibility.AccessibilityManager;
import com.android.tv.ChannelTuner;
import com.android.tv.Features;
@@ -56,6 +57,7 @@ import com.android.tv.data.ProgramDataManager;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrScheduleManager;
import com.android.tv.ui.HardwareLayerAnimatorListenerAdapter;
+import com.android.tv.ui.ViewUtils;
import com.android.tv.util.TvInputManagerHelper;
import com.android.tv.util.Utils;
@@ -90,6 +92,7 @@ public class ProgramGuide implements ProgramGrid.ChildFocusListener {
private final MainActivity mActivity;
private final ProgramManager mProgramManager;
+ private final AccessibilityManager mAccessibilityManager;
private final ChannelTuner mChannelTuner;
private final Tracker mTracker;
private final DurationTimer mVisibleDuration = new DurationTimer();
@@ -374,7 +377,10 @@ public class ProgramGuide implements ProgramGrid.ChildFocusListener {
mProgramTableFadeInAnimator.setTarget(mTable);
mProgramTableFadeInAnimator.addListener(new HardwareLayerAnimatorListenerAdapter(mTable));
mSharedPreference = PreferenceManager.getDefaultSharedPreferences(mActivity);
- mShowGuidePartial = mSharedPreference.getBoolean(KEY_SHOW_GUIDE_PARTIAL, true);
+ mAccessibilityManager =
+ (AccessibilityManager) mActivity.getSystemService(Context.ACCESSIBILITY_SERVICE);
+ mShowGuidePartial = mAccessibilityManager.isEnabled()
+ || mSharedPreference.getBoolean(KEY_SHOW_GUIDE_PARTIAL, true);
}
private void updateGuidePosition() {
@@ -606,7 +612,9 @@ public class ProgramGuide implements ProgramGrid.ChildFocusListener {
}
private void startFull() {
- if (isFull()) {
+ if (isFull() || mAccessibilityManager.isEnabled()) {
+ // If accessibility service is enabled, focus cannot be moved to side panel due to it's
+ // hidden. Therefore, we don't hide side panel when accessibility service is enabled.
return;
}
mShowGuidePartial = false;
@@ -743,7 +751,7 @@ public class ProgramGuide implements ProgramGrid.ChildFocusListener {
View detailView = row.findViewById(R.id.detail);
detailView.findViewById(R.id.detail_content_full).setAlpha(1);
detailView.findViewById(R.id.detail_content_full).setTranslationY(0);
- setLayoutHeight(detailView, mDetailHeight);
+ ViewUtils.setLayoutHeight(detailView, mDetailHeight);
detailView.setVisibility(View.VISIBLE);
final ProgramRow programRow = (ProgramRow) row.findViewById(R.id.row);
@@ -785,8 +793,8 @@ public class ProgramGuide implements ProgramGrid.ChildFocusListener {
fadeOutAnimator.setDuration(mAnimationDuration);
fadeOutAnimator.addListener(new HardwareLayerAnimatorListenerAdapter(outDetailContent));
- Animator collapseAnimator =
- createHeightAnimator(outDetail, getLayoutHeight(outDetail), 0);
+ Animator collapseAnimator = ViewUtils
+ .createHeightAnimator(outDetail, ViewUtils.getLayoutHeight(outDetail), 0);
collapseAnimator.setStartDelay(mAnimationDuration);
collapseAnimator.setDuration(mTableFadeAnimDuration);
collapseAnimator.addListener(new AnimatorListenerAdapter() {
@@ -817,7 +825,7 @@ public class ProgramGuide implements ProgramGrid.ChildFocusListener {
if (inDetail != null) {
final View inDetailContent = inDetail.findViewById(R.id.detail_content_full);
- Animator expandAnimator = createHeightAnimator(inDetail, 0, mDetailHeight);
+ Animator expandAnimator = ViewUtils.createHeightAnimator(inDetail, 0, mDetailHeight);
expandAnimator.setStartDelay(mAnimationDuration);
expandAnimator.setDuration(mTableFadeAnimDuration);
expandAnimator.addListener(new AnimatorListenerAdapter() {
@@ -832,17 +840,15 @@ public class ProgramGuide implements ProgramGrid.ChildFocusListener {
inDetailContent.setAlpha(0);
}
});
-
Animator fadeInAnimator = ObjectAnimator.ofPropertyValuesHolder(inDetailContent,
PropertyValuesHolder.ofFloat(View.ALPHA, 0f, 1f),
PropertyValuesHolder.ofFloat(View.TRANSLATION_Y,
direction * -mDetailPadding, 0f));
- fadeInAnimator.setStartDelay(mAnimationDuration + mTableFadeAnimDuration);
fadeInAnimator.setDuration(mAnimationDuration);
fadeInAnimator.addListener(new HardwareLayerAnimatorListenerAdapter(inDetailContent));
AnimatorSet inAnimator = new AnimatorSet();
- inAnimator.playTogether(expandAnimator, fadeInAnimator);
+ inAnimator.playSequentially(expandAnimator, fadeInAnimator);
inAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animator) {
@@ -854,41 +860,6 @@ public class ProgramGuide implements ProgramGrid.ChildFocusListener {
}
}
- private Animator createHeightAnimator(
- final View target, int initialHeight, int targetHeight) {
- ValueAnimator animator = ValueAnimator.ofInt(initialHeight, targetHeight);
- animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- int value = (Integer) animation.getAnimatedValue();
- if (value == 0) {
- if (target.getVisibility() != View.GONE) {
- target.setVisibility(View.GONE);
- }
- } else {
- if (target.getVisibility() != View.VISIBLE) {
- target.setVisibility(View.VISIBLE);
- }
- setLayoutHeight(target, value);
- }
- }
- });
- return animator;
- }
-
- private int getLayoutHeight(View view) {
- LayoutParams layoutParams = view.getLayoutParams();
- return layoutParams.height;
- }
-
- private void setLayoutHeight(View view, int height) {
- LayoutParams layoutParams = view.getLayoutParams();
- if (height != layoutParams.height) {
- layoutParams.height = height;
- view.setLayoutParams(layoutParams);
- }
- }
-
private class GlobalFocusChangeListener implements
ViewTreeObserver.OnGlobalFocusChangeListener {
private static final int UNKNOWN = 0;
diff --git a/src/com/android/tv/guide/ProgramItemView.java b/src/com/android/tv/guide/ProgramItemView.java
index f638e830..4c7a4404 100644
--- a/src/com/android/tv/guide/ProgramItemView.java
+++ b/src/com/android/tv/guide/ProgramItemView.java
@@ -47,9 +47,9 @@ import com.android.tv.dvr.DvrManager;
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;
-import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.TimeUnit;
@@ -73,8 +73,6 @@ public class ProgramItemView extends TextView {
private static TextAppearanceSpan sEpisodeTitleStyle;
private static TextAppearanceSpan sGrayedOutEpisodeTitleStyle;
- private static WeakReference<Toast> sToast;
-
private DvrManager mDvrManager;
private TableEntry mTableEntry;
private int mMaxWidthForRipple;
@@ -96,10 +94,9 @@ public class ProgramItemView extends TextView {
ApplicationSingletons singletons = TvApplication.getSingletons(view.getContext());
Tracker tracker = singletons.getTracker();
tracker.sendEpgItemClicked();
+ final MainActivity tvActivity = (MainActivity) view.getContext();
+ final Channel channel = tvActivity.getChannelDataManager().getChannel(entry.channelId);
if (entry.isCurrentProgram()) {
- final MainActivity tvActivity = (MainActivity) view.getContext();
- final Channel channel = tvActivity.getChannelDataManager()
- .getChannel(entry.channelId);
view.postDelayed(new Runnable() {
@Override
public void run() {
@@ -114,42 +111,25 @@ public class ProgramItemView extends TextView {
if (entry.entryStartUtcMillis > System.currentTimeMillis()
&& dvrManager.isProgramRecordable(entry.program)) {
if (entry.scheduledRecording == null) {
- if (DvrUiHelper.handleCreateSchedule((MainActivity) view.getContext(),
- entry.program)) {
+ 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());
- showToast(view.getContext(), msg);
+ ToastUtils.show(view.getContext(), msg, Toast.LENGTH_SHORT);
}
- } else if (entry.scheduledRecording.getState()
- == ScheduledRecording.STATE_RECORDING_CANCELED) {
- // TODO: replace the toast with a dialog.
- String msg = view.getResources().getString(
- R.string.dvr_msg_program_scheduled, entry.program.getTitle());
- showToast(view.getContext(), msg);
- dvrManager.updateScheduledRecording(ScheduledRecording.buildFrom(entry
- .scheduledRecording).setState(ScheduledRecording
- .STATE_RECORDING_NOT_STARTED).build());
} else {
dvrManager.removeScheduledRecording(entry.scheduledRecording);
String msg = view.getResources().getString(
R.string.dvr_schedules_deletion_info, entry.program.getTitle());
- showToast(view.getContext(), msg);
+ ToastUtils.show(view.getContext(), msg, Toast.LENGTH_SHORT);
}
} else {
- showToast(view.getContext(), view.getResources()
- .getString(R.string.dvr_msg_cannot_record_program));
+ ToastUtils.show(view.getContext(), view.getResources()
+ .getString(R.string.dvr_msg_cannot_record_program), Toast.LENGTH_SHORT);
}
}
}
-
- private void showToast(Context context, String msg) {
- if (sToast != null && sToast.get() != null) {
- sToast.get().cancel();
- }
- Toast toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
- toast.show();
- sToast = new WeakReference<>(toast);
- }
};
private static final View.OnFocusChangeListener ON_FOCUS_CHANGED =
@@ -322,7 +302,7 @@ public class ProgramItemView extends TextView {
int iconResId = 0;
if (mTableEntry.scheduledRecording != null) {
if (mDvrManager.isConflicting(mTableEntry.scheduledRecording)) {
- iconResId = R.drawable.ic_warning_white_36dp;
+ iconResId = R.drawable.ic_warning_white_18dp;
} else {
switch (mTableEntry.scheduledRecording.getState()) {
case ScheduledRecording.STATE_RECORDING_NOT_STARTED:
diff --git a/src/com/android/tv/guide/ProgramManager.java b/src/com/android/tv/guide/ProgramManager.java
index 489cc5ef..e3d919df 100644
--- a/src/com/android/tv/guide/ProgramManager.java
+++ b/src/com/android/tv/guide/ProgramManager.java
@@ -204,17 +204,17 @@ public class ProgramManager {
@Override
public void onLoadFinished() {
mChannelDataLoaded = true;
- updateChannels(true, false);
+ updateChannels(false);
}
@Override
public void onChannelListUpdated() {
- updateChannels(true, false);
+ updateChannels(false);
}
@Override
public void onChannelBrowsableChanged() {
- updateChannels(true, false);
+ updateChannels(false);
}
};
@@ -222,7 +222,7 @@ public class ProgramManager {
new ProgramDataManager.Listener() {
@Override
public void onProgramUpdated() {
- updateTableEntries(true, true);
+ updateTableEntries(true);
}
};
@@ -434,18 +434,16 @@ public class ProgramManager {
// Note that This can be happens only if program guide isn't shown
// because an user has to select channels as browsable through UI.
- private void updateChannels(boolean notify, boolean clearPreviousTableEntries) {
+ private void updateChannels(boolean clearPreviousTableEntries) {
if (DEBUG) Log.d(TAG, "updateChannels");
mChannels = mChannelDataManager.getBrowsableChannelList();
mSelectedGenreId = GenreItems.ID_ALL_CHANNELS;
mFilteredChannels = mChannels;
- if (notify) {
- notifyChannelsUpdated();
- }
- updateTableEntries(notify, clearPreviousTableEntries);
+ notifyChannelsUpdated();
+ updateTableEntries(clearPreviousTableEntries);
}
- private void updateTableEntries(boolean notify, boolean clear) {
+ private void updateTableEntries(boolean clear) {
if (clear) {
mChannelIdEntriesMap.clear();
}
@@ -494,9 +492,7 @@ public class ProgramManager {
}
}
- if (notify) {
- notifyTableEntriesUpdated();
- }
+ notifyTableEntriesUpdated();
buildGenreFilters();
}
@@ -579,7 +575,7 @@ public class ProgramManager {
}
mProgramDataManager.setPrefetchTimeRange(mStartUtcMillis);
- updateChannels(true, true);
+ updateChannels(true);
setTimeRange(startUtcMillis, endUtcMillis);
}
diff --git a/src/com/android/tv/guide/ProgramRow.java b/src/com/android/tv/guide/ProgramRow.java
index 5c4236a6..2c98ab2d 100644
--- a/src/com/android/tv/guide/ProgramRow.java
+++ b/src/com/android/tv/guide/ProgramRow.java
@@ -22,8 +22,7 @@ import android.support.v7.widget.LinearLayoutManager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
-import android.view.ViewParent;
-import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import com.android.tv.data.Channel;
import com.android.tv.guide.ProgramManager.TableEntry;
@@ -45,25 +44,26 @@ public class ProgramRow extends TimelineGridView {
interface ChildFocusListener {
/**
- * Is called after focus is moved. Only children to {@code ProgramRow} will be passed.
+ * Is called after focus is moved. It used {@link ChildFocusListener#isChild} to decide if
+ * old and new focuses are listener's children.
* See {@code ProgramRow#setChildFocusListener(ChildFocusListener)}.
*/
void onChildFocus(View oldFocus, View newFocus);
}
- private final ViewTreeObserver.OnGlobalFocusChangeListener mGlobalFocusChangeListener =
- new ViewTreeObserver.OnGlobalFocusChangeListener() {
- @Override
- public void onGlobalFocusChanged(View oldFocus, View newFocus) {
- updateCurrentFocus(oldFocus, newFocus);
- }
- };
-
/**
* Used only for debugging.
*/
private Channel mChannel;
+ private final OnGlobalLayoutListener mLayoutListener = new OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ getViewTreeObserver().removeOnGlobalLayoutListener(this);
+ updateChildVisibleArea();
+ }
+ };
+
public ProgramRow(Context context) {
this(context, null);
}
@@ -94,19 +94,15 @@ public class ProgramRow extends TimelineGridView {
@Override
public void onScrolled(int dx, int dy) {
+ // Remove callback to prevent updateChildVisibleArea being called twice.
+ getViewTreeObserver().removeOnGlobalLayoutListener(mLayoutListener);
super.onScrolled(dx, dy);
- int childCount = getChildCount();
if (DEBUG) {
Log.d(TAG, "onScrolled by " + dx);
- Log.d(TAG, "channelId=" + mChannel.getId() + ", childCount=" + childCount);
+ Log.d(TAG, "channelId=" + mChannel.getId() + ", childCount=" + getChildCount());
Log.d(TAG, "ProgramRow {" + Utils.toRectString(this) + "}");
}
- for (int i = 0; i < childCount; ++i) {
- ProgramItemView child = (ProgramItemView) getChildAt(i);
- if (getLeft() <= child.getRight() && child.getLeft() <= getRight()) {
- child.updateVisibleArea();
- }
- }
+ updateChildVisibleArea();
}
/**
@@ -117,29 +113,9 @@ public class ProgramRow extends TimelineGridView {
if (currentProgram == null) {
currentProgram = getChildAt(0);
}
- updateCurrentFocus(null, currentProgram);
- }
-
- private void updateCurrentFocus(View oldFocus, View newFocus) {
- if (mChildFocusListener == null) {
- return;
- }
-
- mChildFocusListener.onChildFocus(isChild(oldFocus) ? oldFocus : null,
- isChild(newFocus) ? newFocus : null);
- }
-
- private boolean isChild(View view) {
- if (view == null) {
- return false;
- }
-
- for (ViewParent p = view.getParent(); p != null; p = p.getParent()) {
- if (p == this) {
- return true;
- }
+ if (mChildFocusListener != null) {
+ mChildFocusListener.onChildFocus(null, currentProgram);
}
- return false;
}
// Call this API after RTL is resolved. (i.e. View is measured.)
@@ -216,23 +192,21 @@ public class ProgramRow extends TimelineGridView {
}
@Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- getViewTreeObserver().addOnGlobalFocusChangeListener(mGlobalFocusChangeListener);
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- getViewTreeObserver().removeOnGlobalFocusChangeListener(mGlobalFocusChangeListener);
- }
-
- @Override
public void onChildDetachedFromWindow(View child) {
if (child.hasFocus()) {
// Focused view can be detached only if it's updated.
TableEntry entry = ((ProgramItemView) child).getTableEntry();
- if (entry.isCurrentProgram()) {
+ if (entry.program == null) {
+ // The focus is lost due to information loaded. Requests focus immediately.
+ // (Because this entry is detached after real entries attached, we can't take
+ // the below approach to resume focus on entry being attached.)
+ post(new Runnable() {
+ @Override
+ public void run() {
+ requestFocus();
+ }
+ });
+ } else if (entry.isCurrentProgram()) {
if (DEBUG) Log.d(TAG, "Keep focus to the current program");
// Current program is visible in the guide.
// Updated entries including current program's will be attached again soon
@@ -250,13 +224,13 @@ public class ProgramRow extends TimelineGridView {
if (mKeepFocusToCurrentProgram) {
TableEntry entry = ((ProgramItemView) child).getTableEntry();
if (entry.isCurrentProgram()) {
+ mKeepFocusToCurrentProgram = false;
post(new Runnable() {
@Override
public void run() {
requestFocus();
}
});
- mKeepFocusToCurrentProgram = false;
}
}
}
@@ -324,6 +298,22 @@ public class ProgramRow extends TimelineGridView {
mProgramManager.getStartTime(), entry.entryStartUtcMillis) - scrollOffset;
((LinearLayoutManager) getLayoutManager())
.scrollToPositionWithOffset(position, offset);
+ // Workaround to b/31598505. When a program's duration is too long,
+ // RecyclerView.onScrolled() will not be called after scrollToPositionWithOffset().
+ // Therefore we have to update children's visible areas by ourselves in theis case.
+ // Since scrollToPositionWithOffset() will call requestLayout(), we can listen to this
+ // behavior to ensure program items' visible areas are correctly updated after layouts
+ // are adjusted, i.e., scrolling is over.
+ getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener);
+ }
+ }
+
+ private void updateChildVisibleArea() {
+ for (int i = 0; i < getChildCount(); ++i) {
+ ProgramItemView child = (ProgramItemView) getChildAt(i);
+ if (getLeft() < child.getRight() && child.getLeft() < getRight()) {
+ child.updateVisibleArea();
+ }
}
}
}
diff --git a/src/com/android/tv/guide/ProgramTableAdapter.java b/src/com/android/tv/guide/ProgramTableAdapter.java
index fd561992..e4a67972 100644
--- a/src/com/android/tv/guide/ProgramTableAdapter.java
+++ b/src/com/android/tv/guide/ProgramTableAdapter.java
@@ -17,6 +17,7 @@
package com.android.tv.guide;
import static com.android.tv.util.ImageLoader.ImageLoaderCallback;
+
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
@@ -42,6 +43,8 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
+import android.view.ViewTreeObserver;
+import android.view.accessibility.AccessibilityManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -50,10 +53,10 @@ import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.common.feature.CommonFeatures;
import com.android.tv.data.Channel;
-import com.android.tv.data.Program.CriticScore;
import com.android.tv.data.Program;
-import com.android.tv.dvr.DvrManager;
+import com.android.tv.data.Program.CriticScore;
import com.android.tv.dvr.DvrDataManager;
+import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.guide.ProgramManager.TableEntriesUpdatedListener;
import com.android.tv.parental.ParentalControlSettings;
@@ -80,6 +83,7 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
private final DvrManager mDvrManager;
private final DvrDataManager mDvrDataManager;
private final ProgramManager mProgramManager;
+ private final AccessibilityManager mAccessibilityManager;
private final ProgramGuide mProgramGuide;
private final Handler mHandler = new Handler();
private final List<ProgramListAdapter> mProgramListAdapters = new ArrayList<>();
@@ -103,6 +107,7 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
private final String mProgramRecordableText;
private final String mRecordingScheduledText;
private final String mRecordingConflictText;
+ private final String mRecordingFailedText;
private final String mRecordingInProgressText;
private final int mDvrPaddingStartWithTrack;
private final int mDvrPaddingStartWithOutTrack;
@@ -110,6 +115,8 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
public ProgramTableAdapter(Context context, ProgramManager programManager,
ProgramGuide programGuide) {
mContext = context;
+ mAccessibilityManager =
+ (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
mTvInputManagerHelper = TvApplication.getSingletons(context).getTvInputManagerHelper();
if (CommonFeatures.DVR.isEnabled(context)) {
mDvrManager = TvApplication.getSingletons(context).getDvrManager();
@@ -149,6 +156,7 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
mProgramRecordableText = res.getString(R.string.dvr_epg_program_recordable);
mRecordingScheduledText = res.getString(R.string.dvr_epg_program_recording_scheduled);
mRecordingConflictText = res.getString(R.string.dvr_epg_program_recording_conflict);
+ mRecordingFailedText = res.getString(R.string.dvr_epg_program_recording_failed);
mRecordingInProgressText = res.getString(R.string.dvr_epg_program_recording_in_progress);
mDvrPaddingStartWithTrack = res.getDimensionPixelOffset(
R.dimen.program_guide_table_detail_dvr_margin_start);
@@ -162,7 +170,7 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
mEpisodeTitleStyle = new TextAppearanceSpan(null, 0, episodeTitleSize,
episodeTitleColor, null);
- mCriticScoreViews = new ArrayList<LinearLayout>();
+ mCriticScoreViews = new ArrayList<>();
mRecycledViewPool = new RecycledViewPool();
mRecycledViewPool.setMaxRecycledViews(R.layout.program_guide_table_item,
context.getResources().getInteger(
@@ -170,12 +178,7 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
mProgramManager.addListener(new ProgramManager.ListenerAdapter() {
@Override
public void onChannelsUpdated() {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- update();
- }
- });
+ update();
}
});
update();
@@ -238,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 {
@@ -265,6 +278,15 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
}
};
+ private final ViewTreeObserver.OnGlobalFocusChangeListener mGlobalFocusChangeListener =
+ new ViewTreeObserver.OnGlobalFocusChangeListener() {
+ @Override
+ public void onGlobalFocusChanged(View oldFocus, View newFocus) {
+ onChildFocus(isChild(oldFocus) ? oldFocus : null,
+ isChild(newFocus) ? newFocus : null);
+ }
+ };
+
// Members of Program Details
private final ViewGroup mDetailView;
private final ImageView mImageView;
@@ -317,6 +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);
+ 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) {
@@ -384,12 +416,32 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
}
}
+ public boolean isChild(View view) {
+ if (view == null) {
+ return false;
+ }
+ for (ViewParent p = view.getParent(); p != null; p = p.getParent()) {
+ if (p == mContainer) {
+ return true;
+ }
+ }
+ return false;
+ }
+
@Override
public void onChildFocus(View oldFocus, View newFocus) {
if (newFocus == null) {
return;
}
- mSelectedEntry = ((ProgramItemView) newFocus).getTableEntry();
+ // When the accessibility service is enabled, focus might be put on channel's header or
+ // detail view, besides program items.
+ if (newFocus == mChannelHeaderView) {
+ mSelectedEntry = ((ProgramItemView) mProgramRow.getChildAt(0)).getTableEntry();
+ } else if (newFocus == mDetailView) {
+ return;
+ } else {
+ mSelectedEntry = ((ProgramItemView) newFocus).getTableEntry();
+ }
if (oldFocus == null) {
updateDetailView();
return;
@@ -456,7 +508,21 @@ 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.
+ return;
+ }
if (DEBUG) Log.d(TAG, "updateDetailView");
mCriticScoresLayout.removeAllViews();
if (Program.isValid(mSelectedEntry.program)) {
@@ -508,7 +574,7 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
int iconResId = 0;
if (scheduledRecording != null) {
if (mDvrManager.isConflicting(scheduledRecording)) {
- iconResId = R.drawable.ic_warning_white_24dp;
+ iconResId = R.drawable.ic_warning_white_12dp;
statusText = mRecordingConflictText;
} else {
switch (scheduledRecording.getState()) {
@@ -521,8 +587,8 @@ public class ProgramTableAdapter extends RecyclerView.Adapter<ProgramTableAdapte
statusText = mRecordingScheduledText;
break;
case ScheduledRecording.STATE_RECORDING_FAILED:
- iconResId = R.drawable.ic_warning_white_24dp;
- statusText = mRecordingConflictText;
+ iconResId = R.drawable.ic_warning_white_12dp;
+ statusText = mRecordingFailedText;
break;
default:
iconResId = 0;
diff --git a/src/com/android/tv/menu/ActionCardView.java b/src/com/android/tv/menu/ActionCardView.java
index 2d72b06f..54892cac 100644
--- a/src/com/android/tv/menu/ActionCardView.java
+++ b/src/com/android/tv/menu/ActionCardView.java
@@ -69,11 +69,13 @@ public class ActionCardView extends FrameLayout implements ItemListRowView.CardV
mStateView.setText(action.getActionDescription(getContext()));
if (action.isEnabled()) {
setEnabled(true);
+ setFocusable(true);
mIconView.setAlpha(OPACITY_ENABLED);
mLabelView.setAlpha(OPACITY_ENABLED);
mStateView.setAlpha(OPACITY_ENABLED);
} else {
setEnabled(false);
+ setFocusable(false);
mIconView.setAlpha(OPACITY_DISABLED);
mLabelView.setAlpha(OPACITY_DISABLED);
mStateView.setAlpha(OPACITY_DISABLED);
diff --git a/src/com/android/tv/menu/AppLinkCardView.java b/src/com/android/tv/menu/AppLinkCardView.java
index a71b1a61..bfb5e3f1 100644
--- a/src/com/android/tv/menu/AppLinkCardView.java
+++ b/src/com/android/tv/menu/AppLinkCardView.java
@@ -30,7 +30,6 @@ import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
@@ -48,10 +47,6 @@ public class AppLinkCardView extends BaseCardView<Channel> {
private static final String TAG = MenuView.TAG;
private static final boolean DEBUG = MenuView.DEBUG;
- private final float mCardHeight;
- private final float mExtendedCardHeight;
- private final float mTextViewHeight;
- private final float mExtendedTextViewCardHeight;
private final int mCardImageWidth;
private final int mCardImageHeight;
private final int mIconWidth;
@@ -62,12 +57,9 @@ public class AppLinkCardView extends BaseCardView<Channel> {
private ImageView mImageView;
private View mGradientView;
private TextView mAppInfoView;
- private TextView mMetaViewFocused;
- private TextView mMetaViewUnfocused;
private View mMetaViewHolder;
private Channel mChannel;
private Intent mIntent;
- private boolean mExtendViewOnFocus;
private final PackageManager mPackageManager;
private final TvInputManagerHelper mTvInputManagerHelper;
@@ -84,18 +76,11 @@ public class AppLinkCardView extends BaseCardView<Channel> {
mCardImageWidth = getResources().getDimensionPixelSize(R.dimen.card_image_layout_width);
mCardImageHeight = getResources().getDimensionPixelSize(R.dimen.card_image_layout_height);
- mCardHeight = getResources().getDimensionPixelSize(R.dimen.card_layout_height);
- mExtendedCardHeight = getResources().getDimensionPixelOffset(
- R.dimen.card_layout_height_extended);
mIconWidth = getResources().getDimensionPixelSize(R.dimen.app_link_card_icon_width);
mIconHeight = getResources().getDimensionPixelSize(R.dimen.app_link_card_icon_height);
mIconPadding = getResources().getDimensionPixelOffset(R.dimen.app_link_card_icon_padding);
mPackageManager = context.getPackageManager();
mTvInputManagerHelper = ((MainActivity) context).getTvInputManagerHelper();
- mTextViewHeight = getResources().getDimensionPixelSize(
- R.dimen.card_meta_layout_height);
- mExtendedTextViewCardHeight = getResources().getDimensionPixelOffset(
- R.dimen.card_meta_layout_height_extended);
mIconColorFilter = getResources().getColor(R.color.app_link_card_icon_color_filter, null);
}
@@ -119,7 +104,7 @@ public class AppLinkCardView extends BaseCardView<Channel> {
switch (linkType) {
case Channel.APP_LINK_TYPE_CHANNEL:
- setMetaViewText(mChannel.getAppLinkText());
+ setText(mChannel.getAppLinkText());
mAppInfoView.setVisibility(VISIBLE);
mGradientView.setVisibility(VISIBLE);
mAppInfoView.setCompoundDrawablePadding(mIconPadding);
@@ -137,7 +122,7 @@ public class AppLinkCardView extends BaseCardView<Channel> {
}
break;
case Channel.APP_LINK_TYPE_APP:
- setMetaViewText(getContext().getString(
+ setText(getContext().getString(
R.string.channels_item_app_link_app_launcher,
mPackageManager.getApplicationLabel(appInfo)));
mAppInfoView.setVisibility(GONE);
@@ -163,17 +148,8 @@ public class AppLinkCardView extends BaseCardView<Channel> {
} else {
setCardImageWithBanner(appInfo);
}
-
- mMetaViewFocused.measure(MeasureSpec.makeMeasureSpec(mCardImageWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
- mExtendViewOnFocus = mMetaViewFocused.getLineCount() > 1;
- if (mExtendViewOnFocus) {
- setMetaViewFocusedAlpha(selected ? 1f : 0f);
- } else {
- setMetaViewFocusedAlpha(1f);
- }
-
- // Call super.onBind() at the end in order to make getCardHeight() return a proper value.
+ // 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);
}
@@ -227,32 +203,6 @@ public class AppLinkCardView extends BaseCardView<Channel> {
mGradientView = findViewById(R.id.image_gradient);
mAppInfoView = (TextView) findViewById(R.id.app_info);
mMetaViewHolder = findViewById(R.id.app_link_text_holder);
- mMetaViewFocused = (TextView) findViewById(R.id.app_link_text_focused);
- mMetaViewUnfocused = (TextView) findViewById(R.id.app_link_text_unfocused);
- }
-
- @Override
- protected void onFocusAnimationStart(boolean selected) {
- if (mExtendViewOnFocus) {
- setMetaViewFocusedAlpha(selected ? 1f : 0f);
- }
- }
-
- @Override
- protected void onSetFocusAnimatedValue(float animatedValue) {
- super.onSetFocusAnimatedValue(animatedValue);
- if (mExtendViewOnFocus) {
- ViewGroup.LayoutParams params = mMetaViewUnfocused.getLayoutParams();
- params.height = Math.round(mTextViewHeight
- + (mExtendedTextViewCardHeight - mTextViewHeight) * animatedValue);
- setMetaViewLayoutParams(params);
- setMetaViewFocusedAlpha(animatedValue);
- }
- }
-
- @Override
- protected float getCardHeight() {
- return (mExtendViewOnFocus && isFocused()) ? mExtendedCardHeight : mCardHeight;
}
// Try to set the card image with following order:
@@ -305,19 +255,4 @@ public class AppLinkCardView extends BaseCardView<Channel> {
}
});
}
-
- private void setMetaViewLayoutParams(ViewGroup.LayoutParams params) {
- mMetaViewFocused.setLayoutParams(params);
- mMetaViewUnfocused.setLayoutParams(params);
- }
-
- private void setMetaViewText(String text) {
- mMetaViewFocused.setText(text);
- mMetaViewUnfocused.setText(text);
- }
-
- private void setMetaViewFocusedAlpha(float focusedAlpha) {
- mMetaViewFocused.setAlpha(focusedAlpha);
- mMetaViewUnfocused.setAlpha(1f - focusedAlpha);
- }
}
diff --git a/src/com/android/tv/menu/BaseCardView.java b/src/com/android/tv/menu/BaseCardView.java
index b4500dd1..c6a34a5d 100644
--- a/src/com/android/tv/menu/BaseCardView.java
+++ b/src/com/android/tv/menu/BaseCardView.java
@@ -21,10 +21,13 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Outline;
+import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
+import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.widget.LinearLayout;
+import android.widget.TextView;
import com.android.tv.R;
@@ -44,6 +47,16 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
private final float mVerticalCardMargin;
private final float mCardCornerRadius;
private float mFocusAnimatedValue;
+ private boolean mExtendViewOnFocus;
+ private final float mExtendedCardHeight;
+ private final float mTextViewHeight;
+ private final float mExtendedTextViewHeight;
+ @Nullable
+ private TextView mTextView;
+ @Nullable
+ private TextView mTextViewFocused;
+ private final int mCardImageWidth;
+ private final float mCardHeight;
public BaseCardView(Context context) {
this(context, null);
@@ -72,16 +85,42 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), mCardCornerRadius);
}
});
+ mCardImageWidth = getResources().getDimensionPixelSize(R.dimen.card_image_layout_width);
+ mCardHeight = getResources().getDimensionPixelSize(R.dimen.card_layout_height);
+ mExtendedCardHeight = getResources().getDimensionPixelSize(
+ R.dimen.card_layout_height_extended);
+ mTextViewHeight = getResources().getDimensionPixelSize(R.dimen.card_meta_layout_height);
+ mExtendedTextViewHeight = getResources().getDimensionPixelOffset(
+ R.dimen.card_meta_layout_height_extended);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mTextView = (TextView) findViewById(R.id.card_text);
+ mTextViewFocused = (TextView) findViewById(R.id.card_text_focused);
}
/**
* 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) {
- // Note that getCardHeight() will be called by setFocusAnimatedValue().
- // Therefore, be sure that getCardHeight() has a proper value before this method is called.
- setFocusAnimatedValue(selected ? SCALE_FACTOR_1F : SCALE_FACTOR_0F);
+ 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);
}
@Override
@@ -108,10 +147,48 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
}
/**
+ * Sets text of this card view.
+ */
+ public void setText(int resId) {
+ if (mTextViewFocused != null) {
+ mTextViewFocused.setText(resId);
+ }
+ if (mTextView != null) {
+ mTextView.setText(resId);
+ }
+ }
+
+ /**
+ * Sets text of this card view.
+ */
+ public void setText(String text) {
+ if (mTextViewFocused != null) {
+ mTextViewFocused.setText(text);
+ }
+ if (mTextView != null) {
+ mTextView.setText(text);
+ }
+ }
+
+ /**
+ * Enables or disables text view of this card view.
+ */
+ public void setTextViewEnabled(boolean enabled) {
+ if (mTextViewFocused != null) {
+ mTextViewFocused.setEnabled(enabled);
+ }
+ if (mTextView != null) {
+ mTextView.setEnabled(enabled);
+ }
+ }
+
+ /**
* Called when the focus animation started.
*/
protected void onFocusAnimationStart(boolean selected) {
- // do nothing.
+ if (mExtendViewOnFocus) {
+ setTextViewFocusedAlpha(selected ? 1f : 0f);
+ }
}
/**
@@ -126,10 +203,19 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
* between {@code SCALE_FACTOR_0F} and {@code SCALE_FACTOR_1F}.
*/
protected void onSetFocusAnimatedValue(float animatedValue) {
- float scale = 1f + (mVerticalCardMargin / getCardHeight()) * animatedValue;
+ float cardViewHeight = (mExtendViewOnFocus && isFocused())
+ ? mExtendedCardHeight : mCardHeight;
+ float scale = 1f + (mVerticalCardMargin / cardViewHeight) * animatedValue;
setScaleX(scale);
setScaleY(scale);
setTranslationZ(mFocusTranslationZ * animatedValue);
+ if (mExtendViewOnFocus) {
+ ViewGroup.LayoutParams params = mTextView.getLayoutParams();
+ params.height = Math.round(mTextViewHeight
+ + (mExtendedTextViewHeight - mTextViewHeight) * animatedValue);
+ setTextViewLayoutParams(params);
+ setTextViewFocusedAlpha(animatedValue);
+ }
}
private void setFocusAnimatedValue(float animatedValue) {
@@ -171,8 +257,13 @@ public abstract class BaseCardView<T> extends LinearLayout implements ItemListRo
}
}
- /**
- * The implementation should return the height of the card.
- */
- protected abstract float getCardHeight();
+ private void setTextViewLayoutParams(ViewGroup.LayoutParams params) {
+ mTextViewFocused.setLayoutParams(params);
+ mTextView.setLayoutParams(params);
+ }
+
+ private void setTextViewFocusedAlpha(float focusedAlpha) {
+ mTextViewFocused.setAlpha(focusedAlpha);
+ mTextView.setAlpha(1f - focusedAlpha);
+ }
}
diff --git a/src/com/android/tv/menu/ChannelCardView.java b/src/com/android/tv/menu/ChannelCardView.java
index 4e29a5a9..1c8015a6 100644
--- a/src/com/android/tv/menu/ChannelCardView.java
+++ b/src/com/android/tv/menu/ChannelCardView.java
@@ -23,7 +23,6 @@ import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
@@ -42,10 +41,6 @@ public class ChannelCardView extends BaseCardView<Channel> {
private static final String TAG = MenuView.TAG;
private static final boolean DEBUG = MenuView.DEBUG;
- private final float mCardHeight;
- private final float mExtendedCardHeight;
- private final float mProgramNameViewHeight;
- private final float mExtendedTextViewCardHeight;
private final int mCardImageWidth;
private final int mCardImageHeight;
@@ -53,11 +48,8 @@ public class ChannelCardView extends BaseCardView<Channel> {
private View mGradientView;
private TextView mChannelNumberNameView;
private ProgressBar mProgressBar;
- private TextView mMetaViewFocused;
- private TextView mMetaViewUnfocused;
private Channel mChannel;
private Program mProgram;
- private boolean mExtendViewOnFocus;
private final MainActivity mMainActivity;
public ChannelCardView(Context context) {
@@ -70,17 +62,8 @@ public class ChannelCardView extends BaseCardView<Channel> {
public ChannelCardView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
-
mCardImageWidth = getResources().getDimensionPixelSize(R.dimen.card_image_layout_width);
mCardImageHeight = getResources().getDimensionPixelSize(R.dimen.card_image_layout_height);
- mCardHeight = getResources().getDimensionPixelSize(R.dimen.card_layout_height);
- mExtendedCardHeight = getResources().getDimensionPixelSize(
- R.dimen.card_layout_height_extended);
- mProgramNameViewHeight = getResources().getDimensionPixelSize(
- R.dimen.card_meta_layout_height);
- mExtendedTextViewCardHeight = getResources().getDimensionPixelOffset(
- R.dimen.card_meta_layout_height_extended);
-
mMainActivity = (MainActivity) context;
}
@@ -90,8 +73,6 @@ public class ChannelCardView extends BaseCardView<Channel> {
mImageView = (ImageView) findViewById(R.id.image);
mGradientView = findViewById(R.id.image_gradient);
mChannelNumberNameView = (TextView) findViewById(R.id.channel_number_and_name);
- mMetaViewFocused = (TextView) findViewById(R.id.channel_title_focused);
- mMetaViewUnfocused = (TextView) findViewById(R.id.channel_title_unfocused);
mProgressBar = (ProgressBar) findViewById(R.id.progress);
}
@@ -110,26 +91,18 @@ public class ChannelCardView extends BaseCardView<Channel> {
mGradientView.setVisibility(View.GONE);
mProgressBar.setVisibility(GONE);
- setMetaViewEnabled(true);
+ setTextViewEnabled(true);
if (mMainActivity.getParentalControlSettings().isParentalControlsEnabled()
&& mChannel.isLocked()) {
- setMetaViewText(R.string.program_title_for_blocked_channel);
+ setText(R.string.program_title_for_blocked_channel);
return;
} else {
- setMetaViewText("");
+ setText("");
}
updateProgramInformation();
- mMetaViewFocused.measure(
- MeasureSpec.makeMeasureSpec(mCardImageWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
- if (mExtendViewOnFocus = mMetaViewFocused.getLineCount() > 1) {
- setMetaViewFocusedAlpha(selected ? 1f : 0f);
- } else {
- setMetaViewFocusedAlpha(1f);
- }
-
- // Call super.onBind() at the end in order to make getCardHeight() return a proper value.
+ // 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);
}
@@ -153,40 +126,16 @@ public class ChannelCardView extends BaseCardView<Channel> {
mGradientView.setVisibility(View.VISIBLE);
}
- @Override
- protected void onFocusAnimationStart(boolean selected) {
- if (mExtendViewOnFocus) {
- setMetaViewFocusedAlpha(selected ? 1f : 0f);
- }
- }
-
- @Override
- protected void onSetFocusAnimatedValue(float animatedValue) {
- super.onSetFocusAnimatedValue(animatedValue);
- if (mExtendViewOnFocus) {
- ViewGroup.LayoutParams params = mMetaViewUnfocused.getLayoutParams();
- params.height = Math.round(mProgramNameViewHeight
- + (mExtendedTextViewCardHeight - mProgramNameViewHeight) * animatedValue);
- setMetaViewLayoutParams(params);
- setMetaViewFocusedAlpha(animatedValue);
- }
- }
-
- @Override
- protected float getCardHeight() {
- return (mExtendViewOnFocus && isFocused()) ? mExtendedCardHeight : mCardHeight;
- }
-
private void updateProgramInformation() {
if (mChannel == null) {
return;
}
mProgram = mMainActivity.getProgramDataManager().getCurrentProgram(mChannel.getId());
if (mProgram == null || TextUtils.isEmpty(mProgram.getTitle())) {
- setMetaViewEnabled(false);
- setMetaViewText(R.string.program_title_for_no_information);
+ setTextViewEnabled(false);
+ setText(R.string.program_title_for_no_information);
} else {
- setMetaViewText(mProgram.getTitle());
+ setText(mProgram.getTitle());
}
if (mProgram == null) {
@@ -217,29 +166,4 @@ public class ChannelCardView extends BaseCardView<Channel> {
createProgramPosterArtCallback(this, mProgram));
}
}
-
- private void setMetaViewLayoutParams(ViewGroup.LayoutParams params) {
- mMetaViewFocused.setLayoutParams(params);
- mMetaViewUnfocused.setLayoutParams(params);
- }
-
- private void setMetaViewText(String text) {
- mMetaViewFocused.setText(text);
- mMetaViewUnfocused.setText(text);
- }
-
- private void setMetaViewText(int resId) {
- mMetaViewFocused.setText(resId);
- mMetaViewUnfocused.setText(resId);
- }
-
- private void setMetaViewEnabled(boolean enabled) {
- mMetaViewFocused.setEnabled(enabled);
- mMetaViewUnfocused.setEnabled(enabled);
- }
-
- private void setMetaViewFocusedAlpha(float focusedAlpha) {
- mMetaViewFocused.setAlpha(focusedAlpha);
- mMetaViewUnfocused.setAlpha(1f - focusedAlpha);
- }
}
diff --git a/src/com/android/tv/menu/ChannelsRowAdapter.java b/src/com/android/tv/menu/ChannelsRowAdapter.java
index 47c413a3..c8e1bd05 100644
--- a/src/com/android/tv/menu/ChannelsRowAdapter.java
+++ b/src/com/android/tv/menu/ChannelsRowAdapter.java
@@ -141,6 +141,8 @@ public class ChannelsRowAdapter extends ItemListRowView.ItemListAdapter<Channel>
viewHolder.itemView.setOnClickListener(mAppLinkOnClickListener);
} else if (viewType == R.layout.menu_card_dvr) {
viewHolder.itemView.setOnClickListener(mDvrOnClickListener);
+ SimpleCardView view = (SimpleCardView) viewHolder.itemView;
+ view.setText(R.string.channels_item_dvr);
} else {
viewHolder.itemView.setTag(getItemList().get(position));
viewHolder.itemView.setOnClickListener(mChannelOnClickListener);
@@ -163,10 +165,7 @@ public class ChannelsRowAdapter extends ItemListRowView.ItemListAdapter<Channel>
// Sometimes applicationInfo can be null. b/28932537
&& inputManager.getTvInputAppInfo(currentChannel.getInputId()) != null;
boolean showDvrCard = false;
- if (mDvrDataManager != null && !(mDvrDataManager.getRecordedPrograms().isEmpty()
- && mDvrDataManager.getStartedRecordings().isEmpty()
- && mDvrDataManager.getNonStartedScheduledRecordings().isEmpty()
- && mDvrDataManager.getSeriesRecordings().isEmpty())) {
+ if (mDvrDataManager != null) {
for (TvInputInfo info : inputManager.getTvInputInfos(true, true)) {
if (info.canRecord()) {
showDvrCard = true;
diff --git a/src/com/android/tv/menu/Menu.java b/src/com/android/tv/menu/Menu.java
index 0da10ff8..1160a5b5 100644
--- a/src/com/android/tv/menu/Menu.java
+++ b/src/com/android/tv/menu/Menu.java
@@ -179,7 +179,9 @@ public class Menu {
mMenuView.onShow(reason, rowIdToSelect, mAnimationDisabledForTest ? null : new Runnable() {
@Override
public void run() {
- mShowAnimator.start();
+ if (isActive()) {
+ mShowAnimator.start();
+ }
}
});
scheduleHide();
@@ -189,6 +191,9 @@ public class Menu {
* Closes the menu.
*/
public void hide(boolean withAnimation) {
+ if (mShowAnimator.isStarted()) {
+ mShowAnimator.cancel();
+ }
if (!isActive()) {
return;
}
diff --git a/src/com/android/tv/menu/MenuRowView.java b/src/com/android/tv/menu/MenuRowView.java
index 7cdbfe9e..97dea29a 100644
--- a/src/com/android/tv/menu/MenuRowView.java
+++ b/src/com/android/tv/menu/MenuRowView.java
@@ -35,25 +35,6 @@ public abstract class MenuRowView extends LinearLayout {
private static final String TAG = "MenuRowView";
private static final boolean DEBUG = false;
- /**
- * For setting ListView visible, and TitleView visible with the selected text size and color
- * without animation.
- */
- public static final int ANIM_NONE_SELECTED = 1;
- /**
- * For setting ListView gone, and TitleView visible with the deselected text size and color
- * without animation.
- */
- public static final int ANIM_NONE_DESELECTED = 2;
- /**
- * An animation for the selected item list view.
- */
- public static final int ANIM_SELECTED = 3;
- /**
- * An animation for the deselected item list view.
- */
- public static final int ANIM_DESELECTED = 4;
-
private TextView mTitleView;
private View mContentsView;
diff --git a/src/com/android/tv/menu/MenuUpdater.java b/src/com/android/tv/menu/MenuUpdater.java
index 23f0373f..075b299e 100644
--- a/src/com/android/tv/menu/MenuUpdater.java
+++ b/src/com/android/tv/menu/MenuUpdater.java
@@ -20,16 +20,7 @@ import android.content.Context;
import android.support.annotation.Nullable;
import com.android.tv.ChannelTuner;
-import com.android.tv.TvApplication;
-import com.android.tv.common.feature.CommonFeatures;
-import com.android.tv.dvr.RecordedProgram;
import com.android.tv.data.Channel;
-import com.android.tv.dvr.DvrDataManager;
-import com.android.tv.dvr.DvrDataManager.OnDvrScheduleLoadFinishedListener;
-import com.android.tv.dvr.DvrDataManager.OnRecordedProgramLoadFinishedListener;
-import com.android.tv.dvr.DvrDataManager.RecordedProgramListener;
-import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
-import com.android.tv.dvr.ScheduledRecording;
import com.android.tv.ui.TunableTvView;
import com.android.tv.ui.TunableTvView.OnScreenBlockingChangedListener;
@@ -43,72 +34,8 @@ public class MenuUpdater {
@Nullable
private final TunableTvView mTvView;
private final Menu mMenu;
- @Nullable
- private final DvrDataManager mDvrDataManager;
private ChannelTuner mChannelTuner;
- private final OnScreenBlockingChangedListener mOnScreenBlockingChangeListener =
- new OnScreenBlockingChangedListener() {
- @Override
- public void onScreenBlockingChanged(boolean blocked) {
- mMenu.update(PlayControlsRow.ID);
- }
- };
- private final OnRecordedProgramLoadFinishedListener mRecordedProgramLoadedListener =
- new OnRecordedProgramLoadFinishedListener() {
- @Override
- public void onRecordedProgramLoadFinished() {
- mMenu.update(ChannelsRow.ID);
- }
- };
- private final RecordedProgramListener mRecordedProgramListener =
- new RecordedProgramListener() {
- @Override
- public void onRecordedProgramAdded(RecordedProgram recordedProgram) {
- mMenu.update(ChannelsRow.ID);
- }
-
- @Override
- public void onRecordedProgramChanged(RecordedProgram recordedProgram) { }
-
- @Override
- public void onRecordedProgramRemoved(RecordedProgram recordedProgram) {
- if (mDvrDataManager != null && mDvrDataManager.getRecordedPrograms().isEmpty()
- && mDvrDataManager.getStartedRecordings().isEmpty()
- && mDvrDataManager.getNonStartedScheduledRecordings().isEmpty()
- && mDvrDataManager.getSeriesRecordings().isEmpty()) {
- mMenu.update(ChannelsRow.ID);
- }
- }
- };
- private final OnDvrScheduleLoadFinishedListener mDvrScheduleLoadedListener =
- new OnDvrScheduleLoadFinishedListener() {
- @Override
- public void onDvrScheduleLoadFinished() {
- mMenu.update(ChannelsRow.ID);
- }
- };
- private final ScheduledRecordingListener mScheduledRecordingListener =
- new ScheduledRecordingListener() {
- @Override
- public void onScheduledRecordingAdded(ScheduledRecording... scheduledRecordings) {
- mMenu.update(ChannelsRow.ID);
- }
-
- @Override
- public void onScheduledRecordingRemoved(ScheduledRecording... scheduledRecordings) {
- if (mDvrDataManager != null && mDvrDataManager.getRecordedPrograms().isEmpty()
- && mDvrDataManager.getStartedRecordings().isEmpty()
- && mDvrDataManager.getNonStartedScheduledRecordings().isEmpty()
- && mDvrDataManager.getSeriesRecordings().isEmpty()) {
- mMenu.update(ChannelsRow.ID);
- }
- }
-
- @Override
- public void onScheduledRecordingStatusChanged(ScheduledRecording... schedules) { }
- };
-
private final ChannelTuner.Listener mChannelTunerListener = new ChannelTuner.Listener() {
@Override
public void onLoadFinished() {}
@@ -131,16 +58,12 @@ public class MenuUpdater {
mTvView = tvView;
mMenu = menu;
if (mTvView != null) {
- mTvView.setOnScreenBlockedListener(mOnScreenBlockingChangeListener);
- }
- if (CommonFeatures.DVR.isEnabled(context)) {
- mDvrDataManager = TvApplication.getSingletons(context).getDvrDataManager();
- mDvrDataManager.addDvrScheduleLoadFinishedListener(mDvrScheduleLoadedListener);
- mDvrDataManager.addScheduledRecordingListener(mScheduledRecordingListener);
- mDvrDataManager.addRecordedProgramLoadFinishedListener(mRecordedProgramLoadedListener);
- mDvrDataManager.addRecordedProgramListener(mRecordedProgramListener);
- } else {
- mDvrDataManager = null;
+ mTvView.setOnScreenBlockedListener(new OnScreenBlockingChangedListener() {
+ @Override
+ public void onScreenBlockingChanged(boolean blocked) {
+ mMenu.update(PlayControlsRow.ID);
+ }
+ });
}
}
@@ -163,13 +86,6 @@ public class MenuUpdater {
* Called at the end of the menu's lifetime.
*/
public void release() {
- if (mDvrDataManager != null) {
- mDvrDataManager.removeScheduledRecordingListener(mScheduledRecordingListener);
- mDvrDataManager.removeRecordedProgramListener(mRecordedProgramListener);
- mDvrDataManager.removeDvrScheduleLoadFinishedListener(mDvrScheduleLoadedListener);
- mDvrDataManager
- .removeRecordedProgramLoadFinishedListener(mRecordedProgramLoadedListener);
- }
if (mChannelTuner != null) {
mChannelTuner.removeListener(mChannelTunerListener);
}
diff --git a/src/com/android/tv/menu/MenuView.java b/src/com/android/tv/menu/MenuView.java
index 4c612520..ee0b036e 100644
--- a/src/com/android/tv/menu/MenuView.java
+++ b/src/com/android/tv/menu/MenuView.java
@@ -24,6 +24,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewParent;
import android.view.ViewTreeObserver.OnGlobalFocusChangeListener;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.FrameLayout;
import com.android.tv.menu.Menu.MenuShowReason;
@@ -57,6 +58,8 @@ public class MenuView extends FrameLayout implements IMenuView {
public MenuView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mLayoutInflater = LayoutInflater.from(context);
+ // Set hardware layer type for smooth animation of lots of views.
+ setLayerType(LAYER_TYPE_HARDWARE, null);
getViewTreeObserver().addOnGlobalFocusChangeListener(new OnGlobalFocusChangeListener() {
@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
@@ -129,7 +132,15 @@ public class MenuView extends FrameLayout implements IMenuView {
// Make the selected row have the focus.
requestFocus();
if (runnableAfterShow != null) {
- runnableAfterShow.run();
+ getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ getViewTreeObserver().removeOnGlobalLayoutListener(this);
+ // Start show animation after layout finishes for smooth animation because the
+ // layout can take long time.
+ runnableAfterShow.run();
+ }
+ });
}
mLayoutManager.onMenuShow();
}
@@ -183,6 +194,16 @@ public class MenuView extends FrameLayout implements IMenuView {
return super.onRequestFocusInDescendants(direction, previouslyFocusedRect);
}
+ @Override
+ public void focusableViewAvailable(View v) {
+ // Workaround of b/30788222 and b/32074688.
+ // The re-layout of RecyclerView gives the focus to the card view even when the menu is not
+ // visible. Don't report focusable view when the menu is not visible.
+ if (getVisibility() == VISIBLE) {
+ super.focusableViewAvailable(v);
+ }
+ }
+
private void setSelectedPosition(int position) {
mLayoutManager.setSelectedPosition(position);
}
diff --git a/src/com/android/tv/menu/PlayControlsButton.java b/src/com/android/tv/menu/PlayControlsButton.java
index 95c07b74..aff39db3 100644
--- a/src/com/android/tv/menu/PlayControlsButton.java
+++ b/src/com/android/tv/menu/PlayControlsButton.java
@@ -129,6 +129,7 @@ public class PlayControlsButton extends FrameLayout {
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
mButton.setEnabled(enabled);
+ mButton.setFocusable(enabled);
mIcon.setEnabled(enabled);
mIcon.setAlpha(enabled ? ALPHA_ENABLED : ALPHA_DISABLED);
mLabel.setEnabled(enabled);
diff --git a/src/com/android/tv/menu/PlayControlsRowView.java b/src/com/android/tv/menu/PlayControlsRowView.java
index a19cbf89..a620d4dd 100644
--- a/src/com/android/tv/menu/PlayControlsRowView.java
+++ b/src/com/android/tv/menu/PlayControlsRowView.java
@@ -40,6 +40,8 @@ import com.android.tv.dvr.DvrDataManager.ScheduledRecordingListener;
import com.android.tv.dvr.DvrManager;
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.HalfSizedDialogFragment;
import com.android.tv.menu.Menu.MenuShowReason;
import com.android.tv.ui.TunableTvView;
import com.android.tv.util.Utils;
@@ -130,10 +132,11 @@ public class PlayControlsRowView extends MenuRowView {
res.getDimensionPixelSize(R.dimen.play_controls_button_compact_margin);
if (CommonFeatures.DVR.isEnabled(context)) {
mDvrDataManager = TvApplication.getSingletons(context).getDvrDataManager();
+ mDvrManager = TvApplication.getSingletons(context).getDvrManager();
} else {
mDvrDataManager = null;
+ mDvrManager = null;
}
- mDvrManager = TvApplication.getSingletons(context).getDvrManager();
mMainActivity = (MainActivity) context;
}
@@ -249,7 +252,7 @@ public class PlayControlsRowView extends MenuRowView {
private boolean isCurrentChannelRecording() {
Channel currentChannel = mMainActivity.getCurrentChannel();
- return currentChannel != null
+ return currentChannel != null && mDvrManager != null
&& mDvrManager.getCurrentRecording(currentChannel.getId()) != null;
}
@@ -259,10 +262,11 @@ public class PlayControlsRowView extends MenuRowView {
TvApplication.getSingletons(getContext()).getTracker().sendMenuClicked(isRecording ?
R.string.channels_item_record_start : R.string.channels_item_record_stop);
if (!isRecording) {
- if (!mDvrManager.isChannelRecordable(currentChannel)) {
+ 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());
if (program == null) {
@@ -274,16 +278,25 @@ public class PlayControlsRowView extends MenuRowView {
Toast.makeText(mMainActivity, msg, Toast.LENGTH_SHORT).show();
}
}
- } else {
- DvrUiHelper.showStopRecordingDialog(mMainActivity, currentChannel);
+ } else if (currentChannel != null) {
+ DvrUiHelper.showStopRecordingDialog(mMainActivity, currentChannel.getId(),
+ DvrStopRecordingFragment.REASON_USER_STOP,
+ new HalfSizedDialogFragment.OnActionClickListener() {
+ @Override
+ public void onActionClick(long actionId) {
+ if (actionId == DvrStopRecordingFragment.ACTION_STOP) {
+ ScheduledRecording currentRecording =
+ mDvrManager.getCurrentRecording(
+ currentChannel.getId());
+ if (currentRecording != null) {
+ mDvrManager.stopRecording(currentRecording);
+ }
+ }
+ }
+ });
}
}
- private boolean needToShowRecordButton() {
- return CommonFeatures.DVR.isEnabled(getContext())
- && mDvrManager.isChannelRecordable(mMainActivity.getCurrentChannel());
- }
-
private void initializeButton(PlayControlsButton button, int imageResId,
int descriptionId, Integer focusedIconColor, Runnable clickAction) {
button.setImageResId(imageResId);
@@ -609,7 +622,8 @@ public class PlayControlsRowView extends MenuRowView {
}
private void updateRecordButton() {
- if (!needToShowRecordButton()) {
+ if (!(mDvrManager != null
+ && mDvrManager.isChannelRecordable(mMainActivity.getCurrentChannel()))) {
mRecordButton.setVisibility(View.GONE);
updateButtonMargin();
return;
diff --git a/src/com/android/tv/menu/SetupCardView.java b/src/com/android/tv/menu/SetupCardView.java
deleted file mode 100644
index 7ad5e9d0..00000000
--- a/src/com/android/tv/menu/SetupCardView.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.util.AttributeSet;
-
-import com.android.tv.R;
-import com.android.tv.data.Channel;
-
-/**
- * A view to render a guide card.
- */
-public class SetupCardView extends BaseCardView<Channel> {
- private static final String TAG = "GuideCardView";
- private static final boolean DEBUG = false;
-
- private static final int INVALID_COUNT = -1;
-
- private final float mCardHeight;
-
- public SetupCardView(Context context) {
- this(context, null, 0);
- }
-
- public SetupCardView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public SetupCardView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- mCardHeight = getResources().getDimension(R.dimen.card_layout_height);
- }
-
- @Override
- protected float getCardHeight() {
- return mCardHeight;
- }
-}
diff --git a/src/com/android/tv/menu/SimpleCardView.java b/src/com/android/tv/menu/SimpleCardView.java
index 24a44244..c99834be 100644
--- a/src/com/android/tv/menu/SimpleCardView.java
+++ b/src/com/android/tv/menu/SimpleCardView.java
@@ -19,16 +19,12 @@ package com.android.tv.menu;
import android.content.Context;
import android.util.AttributeSet;
-import com.android.tv.R;
import com.android.tv.data.Channel;
/**
* A view to render a guide card.
*/
public class SimpleCardView extends BaseCardView<Channel> {
- private static final String TAG = "GuideCardView";
- private static final boolean DEBUG = false;
- private final float mCardHeight;
public SimpleCardView(Context context) {
this(context, null, 0);
@@ -40,11 +36,5 @@ public class SimpleCardView extends BaseCardView<Channel> {
public SimpleCardView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- mCardHeight = getResources().getDimension(R.dimen.card_layout_height);
- }
-
- @Override
- protected float getCardHeight() {
- return mCardHeight;
}
}
diff --git a/src/com/android/tv/onboarding/NewSourcesFragment.java b/src/com/android/tv/onboarding/NewSourcesFragment.java
index 1b14c114..8509b50c 100644
--- a/src/com/android/tv/onboarding/NewSourcesFragment.java
+++ b/src/com/android/tv/onboarding/NewSourcesFragment.java
@@ -26,7 +26,6 @@ import android.view.ViewGroup;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.common.ui.setup.OnActionClickListener;
import com.android.tv.common.ui.setup.SetupActionHelper;
import com.android.tv.util.SetupUtils;
@@ -48,8 +47,6 @@ public class NewSourcesFragment extends Fragment {
*/
public static final int ACTION_SKIP = 2;
- private OnActionClickListener mOnActionClickListener;
-
public NewSourcesFragment() {
setAllowEnterTransitionOverlap(false);
setAllowReturnTransitionOverlap(false);
diff --git a/src/com/android/tv/onboarding/OnboardingActivity.java b/src/com/android/tv/onboarding/OnboardingActivity.java
index 41467376..45205c4c 100644
--- a/src/com/android/tv/onboarding/OnboardingActivity.java
+++ b/src/com/android/tv/onboarding/OnboardingActivity.java
@@ -44,7 +44,6 @@ public class OnboardingActivity extends SetupActivity {
private static final String KEY_INTENT_AFTER_COMPLETION = "key_intent_after_completion";
private static final int PERMISSIONS_REQUEST_READ_TV_LISTINGS = 1;
- private static final String PERMISSION_READ_TV_LISTINGS = "android.permission.READ_TV_LISTINGS";
private static final int SHOW_RIPPLE_DURATION_MS = 266;
@@ -82,10 +81,19 @@ public class OnboardingActivity extends SetupActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (!PermissionUtils.hasAccessAllEpg(this)
- && checkSelfPermission(PERMISSION_READ_TV_LISTINGS)
- != PackageManager.PERMISSION_GRANTED) {
- requestPermissions(new String[]{PERMISSION_READ_TV_LISTINGS},
+ ApplicationSingletons singletons = TvApplication.getSingletons(this);
+ mInputManager = singletons.getTvInputManagerHelper();
+ if (PermissionUtils.hasAccessAllEpg(this) || PermissionUtils.hasReadTvListings(this)) {
+ mChannelDataManager = singletons.getChannelDataManager();
+ // Make the channels of the new inputs which have been setup outside Live TV
+ // browsable.
+ if (mChannelDataManager.isDbLoadFinished()) {
+ SetupUtils.getInstance(this).markNewChannelsBrowsable();
+ } else {
+ mChannelDataManager.addListener(mChannelListener);
+ }
+ } else {
+ requestPermissions(new String[] {PermissionUtils.PERMISSION_READ_TV_LISTINGS},
PERMISSIONS_REQUEST_READ_TV_LISTINGS);
}
}
@@ -101,16 +109,6 @@ public class OnboardingActivity extends SetupActivity {
@Override
protected Fragment onCreateInitialFragment() {
if (PermissionUtils.hasAccessAllEpg(this) || PermissionUtils.hasReadTvListings(this)) {
- ApplicationSingletons singletons = TvApplication.getSingletons(this);
- mChannelDataManager = singletons.getChannelDataManager();
- mInputManager = singletons.getTvInputManagerHelper();
- // Make the channels of the new inputs which have been setup outside Live TV
- // browsable.
- if (mChannelDataManager.isDbLoadFinished()) {
- SetupUtils.getInstance(this).markNewChannelsBrowsable();
- } else {
- mChannelDataManager.addListener(mChannelListener);
- }
return OnboardingUtils.isFirstRunWithCurrentVersion(this) ? new WelcomeFragment()
: new SetupSourcesFragment();
}
diff --git a/src/com/android/tv/setup/SystemSetupActivity.java b/src/com/android/tv/setup/SystemSetupActivity.java
new file mode 100644
index 00000000..7e627410
--- /dev/null
+++ b/src/com/android/tv/setup/SystemSetupActivity.java
@@ -0,0 +1,124 @@
+/*
+ * 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.setup;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.media.tv.TvInputInfo;
+import android.os.Bundle;
+import android.widget.Toast;
+
+import com.android.tv.ApplicationSingletons;
+import com.android.tv.R;
+import com.android.tv.SetupPassthroughActivity;
+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.TvApplication;
+import com.android.tv.data.ChannelDataManager;
+import com.android.tv.onboarding.SetupSourcesFragment;
+import com.android.tv.util.OnboardingUtils;
+import com.android.tv.util.SetupUtils;
+import com.android.tv.util.TvInputManagerHelper;
+
+/**
+ * A activity to start input sources setup fragment for initial setup flow.
+ */
+public class SystemSetupActivity extends SetupActivity {
+ private static final String SYSTEM_SETUP =
+ "com.android.tv.action.LAUNCH_SYSTEM_SETUP";
+ private static final int SHOW_RIPPLE_DURATION_MS = 266;
+ private static final int REQUEST_CODE_START_SETUP_ACTIVITY = 1;
+
+ private TvInputManagerHelper mInputManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Intent intent = getIntent();
+ if (!SYSTEM_SETUP.equals(intent.getAction())) {
+ finish();
+ return;
+ }
+ ApplicationSingletons singletons = TvApplication.getSingletons(this);
+ mInputManager = singletons.getTvInputManagerHelper();
+ }
+
+ @Override
+ protected Fragment onCreateInitialFragment() {
+ return new SetupSourcesFragment();
+ }
+
+ private void showMerchantCollection() {
+ executeActionWithDelay(new Runnable() {
+ @Override
+ public void run() {
+ startActivity(OnboardingUtils.ONLINE_STORE_INTENT);
+ }
+ }, SHOW_RIPPLE_DURATION_MS);
+ }
+
+ @Override
+ public boolean executeAction(String category, int actionId, Bundle params) {
+ switch (category) {
+ case SetupSourcesFragment.ACTION_CATEGORY:
+ switch (actionId) {
+ case SetupSourcesFragment.ACTION_ONLINE_STORE:
+ showMerchantCollection();
+ return true;
+ case SetupSourcesFragment.ACTION_SETUP_INPUT: {
+ String inputId = params.getString(
+ SetupSourcesFragment.ACTION_PARAM_KEY_INPUT_ID);
+ TvInputInfo input = mInputManager.getTvInputInfo(inputId);
+ Intent intent = TvCommonUtils.createSetupIntent(input);
+ if (intent == null) {
+ Toast.makeText(this, R.string.msg_no_setup_activity, Toast.LENGTH_SHORT)
+ .show();
+ return true;
+ }
+ // Even though other app can handle the intent, the setup launched by Live
+ // channels should go through Live channels SetupPassthroughActivity.
+ intent.setComponent(new ComponentName(this,
+ SetupPassthroughActivity.class));
+ try {
+ // Now we know that the user intends to set up this input. Grant
+ // permission for writing EPG data.
+ SetupUtils.grantEpgPermission(this, input.getServiceInfo().packageName);
+ startActivityForResult(intent, REQUEST_CODE_START_SETUP_ACTIVITY);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(this,
+ getString(R.string.msg_unable_to_start_setup_activity,
+ input.loadLabel(this)), Toast.LENGTH_SHORT).show();
+ }
+ return true;
+ }
+ case SetupMultiPaneFragment.ACTION_DONE: {
+ // To make sure user can finish setup flow, set result as RESULT_OK.
+ setResult(Activity.RESULT_OK);
+ finish();
+ return true;
+ }
+ }
+ break;
+ }
+ return false;
+ }
+}
diff --git a/src/com/android/tv/tuner/TunerPreferenceProvider.java b/src/com/android/tv/tuner/TunerPreferenceProvider.java
index 3d289bb2..3a3561b6 100644
--- a/src/com/android/tv/tuner/TunerPreferenceProvider.java
+++ b/src/com/android/tv/tuner/TunerPreferenceProvider.java
@@ -38,8 +38,6 @@ public class TunerPreferenceProvider extends ContentProvider {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "usbtuner_preferences.db";
private static final String PREFERENCES_TABLE = "preferences";
- private static final String PREFERENCES_TABLE_ID_INDEX = "preferences_id_index";
- private static final String PREFERENCES_TABLE_KEY_INDEX = "preferences_key_index";
private static final int MATCH_PREFERENCE = 1;
private static final int MATCH_PREFERENCE_KEY = 2;
diff --git a/src/com/android/tv/tuner/TunerPreferences.java b/src/com/android/tv/tuner/TunerPreferences.java
index 7a5518c8..1547e3ae 100644
--- a/src/com/android/tv/tuner/TunerPreferences.java
+++ b/src/com/android/tv/tuner/TunerPreferences.java
@@ -41,6 +41,7 @@ public class TunerPreferences {
private static final String PREFS_KEY_SCANNED_CHANNEL_COUNT = "scanned_channel_count";
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";
private static final String SHARED_PREFS_NAME = "com.android.tv.tuner.preferences";
@@ -202,6 +203,28 @@ public class TunerPreferences {
}
}
+ @MainThread
+ public static boolean getStoreTsStream(Context context) {
+ SoftPreconditions.checkState(sInitialized);
+ if (useContentProvider(context)) {
+ return sPreferenceValues.getBoolean(PREFS_KEY_STORE_TS_STREAM, false);
+ } else {
+ return getSharedPreferences(context)
+ .getBoolean(TunerPreferences.PREFS_KEY_STORE_TS_STREAM, false);
+ }
+ }
+
+ @MainThread
+ public static void setStoreTsStream(Context context, boolean shouldStore) {
+ if (useContentProvider(context)) {
+ setPreference(context, PREFS_KEY_STORE_TS_STREAM, shouldStore);
+ } else {
+ getSharedPreferences(context).edit()
+ .putBoolean(TunerPreferences.PREFS_KEY_STORE_TS_STREAM, shouldStore)
+ .apply();
+ }
+ }
+
private static SharedPreferences getSharedPreferences(Context context) {
return context.getSharedPreferences(SHARED_PREFS_NAME, Context.MODE_PRIVATE);
}
@@ -266,6 +289,7 @@ public class TunerPreferences {
break;
case PREFS_KEY_SCAN_DONE:
case PREFS_KEY_LAUNCH_SETUP:
+ case PREFS_KEY_STORE_TS_STREAM:
bundle.putBoolean(key, Boolean.parseBoolean(value));
break;
}
diff --git a/src/com/android/tv/tuner/data/TunerChannel.java b/src/com/android/tv/tuner/data/TunerChannel.java
index 91c1f5b0..22cf2aa6 100644
--- a/src/com/android/tv/tuner/data/TunerChannel.java
+++ b/src/com/android/tv/tuner/data/TunerChannel.java
@@ -54,8 +54,6 @@ public class TunerChannel implements Comparable<TunerChannel>, PsipData.TvTracks
"Extended Parameterized Service" };
private static final String ATSC_SERVICE_TYPE_NAME_RESERVED =
ATSC_SERVICE_TYPE_NAMES[Channel.SERVICE_TYPE_ATSC_RESERVED];
- private static final String ATSC_SERVICE_TYPE_NAME_DIGITAL_TELEVISION =
- ATSC_SERVICE_TYPE_NAMES[Channel.SERVICE_TYPE_ATSC_DIGITAL_TELEVISION];
public static final int INVALID_FREQUENCY = -1;
diff --git a/src/com/android/tv/tuner/exoplayer/DataSourceAdapter.java b/src/com/android/tv/tuner/exoplayer/DataSourceAdapter.java
deleted file mode 100644
index e7c11e38..00000000
--- a/src/com/android/tv/tuner/exoplayer/DataSourceAdapter.java
+++ /dev/null
@@ -1,57 +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.tuner.exoplayer;
-
-
-import android.media.MediaDataSource;
-
-import com.google.android.exoplayer.C;
-import com.google.android.exoplayer.upstream.DataSource;
-import com.google.android.exoplayer.upstream.DataSpec;
-
-import java.io.IOException;
-
-/**
- * A DataSource adapter implementation by using {@link MediaDataSource}.
- */
-public class DataSourceAdapter implements DataSource {
- private MediaDataSource mMediaDataSource;
- private long mReadPosition;
-
- public DataSourceAdapter(MediaDataSource mediaDataSource) {
- mMediaDataSource = mediaDataSource;
- }
-
- @Override
- public long open(DataSpec dataSpec) throws IOException {
- return C.LENGTH_UNBOUNDED;
- }
-
- @Override
- public void close() throws IOException {
- mMediaDataSource.close();
- }
-
- @Override
- public int read(byte[] buffer, int offset, int readLength) throws IOException {
- int ret = mMediaDataSource.readAt(mReadPosition, buffer, offset, readLength);
- if (ret > 0) {
- mReadPosition += ret;
- return ret;
- }
- return C.RESULT_END_OF_INPUT;
- }
-}
diff --git a/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java b/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java
index 4eb0d32c..c105e222 100644
--- a/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java
+++ b/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java
@@ -16,10 +16,12 @@
package com.android.tv.tuner.exoplayer;
-import android.media.MediaDataSource;
-import android.media.tv.TvContract;
+import android.net.Uri;
import android.os.ConditionVariable;
import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
import android.os.SystemClock;
import com.google.android.exoplayer.C;
@@ -28,6 +30,7 @@ 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.exoplayer.upstream.DefaultAllocator;
@@ -41,6 +44,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
/**
@@ -48,36 +52,49 @@ import java.util.concurrent.atomic.AtomicLong;
* For demux, this class relies on {@link com.google.android.exoplayer.extractor.ts.TsExtractor}.
*/
public class ExoPlayerSampleExtractor implements SampleExtractor {
- private static final String TAG = "ExoPlayerSampleExtractor";
+ private static final String TAG = "ExoPlayerSampleExtracto";
// 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 static final AtomicLong ID_COUNTER = new AtomicLong(0);
-
- private final ExtractorThread mExtractorThread;
- private final BufferManager.SampleBuffer mSampleBuffer;
+ private final HandlerThread mSourceReaderThread;
private final long mId;
- private final List<MediaFormat> mTrackFormats = new ArrayList<>();
- private final SampleSource.SampleSourceReader mSampleSourceReader;
+ private final Handler.Callback mSourceReaderWorker;
- private boolean mReleased;
- private boolean mOnCompletionCalled;
+ private BufferManager.SampleBuffer mSampleBuffer;
+ private Handler mSourceReaderHandler;
+ private volatile boolean mPrepared;
+ private AtomicBoolean mOnCompletionCalled = new AtomicBoolean();
+ private IOException mExceptionOnPrepare;
+ private List<MediaFormat> mTrackFormats;
private HashMap<Integer, Long> mLastExtractedPositionUsMap = new HashMap<>();
private OnCompletionListener mOnCompletionListener;
private Handler mOnCompletionListenerHandler;
+ private IOException mError;
- public ExoPlayerSampleExtractor(DataSource source, BufferManager bufferManager,
+ public ExoPlayerSampleExtractor(Uri uri, DataSource source, BufferManager bufferManager,
PlaybackBufferListener bufferListener, boolean isRecording) {
- mId = ID_COUNTER.incrementAndGet();
+ // It'll be used as a timeshift file chunk name's prefix.
+ mId = System.currentTimeMillis();
Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE_IN_BYTES);
- mSampleSourceReader = new ExtractorSampleSource(TvContract.Programs.CONTENT_URI, source,
- allocator, BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE_IN_BYTES, null, null, 0);
- mExtractorThread = new ExtractorThread();
+ EventListener eventListener = new EventListener() {
+
+ @Override
+ public void onLoadError(int sourceId, IOException e) {
+ mError = e;
+ }
+ };
+
+ mSourceReaderThread = new HandlerThread("SourceReaderThread");
+ 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, 0));
if (isRecording) {
mSampleBuffer = new RecordingSampleBuffer(bufferManager, bufferListener, false,
RecordingSampleBuffer.BUFFER_REASON_RECORDING);
@@ -97,35 +114,114 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
mOnCompletionListenerHandler = handler;
}
- private class ExtractorThread extends Thread {
- private static final int FETCH_SAMPLE_INTERVAL_MS = 50;
- private volatile boolean mQuitRequested = false;
+ 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 SampleSource mSampleSource;
+ private SampleSource.SampleSourceReader mSampleSourceReader;
+ private boolean[] mTrackMetEos;
+ private boolean mMetEos = false;
private long mCurrentPosition;
- public ExtractorThread() {
- super("ExtractorThread");
+ public SourceReaderWorker(SampleSource sampleSource) {
+ mSampleSource = sampleSource;
}
@Override
- public void run() {
- SampleHolder sample = new SampleHolder(SampleHolder.BUFFER_REPLACEMENT_MODE_NORMAL);
- ConditionVariable conditionVariable = new ConditionVariable();
- int trackCount = mSampleSourceReader.getTrackCount();
- while (!mQuitRequested) {
- boolean didSomething = false;
- for (int i = 0; i < trackCount; ++i) {
- if(SampleSource.NOTHING_READ != fetchSample(i, sample, conditionVariable)) {
- didSomething = true;
+ public boolean handleMessage(Message message) {
+ switch (message.what) {
+ case MSG_PREPARE:
+ mPrepared = prepare();
+ if (!mPrepared && mExceptionOnPrepare == null) {
+ mSourceReaderHandler
+ .sendEmptyMessageDelayed(MSG_PREPARE, RETRY_INTERVAL_MS);
+ } else{
+ mSourceReaderHandler.sendEmptyMessage(MSG_FETCH_SAMPLES);
}
- }
- if (!didSomething) {
- try {
- Thread.sleep(FETCH_SAMPLE_INTERVAL_MS);
- } catch (InterruptedException e) {
+ return true;
+ case MSG_FETCH_SAMPLES:
+ boolean didSomething = false;
+ SampleHolder sample = new SampleHolder(
+ SampleHolder.BUFFER_REPLACEMENT_MODE_NORMAL);
+ ConditionVariable conditionVariable = new ConditionVariable();
+ int trackCount = mSampleSourceReader.getTrackCount();
+ for (int i = 0; i < trackCount; ++i) {
+ 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.
+ break;
+ }
+ didSomething = true;
+ }
+ }
+ if (!mMetEos) {
+ if (didSomething) {
+ mSourceReaderHandler.sendEmptyMessage(MSG_FETCH_SAMPLES);
+ } else {
+ mSourceReaderHandler.sendEmptyMessageDelayed(MSG_FETCH_SAMPLES,
+ RETRY_INTERVAL_MS);
+ }
+ } else {
+ notifyCompletionIfNeeded(false);
+ }
+ return true;
+ case MSG_RELEASE:
+ 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);
+ return true;
+ }
+ 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;
}
}
- cleanUp();
+ return true;
}
private int fetchSample(int track, SampleHolder sample,
@@ -150,20 +246,24 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
queueSample(track, sample, conditionVariable);
} catch (IOException e) {
mLastExtractedPositionUsMap.clear();
- mQuitRequested = true;
+ mMetEos = true;
mSampleBuffer.setEos();
}
} else if (ret == SampleSource.END_OF_STREAM) {
- mQuitRequested = true;
- mSampleBuffer.setEos();
+ mTrackMetEos[track] = true;
+ for (int i = 0; i < mTrackMetEos.length; ++i) {
+ if (!mTrackMetEos[i]) {
+ break;
+ }
+ if (i == mTrackMetEos.length -1) {
+ mMetEos = true;
+ mSampleBuffer.setEos();
+ }
+ }
}
// TODO: Handle SampleSource.FORMAT_READ for dynamic resolution change. b/28169263
return ret;
}
-
- public void quit() {
- mQuitRequested = true;
- }
}
private void queueSample(int index, SampleHolder sample, ConditionVariable conditionVariable)
@@ -179,29 +279,30 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
}
@Override
+ public void maybeThrowError() throws IOException {
+ if (mError != null) {
+ IOException e = mError;
+ mError = null;
+ throw e;
+ }
+ }
+
+ @Override
public boolean prepare() throws IOException {
- synchronized (this) {
- if(!mSampleSourceReader.prepare(0)) {
- return false;
- }
- int trackCount = mSampleSourceReader.getTrackCount();
- mTrackFormats.clear();
- for (int i = 0; i < trackCount; i++) {
- mTrackFormats.add(mSampleSourceReader.getFormat(i));
- mSampleSourceReader.enable(i, 0);
- }
- List<String> ids = new ArrayList<>();
- for (int i = 0; i < trackCount; i++) {
- ids.add(String.format(Locale.ENGLISH, "%s_%x", Long.toHexString(mId), i));
- }
- mSampleBuffer.init(ids, mTrackFormats);
+ if (!mSourceReaderThread.isAlive()) {
+ mSourceReaderThread.start();
+ mSourceReaderHandler = new Handler(mSourceReaderThread.getLooper(),
+ mSourceReaderWorker);
+ mSourceReaderHandler.sendEmptyMessage(SourceReaderWorker.MSG_PREPARE);
+ }
+ if (mExceptionOnPrepare != null) {
+ throw mExceptionOnPrepare;
}
- mExtractorThread.start();
- return true;
+ return mPrepared;
}
@Override
- public synchronized List<MediaFormat> getTrackFormats() {
+ public List<MediaFormat> getTrackFormats() {
return mTrackFormats;
}
@@ -243,27 +344,45 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
@Override
public void release() {
- synchronized (this) {
- mReleased = true;
- }
- if (mExtractorThread.isAlive()) {
- mExtractorThread.quit();
+ if (mSourceReaderThread.isAlive()) {
+ mSourceReaderHandler.removeCallbacksAndMessages(null);
+ mSourceReaderHandler.sendEmptyMessage(SourceReaderWorker.MSG_RELEASE);
+ mSourceReaderThread.quitSafely();
+ // Return early in this case so that session worker can start working on the next
+ // request as early as it can. The clean up will be done in the reader thread while
+ // handling MSG_RELEASE.
} else {
cleanUp();
}
}
- private void onCompletion(final boolean result, long lastExtractedPositionUs) {
- final OnCompletionListener listener = mOnCompletionListener;
- if (mOnCompletionListenerHandler != null && mOnCompletionListener != null) {
- mOnCompletionListenerHandler.post(new Runnable() {
- @Override
- public void run() {
- listener.onCompletion(result, lastExtractedPositionUs);
- }
- });
+ private void cleanUp() {
+ boolean result = true;
+ try {
+ if (mSampleBuffer != null) {
+ mSampleBuffer.release();
+ mSampleBuffer = null;
+ }
+ } catch (IOException e) {
+ result = false;
+ }
+ notifyCompletionIfNeeded(result);
+ setOnCompletionListener(null, null);
+ }
+
+ private void notifyCompletionIfNeeded(final boolean result) {
+ if (!mOnCompletionCalled.getAndSet(true)) {
+ final OnCompletionListener listener = mOnCompletionListener;
+ final long lastExtractedPositionUs = getLastExtractedPositionUs();
+ if (mOnCompletionListenerHandler != null && mOnCompletionListener != null) {
+ mOnCompletionListenerHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ listener.onCompletion(result, lastExtractedPositionUs);
+ }
+ });
+ }
}
- mOnCompletionCalled = true;
}
private long getLastExtractedPositionUs() {
@@ -276,23 +395,4 @@ public class ExoPlayerSampleExtractor implements SampleExtractor {
}
return lastExtractedPositionUs;
}
-
- private synchronized void cleanUp() {
- if (!mReleased) {
- if (!mOnCompletionCalled) {
- onCompletion(false, getLastExtractedPositionUs());
- }
- return;
- }
- boolean result = true;
- try {
- mSampleBuffer.release();
- } catch (IOException e) {
- result = false;
- }
- if (!mOnCompletionCalled) {
- onCompletion(result, getLastExtractedPositionUs());
- }
- setOnCompletionListener(null, null);
- }
}
diff --git a/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java b/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java
index a5059bc2..ec7b4b16 100644
--- a/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java
+++ b/src/com/android/tv/tuner/exoplayer/FileSampleExtractor.java
@@ -55,6 +55,11 @@ public class FileSampleExtractor implements SampleExtractor{
}
@Override
+ public void maybeThrowError() throws IOException {
+ // Do nothing.
+ }
+
+ @Override
public boolean prepare() throws IOException {
ArrayList<Pair<String, android.media.MediaFormat>> trackInfos =
mBufferManager.readTrackInfoFiles();
diff --git a/src/com/android/tv/tuner/exoplayer/FrameworkSampleExtractor.java b/src/com/android/tv/tuner/exoplayer/FrameworkSampleExtractor.java
deleted file mode 100644
index 487844b4..00000000
--- a/src/com/android/tv/tuner/exoplayer/FrameworkSampleExtractor.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * 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.tuner.exoplayer;
-
-import android.media.MediaDataSource;
-import android.media.MediaExtractor;
-import android.os.Handler;
-import android.os.ConditionVariable;
-import android.os.SystemClock;
-import android.util.Log;
-
-import com.google.android.exoplayer.C;
-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.android.tv.tuner.exoplayer.buffer.BufferManager;
-import com.android.tv.tuner.exoplayer.buffer.RecordingSampleBuffer;
-import com.android.tv.tuner.exoplayer.buffer.SimpleSampleBuffer;
-import com.android.tv.tuner.tvinput.PlaybackBufferListener;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * A class that plays and records a live stream from tuner using a {@link MediaExtractor}
- * and the private ExtractorThread class.
- */
-public class FrameworkSampleExtractor implements SampleExtractor {
- private static final String TAG = "FrameworkSampleExtractor";
-
- // Maximum bandwidth of 1080p channel is about 2.2MB/s. 2MB for a sample will suffice.
- private static final int SAMPLE_BUFFER_SIZE = 1024 * 1024 * 2;
- private static final AtomicLong ID_COUNTER = new AtomicLong(0);
-
- private final MediaDataSource mDataSource;
- private final MediaExtractor mMediaExtractor;
- private final ExtractorThread mExtractorThread;
- private final BufferManager.SampleBuffer mSampleBuffer;
- private final long mId;
- private final List<MediaFormat> mTrackFormats = new ArrayList<>();
-
- private boolean mReleased;
- private boolean mOnCompletionCalled;
- private HashMap<Integer, Long> mLastExtractedPositionUsMap = new HashMap<>();
- private OnCompletionListener mOnCompletionListener;
- private Handler mOnCompletionListenerHandler;
-
- public FrameworkSampleExtractor(MediaDataSource source, BufferManager bufferManager,
- PlaybackBufferListener bufferListener, boolean isRecording) {
- mId = ID_COUNTER.incrementAndGet();
- mDataSource = source;
- mMediaExtractor = new MediaExtractor();
- mExtractorThread = new ExtractorThread();
- if (isRecording) {
- mSampleBuffer = new RecordingSampleBuffer(bufferManager, bufferListener, false,
- RecordingSampleBuffer.BUFFER_REASON_RECORDING);
- } else {
- if (bufferManager == null || bufferManager.isDisabled()) {
- mSampleBuffer = new SimpleSampleBuffer(bufferListener);
- } else {
- mSampleBuffer = new RecordingSampleBuffer(bufferManager, bufferListener, true,
- RecordingSampleBuffer.BUFFER_REASON_LIVE_PLAYBACK);
- }
- }
- }
-
- @Override
- public void setOnCompletionListener(OnCompletionListener listener, Handler handler) {
- mOnCompletionListener = listener;
- mOnCompletionListenerHandler = handler;
- }
-
- private class ExtractorThread extends Thread {
- private volatile boolean mQuitRequested = false;
-
- public ExtractorThread() {
- super("ExtractorThread");
- }
-
- @Override
- public void run() {
- SampleHolder sample = new SampleHolder(SampleHolder.BUFFER_REPLACEMENT_MODE_NORMAL);
- sample.ensureSpaceForWrite(SAMPLE_BUFFER_SIZE);
- ConditionVariable conditionVariable = new ConditionVariable();
- while (!mQuitRequested) {
- fetchSample(sample, conditionVariable);
- }
- cleanUp();
- }
-
- private void fetchSample(SampleHolder sample, ConditionVariable conditionVariable) {
- int index = mMediaExtractor.getSampleTrackIndex();
- if (index < 0) {
- Log.i(TAG, "EoS");
- mQuitRequested = true;
- mSampleBuffer.setEos();
- return;
- }
- sample.data.clear();
- sample.size = mMediaExtractor.readSampleData(sample.data, 0);
- if (sample.size < 0 || sample.size > SAMPLE_BUFFER_SIZE) {
- // Should not happen
- Log.e(TAG, "Invalid sample size: " + sample.size);
- mMediaExtractor.advance();
- return;
- }
- sample.data.position(sample.size);
- sample.timeUs = mMediaExtractor.getSampleTime();
- sample.flags = mMediaExtractor.getSampleFlags();
-
- mMediaExtractor.advance();
- try {
- Long lastExtractedPositionUs = mLastExtractedPositionUsMap.get(index);
- if (lastExtractedPositionUs == null) {
- mLastExtractedPositionUsMap.put(index, sample.timeUs);
- } else {
- mLastExtractedPositionUsMap.put(index,
- Math.max(lastExtractedPositionUs, sample.timeUs));
- }
- queueSample(index, sample, conditionVariable);
- } catch (IOException e) {
- mLastExtractedPositionUsMap.clear();
- mQuitRequested = true;
- mSampleBuffer.setEos();
- }
- }
-
- public void quit() {
- mQuitRequested = true;
- }
- }
-
- 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();
- }
- }
-
- @Override
- public boolean prepare() throws IOException {
- synchronized (this) {
- mMediaExtractor.setDataSource(mDataSource);
- int trackCount = mMediaExtractor.getTrackCount();
- mTrackFormats.clear();
- for (int i = 0; i < trackCount; i++) {
- mTrackFormats.add(MediaFormatUtil.createMediaFormat(
- mMediaExtractor.getTrackFormat(i)));
- mMediaExtractor.selectTrack(i);
- }
- List<String> ids = new ArrayList<>();
- for (int i = 0; i < trackCount; i++) {
- ids.add(String.format(Locale.ENGLISH, "%s_%x", Long.toHexString(mId), i));
- }
- mSampleBuffer.init(ids, mTrackFormats);
- }
- mExtractorThread.start();
- return true;
- }
-
- @Override
- public synchronized List<MediaFormat> getTrackFormats() {
- return mTrackFormats;
- }
-
- @Override
- public void getTrackMediaFormat(int track, MediaFormatHolder outMediaFormatHolder) {
- outMediaFormatHolder.format = mTrackFormats.get(track);
- outMediaFormatHolder.drmInitData = null;
- }
-
- @Override
- public void selectTrack(int index) {
- mSampleBuffer.selectTrack(index);
- }
-
- @Override
- public void deselectTrack(int index) {
- mSampleBuffer.deselectTrack(index);
- }
-
- @Override
- public long getBufferedPositionUs() {
- return mSampleBuffer.getBufferedPositionUs();
- }
-
- @Override
- public boolean continueBuffering(long positionUs) {
- return mSampleBuffer.continueBuffering(positionUs);
- }
-
- @Override
- public void seekTo(long positionUs) {
- mSampleBuffer.seekTo(positionUs);
- }
-
- @Override
- public int readSample(int track, SampleHolder sampleHolder) {
- return mSampleBuffer.readSample(track, sampleHolder);
- }
-
- @Override
- public void release() {
- synchronized (this) {
- mReleased = true;
- }
- if (mExtractorThread.isAlive()) {
- mExtractorThread.quit();
-
- // We don't join here to prevent hang --- MediaExtractor is released at the thread.
- } else {
- cleanUp();
- }
- }
-
- private void onCompletion(final boolean result, long lastExtractedPositionUs) {
- final OnCompletionListener listener = mOnCompletionListener;
- if (mOnCompletionListenerHandler != null && mOnCompletionListener != null) {
- mOnCompletionListenerHandler.post(new Runnable() {
- @Override
- public void run() {
- listener.onCompletion(result, lastExtractedPositionUs);
- }
- });
- }
- mOnCompletionCalled = true;
- }
-
- private long getLastExtractedPositionUs() {
- long lastExtractedPositionUs = Long.MAX_VALUE;
- for (long value : mLastExtractedPositionUsMap.values()) {
- lastExtractedPositionUs = Math.min(lastExtractedPositionUs, value);
- }
- if (lastExtractedPositionUs == Long.MAX_VALUE) {
- lastExtractedPositionUs = C.UNKNOWN_TIME_US;
- }
- return lastExtractedPositionUs;
- }
-
- private synchronized void cleanUp() {
- if (!mReleased) {
- if (!mOnCompletionCalled) {
- onCompletion(false, getLastExtractedPositionUs());
- }
- return;
- }
- boolean result = true;
- try {
- mSampleBuffer.release();
- } catch (IOException e) {
- result = false;
- }
- if (!mOnCompletionCalled) {
- onCompletion(result, getLastExtractedPositionUs());
- }
- setOnCompletionListener(null, null);
- mMediaExtractor.release();
- }
-}
diff --git a/src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java b/src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java
index c1a20a55..381b22e9 100644
--- a/src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java
+++ b/src/com/android/tv/tuner/exoplayer/MpegTsPlayer.java
@@ -19,7 +19,6 @@ package com.android.tv.tuner.exoplayer;
import android.content.Context;
import android.media.AudioFormat;
import android.media.MediaCodec.CryptoException;
-import android.media.MediaDataSource;
import android.media.PlaybackParams;
import android.os.Handler;
import android.support.annotation.IntDef;
@@ -35,14 +34,15 @@ import com.google.android.exoplayer.MediaFormat;
import com.google.android.exoplayer.TrackRenderer;
import com.google.android.exoplayer.audio.AudioCapabilities;
import com.google.android.exoplayer.audio.AudioTrack;
+import com.google.android.exoplayer.upstream.DataSource;
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.Ac3PassthroughTrackRenderer;
import com.android.tv.tuner.exoplayer.ac3.Ac3TrackRenderer;
-import com.android.tv.tuner.source.TsMediaDataSource;
-import com.android.tv.tuner.source.TsMediaDataSourceManager;
+import com.android.tv.tuner.source.TsDataSource;
+import com.android.tv.tuner.source.TsDataSourceManager;
import com.android.tv.tuner.tvinput.EventDetector;
import java.lang.annotation.Retention;
@@ -59,7 +59,7 @@ public class MpegTsPlayer implements ExoPlayer.Listener, MediaCodecVideoTrackRen
* Interface definition for building specific track renderers.
*/
public interface RendererBuilder {
- void buildRenderers(MpegTsPlayer mpegTsPlayer, MediaDataSource dataSource,
+ void buildRenderers(MpegTsPlayer mpegTsPlayer, DataSource dataSource,
RendererBuilderCallback callback);
}
@@ -125,14 +125,13 @@ public class MpegTsPlayer implements ExoPlayer.Listener, MediaCodecVideoTrackRen
private final ExoPlayer mPlayer;
private final Handler mMainHandler;
private final AudioCapabilities mAudioCapabilities;
- private final TsMediaDataSourceManager mSourceManager;
+ private final TsDataSourceManager mSourceManager;
private Listener mListener;
@RendererBuildingState private int mRendererBuildingState;
- private boolean mLastReportedPlayWhenReady;
private Surface mSurface;
- private TsMediaDataSource mMediaDataSource;
+ private TsDataSource mDataSource;
private InternalRendererBuilderCallback mBuilderCallback;
private TrackRenderer mVideoRenderer;
private TrackRenderer mAudioRenderer;
@@ -147,12 +146,12 @@ public class MpegTsPlayer implements ExoPlayer.Listener, MediaCodecVideoTrackRen
*
* @param rendererBuilder the builder of track renderers
* @param handler the handler for the playback events in track renderers
- * @param sourceManager the manager for {@link MediaDataSource}
+ * @param sourceManager the manager for {@link DataSource}
* @param capabilities the {@link AudioCapabilities} of the current device
* @param listener the listener for playback state changes
*/
public MpegTsPlayer(RendererBuilder rendererBuilder, Handler handler,
- TsMediaDataSourceManager sourceManager, AudioCapabilities capabilities,
+ TsDataSourceManager sourceManager, AudioCapabilities capabilities,
Listener listener) {
mRendererBuilder = rendererBuilder;
mPlayer = ExoPlayer.Factory.newInstance(RENDERER_COUNT, MIN_BUFFER_MS, MIN_REBUFFER_MS);
@@ -213,7 +212,7 @@ public class MpegTsPlayer implements ExoPlayer.Listener, MediaCodecVideoTrackRen
}
/**
- * Creates renderers and {@link MediaDataSource} and initializes player.
+ * Creates renderers and {@link DataSource} and initializes player.
* @param context a {@link Context} instance
* @param channel to play
* @param eventListener for program information which will be scanned from MPEG2-TS stream
@@ -221,14 +220,14 @@ public class MpegTsPlayer implements ExoPlayer.Listener, MediaCodecVideoTrackRen
*/
public boolean prepare(Context context, TunerChannel channel,
EventDetector.EventListener eventListener) {
- TsMediaDataSource source = null;
+ TsDataSource source = null;
if (channel != null) {
source = mSourceManager.createDataSource(context, channel, eventListener);
if (source == null) {
return false;
}
}
- mMediaDataSource = source;
+ mDataSource = source;
if (mRendererBuildingState == RENDERER_BUILDING_STATE_BUILT) {
mPlayer.stop();
}
@@ -242,10 +241,10 @@ public class MpegTsPlayer implements ExoPlayer.Listener, MediaCodecVideoTrackRen
}
/**
- * Returns {@link TsMediaDataSource} which provides MPEG2-TS stream.
+ * Returns {@link TsDataSource} which provides MPEG2-TS stream.
*/
- public TsMediaDataSource getDataSource() {
- return mMediaDataSource;
+ public TsDataSource getDataSource() {
+ return mDataSource;
}
private void onRenderers(TrackRenderer[] renderers) {
@@ -347,9 +346,9 @@ public class MpegTsPlayer implements ExoPlayer.Listener, MediaCodecVideoTrackRen
* Releases the player.
*/
public void release() {
- if (mMediaDataSource != null) {
- mSourceManager.releaseDataSource(mMediaDataSource);
- mMediaDataSource = null;
+ if (mDataSource != null) {
+ mSourceManager.releaseDataSource(mDataSource);
+ mDataSource = null;
}
if (mBuilderCallback != null) {
mBuilderCallback.cancel();
@@ -479,6 +478,23 @@ public class MpegTsPlayer implements ExoPlayer.Listener, MediaCodecVideoTrackRen
}
/**
+ * Returns the number of tracks exposed by the specified renderer.
+ */
+ public int getTrackCount(int rendererIndex) {
+ return mPlayer.getTrackCount(rendererIndex);
+ }
+
+ /**
+ * Selects a track for the specified renderer.
+ */
+ public void setSelectedTrack(int rendererIndex, int trackIndex) {
+ if (trackIndex >= getTrackCount(rendererIndex)) {
+ return;
+ }
+ mPlayer.setSelectedTrack(rendererIndex, trackIndex);
+ }
+
+ /**
* Gets the main handler of the player.
*/
/* package */ Handler getMainHandler() {
diff --git a/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java b/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java
index f6ea84d9..0e46c9cf 100644
--- a/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java
+++ b/src/com/android/tv/tuner/exoplayer/MpegTsRendererBuilder.java
@@ -17,10 +17,10 @@
package com.android.tv.tuner.exoplayer;
import android.content.Context;
-import android.media.MediaDataSource;
import com.google.android.exoplayer.SampleSource;
import com.google.android.exoplayer.TrackRenderer;
+import com.google.android.exoplayer.upstream.DataSource;
import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilder;
import com.android.tv.tuner.exoplayer.MpegTsPlayer.RendererBuilderCallback;
import com.android.tv.tuner.exoplayer.ac3.Ac3PassthroughTrackRenderer;
@@ -43,7 +43,7 @@ public class MpegTsRendererBuilder implements RendererBuilder {
}
@Override
- public void buildRenderers(MpegTsPlayer mpegTsPlayer, MediaDataSource dataSource,
+ public void buildRenderers(MpegTsPlayer mpegTsPlayer, DataSource dataSource,
RendererBuilderCallback callback) {
// Build the video and audio renderers.
SampleExtractor extractor = dataSource == null ?
diff --git a/src/com/android/tv/tuner/exoplayer/MpegTsSampleExtractor.java b/src/com/android/tv/tuner/exoplayer/MpegTsSampleExtractor.java
index aaf4a391..7bf116c8 100644
--- a/src/com/android/tv/tuner/exoplayer/MpegTsSampleExtractor.java
+++ b/src/com/android/tv/tuner/exoplayer/MpegTsSampleExtractor.java
@@ -16,17 +16,15 @@
package com.android.tv.tuner.exoplayer;
-import android.media.MediaDataSource;
+import android.net.Uri;
import android.os.Handler;
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.upstream.DataSource;
import com.google.android.exoplayer.util.MimeTypes;
-import com.android.tv.tuner.TunerFlags;
import com.android.tv.tuner.exoplayer.buffer.BufferManager;
import com.android.tv.tuner.exoplayer.buffer.SamplePool;
import com.android.tv.tuner.tvinput.PlaybackBufferListener;
@@ -38,7 +36,7 @@ import java.util.LinkedList;
import java.util.List;
/**
- * Extracts samples from {@link MediaDataSource} for MPEG-TS streams.
+ * Extracts samples from {@link DataSource} for MPEG-TS streams.
*/
public final class MpegTsSampleExtractor implements SampleExtractor {
public static final String MIMETYPE_TEXT_CEA_708 = "text/cea-708";
@@ -64,22 +62,17 @@ public final class MpegTsSampleExtractor implements SampleExtractor {
}
/**
- * Creates MpegTsSampleExtractor for {@link MediaDataSource}.
+ * Creates MpegTsSampleExtractor for {@link DataSource}.
*
- * @param source the {@link MediaDataSource} to extract from
+ * @param source the {@link DataSource} to extract from
* @param bufferManager the manager for reading & writing samples backed by physical storage
* @param bufferListener the {@link PlaybackBufferListener}
* to notify buffer storage status change
*/
- public MpegTsSampleExtractor(MediaDataSource source,
- BufferManager bufferManager, PlaybackBufferListener bufferListener) {
- if (TunerFlags.USE_EXTRACTOR_IN_EXOPLAYER) {
- mSampleExtractor = new ExoPlayerSampleExtractor(new DataSourceAdapter(source),
- bufferManager, bufferListener, false);
- } else {
- mSampleExtractor = new FrameworkSampleExtractor(source, bufferManager, bufferListener,
- false);
- }
+ public MpegTsSampleExtractor(DataSource source, BufferManager bufferManager,
+ PlaybackBufferListener bufferListener) {
+ mSampleExtractor = new ExoPlayerSampleExtractor(Uri.EMPTY, source, bufferManager,
+ bufferListener, false);
init();
}
@@ -97,6 +90,13 @@ public final class MpegTsSampleExtractor implements SampleExtractor {
}
@Override
+ public void maybeThrowError() throws IOException {
+ if (mSampleExtractor != null) {
+ mSampleExtractor.maybeThrowError();
+ }
+ }
+
+ @Override
public boolean prepare() throws IOException {
if(!mSampleExtractor.prepare()) {
return false;
@@ -124,8 +124,8 @@ public final class MpegTsSampleExtractor implements SampleExtractor {
mCea708TextTrackIndex = trackCount;
}
if (mCea708TextTrackIndex >= 0) {
- mTrackFormats.add(MediaFormatUtil.createTextMediaFormat(MIMETYPE_TEXT_CEA_708,
- mTrackFormats.get(0).durationUs));
+ mTrackFormats.add(MediaFormat.createTextFormat(null, MIMETYPE_TEXT_CEA_708, 0,
+ mTrackFormats.get(0).durationUs, ""));
}
return true;
}
@@ -224,81 +224,112 @@ public final class MpegTsSampleExtractor implements SampleExtractor {
public void setOnCompletionListener(OnCompletionListener listener, Handler handler) { }
private abstract class CcParser {
+ // Interim buffer for reduce direct access to ByteBuffer which is expensive. Using
+ // relatively small buffer size in order to minimize memory footprint increase.
+ protected final byte[] mBuffer = new byte[1024];
+
abstract void mayParseClosedCaption(ByteBuffer buffer, long presentationTimeUs);
- protected void parseClosedCaption(ByteBuffer buffer, int offset, long presentationTimeUs) {
+ protected int parseClosedCaption(ByteBuffer buffer, int offset, long presentationTimeUs) {
// For the details of user_data_type_structure, see ATSC A/53 Part 4 - Table 6.9.
int pos = offset;
if (pos + 2 >= buffer.position()) {
- return;
+ return offset;
}
boolean processCcDataFlag = (buffer.get(pos) & 64) != 0;
int ccCount = buffer.get(pos) & 0x1f;
pos += 2;
if (!processCcDataFlag || pos + 3 * ccCount >= buffer.position() || ccCount == 0) {
- return;
+ return offset;
}
SampleHolder holder = mCcSamplePool.acquireSample(CC_BUFFER_SIZE_IN_BYTES);
for (int i = 0; i < 3 * ccCount; i++) {
- holder.data.put(buffer.get(pos + i));
+ holder.data.put(buffer.get(pos++));
}
holder.timeUs = presentationTimeUs;
mPendingCcSamples.add(holder);
+ return pos;
}
}
private class Mpeg2CcParser extends CcParser {
+ private static final int PATTERN_LENGTH = 9;
+
@Override
public void mayParseClosedCaption(ByteBuffer buffer, long presentationTimeUs) {
- int pos = 0;
- while (pos + 9 < buffer.position()) {
- // Find the start prefix code of private user data.
- if (buffer.get(pos) == 0
- && buffer.get(pos + 1) == 0
- && buffer.get(pos + 2) == 1
- && (buffer.get(pos + 3) & 0xff) == 0xb2) {
- // ATSC closed caption data embedded in MPEG2VIDEO stream has 'GA94' user
- // identifier and user data type code 3.
- if (buffer.get(pos + 4) == 'G'
- && buffer.get(pos + 5) == 'A'
- && buffer.get(pos + 6) == '9'
- && buffer.get(pos + 7) == '4'
- && buffer.get(pos + 8) == 3) {
- parseClosedCaption(buffer, pos + 9, presentationTimeUs);
+ int totalSize = buffer.position();
+ // Reading the frame in bulk to reduce the overhead from ByteBuffer.get() with
+ // overlapping to handle the case that the pattern exists in the boundary.
+ for (int i = 0; i < totalSize; i += mBuffer.length - PATTERN_LENGTH) {
+ buffer.position(i);
+ int size = Math.min(totalSize - i, mBuffer.length);
+ buffer.get(mBuffer, 0, size);
+ int j = 0;
+ while (j < size - PATTERN_LENGTH) {
+ // Find the start prefix code of private user data.
+ if (mBuffer[j] == 0
+ && mBuffer[j + 1] == 0
+ && mBuffer[j + 2] == 1
+ && (mBuffer[j + 3] & 0xff) == 0xb2) {
+ // ATSC closed caption data embedded in MPEG2VIDEO stream has 'GA94' user
+ // identifier and user data type code 3.
+ if (mBuffer[j + 4] == 'G'
+ && mBuffer[j + 5] == 'A'
+ && mBuffer[j + 6] == '9'
+ && mBuffer[j + 7] == '4'
+ && mBuffer[j + 8] == 3) {
+ j = parseClosedCaption(buffer, i + j + PATTERN_LENGTH,
+ presentationTimeUs) - i;
+ } else {
+ j += PATTERN_LENGTH;
+ }
+ } else {
+ ++j;
}
- pos += 9;
- } else {
- ++pos;
}
}
+ buffer.position(totalSize);
}
}
private class H264CcParser extends CcParser {
+ private static final int PATTERN_LENGTH = 14;
+
@Override
public void mayParseClosedCaption(ByteBuffer buffer, long presentationTimeUs) {
- int pos = 0;
- while (pos + 7 < buffer.position()) {
- // Find the start prefix code of a NAL Unit.
- if (buffer.get(pos) == 0
- && buffer.get(pos + 1) == 0
- && buffer.get(pos + 2) == 1) {
- int nalType = buffer.get(pos + 3) & 0x1f;
- int payloadType = buffer.get(pos + 4) & 0xff;
-
- // ATSC closed caption data embedded in H264 private user data has NAL type 6,
- // payload type 4, and 'GA94' user identifier for ATSC.
- if (nalType == 6 && payloadType == 4 && buffer.get(pos + 9) == 'G'
- && buffer.get(pos + 10) == 'A'
- && buffer.get(pos + 11) == '9'
- && buffer.get(pos + 12) == '4') {
- parseClosedCaption(buffer, pos + 14, presentationTimeUs);
+ int totalSize = buffer.position();
+ // Reading the frame in bulk to reduce the overhead from ByteBuffer.get() with
+ // overlapping to handle the case that the pattern exists in the boundary.
+ for (int i = 0; i < totalSize; i += mBuffer.length - PATTERN_LENGTH) {
+ buffer.position(i);
+ int size = Math.min(totalSize - i, mBuffer.length);
+ buffer.get(mBuffer, 0, size);
+ int j = 0;
+ while (j < size - PATTERN_LENGTH) {
+ // Find the start prefix code of a NAL Unit.
+ if (mBuffer[j] == 0
+ && mBuffer[j + 1] == 0
+ && mBuffer[j + 2] == 1) {
+ int nalType = mBuffer[j + 3] & 0x1f;
+ int payloadType = mBuffer[j + 4] & 0xff;
+
+ // ATSC closed caption data embedded in H264 private user data has NAL type
+ // 6, payload type 4, and 'GA94' user identifier for ATSC.
+ if (nalType == 6 && payloadType == 4 && mBuffer[j + 9] == 'G'
+ && mBuffer[j + 10] == 'A'
+ && mBuffer[j + 11] == '9'
+ && mBuffer[j + 12] == '4') {
+ j = parseClosedCaption(buffer, i + j + PATTERN_LENGTH,
+ presentationTimeUs) - i;
+ } else {
+ j += 7;
+ }
+ } else {
+ ++j;
}
- pos += 7;
- } else {
- ++pos;
}
}
+ buffer.position(totalSize);
}
}
}
diff --git a/src/com/android/tv/tuner/exoplayer/MpegTsSampleSource.java b/src/com/android/tv/tuner/exoplayer/MpegTsSampleSource.java
index 45b78bd1..6007b0be 100644
--- a/src/com/android/tv/tuner/exoplayer/MpegTsSampleSource.java
+++ b/src/com/android/tv/tuner/exoplayer/MpegTsSampleSource.java
@@ -154,6 +154,9 @@ public final class MpegTsSampleSource implements SampleSource, SampleSourceReade
if (mPreparationError != null) {
throw mPreparationError;
}
+ if (mSampleExtractor != null) {
+ mSampleExtractor.maybeThrowError();
+ }
}
@Override
diff --git a/src/com/android/tv/tuner/exoplayer/SampleExtractor.java b/src/com/android/tv/tuner/exoplayer/SampleExtractor.java
index 47790ccb..543588c7 100644
--- a/src/com/android/tv/tuner/exoplayer/SampleExtractor.java
+++ b/src/com/android/tv/tuner/exoplayer/SampleExtractor.java
@@ -41,10 +41,17 @@ import java.util.List;
public interface SampleExtractor {
/**
+ * If the extractor is currently having difficulty preparing or loading samples, then this
+ * method throws the underlying error. Otherwise does nothing.
+ *
+ * @throws IOException The underlying error.
+ */
+ void maybeThrowError() throws IOException;
+
+ /**
* Prepares the extractor for reading track metadata and samples.
*
- * @return whether the source is ready; if {@code false}, {@link #prepare()} must be called
- * again
+ * @return whether the source is ready; if {@code false}, this method must be called again.
* @throws IOException thrown if the source can't be read
*/
boolean prepare() throws IOException;
@@ -109,12 +116,12 @@ public interface SampleExtractor {
* @param listener the OnCompletionListener
* @param handler the {@link Handler} for {@link Handler#post(Runnable)} of OnCompletionListener
*/
- public void setOnCompletionListener(OnCompletionListener listener, Handler handler);
+ void setOnCompletionListener(OnCompletionListener listener, Handler handler);
/**
* The listener for SampleExtractor being completed.
*/
- public interface OnCompletionListener {
+ interface OnCompletionListener {
/**
* Called when sample extraction is completed.
diff --git a/src/com/android/tv/tuner/exoplayer/ac3/Ac3PassthroughTrackRenderer.java b/src/com/android/tv/tuner/exoplayer/ac3/Ac3PassthroughTrackRenderer.java
index 434b46af..9dae2e34 100644
--- a/src/com/android/tv/tuner/exoplayer/ac3/Ac3PassthroughTrackRenderer.java
+++ b/src/com/android/tv/tuner/exoplayer/ac3/Ac3PassthroughTrackRenderer.java
@@ -37,6 +37,7 @@ import com.android.tv.tuner.tvinput.TunerDebug;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.util.ArrayList;
/**
* Decodes and renders AC3 audio.
@@ -105,6 +106,7 @@ public class Ac3PassthroughTrackRenderer extends TrackRenderer implements MediaC
private long mInterpolatedTimeUs;
private long mPreviousPositionUs;
private boolean mIsStopped;
+ private ArrayList<Integer> mTracksIndex;
public Ac3PassthroughTrackRenderer(SampleSource source, Handler eventHandler,
EventListener listener) {
@@ -120,6 +122,7 @@ public class Ac3PassthroughTrackRenderer extends TrackRenderer implements MediaC
mCodecCounters = new CodecCounters();
mMonitor = new AudioTrackMonitor();
mAudioClock = new AudioClock();
+ mTracksIndex = new ArrayList<>();
}
@Override
@@ -139,8 +142,10 @@ public class Ac3PassthroughTrackRenderer extends TrackRenderer implements MediaC
}
for (int i = 0; i < mSource.getTrackCount(); i++) {
if (handlesMimeType(mSource.getFormat(i).mimeType)) {
- mTrackIndex = i;
- return true;
+ if (mTrackIndex < 0) {
+ mTrackIndex = i;
+ }
+ mTracksIndex.add(i);
}
}
@@ -150,18 +155,19 @@ public class Ac3PassthroughTrackRenderer extends TrackRenderer implements MediaC
@Override
protected int getTrackCount() {
- return mTrackIndex < 0 ? 0 : 1;
+ return mTracksIndex.size();
}
@Override
protected MediaFormat getFormat(int track) {
- Assertions.checkArgument(mTrackIndex != -1 && track == 0);
- return mSource.getFormat(mTrackIndex);
+ Assertions.checkArgument(track >= 0 && track < mTracksIndex.size());
+ return mSource.getFormat(mTracksIndex.get(track));
}
@Override
protected void onEnabled(int track, long positionUs, boolean joining) {
- Assertions.checkArgument(mTrackIndex != -1 && track == 0);
+ Assertions.checkArgument(track >= 0 && track < mTracksIndex.size());
+ mTrackIndex = mTracksIndex.get(track);
mSource.enable(mTrackIndex, positionUs);
seekToInternal(positionUs);
}
diff --git a/src/com/android/tv/tuner/exoplayer/ac3/Ac3TrackRenderer.java b/src/com/android/tv/tuner/exoplayer/ac3/Ac3TrackRenderer.java
index 4c46021f..2bf86b5a 100644
--- a/src/com/android/tv/tuner/exoplayer/ac3/Ac3TrackRenderer.java
+++ b/src/com/android/tv/tuner/exoplayer/ac3/Ac3TrackRenderer.java
@@ -16,17 +16,12 @@
package com.android.tv.tuner.exoplayer.ac3;
-import android.media.MediaCodec;
import android.os.Handler;
-import android.util.Log;
import com.google.android.exoplayer.ExoPlaybackException;
import com.google.android.exoplayer.MediaCodecAudioTrackRenderer;
import com.google.android.exoplayer.MediaCodecSelector;
import com.google.android.exoplayer.SampleSource;
-import com.android.tv.tuner.TunerFlags;
-
-import java.nio.ByteBuffer;
/**
* MPEG-2 TS audio track renderer.
@@ -40,10 +35,6 @@ public class Ac3TrackRenderer extends MediaCodecAudioTrackRenderer {
private final String TAG = "Ac3TrackRenderer";
private final boolean DEBUG = false;
- private int mZeroPresentationTimeCount;
- private Long mPresentationTimeOffset;
- private boolean mPresentationTimeOffsetNeeded;
- private final MediaCodec.BufferInfo mBufferInfo = new MediaCodec.BufferInfo();
private final Ac3EventListener mListener;
public interface Ac3EventListener extends EventListener {
@@ -63,72 +54,6 @@ public class Ac3TrackRenderer extends MediaCodecAudioTrackRenderer {
}
@Override
- protected void onDiscontinuity(long positionUs) throws ExoPlaybackException {
- super.onDiscontinuity(positionUs);
- if (TunerFlags.USE_EXTRACTOR_IN_EXOPLAYER) {
- return;
- }
- if (DEBUG) Log.d(TAG, "onDiscontinuity(), positionUs = " + positionUs);
- mZeroPresentationTimeCount = 0;
- mPresentationTimeOffset = null;
- mPresentationTimeOffsetNeeded = false;
- }
-
- @Override
- protected void onQueuedInputBuffer(long presentationTimeUs, ByteBuffer buffer,
- int bufferSize, boolean sampleEncrypted) {
- if (TunerFlags.USE_EXTRACTOR_IN_EXOPLAYER) {
- return;
- }
- if (DEBUG) Log.d(TAG, "onQueuedInputBuffer(), presentationTimeUs = " + presentationTimeUs);
- if (presentationTimeUs == 0) {
- // A sequence of consecutive zero presentation times indicate
- // the starting of a data stream.
- // Count the number of leading zeros
- mZeroPresentationTimeCount++;
- // Start waiting for the first non-zero presentation time.
- mPresentationTimeOffsetNeeded = true;
- } else if (mPresentationTimeOffset == null && mPresentationTimeOffsetNeeded) {
- // Sets time offset based on the first non-zero presentation timestamp,
- // which is the first timestamp we can trust.
- mPresentationTimeOffset = mZeroPresentationTimeCount
- * Ac3PassthroughTrackRenderer.AC3_SAMPLE_DURATION_US
- - presentationTimeUs;
- }
-
- }
-
- @Override
- protected boolean processOutputBuffer(long positionUs, long elapsedRealtimeUs, MediaCodec codec,
- ByteBuffer buffer, MediaCodec.BufferInfo bufferInfo, int bufferIndex,
- boolean shouldSkip) throws ExoPlaybackException {
- if (TunerFlags.USE_EXTRACTOR_IN_EXOPLAYER) {
- return super.processOutputBuffer(positionUs, elapsedRealtimeUs, codec, buffer,
- bufferInfo, bufferIndex, shouldSkip);
- }
- if (mPresentationTimeOffset != null) {
- // Adjust the presentation time. We don't modify the given {@code bufferInfo} here since
- // this method can be called multiple times with the same buffer.
- long presentationTimeUs =
- Math.max(bufferInfo.presentationTimeUs - mPresentationTimeOffset, 0);
- mBufferInfo.set(bufferInfo.offset, bufferInfo.size,
- presentationTimeUs, bufferInfo.flags);
- } else {
- mBufferInfo.set(bufferInfo.offset, bufferInfo.size,
- bufferInfo.presentationTimeUs, bufferInfo.flags);
- }
- try {
- return super.processOutputBuffer(positionUs, elapsedRealtimeUs, codec, buffer,
- mBufferInfo, bufferIndex, shouldSkip);
- } catch (IllegalArgumentException e) {
- if (isAudioTrackSetPlaybackParamsError(e)) {
- notifyAudioTrackSetPlaybackParamsError(e);
- }
- return false;
- }
- }
-
- @Override
public void handleMessage(int messageType, Object message) throws ExoPlaybackException {
if (messageType == MSG_SET_PLAYBACK_PARAMS) {
try {
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java b/src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java
index 8cf80420..eb596e93 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/BufferManager.java
@@ -81,6 +81,7 @@ public class BufferManager {
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;
@@ -555,7 +556,8 @@ public class BufferManager {
}
}
- private void resetWriteStat() {
+ private void resetWriteStat(float writeBandwidth) {
+ mWriteBandwidth = writeBandwidth;
mTotalWriteSize = 0;
mTotalWriteTimeNs = 0;
}
@@ -585,8 +587,8 @@ public class BufferManager {
return false;
}
mSpeedCheckCount++;
- float megabytePerSecond = getWriteBandwidth();
- resetWriteStat();
+ float megabytePerSecond = calculateWriteBandwidth();
+ resetWriteStat(megabytePerSecond);
if (DEBUG) {
Log.d(TAG, "Measured disk write performance: " + megabytePerSecond + "MBps");
}
@@ -594,9 +596,14 @@ public class BufferManager {
}
/**
- * Returns the disk write speed in megabytes per second.
+ * Returns recent write bandwidth in MBps. If recent bandwidth is not available,
+ * returns {float -1.0f}.
*/
- private float getWriteBandwidth() {
+ public float getWriteBandwidth() {
+ return mWriteBandwidth == 0.0f ? -1.0f : mWriteBandwidth;
+ }
+
+ private float calculateWriteBandwidth() {
if (mTotalWriteTimeNs == 0) {
return -1;
}
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java b/src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java
index f9efa0de..6a0502a7 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/DvrStorageManager.java
@@ -61,8 +61,11 @@ public class DvrStorageManager implements BufferManager.StorageManager {
@Override
public void clearStorage() {
if (mIsRecording) {
- for (File file : mBufferDir.listFiles()) {
- file.delete();
+ File[] files = mBufferDir.listFiles();
+ if (files != null && files.length > 0) {
+ for (File file : files) {
+ file.delete();
+ }
}
}
}
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java b/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java
index 9243c568..4869b49f 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/RecordingSampleBuffer.java
@@ -183,12 +183,16 @@ public class RecordingSampleBuffer implements BufferManager.SampleBuffer,
@Override
public void handleWriteSpeedSlow() throws IOException{
- Log.w(TAG, "Disk is too slow for recording");
if (mBufferReason == BUFFER_REASON_RECORDING) {
- // Stops the recording immediately.
- throw new IOException("Write bandwidth is not enough");
+ // Recording does not need to stop because I/O speed is slow temporarily.
+ // If fixed size buffer of TsStreamer overflows, TsDataSource will reach EoS.
+ // Reaching EoS will stop recording eventually.
+ Log.w(TAG, "Disk I/O speed is slow for recording temporarily: "
+ + mBufferManager.getWriteBandwidth() + "MBps");
+ return;
}
// Disables buffering samples afterwards, and notifies the disk speed is slow.
+ Log.w(TAG, "Disk is too slow for trickplay");
mBufferManager.disable();
mBufferListener.onDiskTooSlow();
}
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java b/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java
index d8276059..37ae4022 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/SampleChunkIoHelper.java
@@ -27,6 +27,7 @@ import android.util.Pair;
import com.google.android.exoplayer.MediaFormat;
import com.google.android.exoplayer.SampleHolder;
import com.google.android.exoplayer.util.MimeTypes;
+import com.android.tv.common.SoftPreconditions;
import com.android.tv.tuner.exoplayer.buffer.RecordingSampleBuffer.BufferReason;
import java.io.IOException;
@@ -65,6 +66,7 @@ public class SampleChunkIoHelper implements Handler.Callback {
private final SampleChunk.IoState[] mReadIoStates;
private final SampleChunk.IoState[] mWriteIoStates;
private long mBufferDurationUs = 0;
+ private boolean mWriteEnded;
private boolean mErrorNotified;
private boolean mFinished;
@@ -150,6 +152,7 @@ public class SampleChunkIoHelper implements Handler.Callback {
for (int i = 0; i < mTrackCount; ++i) {
mBufferManager.loadTrackFromStorage(mIds.get(i), mSamplePool);
}
+ mWriteEnded = true;
} else {
for (int i = 0; i < mTrackCount; ++i) {
mIoHandler.sendMessage(mIoHandler.obtainMessage(MSG_OPEN_WRITE, i));
@@ -289,6 +292,12 @@ public class SampleChunkIoHelper implements Handler.Callback {
int index = params.index;
mIoHandler.removeMessages(MSG_READ, index);
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(chunk, TAG, errorMessage);
+ throw new IOException(errorMessage);
+ }
mReadIoStates[index].openRead(chunk);
if (mHandlerReadSampleBuffers[index] != null) {
SampleHolder sample;
@@ -314,6 +323,11 @@ public class SampleChunkIoHelper implements Handler.Callback {
mIoHandler.obtainMessage(MSG_READ, index), READ_RESCHEDULING_DELAY_MS);
} else {
if (mReadIoStates[index].isReadFinished()) {
+ for (int i = 0; i < mTrackCount; ++i) {
+ if (!mReadIoStates[i].isReadFinished()) {
+ return;
+ }
+ }
mIoCallback.onIoReachedEos();
return;
}
@@ -332,6 +346,10 @@ public class SampleChunkIoHelper implements Handler.Callback {
private void doWrite(IoParams params) throws IOException {
try {
+ if (mWriteEnded) {
+ SoftPreconditions.checkState(false);
+ return;
+ }
int index = params.index;
SampleHolder sample = params.sample;
SampleChunk nextChunk = null;
@@ -355,6 +373,10 @@ public class SampleChunkIoHelper implements Handler.Callback {
}
private void doCloseWrite() throws IOException {
+ if (mWriteEnded) {
+ return;
+ }
+ mWriteEnded = true;
boolean readFinished = true;
for (int i = 0; i < mTrackCount; ++i) {
readFinished = readFinished && mReadIoStates[i].isReadFinished();
diff --git a/src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java b/src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java
index 9051b73b..258a5cd0 100644
--- a/src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java
+++ b/src/com/android/tv/tuner/exoplayer/buffer/TrickplayStorageManager.java
@@ -18,6 +18,8 @@ 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.util.Pair;
@@ -64,8 +66,24 @@ public class TrickplayStorageManager implements BufferManager.StorageManager {
@Override
public void clearStorage() {
- for (File file : mBufferDir.listFiles()) {
- file.delete();
+ File files[] = mBufferDir.listFiles();
+ if (files == null || files.length == 0) {
+ return;
+ }
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ for (File file : files) {
+ file.delete();
+ }
+ return null;
+ }
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ } else {
+ for (File file : files) {
+ file.delete();
+ }
}
}
diff --git a/src/com/android/tv/tuner/setup/ScanFragment.java b/src/com/android/tv/tuner/setup/ScanFragment.java
index b286cff9..4b3ffe40 100644
--- a/src/com/android/tv/tuner/setup/ScanFragment.java
+++ b/src/com/android/tv/tuner/setup/ScanFragment.java
@@ -46,7 +46,7 @@ import com.android.tv.tuner.data.Channel;
import com.android.tv.tuner.data.PsipData;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.source.FileTsStreamer;
-import com.android.tv.tuner.source.TsMediaDataSource;
+import com.android.tv.tuner.source.TsDataSource;
import com.android.tv.tuner.source.TsStreamer;
import com.android.tv.tuner.source.TunerTsStreamer;
import com.android.tv.tuner.tvinput.ChannelDataManager;
@@ -120,6 +120,7 @@ public class ScanFragment extends SetupFragment {
}
});
Bundle args = getArguments();
+ // 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);
if (TunerInputInfoUtils.isBuiltInTuner(getActivity())){
@@ -147,8 +148,10 @@ public class ScanFragment extends SetupFragment {
@Override
public void onDetach() {
- // Ensure scan task will stop.
- mChannelScanTask.stopScan();
+ if (mChannelScanTask != null) {
+ // Ensure scan task will stop.
+ mChannelScanTask.stopScan();
+ }
super.onDetach();
}
@@ -231,7 +234,7 @@ public class ScanFragment extends SetupFragment {
}
private class ChannelScanTask extends AsyncTask<Void, Integer, Void>
- implements EventDetector.EventListener {
+ implements EventDetector.EventListener, ChannelDataManager.ChannelScanListener {
private static final int MAX_PROGRESS = 100;
private final Activity mActivity;
@@ -260,6 +263,7 @@ public class ScanFragment extends SetupFragment {
}
mFileTsStreamer = SCAN_LOCAL_STREAMS ? new FileTsStreamer(this) : null;
mConditionStopped = new ConditionVariable();
+ mChannelDataManager.setChannelScanListener(this, new Handler());
}
private void maybeSetChannelListVisible() {
@@ -302,28 +306,10 @@ public class ScanFragment extends SetupFragment {
mScanChannelList.addAll(ChannelScanFileParser.parseScanFile(
getResources().openRawResource(mChannelMapId)));
scanChannels();
- mChannelDataManager.setCurrentVersion(mActivity);
- mChannelDataManager.release();
return null;
}
@Override
- protected void onPostExecute(Void result) {
- mIsFinished = true;
- TunerPreferences.setScannedChannelCount(mActivity.getApplicationContext(),
- mChannelDataManager.getScannedChannelCount());
- // Cancel a previously shown recommendation card.
- TunerSetupActivity.cancelRecommendationCard(mActivity.getApplicationContext());
- // Mark scan as done
- TunerPreferences.setScanDone(mActivity.getApplicationContext());
- // finishing will be done manually.
- if (mFinishingProgressDialog != null) {
- mFinishingProgressDialog.dismiss();
- }
- onActionClick(ACTION_CATEGORY, mIsCanceled ? ACTION_CANCEL : ACTION_FINISH);
- }
-
- @Override
protected void onCancelled() {
SoftPreconditions.checkState(false, TAG, "call cancelScan instead of cancel");
}
@@ -404,7 +390,7 @@ public class ScanFragment extends SetupFragment {
tunerChannel.getProgramNumber()));
tunerChannel.setVirtualMajor(scanChannel.radioFrequencyNumber);
tunerChannel.setVirtualMinor(tunerChannel.getProgramNumber());
- mChannelDataManager.notifyChannelDetected(tunerChannel, true);
+ onChannelDetected(tunerChannel, true);
}
}
}
@@ -452,6 +438,25 @@ public class ScanFragment extends SetupFragment {
getString(R.string.ut_setup_cancel), true, false);
}
}
+
+ @Override
+ public void onChannelHandlingDone() {
+ mChannelDataManager.setCurrentVersion(mActivity);
+ mChannelDataManager.releaseSafely();
+ mIsFinished = true;
+ TunerPreferences.setScannedChannelCount(mActivity.getApplicationContext(),
+ mChannelDataManager.getScannedChannelCount());
+ // Cancel a previously shown recommendation card.
+ TunerSetupActivity.cancelRecommendationCard(mActivity.getApplicationContext());
+ // Mark scan as done
+ TunerPreferences.setScanDone(mActivity.getApplicationContext());
+ // finishing will be done manually.
+ if (mFinishingProgressDialog != null) {
+ mFinishingProgressDialog.dismiss();
+ }
+ onActionClick(ACTION_CATEGORY, mIsCanceled ? ACTION_CANCEL : ACTION_FINISH);
+ mChannelScanTask = null;
+ }
}
private static class FakeTsStreamer implements TsStreamer {
@@ -493,7 +498,7 @@ public class ScanFragment extends SetupFragment {
}
@Override
- public TsMediaDataSource createMediaDataSource() {
+ public TsDataSource createDataSource() {
return null;
}
}
diff --git a/src/com/android/tv/tuner/setup/ScanResultFragment.java b/src/com/android/tv/tuner/setup/ScanResultFragment.java
index 757eeddd..068543cd 100644
--- a/src/com/android/tv/tuner/setup/ScanResultFragment.java
+++ b/src/com/android/tv/tuner/setup/ScanResultFragment.java
@@ -38,12 +38,6 @@ public class ScanResultFragment extends SetupMultiPaneFragment {
public static final String ACTION_CATEGORY =
"com.android.tv.tuner.setup.ScanResultFragment";
- /**
- * An action which moves to previous page when the user presses BACK button.
- * In some cases, more than one page can be popped out.
- */
- public static final int ACTION_BACK_TO_CONNECTION_TYPE = ACTION_DONE - 1;
-
@Override
protected SetupGuidedStepFragment onCreateContentFragment() {
return new ContentFragment();
diff --git a/src/com/android/tv/tuner/setup/TunerSetupActivity.java b/src/com/android/tv/tuner/setup/TunerSetupActivity.java
index 8359ce73..78121bc5 100644
--- a/src/com/android/tv/tuner/setup/TunerSetupActivity.java
+++ b/src/com/android/tv/tuner/setup/TunerSetupActivity.java
@@ -31,7 +31,9 @@ import android.graphics.BitmapFactory;
import android.media.tv.TvContract;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
+import android.util.Log;
import android.view.KeyEvent;
+import android.widget.Toast;
import com.android.tv.TvApplication;
import com.android.tv.common.TvCommonConstants;
@@ -40,6 +42,7 @@ 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.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.TunerInputInfoUtils;
@@ -48,6 +51,7 @@ import com.android.tv.tuner.util.TunerInputInfoUtils;
* An activity that serves tuner setup process.
*/
public class TunerSetupActivity extends SetupActivity {
+ 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";
@@ -107,9 +111,23 @@ public class TunerSetupActivity extends SetupActivity {
}
return true;
case ConnectionTypeFragment.ACTION_CATEGORY:
+ 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 args = new Bundle();
- args.putInt(ScanFragment.EXTRA_FOR_CHANNEL_SCAN_FILE, CHANNEL_MAP_SCAN_FILE[actionId]);
+ args.putInt(ScanFragment.EXTRA_FOR_CHANNEL_SCAN_FILE,
+ CHANNEL_MAP_SCAN_FILE[actionId]);
mLastScanFragment.setArguments(args);
showFragment(mLastScanFragment, true);
return true;
diff --git a/src/com/android/tv/tuner/source/FileTsStreamer.java b/src/com/android/tv/tuner/source/FileTsStreamer.java
index 617440bc..14997ee4 100644
--- a/src/com/android/tv/tuner/source/FileTsStreamer.java
+++ b/src/com/android/tv/tuner/source/FileTsStreamer.java
@@ -20,9 +20,10 @@ import android.os.Environment;
import android.util.Log;
import android.util.SparseBooleanArray;
+import com.google.android.exoplayer.C;
+import com.google.android.exoplayer.upstream.DataSpec;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.tuner.ChannelScanFileParser.ScanChannel;
-import com.android.tv.tuner.TunerFlags;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.ts.TsParser;
import com.android.tv.tuner.tvinput.EventDetector;
@@ -67,31 +68,17 @@ public class FileTsStreamer implements TsStreamer {
private Thread mStreamingThread;
private StreamProvider mSource;
- public static class FileMediaDataSource extends TsMediaDataSource {
+ public static class FileDataSource extends TsDataSource {
private final FileTsStreamer mTsStreamer;
private final AtomicLong mLastReadPosition = new AtomicLong(0);
private long mStartBufferedPosition;
- private FileMediaDataSource(FileTsStreamer tsStreamer) {
+ private FileDataSource(FileTsStreamer tsStreamer) {
mTsStreamer = tsStreamer;
mStartBufferedPosition = tsStreamer.getBufferedPosition();
}
@Override
- public int readAt(long pos, byte[] buffer, int offset, int amount) throws IOException {
- int ret = mTsStreamer.readAt(mStartBufferedPosition + pos, buffer, offset, amount);
- if (ret > 0) {
- mLastReadPosition.set(pos + ret);
- }
- return ret;
- }
-
- @Override
- public long getSize() {
- return -1L;
- }
-
- @Override
public long getBufferedPosition() {
return mTsStreamer.getBufferedPosition() - mStartBufferedPosition;
}
@@ -108,10 +95,25 @@ public class FileTsStreamer implements TsStreamer {
mStartBufferedPosition += offset;
}
- // This will be called by {@link MediaExtractor}
+ @Override
+ public long open(DataSpec dataSpec) throws IOException {
+ mLastReadPosition.set(0);
+ return C.LENGTH_UNBOUNDED;
+ }
+
@Override
public void close() {
}
+
+ @Override
+ public int read(byte[] buffer, int offset, int readLength) throws IOException {
+ int ret = mTsStreamer.readAt(mStartBufferedPosition + mLastReadPosition.get(), buffer,
+ offset, readLength);
+ if (ret > 0) {
+ mLastReadPosition.addAndGet(ret);
+ }
+ return ret;
+ }
}
/**
@@ -154,13 +156,8 @@ public class FileTsStreamer implements TsStreamer {
}
mEventDetector.start(mSource, channel.getProgramNumber());
mSource.addPidFilter(channel.getVideoPid());
- if (TunerFlags.USE_EXTRACTOR_IN_EXOPLAYER) {
- // ExoPlayer's extractor expects all the tracks which belong to the channel.
- for (Integer i : channel.getAudioPids()) {
- mSource.addPidFilter(i);
- }
- } else {
- mSource.addPidFilter(channel.getAudioPid());
+ for (Integer i : channel.getAudioPids()) {
+ mSource.addPidFilter(i);
}
mSource.addPidFilter(channel.getPcrPid());
mSource.addPidFilter(TsParser.ATSC_SI_BASE_PID);
@@ -199,8 +196,8 @@ public class FileTsStreamer implements TsStreamer {
}
@Override
- public TsMediaDataSource createMediaDataSource() {
- return new FileMediaDataSource(this);
+ public TsDataSource createDataSource() {
+ return new FileDataSource(this);
}
/**
diff --git a/src/com/android/tv/tuner/source/TsMediaDataSource.java b/src/com/android/tv/tuner/source/TsDataSource.java
index 1bef78fe..2ce3e670 100644
--- a/src/com/android/tv/tuner/source/TsMediaDataSource.java
+++ b/src/com/android/tv/tuner/source/TsDataSource.java
@@ -16,12 +16,12 @@
package com.android.tv.tuner.source;
-import android.media.MediaDataSource;
+import com.google.android.exoplayer.upstream.DataSource;
/**
- * {@link MediaDatasource} for MPEG-TS stream, which will be used by {@link MediaExtractor}.
+ * {@link DataSource} for MPEG-TS stream, which will be used by {@link TsExtractor}.
*/
-public abstract class TsMediaDataSource extends MediaDataSource {
+public abstract class TsDataSource implements DataSource {
/**
* Returns the number of bytes being buffered by {@link TsStreamer} so far.
@@ -33,7 +33,7 @@ public abstract class TsMediaDataSource extends MediaDataSource {
}
/**
- * Returns the offset position where the last {@link MediaDataSource#readAt} read.
+ * Returns the offset position where the last {@link DataSource#read} read.
*
* @return the last read position
*/
diff --git a/src/com/android/tv/tuner/source/TsMediaDataSourceManager.java b/src/com/android/tv/tuner/source/TsDataSourceManager.java
index d6c3c3b1..7286cd8c 100644
--- a/src/com/android/tv/tuner/source/TsMediaDataSourceManager.java
+++ b/src/com/android/tv/tuner/source/TsDataSourceManager.java
@@ -17,7 +17,6 @@
package com.android.tv.tuner.source;
import android.content.Context;
-import android.media.MediaDataSource;
import com.android.tv.tuner.data.Channel;
import com.android.tv.tuner.data.TunerChannel;
@@ -27,15 +26,15 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
- * Manages {@link TsMediaDataSource} for playback and recording.
+ * Manages {@link DataSource} for playback and recording.
* The class hides handling of {@link TunerHal} and {@link TsStreamer} from other classes.
- * One TsMediaDataSourceManager should be created for per session.
+ * One TsDataSourceManager should be created for per session.
*/
-public class TsMediaDataSourceManager {
- private static String TAG = "TsMediaDataSourceManager";
+public class TsDataSourceManager {
+ private static String TAG = "TsDataSourceManager";
private static final Object sLock = new Object();
- private static final Map<TsMediaDataSource, TsStreamer> sTsStreamers =
+ private static final Map<TsDataSource, TsStreamer> sTsStreamers =
new ConcurrentHashMap<>();
private static int sSequenceId;
@@ -48,33 +47,33 @@ public class TsMediaDataSourceManager {
private boolean mKeepTuneStatus;
/**
- * Creates TsMediaDataSourceManager to create and release {@link MediaDataSource} which will be
+ * Creates TsDataSourceManager to create and release {@link DataSource} which will be
* used for playing and recording.
* @param isRecording {@code true} when for recording, {@code false} otherwise
- * @return {@link TsMediaDataSourceManager}
+ * @return {@link TsDataSourceManager}
*/
- public static TsMediaDataSourceManager createSourceManager(boolean isRecording) {
+ public static TsDataSourceManager createSourceManager(boolean isRecording) {
int id;
synchronized (sLock) {
id = ++sSequenceId;
}
- return new TsMediaDataSourceManager(id, isRecording);
+ return new TsDataSourceManager(id, isRecording);
}
- private TsMediaDataSourceManager(int id, boolean isRecording) {
+ private TsDataSourceManager(int id, boolean isRecording) {
mId = id;
mIsRecording = isRecording;
mKeepTuneStatus = true;
}
/**
- * Creates or retrieves {@link TsMediaDataSource} for playing or recording
+ * Creates or retrieves {@link TsDataSource} for playing or recording
* @param context a {@link Context} instance
* @param channel to play or record
* @param eventListener for program information which will be scanned from MPEG2-TS stream
- * @return {@link TsMediaDataSource} which will provide the specified channel stream
+ * @return {@link TsDataSource} which will provide the specified channel stream
*/
- public TsMediaDataSource createDataSource(Context context, TunerChannel channel,
+ public TsDataSource createDataSource(Context context, TunerChannel channel,
EventDetector.EventListener eventListener) {
if (channel.getType() == Channel.TYPE_FILE) {
// MPEG2 TS captured stream file recording is not supported.
@@ -83,7 +82,7 @@ public class TsMediaDataSourceManager {
}
FileTsStreamer streamer = new FileTsStreamer(eventListener);
if (streamer.startStream(channel)) {
- TsMediaDataSource source = streamer.createMediaDataSource();
+ TsDataSource source = streamer.createDataSource();
sTsStreamers.put(source, streamer);
return source;
}
@@ -94,14 +93,14 @@ public class TsMediaDataSourceManager {
}
/**
- * Releases the specified {@link MediaDataSource} and underlying {@link TunerHal}.
+ * Releases the specified {@link TsDataSource} and underlying {@link TunerHal}.
* @param source to release
*/
- public void releaseDataSource(TsMediaDataSource source) {
- if (source instanceof TunerTsStreamer.TunerMediaDataSource) {
+ public void releaseDataSource(TsDataSource source) {
+ if (source instanceof TunerTsStreamer.TunerDataSource) {
mTunerStreamerManager.releaseDataSource(
source, mId, !mIsRecording && mKeepTuneStatus);
- } else if (source instanceof FileTsStreamer.FileMediaDataSource) {
+ } else if (source instanceof FileTsStreamer.FileDataSource) {
FileTsStreamer streamer = (FileTsStreamer) sTsStreamers.get(source);
if (streamer != null) {
sTsStreamers.remove(source);
diff --git a/src/com/android/tv/tuner/source/TsStreamWriter.java b/src/com/android/tv/tuner/source/TsStreamWriter.java
new file mode 100644
index 00000000..30650555
--- /dev/null
+++ b/src/com/android/tv/tuner/source/TsStreamWriter.java
@@ -0,0 +1,237 @@
+/*
+ * 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.tuner.source;
+
+import android.content.Context;
+import android.util.Log;
+import com.android.tv.tuner.data.TunerChannel;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Stores TS files to the disk for debugging.
+ */
+public class TsStreamWriter {
+ private static final String TAG = "TsStreamWriter";
+ private static final boolean DEBUG = false;
+
+ private static final long TIME_LIMIT_MS = 10000; // 10s
+ private static final int NO_INSTANCE_ID = 0;
+ private static final int MAX_GET_ID_RETRY_COUNT = 5;
+ private static final int MAX_INSTANCE_ID = 10000;
+ private static final String SEPARATOR = "_";
+
+ private FileOutputStream mFileOutputStream;
+ private long mFileStartTimeMs;
+ private String mFileName = null;
+ private final String mDirectoryPath;
+ private final File mDirectory;
+ private final int mInstanceId;
+ private TunerChannel mChannel;
+
+ public TsStreamWriter(Context context) {
+ File externalFilesDir = context.getExternalFilesDir(null);
+ if (externalFilesDir == null || !externalFilesDir.isDirectory()) {
+ mDirectoryPath = null;
+ mDirectory = null;
+ mInstanceId = NO_INSTANCE_ID;
+ if (DEBUG) {
+ Log.w(TAG, "Fail to get external files dir!");
+ }
+ } else {
+ mDirectoryPath = externalFilesDir.getPath() + "/EngTsStream";
+ mDirectory = new File(mDirectoryPath);
+ if (!mDirectory.exists()) {
+ boolean madeDir = mDirectory.mkdir();
+ if (!madeDir) {
+ Log.w(TAG, "Error. Fail to create folder!");
+ }
+ }
+ mInstanceId = generateInstanceId();
+ }
+ }
+
+ /**
+ * Sets the current channel.
+ *
+ * @param channel curren channel of the stream
+ */
+ public void setChannel(TunerChannel channel) {
+ mChannel = channel;
+ }
+
+ /**
+ * Opens a file to store TS data.
+ */
+ public void openFile() {
+ if (mChannel == null || mDirectoryPath == null) {
+ return;
+ }
+ mFileStartTimeMs = System.currentTimeMillis();
+ mFileName = mChannel.getDisplayNumber() + SEPARATOR + mFileStartTimeMs + SEPARATOR
+ + mInstanceId + ".ts";
+ String filePath = mDirectoryPath + "/" + mFileName;
+ try {
+ mFileOutputStream = new FileOutputStream(filePath, false);
+ } catch (FileNotFoundException e) {
+ Log.w(TAG, "Cannot open file: " + filePath, e);
+ }
+ }
+
+ /**
+ * Closes the file and stops storing TS data.
+ *
+ * @param calledWhenStopStream {@code true} if this method is called when the stream is stopped
+ * {@code false} otherwise
+ */
+ public void closeFile(boolean calledWhenStopStream) {
+ if (mFileOutputStream == null) {
+ return;
+ }
+ try {
+ mFileOutputStream.close();
+ deleteOutdatedFiles(calledWhenStopStream);
+ mFileName = null;
+ mFileOutputStream = null;
+ } catch (IOException e) {
+ Log.w(TAG, "Error on closing file.", e);
+ }
+ }
+
+ /**
+ * Writes the data to the file.
+ *
+ * @param buffer the data to be written
+ * @param bytesWritten number of bytes written
+ */
+ public void writeToFile(byte[] buffer, int bytesWritten) {
+ if (mFileOutputStream == null) {
+ return;
+ }
+ if (System.currentTimeMillis() - mFileStartTimeMs > TIME_LIMIT_MS) {
+ closeFile(false);
+ openFile();
+ }
+ try {
+ mFileOutputStream.write(buffer, 0, bytesWritten);
+ } catch (IOException e) {
+ Log.w(TAG, "Error on writing TS stream.", e);
+ }
+ }
+
+ /**
+ * Deletes outdated files to save storage.
+ *
+ * @param deleteAll {@code true} if all the files with the relative ID should be deleted
+ * {@code false} if the most recent file should not be deleted
+ */
+ private void deleteOutdatedFiles(boolean deleteAll) {
+ if (mFileName == null) {
+ return;
+ }
+ if (mDirectory == null || !mDirectory.isDirectory()) {
+ Log.e(TAG, "Error. The folder doesn't exist!");
+ return;
+ }
+ if (mFileName == null) {
+ Log.e(TAG, "Error. The current file name is null!");
+ return;
+ }
+ for (File file : mDirectory.listFiles()) {
+ if (file.isFile() && getFileId(file) == mInstanceId
+ && (deleteAll || !mFileName.equals(file.getName()))) {
+ boolean deleted = file.delete();
+ if (DEBUG && !deleted) {
+ Log.w(TAG, "Failed to delete " + file.getName());
+ }
+ }
+ }
+ }
+
+ /**
+ * Generates a unique instance ID.
+ *
+ * @return a unique instance ID
+ */
+ private int generateInstanceId() {
+ if (mDirectory == null) {
+ return NO_INSTANCE_ID;
+ }
+ Set<Integer> idSet = getExistingIds();
+ if (idSet == null) {
+ return NO_INSTANCE_ID;
+ }
+ for (int i = 0; i < MAX_GET_ID_RETRY_COUNT; i++) {
+ // Range [1, MAX_INSTANCE_ID]
+ int id = (int)Math.floor(Math.random() * MAX_INSTANCE_ID) + 1;
+ if (!idSet.contains(id)) {
+ return id;
+ }
+ }
+ return NO_INSTANCE_ID;
+ }
+
+ /**
+ * Gets all existing instance IDs.
+ *
+ * @return a set of all existing instance IDs
+ */
+ private Set<Integer> getExistingIds() {
+ if (mDirectory == null || !mDirectory.isDirectory()) {
+ return null;
+ }
+
+ Set<Integer> idSet = new HashSet<>();
+ for (File file : mDirectory.listFiles()) {
+ int id = getFileId(file);
+ if(id != NO_INSTANCE_ID) {
+ idSet.add(id);
+ }
+ }
+ return idSet;
+ }
+
+ /**
+ * Gets the instance ID of a given file.
+ *
+ * @param file the file whose TsStreamWriter ID is returned
+ * @return the TsStreamWriter ID of the file or NO_INSTANCE_ID if not available
+ */
+ private static int getFileId(File file) {
+ if (file == null || !file.isFile()) {
+ return NO_INSTANCE_ID;
+ }
+ String fileName = file.getName();
+ int lastSeparator = fileName.lastIndexOf(SEPARATOR);
+ if (!fileName.endsWith(".ts") || lastSeparator == -1) {
+ return NO_INSTANCE_ID;
+ }
+ try {
+ return Integer.parseInt(fileName.substring(lastSeparator + 1, fileName.length() - 3));
+ } catch (NumberFormatException e) {
+ if (DEBUG) {
+ Log.e(TAG, fileName + " is not a valid file name.");
+ }
+ }
+ return NO_INSTANCE_ID;
+ }
+}
diff --git a/src/com/android/tv/tuner/source/TsStreamer.java b/src/com/android/tv/tuner/source/TsStreamer.java
index cc28fc44..1ac950bb 100644
--- a/src/com/android/tv/tuner/source/TsStreamer.java
+++ b/src/com/android/tv/tuner/source/TsStreamer.java
@@ -46,11 +46,11 @@ public interface TsStreamer {
void stopStream();
/**
- * Creates {@link TsMediaDataSource} which will provide MPEG-2 TS stream for
+ * Creates {@link TsDataSource} which will provide MPEG-2 TS stream for
* {@link android.media.MediaExtractor}. The source will start from the position
* where it is created.
*
- * @return {@link TsMediaDataSource}
+ * @return {@link TsDataSource}
*/
- TsMediaDataSource createMediaDataSource();
+ TsDataSource createDataSource();
}
diff --git a/src/com/android/tv/tuner/source/TunerTsStreamer.java b/src/com/android/tv/tuner/source/TunerTsStreamer.java
index c756c381..b24048e6 100644
--- a/src/com/android/tv/tuner/source/TunerTsStreamer.java
+++ b/src/com/android/tv/tuner/source/TunerTsStreamer.java
@@ -16,11 +16,15 @@
package com.android.tv.tuner.source;
+import android.content.Context;
import android.util.Log;
+import com.google.android.exoplayer.C;
+import com.google.android.exoplayer.upstream.DataSpec;
import com.android.tv.common.SoftPreconditions;
import com.android.tv.tuner.ChannelScanFileParser;
import com.android.tv.tuner.TunerHal;
+import com.android.tv.tuner.TunerPreferences;
import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.tvinput.EventDetector;
import com.android.tv.tuner.tvinput.EventDetector.EventListener;
@@ -42,11 +46,6 @@ public class TunerTsStreamer implements TsStreamer {
private static final int READ_TIMEOUT_MS = 5000; // 5 secs.
private static final int BUFFER_UNDERRUN_SLEEP_MS = 10;
- private static final int BUFFER_KEY_VERSION = 1;
-
- // UTCK stands for USB Tuner Buffer Key.
- private static final String BUFFER_KEY_PREFIX = "UTCK";
-
private final Object mCircularBufferMonitor = new Object();
private final byte[] mCircularBuffer = new byte[CIRCULAR_BUFFER_SIZE];
private long mBytesFetched;
@@ -59,31 +58,19 @@ public class TunerTsStreamer implements TsStreamer {
private Thread mStreamingThread;
private final EventDetector mEventDetector;
- public static class TunerMediaDataSource extends TsMediaDataSource {
+ private final TsStreamWriter mTsStreamWriter;
+
+ public static class TunerDataSource extends TsDataSource {
private final TunerTsStreamer mTsStreamer;
private final AtomicLong mLastReadPosition = new AtomicLong(0);
private long mStartBufferedPosition;
- private TunerMediaDataSource(TunerTsStreamer tsStreamer) {
+ private TunerDataSource(TunerTsStreamer tsStreamer) {
mTsStreamer = tsStreamer;
mStartBufferedPosition = tsStreamer.getBufferedPosition();
}
@Override
- public int readAt(long pos, byte[] buffer, int offset, int amount) throws IOException {
- int ret = mTsStreamer.readAt(mStartBufferedPosition + pos, buffer, offset, amount);
- if (ret > 0) {
- mLastReadPosition.set(pos + ret);
- }
- return ret;
- }
-
- @Override
- public long getSize() {
- return -1L;
- }
-
- @Override
public long getBufferedPosition() {
return mTsStreamer.getBufferedPosition() - mStartBufferedPosition;
}
@@ -100,19 +87,40 @@ public class TunerTsStreamer implements TsStreamer {
mStartBufferedPosition += offset;
}
- // This will be called by {@link MediaExtractor}
+ @Override
+ public long open(DataSpec dataSpec) throws IOException {
+ mLastReadPosition.set(0);
+ return C.LENGTH_UNBOUNDED;
+ }
+
@Override
public void close() {
}
+
+ @Override
+ public int read(byte[] buffer, int offset, int readLength) throws IOException {
+ int ret = mTsStreamer.readAt(mStartBufferedPosition + mLastReadPosition.get(), buffer,
+ offset, readLength);
+ if (ret > 0) {
+ mLastReadPosition.addAndGet(ret);
+ }
+ return ret;
+ }
}
/**
* Creates {@link TsStreamer} for playing or recording the specified channel.
* @param tunerHal the HAL for tuner device
* @param eventListener the listener for channel & program information
*/
- public TunerTsStreamer(TunerHal tunerHal, EventListener eventListener) {
+ public TunerTsStreamer(TunerHal tunerHal, EventListener eventListener, Context context) {
mTunerHal = tunerHal;
mEventDetector = new EventDetector(mTunerHal, eventListener);
+ mTsStreamWriter = context != null && TunerPreferences.getStoreTsStream(context) ?
+ new TsStreamWriter(context) : null;
+ }
+
+ public TunerTsStreamer(TunerHal tunerHal, EventListener eventListener) {
+ this(tunerHal, eventListener, null);
}
@Override
@@ -122,9 +130,16 @@ public class TunerTsStreamer implements TsStreamer {
mTunerHal.addPidFilter(channel.getVideoPid(),
TunerHal.FILTER_TYPE_VIDEO);
}
- if (channel.hasAudio()) {
- mTunerHal.addPidFilter(channel.getAudioPid(),
- TunerHal.FILTER_TYPE_AUDIO);
+ boolean audioFilterSet = false;
+ for (Integer audioPid : channel.getAudioPids()) {
+ if (!audioFilterSet) {
+ mTunerHal.addPidFilter(audioPid, TunerHal.FILTER_TYPE_AUDIO);
+ audioFilterSet = true;
+ } else {
+ // FILTER_TYPE_AUDIO overrides the previous filter for audio. We use
+ // FILTER_TYPE_OTHER from the secondary one to get the all audio tracks.
+ mTunerHal.addPidFilter(audioPid, TunerHal.FILTER_TYPE_OTHER);
+ }
}
mTunerHal.addPidFilter(channel.getPcrPid(),
TunerHal.FILTER_TYPE_PCR);
@@ -143,6 +158,10 @@ public class TunerTsStreamer implements TsStreamer {
mLastReadPosition.set(0L);
mEndOfStreamSent = false;
}
+ if (mTsStreamWriter != null) {
+ mTsStreamWriter.setChannel(mChannel);
+ mTsStreamWriter.openFile();
+ }
mStreamingThread = new StreamingThread();
mStreamingThread.start();
Log.i(TAG, "Streaming started");
@@ -193,11 +212,15 @@ public class TunerTsStreamer implements TsStreamer {
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
+ if (mTsStreamWriter != null) {
+ mTsStreamWriter.closeFile(true);
+ mTsStreamWriter.setChannel(null);
+ }
}
@Override
- public TsMediaDataSource createMediaDataSource() {
- return new TunerMediaDataSource(this);
+ public TsDataSource createDataSource() {
+ return new TunerDataSource(this);
}
/**
@@ -260,6 +283,10 @@ public class TunerTsStreamer implements TsStreamer {
continue;
}
+ if (mTsStreamWriter != null) {
+ mTsStreamWriter.writeToFile(dataBuffer, bytesWritten);
+ }
+
if (mEventDetector != null) {
mEventDetector.feedTSStream(dataBuffer, 0, bytesWritten);
}
diff --git a/src/com/android/tv/tuner/source/TunerTsStreamerManager.java b/src/com/android/tv/tuner/source/TunerTsStreamerManager.java
index bd3fa5d6..cf1f6dcf 100644
--- a/src/com/android/tv/tuner/source/TunerTsStreamerManager.java
+++ b/src/com/android/tv/tuner/source/TunerTsStreamerManager.java
@@ -33,7 +33,7 @@ import java.util.Set;
/**
* Manages {@link TunerTsStreamer} for playback and recording.
* The class hides handling of {@link TunerHal} from other classes.
- * This class is used by {@link TsMediaDataSourceManager}. Don't use this class directly.
+ * This class is used by {@link TsDataSourceManager}. Don't use this class directly.
*/
class TunerTsStreamerManager {
// The lock will protect mStreamerFinder, mSourceToStreamerMap and some part of TsStreamCreator
@@ -42,7 +42,7 @@ 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<TsMediaDataSource, TunerTsStreamer> mSourceToStreamerMap = new HashMap<>();
+ private final Map<TsDataSource, TunerTsStreamer> mSourceToStreamerMap = new HashMap<>();
private final TunerHalManager mTunerHalManager = new TunerHalManager();
private static TunerTsStreamerManager sInstance;
@@ -59,7 +59,7 @@ class TunerTsStreamerManager {
private TunerTsStreamerManager() { }
- synchronized TsMediaDataSource createDataSource(
+ synchronized TsDataSource createDataSource(
Context context, TunerChannel channel, EventDetector.EventListener listener,
int sessionId, boolean reuse) {
TsStreamerCreator creator;
@@ -67,7 +67,7 @@ class TunerTsStreamerManager {
if (mStreamerFinder.containsLocked(channel)) {
mStreamerFinder.appendSessionLocked(channel, sessionId);
TunerTsStreamer streamer = mStreamerFinder.getStreamerLocked(channel);
- TsMediaDataSource source = streamer.createMediaDataSource();
+ TsDataSource source = streamer.createDataSource();
mSourceToStreamerMap.put(source, streamer);
return source;
}
@@ -82,7 +82,7 @@ class TunerTsStreamerManager {
}
if (!creator.isCancelledLocked()) {
mStreamerFinder.putLocked(channel, sessionId, streamer);
- TsMediaDataSource source = streamer.createMediaDataSource();
+ TsDataSource source = streamer.createDataSource();
mSourceToStreamerMap.put(source, streamer);
return source;
}
@@ -95,7 +95,7 @@ class TunerTsStreamerManager {
return null;
}
- synchronized void releaseDataSource(TsMediaDataSource source, int sessionId,
+ synchronized void releaseDataSource(TsDataSource source, int sessionId,
boolean reuse) {
TunerTsStreamer streamer;
synchronized (mCancelLock) {
@@ -203,7 +203,7 @@ class TunerTsStreamerManager {
}
}
if (!canceled) {
- TunerTsStreamer tsStreamer = new TunerTsStreamer(hal, mEventListener);
+ TunerTsStreamer tsStreamer = new TunerTsStreamer(hal, mEventListener, mContext);
if (tsStreamer.startStream(mChannel)) {
return tsStreamer;
}
diff --git a/src/com/android/tv/tuner/ts/SectionParser.java b/src/com/android/tv/tuner/ts/SectionParser.java
index f47d48c9..5d3e728a 100644
--- a/src/com/android/tv/tuner/ts/SectionParser.java
+++ b/src/com/android/tv/tuner/ts/SectionParser.java
@@ -532,6 +532,13 @@ public class SectionParser {
int numChannelsInSection = (data[9] & 0xff);
int sectionNumber = (data[6] & 0xff);
int lastSectionNumber = (data[7] & 0xff);
+ if (sectionNumber > lastSectionNumber) {
+ // According to section 6.3.1 of the spec ATSC A/65,
+ // last section number is the largest section number.
+ Log.w(TAG, "Invalid VCT. Section Number " + sectionNumber + " > Last Section Number "
+ + lastSectionNumber);
+ return false;
+ }
int pos = 10;
List<VctItem> results = new ArrayList<>();
for (int i = 0; i < numChannelsInSection; ++i) {
diff --git a/src/com/android/tv/tuner/tvinput/ChannelDataManager.java b/src/com/android/tv/tuner/tvinput/ChannelDataManager.java
index f8573732..a16bc522 100644
--- a/src/com/android/tv/tuner/tvinput/ChannelDataManager.java
+++ b/src/com/android/tv/tuner/tvinput/ChannelDataManager.java
@@ -39,6 +39,8 @@ import com.android.tv.tuner.data.TunerChannel;
import com.android.tv.tuner.util.ConvertUtils;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -46,7 +48,6 @@ import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.ConcurrentSkipListSet;
-import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -76,8 +77,7 @@ public class ChannelDataManager implements Handler.Callback {
private static final int MSG_BUILD_CHANNEL_MAP = 3;
private static final int MSG_REQUEST_PROGRAMS = 4;
private static final int MSG_CLEAR_CHANNELS = 6;
- private static final int MSG_SCAN_COMPLETED = 7;
- private static final int MSG_CHECK_VERSION = 8;
+ private static final int MSG_CHECK_VERSION = 7;
// Throttle the batch operations to avoid TransactionTooLargeException.
private static final int BATCH_OPERATION_COUNT = 100;
@@ -97,6 +97,8 @@ public class ChannelDataManager implements Handler.Callback {
private final Context mContext;
private final String mInputId;
private ProgramInfoListener mListener;
+ private ChannelScanListener mChannelScanListener;
+ private Handler mChannelScanHandler;
private final HandlerThread mHandlerThread;
private final Handler mHandler;
private final ConcurrentHashMap<Long, TunerChannel> mTunerChannelMap;
@@ -107,7 +109,7 @@ public class ChannelDataManager implements Handler.Callback {
private final ConcurrentSkipListSet<TunerChannel> mScannedChannels;
private final ConcurrentSkipListSet<TunerChannel> mPreviousScannedChannels;
private final AtomicBoolean mIsScanning;
- private CountDownLatch mScanLatch;
+ private final AtomicBoolean scanCompleted = new AtomicBoolean();
public interface ProgramInfoListener {
@@ -135,6 +137,13 @@ public class ChannelDataManager implements Handler.Callback {
void onRescanNeeded();
}
+ public interface ChannelScanListener {
+ /**
+ * Invoked when all pending channels have been handled.
+ */
+ void onChannelHandlingDone();
+ }
+
public ChannelDataManager(Context context) {
mContext = context;
mInputId = TvContract.buildInputId(new ComponentName(mContext.getPackageName(),
@@ -176,11 +185,20 @@ public class ChannelDataManager implements Handler.Callback {
mListener = listener;
}
+ public void setChannelScanListener(ChannelScanListener listener, Handler handler) {
+ mChannelScanListener = listener;
+ mChannelScanHandler = handler;
+ }
+
public void release() {
mHandler.removeCallbacksAndMessages(null);
mHandlerThread.quitSafely();
}
+ public void releaseSafely() {
+ mHandlerThread.quitSafely();
+ }
+
public TunerChannel getChannel(long channelId) {
TunerChannel channel = mTunerChannelMap.get(channelId);
if (channel != null) {
@@ -215,7 +233,13 @@ public class ChannelDataManager implements Handler.Callback {
}
public void notifyChannelDetected(TunerChannel channel, boolean channelArrivedAtFirstTime) {
- mHandler.obtainMessage(MSG_HANDLE_CHANNEL, channel).sendToTarget();
+ if (mIsScanning.get()) {
+ // During scanning, channels should be handle first to improve scan time.
+ // EIT items can be handled in background after channel scan.
+ mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_HANDLE_CHANNEL, channel));
+ } else {
+ mHandler.obtainMessage(MSG_HANDLE_CHANNEL, channel).sendToTarget();
+ }
}
// For scanning process
@@ -249,26 +273,35 @@ public class ChannelDataManager implements Handler.Callback {
* obsolete channels, which are previously scanned but are not in the current scanned result.
*/
public void notifyScanCompleted() {
- mScanLatch = new CountDownLatch(1);
- mHandler.sendEmptyMessage(MSG_SCAN_COMPLETED);
- try {
- mScanLatch.await();
- } catch (InterruptedException e) {
- Log.e(TAG, "Scanning process could not finish", e);
- }
+ // Send a dummy message to check whether there is any MSG_HANDLE_CHANNEL in queue
+ // and avoid race conditions.
+ scanCompleted.set(true);
+ mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_HANDLE_CHANNEL, null));
+ }
+
+ public void scannedChannelHandlingCompleted() {
mIsScanning.set(false);
- if (mPreviousScannedChannels.isEmpty()) {
- return;
- }
- ArrayList<ContentProviderOperation> ops = new ArrayList<>();
- for (TunerChannel channel : mPreviousScannedChannels) {
- ops.add(ContentProviderOperation.newDelete(
- TvContract.buildChannelUri(channel.getChannelId())).build());
+ if (!mPreviousScannedChannels.isEmpty()) {
+ ArrayList<ContentProviderOperation> ops = new ArrayList<>();
+ for (TunerChannel channel : mPreviousScannedChannels) {
+ ops.add(ContentProviderOperation.newDelete(
+ TvContract.buildChannelUri(channel.getChannelId())).build());
+ }
+ try {
+ mContext.getContentResolver().applyBatch(TvContract.AUTHORITY, ops);
+ } catch (RemoteException | OperationApplicationException e) {
+ Log.e(TAG, "Error deleting obsolete channels", e);
+ }
}
- try {
- mContext.getContentResolver().applyBatch(TvContract.AUTHORITY, ops);
- } catch (RemoteException | OperationApplicationException e) {
- Log.e(TAG, "Error deleting obsolete channels", e);
+ if (mChannelScanListener != null && mChannelScanHandler != null) {
+ mChannelScanHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mChannelScanListener.onChannelHandlingDone();
+ }
+ });
+ } else {
+ Log.e(TAG, "Error. mChannelScanListener is null.");
}
}
@@ -296,7 +329,14 @@ public class ChannelDataManager implements Handler.Callback {
}
case MSG_HANDLE_CHANNEL: {
TunerChannel channel = (TunerChannel) msg.obj;
- handleChannel(channel);
+ if (channel != null) {
+ handleChannel(channel);
+ }
+ if (scanCompleted.get() && mIsScanning.get()
+ && !mHandler.hasMessages(MSG_HANDLE_CHANNEL)) {
+ // Complete the scan when all found channels have already been handled.
+ scannedChannelHandlingCompleted();
+ }
return true;
}
case MSG_BUILD_CHANNEL_MAP: {
@@ -318,10 +358,6 @@ public class ChannelDataManager implements Handler.Callback {
clearChannels();
return true;
}
- case MSG_SCAN_COMPLETED: {
- mScanLatch.countDown();
- return true;
- }
case MSG_CHECK_VERSION: {
checkVersion();
return true;
@@ -347,15 +383,69 @@ public class ChannelDataManager implements Handler.Callback {
long currentTime = System.currentTimeMillis();
List<EitItem> oldItems = getAllProgramsForChannel(channel, currentTime,
currentTime + PROGRAM_QUERY_DURATION);
+ ArrayList<ContentProviderOperation> ops = new ArrayList<>();
// TODO: Find a right way to check if the programs are added outside.
+ boolean addedOutside = false;
for (EitItem item : oldItems) {
if (item.getEventId() == 0) {
- // The event has been added outside TV tuner. Do not update programs.
- return;
+ // The event has been added outside TV tuner.
+ addedOutside = true;
+ break;
}
}
+
+ // Inserting programs only when there is no overlapping with existing data assuming that:
+ // 1. external EPG is more accurate and rich and
+ // 2. the data we add here will be updated when we apply external EPG.
+ if (addedOutside) {
+ // oldItemCount cannot be 0 if addedOutside is true.
+ int oldItemCount = oldItems.size();
+ for (EitItem newItem : items) {
+ if (newItem.getEndTimeUtcMillis() < currentTime) {
+ continue;
+ }
+ long newItemStartTime = newItem.getStartTimeUtcMillis();
+ long newItemEndTime = newItem.getEndTimeUtcMillis();
+ if (newItemStartTime < oldItems.get(0).getStartTimeUtcMillis()) {
+ // Start time smaller than that of any old items. Insert if no overlap.
+ if (newItemEndTime > oldItems.get(0).getStartTimeUtcMillis()) continue;
+ } else if (newItemStartTime
+ > oldItems.get(oldItemCount - 1).getStartTimeUtcMillis()) {
+ // Start time larger than that of any old item. Insert if no overlap.
+ if (newItemStartTime
+ < oldItems.get(oldItemCount - 1).getEndTimeUtcMillis()) continue;
+ } else {
+ int pos = Collections.binarySearch(oldItems, newItem,
+ new Comparator<EitItem>() {
+ @Override
+ public int compare(EitItem lhs, EitItem rhs) {
+ return Long.compare(lhs.getStartTimeUtcMillis(),
+ rhs.getStartTimeUtcMillis());
+ }
+ });
+ if (pos >= 0) {
+ // Same start Time found. Overlapped.
+ continue;
+ }
+ int insertPoint = -1 - pos;
+ // Check the two adjacent items.
+ if (newItemStartTime < oldItems.get(insertPoint - 1).getEndTimeUtcMillis()
+ || newItemEndTime > oldItems.get(insertPoint).getStartTimeUtcMillis()) {
+ continue;
+ }
+ }
+ ops.add(buildContentProviderOperation(ContentProviderOperation.newInsert(
+ TvContract.Programs.CONTENT_URI), newItem, channel.getChannelId()));
+ if (ops.size() >= BATCH_OPERATION_COUNT) {
+ applyBatch(channel.getName(), ops);
+ ops.clear();
+ }
+ }
+ applyBatch(channel.getName(), ops);
+ return;
+ }
+
List<EitItem> outdatedOldItems = new ArrayList<>();
- ArrayList<ContentProviderOperation> ops = new ArrayList<>();
Map<Integer, EitItem> newEitItemMap = new HashMap<>();
for (EitItem item : items) {
newEitItemMap.put(item.getEventId(), item);
@@ -379,22 +469,8 @@ public class ChannelDataManager implements Handler.Callback {
item.setDescription(oldItem.getDescription());
}
if (item.compareTo(oldItem) != 0) {
- ops.add(ContentProviderOperation.newUpdate(
- TvContract.buildProgramUri(oldItem.getProgramId()))
- .withValue(TvContract.Programs.COLUMN_TITLE, item.getTitleText())
- .withValue(TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS,
- item.getStartTimeUtcMillis())
- .withValue(TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS,
- item.getEndTimeUtcMillis())
- .withValue(TvContract.Programs.COLUMN_CONTENT_RATING,
- item.getContentRating())
- .withValue(TvContract.Programs.COLUMN_AUDIO_LANGUAGE,
- item.getAudioLanguage())
- .withValue(TvContract.Programs.COLUMN_SHORT_DESCRIPTION,
- item.getDescription())
- .withValue(TvContract.Programs.COLUMN_VERSION_NUMBER,
- item.getEventId())
- .build());
+ ops.add(buildContentProviderOperation(ContentProviderOperation.newUpdate(
+ TvContract.buildProgramUri(oldItem.getProgramId())), item, null));
if (ops.size() >= BATCH_OPERATION_COUNT) {
applyBatch(channel.getName(), ops);
ops.clear();
@@ -428,9 +504,24 @@ public class ChannelDataManager implements Handler.Callback {
if (item.getEndTimeUtcMillis() < currentTime) {
continue;
}
- ops.add(ContentProviderOperation.newInsert(TvContract.Programs.CONTENT_URI)
- .withValue(TvContract.Programs.COLUMN_CHANNEL_ID, channel.getChannelId())
- .withValue(TvContract.Programs.COLUMN_TITLE, item.getTitleText())
+ ops.add(buildContentProviderOperation(ContentProviderOperation.newInsert(
+ TvContract.Programs.CONTENT_URI), item, channel.getChannelId()));
+ if (ops.size() >= BATCH_OPERATION_COUNT) {
+ applyBatch(channel.getName(), ops);
+ ops.clear();
+ }
+ }
+
+ applyBatch(channel.getName(), ops);
+ }
+
+ private ContentProviderOperation buildContentProviderOperation(
+ 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())
.withValue(TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS,
item.getStartTimeUtcMillis())
.withValue(TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS,
@@ -442,15 +533,9 @@ public class ChannelDataManager implements Handler.Callback {
.withValue(TvContract.Programs.COLUMN_SHORT_DESCRIPTION,
item.getDescription())
.withValue(TvContract.Programs.COLUMN_VERSION_NUMBER,
- item.getEventId())
- .build());
- if (ops.size() >= BATCH_OPERATION_COUNT) {
- applyBatch(channel.getName(), ops);
- ops.clear();
- }
+ item.getEventId());
}
-
- applyBatch(channel.getName(), ops);
+ return builder.build();
}
private void applyBatch(String channelName, ArrayList<ContentProviderOperation> operations) {
diff --git a/src/com/android/tv/tuner/tvinput/EventDetector.java b/src/com/android/tv/tuner/tvinput/EventDetector.java
index e62df62f..27bbb8c7 100644
--- a/src/com/android/tv/tuner/tvinput/EventDetector.java
+++ b/src/com/android/tv/tuner/tvinput/EventDetector.java
@@ -20,7 +20,6 @@ import android.util.Log;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
-import com.android.tv.tuner.TunerFlags;
import com.android.tv.tuner.TunerHal;
import com.android.tv.tuner.data.Track.AtscAudioTrack;
import com.android.tv.tuner.data.Track.AtscCaptionTrack;
@@ -39,7 +38,6 @@ import java.util.Set;
*/
public class EventDetector {
private static final String TAG = "EventDetector";
- private static final String CABLE_MODULATION = "QAM";
private static final boolean DEBUG = false;
public static final int ALL_PROGRAM_NUMBERS = -1;
@@ -62,12 +60,7 @@ public class EventDetector {
@Override
public void onPatDetected(List<PsiData.PatItem> items) {
for (PsiData.PatItem i : items) {
- // In case of tuning to a cable channel, we don't add filters for EPG update for
- // other channels due to b/29490412. We do the same when extractor in ExoPlayer is
- // used since it doesn't allow PMTs not related to the channel to play.
- if (mProgramNumber == ALL_PROGRAM_NUMBERS || mProgramNumber == i.getProgramNo()
- || (!mModulation.startsWith(CABLE_MODULATION)
- && !TunerFlags.USE_EXTRACTOR_IN_EXOPLAYER)) {
+ if (mProgramNumber == ALL_PROGRAM_NUMBERS || mProgramNumber == i.getProgramNo()) {
mTunerHal.addPidFilter(i.getPmtPid(), TunerHal.FILTER_TYPE_OTHER);
}
}
diff --git a/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java b/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java
index 352687c1..6ec55e4f 100644
--- a/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java
+++ b/src/com/android/tv/tuner/tvinput/TunerRecordingSessionWorker.java
@@ -24,6 +24,7 @@ import android.database.Cursor;
import android.media.tv.TvContract;
import android.media.tv.TvInputManager;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
@@ -32,23 +33,20 @@ import android.support.annotation.MainThread;
import android.support.annotation.Nullable;
import android.util.Log;
-import com.google.android.exoplayer.upstream.DataSource;
+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.RecordedProgram;
import com.android.tv.tuner.DvbDeviceAccessor;
-import com.android.tv.tuner.TunerFlags;
import com.android.tv.tuner.data.PsipData;
import com.android.tv.tuner.data.TunerChannel;
-import com.android.tv.tuner.exoplayer.DataSourceAdapter;
import com.android.tv.tuner.exoplayer.ExoPlayerSampleExtractor;
-import com.android.tv.tuner.exoplayer.FrameworkSampleExtractor;
import com.android.tv.tuner.exoplayer.SampleExtractor;
import com.android.tv.tuner.exoplayer.buffer.BufferManager;
import com.android.tv.tuner.exoplayer.buffer.DvrStorageManager;
-import com.android.tv.tuner.source.TsMediaDataSource;
-import com.android.tv.tuner.source.TsMediaDataSourceManager;
-import com.android.tv.util.DvrTunerStorageUtils;
+import com.android.tv.tuner.source.TsDataSource;
+import com.android.tv.tuner.source.TsDataSourceManager;
import com.android.tv.util.Utils;
import java.io.File;
@@ -75,11 +73,13 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
+ TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS;
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;
private static final int MSG_TUNE = 1;
private static final int MSG_START_RECORDING = 2;
- private static final int MSG_STOP_RECORDING = 3;
- private static final int MSG_MONITOR_STORAGE_STATUS = 4;
- private static final int MSG_RELEASE = 5;
+ private static final int MSG_PREPARE_RECODER = 3;
+ 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 final RecordingCapability mCapabilities;
public RecordingCapability getCapabilities() {
@@ -97,12 +97,12 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
private final Context mContext;
private final ChannelDataManager mChannelDataManager;
+ private final DvrStorageStatusManager mDvrStorageStatusManager;
private final Handler mHandler;
- private final TsMediaDataSourceManager mSourceManager;
+ private final TsDataSourceManager mSourceManager;
private final Random mRandom = new Random();
- private final CountDownLatch mReleaseLatch = new CountDownLatch(1);
- private TsMediaDataSource mTunerSource;
+ private TsDataSource mTunerSource;
private TunerChannel mChannel;
private File mStorageDir;
private long mRecordStartTime;
@@ -122,9 +122,11 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
HandlerThread handlerThread = new HandlerThread(TAG);
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper(), this);
+ mDvrStorageStatusManager =
+ TvApplication.getSingletons(context).getDvrStorageStatusManager();
mChannelDataManager = dataManager;
mChannelDataManager.checkDataVersion(context);
- mSourceManager = TsMediaDataSourceManager.createSourceManager(true);
+ mSourceManager = TsDataSourceManager.createSourceManager(true);
mCapabilities = new DvbDeviceAccessor(context).getRecordingCapability(inputId);
mInputId = inputId;
if (DEBUG) Log.d(TAG, mCapabilities.toString());
@@ -202,13 +204,6 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
public void release() {
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();
- }
}
@Override
@@ -216,6 +211,7 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
switch (msg.what) {
case MSG_TUNE: {
Uri channelUri = (Uri) msg.obj;
+ if (DEBUG) Log.d(TAG, "Tune to " + channelUri);
if (doTune(channelUri)) {
mSession.onTuned(channelUri);
} else {
@@ -224,12 +220,31 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
return true;
}
case MSG_START_RECORDING: {
+ if (DEBUG) Log.d(TAG, "Start recording");
if (!doStartRecording((Uri) msg.obj)) {
reset();
}
return true;
}
+ case MSG_PREPARE_RECODER: {
+ if (DEBUG) Log.d(TAG, "Preparing recorder");
+ if (!mRecorderRunning) {
+ return true;
+ }
+ try {
+ if (!mRecorder.prepare()) {
+ mHandler.sendEmptyMessageDelayed(MSG_PREPARE_RECODER,
+ PREPARE_RECORDER_POLL_MS);
+ }
+ } catch (IOException e) {
+ Log.w(TAG, "Failed to start recording. Couldn't prepare an extractor");
+ mSession.onError(TvInputManager.RECORDING_ERROR_UNKNOWN);
+ reset();
+ }
+ return true;
+ }
case MSG_STOP_RECORDING: {
+ if (DEBUG) Log.d(TAG, "Stop recording");
if (mSessionState != STATE_RECORDING) {
mSession.onError(TvInputManager.RECORDING_ERROR_UNKNOWN);
reset();
@@ -244,12 +259,12 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
if (mSessionState != STATE_RECORDING) {
return true;
}
- if (!DvrTunerStorageUtils.isStorageSufficient(mContext)) {
+ if (!mDvrStorageStatusManager.isStorageSufficient()) {
if (mRecorderRunning) {
stopRecorder();
}
+ new DeleteRecordingTask().execute(mStorageDir);
mSession.onError(TvInputManager.RECORDING_ERROR_INSUFFICIENT_SPACE);
- Utils.deleteDirOrFile(mStorageDir);
reset();
} else {
mHandler.sendEmptyMessageDelayed(MSG_MONITOR_STORAGE_STATUS,
@@ -262,7 +277,8 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
// without notification.
reset();
mSourceManager.release();
- mReleaseLatch.countDown();
+ mHandler.removeCallbacksAndMessages(null);
+ mHandler.getLooper().quitSafely();
return true;
}
}
@@ -318,7 +334,7 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
Log.w(TAG, "Failed to start recording. Couldn't find the channel for " + mChannel);
return false;
}
- if (!DvrTunerStorageUtils.isStorageSufficient(mContext)) {
+ if (!mDvrStorageStatusManager.isStorageSufficient()) {
mSession.onError(TvInputManager.RECORDING_ERROR_INSUFFICIENT_SPACE);
Log.w(TAG, "Tuning failed due to insufficient storage.");
return false;
@@ -339,8 +355,9 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
Log.e(TAG, "Recording session status abnormal");
return false;
}
- mStorageDir = DvrTunerStorageUtils.isStorageSufficient(mContext) ?
- DvrTunerStorageUtils.getRecordingDataDirectory(mContext, getStorageKey()) : null;
+ mStorageDir = mDvrStorageStatusManager.isStorageSufficient() ?
+ new File(mDvrStorageStatusManager.getRecordingRootDataDirectory(),
+ getStorageKey()) : null;
if (mStorageDir == null) {
mSession.onError(TvInputManager.RECORDING_ERROR_INSUFFICIENT_SPACE);
Log.w(TAG, "Failed to start recording due to insufficient storage.");
@@ -350,23 +367,13 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
mTunerSource.shiftStartPosition(mTunerSource.getBufferedPosition());
mBufferManager = new BufferManager(new DvrStorageManager(mStorageDir, true));
mRecordStartTime = System.currentTimeMillis();
- if (TunerFlags.USE_EXTRACTOR_IN_EXOPLAYER) {
- mRecorder = new ExoPlayerSampleExtractor(new DataSourceAdapter(mTunerSource),
- mBufferManager, this, true);
- } else {
- mRecorder = new FrameworkSampleExtractor(mTunerSource, mBufferManager, this, true);
- }
+ mRecorder = new ExoPlayerSampleExtractor(Uri.EMPTY, mTunerSource, mBufferManager, this,
+ true);
mRecorder.setOnCompletionListener(this, mHandler);
mProgramUri = programUri;
- try {
- mRecorder.prepare();
- } catch (IOException e) {
- Log.w(TAG, "Failed to start recording. Couldn't prepare a extractor");
- mSession.onError(TvInputManager.RECORDING_ERROR_UNKNOWN);
- return false;
- }
mSessionState = STATE_RECORDING;
mRecorderRunning = true;
+ mHandler.sendEmptyMessage(MSG_PREPARE_RECODER);
mHandler.removeMessages(MSG_MONITOR_STORAGE_STATUS);
mHandler.sendEmptyMessageDelayed(MSG_MONITOR_STORAGE_STATUS,
STORAGE_MONITOR_INTERVAL_MS);
@@ -553,9 +560,9 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
}
if (!success && lastExtractedPositionUs <
TimeUnit.MILLISECONDS.toMicros(MIN_PARTIAL_RECORDING_DURATION_MS)) {
+ new DeleteRecordingTask().execute(mStorageDir);
mSession.onError(TvInputManager.RECORDING_ERROR_UNKNOWN);
Log.w(TAG, "Recording failed during recording");
- Utils.deleteDirOrFile(mStorageDir);
return;
}
Log.i(TAG, "recording finished " + (success ? "completely" : "partially"));
@@ -563,11 +570,25 @@ public class TunerRecordingSessionWorker implements PlaybackBufferListener,
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");
- Utils.deleteDirOrFile(mStorageDir);
return;
}
mSession.onRecordFinished(uri);
}
+
+ private static class DeleteRecordingTask extends AsyncTask<File, Void, Void> {
+
+ @Override
+ public Void doInBackground(File... files) {
+ if (files == null || files.length == 0) {
+ return null;
+ }
+ for(File file : files) {
+ Utils.deleteDirOrFile(file);
+ }
+ return null;
+ }
+ }
}
diff --git a/src/com/android/tv/tuner/tvinput/TunerSession.java b/src/com/android/tv/tuner/tvinput/TunerSession.java
index 1494e212..abfd2b30 100644
--- a/src/com/android/tv/tuner/tvinput/TunerSession.java
+++ b/src/com/android/tv/tuner/tvinput/TunerSession.java
@@ -44,6 +44,7 @@ import com.android.tv.tuner.data.Cea708Data.CaptionEvent;
import com.android.tv.tuner.data.Track.AtscCaptionTrack;
import com.android.tv.tuner.exoplayer.buffer.BufferManager;
import com.android.tv.tuner.data.TunerChannel;
+import com.android.tv.tuner.util.GlobalSettingsUtils;
import com.android.tv.tuner.util.StatusTextUtils;
import com.android.tv.tuner.util.SystemPropertiesProxy;
@@ -97,7 +98,7 @@ public class TunerSession extends TvInputService.Session implements Handler.Call
mAudioStatusView = (TextView) mOverlayView.findViewById(R.id.audio_status);
mAudioStatusView.setVisibility(View.INVISIBLE);
mAudioStatusView.setText(Html.fromHtml(StatusTextUtils.getAudioWarningInHTML(
- context.getString(R.string.ut_ac3_passthrough_unavailable))));
+ 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,
@@ -267,7 +268,14 @@ public class TunerSession extends TvInputService.Session implements Handler.Call
return true;
}
case MSG_UI_SHOW_AUDIO_UNPLAYABLE: {
- mAudioStatusView.setVisibility(View.VISIBLE);
+ // Showing message of enabling surround sound only when global surround sound
+ // setting is "never".
+ final int value = GlobalSettingsUtils.getEncodedSurroundOutputSettings(mContext);
+ if (value == GlobalSettingsUtils.ENCODED_SURROUND_OUTPUT_NEVER) {
+ mAudioStatusView.setVisibility(View.VISIBLE);
+ } else {
+ Log.e(TAG, "Audio is unavailable, surround sound setting is " + value);
+ }
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 ab9dda50..c0a613a4 100644
--- a/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java
+++ b/src/com/android/tv/tuner/tvinput/TunerSessionWorker.java
@@ -45,6 +45,7 @@ import com.google.android.exoplayer.audio.AudioCapabilities;
import com.google.android.exoplayer.ExoPlayer;
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;
@@ -56,8 +57,8 @@ import com.android.tv.tuner.exoplayer.MpegTsRendererBuilder;
import com.android.tv.tuner.exoplayer.buffer.BufferManager;
import com.android.tv.tuner.exoplayer.buffer.DvrStorageManager;
import com.android.tv.tuner.exoplayer.MpegTsPlayer;
-import com.android.tv.tuner.source.TsMediaDataSource;
-import com.android.tv.tuner.source.TsMediaDataSourceManager;
+import com.android.tv.tuner.source.TsDataSource;
+import com.android.tv.tuner.source.TsDataSourceManager;
import com.android.tv.tuner.util.StatusTextUtils;
import java.io.File;
@@ -112,6 +113,8 @@ public class TunerSessionWorker implements PlaybackBufferListener,
private static final int MSG_BUFFER_STATE_CHANGED = 1021;
private static final int MSG_PROGRAM_DATA_RESULT = 1022;
private static final int MSG_STOP_TUNE = 1023;
+ private static final int MSG_SET_SURFACE = 1024;
+ private static final int MSG_NOTIFY_AUDIO_TRACK_UPDATED = 1025;
private static final int TS_PACKET_SIZE = 188;
private static final int CHECK_NO_SIGNAL_INITIAL_DELAY_MS = 4000;
@@ -121,9 +124,11 @@ public class TunerSessionWorker implements PlaybackBufferListener,
private static final int RESCHEDULE_PROGRAMS_INITIAL_DELAY_MS = 4000;
private static final int RESCHEDULE_PROGRAMS_INTERVAL_MS = 10000;
private static final int RESCHEDULE_PROGRAMS_TOLERANCE_MS = 2000;
+ // The following 3s is defined empirically. This should be larger than 2s considering video
+ // key frame interval in the TS stream.
private static final int PLAYBACK_STATE_CHANGED_WAITING_THRESHOLD_MS = 3000;
private static final int PLAYBACK_RETRY_DELAY_MS = 5000;
- private static final int MAX_RETRY_COUNT = 5;
+ private static final int MAX_IMMEDIATE_RETRY_COUNT = 5;
private static final long INVALID_TIME = -1;
// Some examples of the track ids of the audio tracks, "a0", "a1", "a2".
@@ -145,7 +150,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
private final Context mContext;
private final ChannelDataManager mChannelDataManager;
- private final TsMediaDataSourceManager mSourceManager;
+ private final TsDataSourceManager mSourceManager;
private volatile Surface mSurface;
private volatile float mVolume = 1.0f;
private volatile boolean mCaptionEnabled;
@@ -179,6 +184,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
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;
@@ -196,7 +202,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
mChannelDataManager = channelDataManager;
mChannelDataManager.setListener(this);
mChannelDataManager.checkDataVersion(mContext);
- mSourceManager = TsMediaDataSourceManager.createSourceManager(false);
+ mSourceManager = TsDataSourceManager.createSourceManager(false);
mTvInputManager = (TvInputManager) context.getSystemService(Context.TV_INPUT_SERVICE);
mTvTracks = new ArrayList<>();
mAudioTrackMap = new SparseArray<>();
@@ -206,6 +212,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
mCaptionEnabled = captioningManager.isEnabled();
mPlaybackParams.setSpeed(1.0f);
mBufferManager = bufferManager;
+ mPreparingStartTimeMs = INVALID_TIME;
mBufferingStartTimeMs = INVALID_TIME;
mReadyStartTimeMs = INVALID_TIME;
}
@@ -236,7 +243,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
// mSurface is kept even when tune is called right after. But, messages can be deleted by
// tune or updateChannelBlockStatus. So mSurface should be stored here, not through message.
mSurface = surface;
- mHandler.sendEmptyMessage(MSG_RESET_PLAYBACK);
+ mHandler.sendEmptyMessage(MSG_SET_SURFACE);
}
/**
@@ -355,6 +362,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
return;
}
mReadyStartTimeMs = INVALID_TIME;
+ mPreparingStartTimeMs = INVALID_TIME;
mBufferingStartTimeMs = INVALID_TIME;
if (playbackState == ExoPlayer.STATE_READY) {
if (DEBUG) Log.d(TAG, "ExoPlayer ready");
@@ -362,6 +370,8 @@ public class TunerSessionWorker implements PlaybackBufferListener,
sendMessage(MSG_START_PLAYBACK, mPlayer);
}
mReadyStartTimeMs = SystemClock.elapsedRealtime();
+ } else if (playbackState == ExoPlayer.STATE_PREPARING) {
+ mPreparingStartTimeMs = SystemClock.elapsedRealtime();
} else if (playbackState == ExoPlayer.STATE_BUFFERING) {
mBufferingStartTimeMs = SystemClock.elapsedRealtime();
} else if (playbackState == ExoPlayer.STATE_ENDED) {
@@ -377,6 +387,12 @@ public class TunerSessionWorker implements PlaybackBufferListener,
@Override
public void onError(Exception e) {
+ if (TunerPreferences.getStoreTsStream(mContext)) {
+ // Crash intentionally to capture the error causing TS file.
+ Log.e(TAG, "Crash intentionally to capture the error causing TS file. "
+ + e.getMessage());
+ SoftPreconditions.checkState(false);
+ }
// There maybe some errors that finally raise ExoPlaybackException and will be handled here.
// If we are playing live stream, retrying playback maybe helpful. But for recorded stream,
// retrying playback is not helpful.
@@ -401,7 +417,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (DEBUG) Log.d(TAG, "MSG_DRAWN_TO_SURFACE");
mBufferStartTimeMs = mRecordStartTimeMs =
(mRecordingId != null) ? 0 : System.currentTimeMillis();
- mSession.notifyVideoAvailable();
+ notifyVideoAvailable();
mReportedDrawnToSurface = true;
// If surface is drawn successfully, it means that the playback was brought back
@@ -415,6 +431,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
} else {
stopCaptionTrack();
}
+ mHandler.sendEmptyMessage(MSG_NOTIFY_AUDIO_TRACK_UPDATED);
}
}
@@ -584,6 +601,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (mHandler.hasMessages(MSG_TUNE)) {
return true;
}
+ notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING);
Uri channelUri = (Uri) msg.obj;
String recording = null;
long channelId = parseChannel(channelUri);
@@ -595,8 +613,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (channel == null && recording == null) {
Log.w(TAG, "onTune() is failed. Can't find channel for " + channelUri);
stopTune();
- mSession.notifyVideoUnavailable(
- TvInputManager.VIDEO_UNAVAILABLE_REASON_UNKNOWN);
+ notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_UNKNOWN);
return true;
}
mHandler.removeCallbacksAndMessages(null);
@@ -619,8 +636,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
stopPlayback();
stopCaptionTrack();
resetTvTracks();
- mSession.notifyVideoUnavailable(
- TvInputManager.VIDEO_UNAVAILABLE_REASON_UNKNOWN);
+ notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_UNKNOWN);
return true;
}
case MSG_RELEASE: {
@@ -642,7 +658,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (DEBUG) {
Log.d(TAG, "MSG_RETRY_PLAYBACK " + mRetryCount);
}
- if (mRetryCount <= MAX_RETRY_COUNT) {
+ if (mRetryCount <= MAX_IMMEDIATE_RETRY_COUNT) {
resetPlayback();
} else {
// When it reaches this point, it may be due to an error that occurred in
@@ -651,11 +667,10 @@ public class TunerSessionWorker implements PlaybackBufferListener,
stopPlayback();
stopCaptionTrack();
- mSession.notifyVideoUnavailable(
- TvInputManager.VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL);
+ notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL);
- // After MAX_RETRY_COUNT, give some delay of an empirically chosen value
- // before recovering the playback.
+ // After MAX_IMMEDIATE_RETRY_COUNT, give some delay of an empirically chosen
+ // value before recovering the playback.
mHandler.sendEmptyMessageDelayed(MSG_RESET_PLAYBACK,
RECOVER_STOPPED_PLAYBACK_PERIOD_MS);
}
@@ -742,10 +757,16 @@ public class TunerSessionWorker implements PlaybackBufferListener,
return true;
}
case MSG_TRICKPLAY_BY_SEEK: {
+ if (mPlayer == null) {
+ return true;
+ }
doTrickplayBySeek(msg.arg1);
return true;
}
case MSG_SMOOTH_TRICKPLAY_MONITOR: {
+ if (mPlayer == null) {
+ return true;
+ }
long systemCurrentTime = System.currentTimeMillis();
long position = getCurrentPosition();
if (mRecordingId == null) {
@@ -811,21 +832,33 @@ public class TunerSessionWorker implements PlaybackBufferListener,
}
case MSG_TIMESHIFT_PAUSE: {
if (DEBUG) Log.d(TAG, "MSG_TIMESHIFT_PAUSE");
+ if (mPlayer == null) {
+ return true;
+ }
doTimeShiftPause();
return true;
}
case MSG_TIMESHIFT_RESUME: {
if (DEBUG) Log.d(TAG, "MSG_TIMESHIFT_RESUME");
+ if (mPlayer == null) {
+ return true;
+ }
doTimeShiftResume();
return true;
}
case MSG_TIMESHIFT_SEEK_TO: {
long position = (long) msg.obj;
if (DEBUG) Log.d(TAG, "MSG_TIMESHIFT_SEEK_TO (position=" + position + ")");
+ if (mPlayer == null) {
+ return true;
+ }
doTimeShiftSeekTo(position);
return true;
}
case MSG_TIMESHIFT_SET_PLAYBACKPARAMS: {
+ if (mPlayer == null) {
+ return true;
+ }
doTimeShiftSetPlaybackParams((PlaybackParams) msg.obj);
return true;
}
@@ -874,7 +907,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (mChannel == null || mPlayer == null) {
return true;
}
- TsMediaDataSource source = mPlayer.getDataSource();
+ TsDataSource source = mPlayer.getDataSource();
long limitInBytes = source != null ? source.getBufferedPosition() : 0L;
long positionInBytes = source != null ? source.getLastReadPosition() : 0L;
if (TunerDebug.ENABLED) {
@@ -905,16 +938,21 @@ public class TunerSessionWorker implements PlaybackBufferListener,
boolean isBufferingTooLong = mBufferingStartTimeMs != INVALID_TIME
&& currentTime - mBufferingStartTimeMs
> PLAYBACK_STATE_CHANGED_WAITING_THRESHOLD_MS;
+ boolean isPreparingTooLong = mPreparingStartTimeMs != INVALID_TIME
+ && currentTime - mPreparingStartTimeMs
+ > PLAYBACK_STATE_CHANGED_WAITING_THRESHOLD_MS;
boolean isWeakSignal = source != null
&& mChannel.getType() == Channel.TYPE_TUNER
- && (noBufferRead || isBufferingTooLong);
+ && (noBufferRead || isBufferingTooLong || isPreparingTooLong);
if (isWeakSignal && !mReportedWeakSignal) {
- mSession.notifyVideoUnavailable(
- TvInputManager.VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL);
+ if (!mHandler.hasMessages(MSG_RETRY_PLAYBACK)) {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ MSG_RETRY_PLAYBACK, mPlayer), PLAYBACK_RETRY_DELAY_MS);
+ }
if (mPlayer != null) {
mPlayer.setAudioTrack(false);
}
- mReportedWeakSignal = true;
+ notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL);
} else if (!isWeakSignal && mReportedWeakSignal) {
boolean isPlaybackStable = mReadyStartTimeMs != INVALID_TIME
&& currentTime - mReadyStartTimeMs
@@ -922,9 +960,9 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (!isPlaybackStable) {
// Wait until playback becomes stable.
} else if (mReportedDrawnToSurface) {
- mSession.notifyVideoAvailable();
+ mHandler.removeMessages(MSG_RETRY_PLAYBACK);
+ notifyVideoAvailable();
mPlayer.setAudioTrack(true);
- mReportedWeakSignal = false;
}
}
mLastLimitInBytes = limitInBytes;
@@ -932,6 +970,20 @@ public class TunerSessionWorker implements PlaybackBufferListener,
mHandler.sendEmptyMessageDelayed(MSG_CHECK_SIGNAL, CHECK_NO_SIGNAL_PERIOD_MS);
return true;
}
+ case MSG_SET_SURFACE: {
+ if (mPlayer != null) {
+ mPlayer.setSurface(mSurface);
+ } else {
+ // TODO: Since surface is dynamically set, we can remove the dependency of
+ // playback start on mSurface nullity.
+ resetPlayback();
+ }
+ return true;
+ }
+ case MSG_NOTIFY_AUDIO_TRACK_UPDATED: {
+ notifyAudioTracksUpdated();
+ return true;
+ }
default: {
Log.w(TAG, "Unhandled message code: " + msg.what);
return false;
@@ -955,8 +1007,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
mChannel.selectAudioTrack(audioTrack.index);
int newAudioPid = mChannel.getAudioPid();
if (oldAudioPid != newAudioPid) {
- // TODO: Implement a switching between tracks more smoothly.
- resetPlayback();
+ mPlayer.setSelectedTrack(MpegTsPlayer.TRACK_TYPE_AUDIO, audioTrack.index);
}
mSession.notifyTrackSelected(type, trackId);
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
@@ -1061,33 +1112,48 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (DEBUG) {
Log.d(TAG, "Update AudioTracks " + audioTracks);
}
- removeTvTracks(TvTrackInfo.TYPE_AUDIO);
mAudioTrackMap.clear();
if (audioTracks != null) {
int index = 0;
for (AtscAudioTrack audioTrack : audioTracks) {
- String language = audioTrack.language;
- if (language == null && mChannel.getAudioTracks() != null
- && mChannel.getAudioTracks().size() == audioTracks.size()) {
- // If a language is not present, use a language field in PMT section parsed.
- language = mChannel.getAudioTracks().get(index).language;
- }
-
- // Save the index to the audio track.
- // Later, when a audio track is selected, Both an audio pid and its audio stream
- // type reside in the selected index position of the tuner channel's audio data.
audioTrack.index = index;
- TvTrackInfo.Builder builder = new TvTrackInfo.Builder(
- TvTrackInfo.TYPE_AUDIO, AUDIO_TRACK_PREFIX + index);
- builder.setLanguage(language);
- builder.setAudioChannelCount(audioTrack.channelCount);
- builder.setAudioSampleRate(audioTrack.sampleRate);
- TvTrackInfo track = builder.build();
- mTvTracks.add(track);
mAudioTrackMap.put(index, audioTrack);
++index;
}
}
+ mHandler.sendEmptyMessage(MSG_NOTIFY_AUDIO_TRACK_UPDATED);
+ }
+
+ private void notifyAudioTracksUpdated() {
+ if (mPlayer == null) {
+ // Audio tracks will be updated later once player initialization is done.
+ return;
+ }
+ int audioTrackCount = mPlayer.getTrackCount(MpegTsPlayer.TRACK_TYPE_AUDIO);
+ removeTvTracks(TvTrackInfo.TYPE_AUDIO);
+ for (int i = 0; i < audioTrackCount; i++) {
+ 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(audioTrack.channelCount);
+ builder.setAudioSampleRate(audioTrack.sampleRate);
+ TvTrackInfo track = builder.build();
+ mTvTracks.add(track);
+ }
mSession.notifyTracksChanged(mTvTracks);
}
@@ -1170,10 +1236,11 @@ public class TunerSessionWorker implements PlaybackBufferListener,
mPlaybackParams.setSpeed(1.0f);
mPlayerStarted = false;
mReportedDrawnToSurface = false;
- mReportedWeakSignal = false;
+ mPreparingStartTimeMs = INVALID_TIME;
mBufferingStartTimeMs = INVALID_TIME;
mReadyStartTimeMs = INVALID_TIME;
mSession.sendUiMessage(TunerSession.MSG_UI_HIDE_AUDIO_UNPLAYABLE);
+ mSession.notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE);
}
}
@@ -1186,8 +1253,7 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (DEBUG) Log.d(TAG, "Channel " + mChannel + " does not have audio.");
// Playbacks with video-only stream have not been tested yet.
// No video-only channel has been found.
- mSession.notifyVideoUnavailable(
- TvInputManager.VIDEO_UNAVAILABLE_REASON_UNKNOWN);
+ notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_UNKNOWN);
return;
}
if (mChannel != null && ((mChannel.hasAudio() && !mPlayer.hasAudio())
@@ -1204,11 +1270,10 @@ public class TunerSessionWorker implements PlaybackBufferListener,
mPlayer.setPlayWhenReady(true);
mPlayer.setVolume(mVolume);
if (mChannel != null && !mChannel.hasVideo() && mChannel.hasAudio()) {
- mSession.notifyVideoUnavailable(
- TvInputManager.VIDEO_UNAVAILABLE_REASON_AUDIO_ONLY);
- } else {
- mSession.notifyVideoUnavailable(
- TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING);
+ notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_AUDIO_ONLY);
+ } else if (!mReportedWeakSignal) {
+ // Doesn't show buffering during weak signal.
+ notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING);
}
mSession.sendUiMessage(TunerSession.MSG_UI_HIDE_MESSAGE);
mPlayerStarted = true;
@@ -1232,15 +1297,11 @@ public class TunerSessionWorker implements PlaybackBufferListener,
mSourceManager.setKeepTuneStatus(false);
player.release();
if (!mHandler.hasMessages(MSG_TUNE)) {
- if (mRetryCount < MAX_RETRY_COUNT) {
- // When prepare failed, there may be some errors related to hardware. In that
- // case, retry playback immediately may not help.
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RETRY_PLAYBACK, mPlayer),
- PLAYBACK_RETRY_DELAY_MS);
- } else {
- mSession.notifyVideoUnavailable(
- TvInputManager.VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL);
- }
+ // 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, mPlayer),
+ PLAYBACK_RETRY_DELAY_MS);
}
} else {
mPlayer = player;
@@ -1263,7 +1324,6 @@ public class TunerSessionWorker implements PlaybackBufferListener,
if (mChannelBlocked || mSurface == null) {
return;
}
- mSession.notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING);
preparePlayback();
}
@@ -1506,4 +1566,18 @@ public class TunerSessionWorker implements PlaybackBufferListener,
return mPlayer.getCurrentPosition() + BUFFER_UNDERFLOW_BUFFER_MS
>= mBufferStartTimeMs - mRecordStartTimeMs;
}
+
+ private void notifyVideoUnavailable(final int reason) {
+ mReportedWeakSignal = (reason == TvInputManager.VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL);
+ if (mSession != null) {
+ mSession.notifyVideoUnavailable(reason);
+ }
+ }
+
+ private void notifyVideoAvailable() {
+ mReportedWeakSignal = false;
+ if (mSession != null) {
+ mSession.notifyVideoAvailable();
+ }
+ }
}
diff --git a/src/com/android/tv/tuner/tvinput/TunerStorageCleanUpService.java b/src/com/android/tv/tuner/tvinput/TunerStorageCleanUpService.java
new file mode 100644
index 00000000..e734b779
--- /dev/null
+++ b/src/com/android/tv/tuner/tvinput/TunerStorageCleanUpService.java
@@ -0,0 +1,166 @@
+/*
+ * 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.tuner.tvinput;
+
+import android.app.job.JobParameters;
+import android.app.job.JobService;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.media.tv.TvContract;
+import android.net.Uri;
+import android.os.AsyncTask;
+
+import com.android.tv.TvApplication;
+import com.android.tv.dvr.DvrStorageStatusManager;
+import com.android.tv.util.Utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Creates {@link JobService} to clean up recorded program files which are not referenced
+ * from database.
+ */
+public class TunerStorageCleanUpService extends JobService {
+ private CleanUpStorageTask mTask;
+
+ @Override
+ public void onCreate() {
+ TvApplication.setCurrentRunningProcess(this, false);
+ super.onCreate();
+ mTask = new CleanUpStorageTask(this, this);
+ }
+
+ @Override
+ public boolean onStartJob(JobParameters params) {
+ mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
+ return true;
+ }
+
+ @Override
+ public boolean onStopJob(JobParameters params) {
+ return false;
+ }
+
+ /**
+ * Cleans up recorded program files which are not referenced from database.
+ * Cleaning up will be done periodically.
+ */
+ public static class CleanUpStorageTask extends AsyncTask<JobParameters, Void, JobParameters[]> {
+ private final static String[] mProjection = {
+ TvContract.RecordedPrograms.COLUMN_PACKAGE_NAME,
+ TvContract.RecordedPrograms.COLUMN_RECORDING_DATA_URI
+ };
+ private final static long ELAPSED_MILLIS_TO_DELETE = TimeUnit.DAYS.toMillis(1);
+
+ private final Context mContext;
+ private final DvrStorageStatusManager mDvrStorageStatusManager;
+ private final JobService mJobService;
+ private final ContentResolver mContentResolver;
+
+ /**
+ * Creates a recurring storage cleaning task.
+ *
+ * @param context {@link Context}
+ * @param jobService {@link JobService}
+ */
+ public CleanUpStorageTask(Context context, JobService jobService) {
+ mContext = context;
+ mDvrStorageStatusManager =
+ TvApplication.getSingletons(mContext).getDvrStorageStatusManager();
+ mJobService = jobService;
+ mContentResolver = mContext.getContentResolver();
+ }
+
+ private Set<String> getRecordedProgramsDirs() {
+ try (Cursor c = mContentResolver.query(
+ TvContract.RecordedPrograms.CONTENT_URI, mProjection, null, null, null)) {
+ if (c == null) {
+ return null;
+ }
+ Set<String> recordedProgramDirs = new HashSet<>();
+ while (c.moveToNext()) {
+ String packageName = c.getString(0);
+ String dataUriString = c.getString(1);
+ if (dataUriString == null) {
+ continue;
+ }
+ Uri dataUri = Uri.parse(dataUriString);
+ if (!Utils.isInBundledPackageSet(packageName)
+ || dataUri == null || dataUri.getPath() == null
+ || !ContentResolver.SCHEME_FILE.equals(dataUri.getScheme())) {
+ continue;
+ }
+ File recordedProgramDir = new File(dataUri.getPath());
+ try {
+ recordedProgramDirs.add(recordedProgramDir.getCanonicalPath());
+ } catch (IOException | SecurityException e) {
+ }
+ }
+ return recordedProgramDirs;
+ }
+ }
+
+ @Override
+ protected JobParameters[] doInBackground(JobParameters... params) {
+ if (mDvrStorageStatusManager.getDvrStorageStatus()
+ == DvrStorageStatusManager.STORAGE_STATUS_MISSING) {
+ return params;
+ }
+ File dvrRecordingDir = mDvrStorageStatusManager.getRecordingRootDataDirectory();
+ if (dvrRecordingDir == null || !dvrRecordingDir.isDirectory()) {
+ return params;
+ }
+ Set<String> recordedProgramDirs = getRecordedProgramsDirs();
+ if (recordedProgramDirs == null) {
+ return params;
+ }
+ File[] files = dvrRecordingDir.listFiles();
+ if (files == null || files.length == 0) {
+ return params;
+ }
+ for (File recordingDir : files) {
+ try {
+ if (!recordedProgramDirs.contains(recordingDir.getCanonicalPath())) {
+ long lastModified = recordingDir.lastModified();
+ long now = System.currentTimeMillis();
+ if (lastModified != 0
+ && lastModified < now - ELAPSED_MILLIS_TO_DELETE) {
+ // To prevent current recordings from being deleted,
+ // deletes recordings which was not modified for long enough time.
+ Utils.deleteDirOrFile(recordingDir);
+ }
+ }
+ } catch (IOException | SecurityException e) {
+ // would not happen
+ }
+ }
+ return params;
+ }
+
+ @Override
+ protected void onPostExecute(JobParameters[] params) {
+ for (JobParameters param : params) {
+ mJobService.jobFinished(param, false);
+ }
+ }
+ }
+}
diff --git a/src/com/android/tv/tuner/tvinput/TunerTvInputService.java b/src/com/android/tv/tuner/tvinput/TunerTvInputService.java
index baefe61f..684ebdbd 100644
--- a/src/com/android/tv/tuner/tvinput/TunerTvInputService.java
+++ b/src/com/android/tv/tuner/tvinput/TunerTvInputService.java
@@ -16,6 +16,8 @@
package com.android.tv.tuner.tvinput;
+import android.app.job.JobInfo;
+import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.media.tv.TvContract;
@@ -25,6 +27,7 @@ import android.util.Log;
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;
@@ -32,6 +35,7 @@ import com.android.tv.tuner.util.SystemPropertiesProxy;
import java.util.Collections;
import java.util.Set;
import java.util.WeakHashMap;
+import java.util.concurrent.TimeUnit;
/**
* {@link TunerTvInputService} serves TV channels coming from a tuner device.
@@ -41,10 +45,10 @@ 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}
private final Set<TunerSession> mTunerSessions = Collections.newSetFromMap(new WeakHashMap<>());
@@ -62,6 +66,19 @@ public class TunerTvInputService extends TvInputService
mAudioCapabilitiesReceiver = new AudioCapabilitiesReceiver(getApplicationContext(), this);
mAudioCapabilitiesReceiver.register();
mBufferManager = createBufferManager();
+ if (CommonFeatures.DVR.isEnabled(this)) {
+ JobScheduler jobScheduler =
+ (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
+ JobInfo pendingJob = jobScheduler.getPendingJob(DVR_STORAGE_CLEANUP_JOB_ID);
+ if (pendingJob != null) {
+ // storage cleaning job is already scheduled.
+ } else {
+ JobInfo job = new JobInfo.Builder(DVR_STORAGE_CLEANUP_JOB_ID,
+ new ComponentName(this, TunerStorageCleanUpService.class))
+ .setPersisted(true).setPeriodic(TimeUnit.DAYS.toMillis(1)).build();
+ jobScheduler.schedule(job);
+ }
+ }
if (mBufferManager == null) {
Log.i(TAG, "Trickplay is disabled");
} else {
diff --git a/src/com/android/tv/tuner/util/GlobalSettingsUtils.java b/src/com/android/tv/tuner/util/GlobalSettingsUtils.java
new file mode 100644
index 00000000..0cefcbed
--- /dev/null
+++ b/src/com/android/tv/tuner/util/GlobalSettingsUtils.java
@@ -0,0 +1,36 @@
+/*
+ * 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.tuner.util;
+
+import android.content.Context;
+import android.provider.Settings;
+
+/**
+ * Utility class that get information of global settings.
+ */
+public class GlobalSettingsUtils {
+ // Since global surround setting is hided, add the related variable here for checking surround
+ // sound setting when the audio is unavailable. Remove this workaround after b/31254857 fixed.
+ private static final String ENCODED_SURROUND_OUTPUT = "encoded_surround_output";
+ public static final int ENCODED_SURROUND_OUTPUT_NEVER = 1;
+
+ private GlobalSettingsUtils () { }
+
+ public static int getEncodedSurroundOutputSettings(Context context) {
+ return Settings.Global.getInt(context.getContentResolver(), ENCODED_SURROUND_OUTPUT, 0);
+ }
+}
diff --git a/src/com/android/tv/ui/AppLayerTvView.java b/src/com/android/tv/ui/AppLayerTvView.java
index eef05136..09acb36b 100644
--- a/src/com/android/tv/ui/AppLayerTvView.java
+++ b/src/com/android/tv/ui/AppLayerTvView.java
@@ -55,7 +55,7 @@ public class AppLayerTvView extends TvView {
public void onViewAdded(View child) {
if (child instanceof SurfaceView) {
// Note: See b/29118070 for detail.
- ((SurfaceView) child).setSecure(Experiments.ENABLE_DEVELOPER_FEATURES.get());
+ ((SurfaceView) child).setSecure(!Experiments.ENABLE_DEVELOPER_FEATURES.get());
}
super.onViewAdded(child);
}
diff --git a/src/com/android/tv/ui/ChannelBannerView.java b/src/com/android/tv/ui/ChannelBannerView.java
index cb371e76..3cf4de83 100644
--- a/src/com/android/tv/ui/ChannelBannerView.java
+++ b/src/com/android/tv/ui/ChannelBannerView.java
@@ -25,6 +25,7 @@ import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Bitmap;
+import android.media.tv.TvContentRating;
import android.media.tv.TvContract;
import android.media.tv.TvInputInfo;
import android.net.Uri;
@@ -57,6 +58,7 @@ import com.android.tv.data.Program;
import com.android.tv.data.StreamInfo;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.ScheduledRecording;
+import com.android.tv.parental.ContentRatingsManager;
import com.android.tv.util.ImageCache;
import com.android.tv.util.ImageLoader;
import com.android.tv.util.ImageLoader.ImageLoaderCallback;
@@ -92,6 +94,8 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
*/
public static final int LOCK_CHANNEL_INFO = 2;
+ private static final int DISPLAYED_CONTENT_RATINGS_COUNT = 3;
+
private static final String EMPTY_STRING = "";
private static Program sNoProgram;
@@ -114,6 +118,7 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
private TextView mAspectRatioTextView;
private TextView mResolutionTextView;
private TextView mAudioChannelTextView;
+ private TextView[] mContentRatingsTextViews = new TextView[DISPLAYED_CONTENT_RATINGS_COUNT];
private TextView mProgramDescriptionTextView;
private String mProgramDescriptionText;
private View mAnchorView;
@@ -121,6 +126,8 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
private Program mLastUpdatedProgram;
private final Handler mHandler = new Handler();
private final DvrManager mDvrManager;
+ private ContentRatingsManager mContentRatingsManager;
+ private TvContentRating mBlockingContentRating;
private int mLockType;
@@ -233,6 +240,8 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
} else {
mDvrManager = null;
}
+ mContentRatingsManager = TvApplication.getSingletons(getContext())
+ .getTvInputManagerHelper().getContentRatingsManager();
if (sNoProgram == null) {
sNoProgram = new Program.Builder()
@@ -284,6 +293,9 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
mAspectRatioTextView = (TextView) findViewById(R.id.aspect_ratio);
mResolutionTextView = (TextView) findViewById(R.id.resolution);
mAudioChannelTextView = (TextView) findViewById(R.id.audio_channel);
+ mContentRatingsTextViews[0] = (TextView) findViewById(R.id.content_ratings_0);
+ mContentRatingsTextViews[1] = (TextView) findViewById(R.id.content_ratings_1);
+ mContentRatingsTextViews[2] = (TextView) findViewById(R.id.content_ratings_2);
mProgramDescriptionTextView = (TextView) findViewById(R.id.program_description);
mAnchorView = findViewById(R.id.anchor);
@@ -349,6 +361,15 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
}
/**
+ * Sets the content rating that blocks the current watched channel for displaying it in the
+ * channel banner.
+ */
+ public void setBlockingContentRating(TvContentRating rating) {
+ mBlockingContentRating = rating;
+ updateProgramRatings(mMainActivity.getCurrentProgram());
+ }
+
+ /**
* Update channel banner view.
*
* @param info A StreamInfo that includes stream information.
@@ -357,8 +378,11 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
public void updateViews(StreamInfo info) {
resetAnimationEffects();
Channel channel = mMainActivity.getCurrentChannel();
- if (!Objects.equals(mCurrentChannel, channel) && isShown()) {
- scheduleHide();
+ if (!Objects.equals(mCurrentChannel, channel)) {
+ mBlockingContentRating = null;
+ if (isShown()) {
+ scheduleHide();
+ }
}
mCurrentChannel = channel;
mChannelView.setVisibility(VISIBLE);
@@ -390,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);
+ }
}
}
@@ -545,6 +572,7 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
}
updateProgramTimeInfo(program);
updateRecordingStatus(program);
+ updateProgramRatings(program);
// When the program is changed, but the previous resize animation has not ended yet,
// cancel the animation.
@@ -626,6 +654,28 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
: R.dimen.channel_banner_anchor_two_line_y);
}
+ private void updateProgramRatings(Program program) {
+ 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);
+ }
+ 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);
+ }
+ }
+ }
+
private void updateProgramTimeInfo(Program program) {
long durationMs = program.getDurationMillis();
long startTimeMs = program.getStartTimeUtcMillis();
@@ -775,4 +825,4 @@ public class ChannelBannerView extends FrameLayout implements TvTransitionManage
animator.addListener(mResizeAnimatorListener);
return animator;
}
-}
+} \ No newline at end of file
diff --git a/src/com/android/tv/ui/TunableTvView.java b/src/com/android/tv/ui/TunableTvView.java
index 44656de5..cbe459fb 100644
--- a/src/com/android/tv/ui/TunableTvView.java
+++ b/src/com/android/tv/ui/TunableTvView.java
@@ -62,7 +62,6 @@ 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.dvr.DvrManager;
import com.android.tv.parental.ContentRatingsManager;
import com.android.tv.recommendation.NotificationService;
import com.android.tv.util.NetworkUtils;
@@ -171,7 +170,6 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
@BlockScreenType private int mBlockScreenType;
- private final DvrManager mDvrManager;
private final TvInputManagerHelper mInputManager;
private final ConnectivityManager mConnectivityManager;
private final InputSessionManager mInputSessionManager;
@@ -352,10 +350,8 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
ApplicationSingletons appSingletons = TvApplication.getSingletons(context);
if (CommonFeatures.DVR.isEnabled(context)) {
- mDvrManager = appSingletons.getDvrManager();
mInputSessionManager = appSingletons.getInputSessionManager();
} else {
- mDvrManager = null;
mInputSessionManager = null;
}
mInputManager = appSingletons.getTvInputManagerHelper();
@@ -764,6 +760,7 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
/**
* Returns currently blocked content rating. {@code null} if it's not blocked.
*/
+ @Override
public TvContentRating getBlockedContentRating() {
return mBlockedContentRating;
}
@@ -1005,6 +1002,12 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
mute();
break;
case TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING:
+ mHideScreenView.setVisibility(VISIBLE);
+ mHideScreenView.setImageVisibility(false);
+ mHideScreenView.setText(null);
+ mBufferingSpinnerView.setVisibility(VISIBLE);
+ mute();
+ break;
case VIDEO_UNAVAILABLE_REASON_NOT_TUNED:
mHideScreenView.setVisibility(VISIBLE);
mHideScreenView.setImageVisibility(false);
@@ -1035,12 +1038,14 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
}
private String getTuneConflictMessage(String inputId) {
- if (mDvrManager != null && inputId != null) {
+ if (inputId != null) {
TvInputInfo input = mInputManager.getTvInputInfo(inputId);
- long time = mDvrManager.getEarliestRecordingEndTime(inputId);
- return getResources().getQuantityString(R.plurals.tvview_msg_input_no_resource,
- input.getTunerCount(),
- DateUtils.formatDateTime(getContext(), time, DateUtils.FORMAT_SHOW_TIME));
+ Long timeMs = mInputSessionManager.getEarliestRecordingSessionEndTimeMs(inputId);
+ if (timeMs != null) {
+ return getResources().getQuantityString(R.plurals.tvview_msg_input_no_resource,
+ input.getTunerCount(),
+ DateUtils.formatDateTime(getContext(), timeMs, DateUtils.FORMAT_SHOW_TIME));
+ }
}
return null;
}
diff --git a/src/com/android/tv/ui/ViewUtils.java b/src/com/android/tv/ui/ViewUtils.java
index 5a853dcd..ac181752 100644
--- a/src/com/android/tv/ui/ViewUtils.java
+++ b/src/com/android/tv/ui/ViewUtils.java
@@ -16,8 +16,11 @@
package com.android.tv.ui;
+import android.animation.Animator;
+import android.animation.ValueAnimator;
import android.util.Log;
import android.view.View;
+import android.view.ViewGroup.LayoutParams;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -42,4 +45,49 @@ public class ViewUtils {
Log.e(TAG, "Fail to call View.setTransitionAlpha", e);
}
}
-}
+
+ /**
+ * Creates an animator in view's height
+ * @param target the {@link view} animator performs on.
+ */
+ public static Animator createHeightAnimator(
+ final View target, int initialHeight, int targetHeight) {
+ ValueAnimator animator = ValueAnimator.ofInt(initialHeight, targetHeight);
+ animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int value = (Integer) animation.getAnimatedValue();
+ if (value == 0) {
+ if (target.getVisibility() != View.GONE) {
+ target.setVisibility(View.GONE);
+ }
+ } else {
+ if (target.getVisibility() != View.VISIBLE) {
+ target.setVisibility(View.VISIBLE);
+ }
+ setLayoutHeight(target, value);
+ }
+ }
+ });
+ return animator;
+ }
+
+ /**
+ * Gets view's layout height.
+ */
+ public static int getLayoutHeight(View view) {
+ LayoutParams layoutParams = view.getLayoutParams();
+ return layoutParams.height;
+ }
+
+ /**
+ * Sets view's layout height.
+ */
+ public static void setLayoutHeight(View view, int height) {
+ LayoutParams layoutParams = view.getLayoutParams();
+ if (height != layoutParams.height) {
+ layoutParams.height = height;
+ view.setLayoutParams(layoutParams);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java b/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java
index 067c6292..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;
@@ -27,6 +29,7 @@ import com.android.tv.TvApplication;
import com.android.tv.common.BuildConfig;
import com.android.tv.data.epg.EpgFetcher;
import com.android.tv.experiments.Experiments;
+import com.android.tv.tuner.TunerPreferences;
import java.util.ArrayList;
import java.util.List;
@@ -59,6 +62,33 @@ 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)) {
+ @Override
+ protected void onUpdate() {
+ super.onUpdate();
+ setChecked(TunerPreferences.getStoreTsStream(getContext()));
+ }
+
+ @Override
+ protected void onSelected() {
+ super.onSelected();
+ TunerPreferences.setStoreTsStream(getContext(), isChecked());
+ }
+ });
return items;
}
diff --git a/src/com/android/tv/ui/sidepanel/SideFragment.java b/src/com/android/tv/ui/sidepanel/SideFragment.java
index 30e885a5..8df56cd2 100644
--- a/src/com/android/tv/ui/sidepanel/SideFragment.java
+++ b/src/com/android/tv/ui/sidepanel/SideFragment.java
@@ -235,6 +235,9 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
void onSideFragmentViewDestroyed();
}
+ /**
+ * Preloads the view holders.
+ */
public static void preloadRecycledViews(Context context) {
if (sRecycledViewPool != null) {
return;
@@ -252,6 +255,13 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
}
}
+ /**
+ * Releases the pre-loaded view holders.
+ */
+ public static void releasePreloadedRecycledViews() {
+ sRecycledViewPool = null;
+ }
+
private static class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {
private final LayoutInflater mLayoutInflater;
private List<Item> mItems;
diff --git a/src/com/android/tv/ui/sidepanel/SideFragmentManager.java b/src/com/android/tv/ui/sidepanel/SideFragmentManager.java
index faccbc66..553cd9d7 100644
--- a/src/com/android/tv/ui/sidepanel/SideFragmentManager.java
+++ b/src/com/android/tv/ui/sidepanel/SideFragmentManager.java
@@ -22,6 +22,7 @@ import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
+import android.os.Handler;
import android.view.View;
import com.android.tv.R;
@@ -42,6 +43,7 @@ public class SideFragmentManager {
private final Animator mShowAnimator;
private final Animator mHideAnimator;
+ private final Handler mHandler = new Handler();
private final Runnable mHideAllRunnable = new Runnable() {
@Override
public void run() {
@@ -154,6 +156,7 @@ public class SideFragmentManager {
}
private void hideAllInternal() {
+ mHandler.removeCallbacksAndMessages(null);
if (mFragmentCount == 0) {
return;
}
@@ -192,8 +195,8 @@ public class SideFragmentManager {
* stack. If you want to empty the back stack, call {@link #hideAll}.
*/
public void hideSidePanel(boolean withAnimation) {
+ mHandler.removeCallbacks(mHideAllRunnable);
if (withAnimation) {
- mPanel.removeCallbacks(mHideAllRunnable);
Animator hideAnimator =
AnimatorInflater.loadAnimator(mActivity, R.animator.side_panel_exit);
hideAnimator.setTarget(mPanel);
@@ -213,9 +216,12 @@ public class SideFragmentManager {
return mPanel.getVisibility() == View.VISIBLE;
}
+ /**
+ * Resets the timer for hiding side fragment.
+ */
public void scheduleHideAll() {
- mPanel.removeCallbacks(mHideAllRunnable);
- mPanel.postDelayed(mHideAllRunnable, mShowDurationMillis);
+ mHandler.removeCallbacks(mHideAllRunnable);
+ mHandler.postDelayed(mHideAllRunnable, mShowDurationMillis);
}
/**
diff --git a/src/com/android/tv/util/AsyncDbTask.java b/src/com/android/tv/util/AsyncDbTask.java
index 8bcdb294..78243642 100644
--- a/src/com/android/tv/util/AsyncDbTask.java
+++ b/src/com/android/tv/util/AsyncDbTask.java
@@ -29,9 +29,9 @@ import android.util.Log;
import android.util.Range;
import com.android.tv.common.SoftPreconditions;
-import com.android.tv.dvr.RecordedProgram;
import com.android.tv.data.Channel;
import com.android.tv.data.Program;
+import com.android.tv.dvr.RecordedProgram;
import java.util.ArrayList;
import java.util.List;
@@ -162,7 +162,7 @@ public abstract class AsyncDbTask<Params, Progress, Result>
@Override
public String toString() {
- return this.getClass().getSimpleName() + "(" + mUri + ")";
+ return this.getClass().getName() + "(" + mUri + ")";
}
}
diff --git a/src/com/android/tv/util/CompositeComparator.java b/src/com/android/tv/util/CompositeComparator.java
new file mode 100644
index 00000000..47cf50fe
--- /dev/null
+++ b/src/com/android/tv/util/CompositeComparator.java
@@ -0,0 +1,42 @@
+/*
+ * 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.Comparator;
+
+/**
+ * A comparator which runs multiple comparators sequentially.
+ */
+public class CompositeComparator<T> implements Comparator<T> {
+ private final Comparator<T>[] mComparators;
+
+ @SafeVarargs
+ public CompositeComparator(Comparator<T>... comparators) {
+ mComparators = comparators;
+ }
+
+ @Override
+ public int compare(T lhs, T rhs) {
+ for (Comparator<T> comparator : mComparators) {
+ int result = comparator.compare(lhs, rhs);
+ if (result != 0) {
+ return result;
+ }
+ }
+ return 0;
+ }
+}
diff --git a/src/com/android/tv/util/DvrTunerStorageUtils.java b/src/com/android/tv/util/DvrTunerStorageUtils.java
deleted file mode 100644
index 534a95ef..00000000
--- a/src/com/android/tv/util/DvrTunerStorageUtils.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.util;
-
-import android.os.Environment;
-import android.content.Context;
-import android.os.StatFs;
-import android.os.storage.StorageManager;
-import android.os.storage.StorageVolume;
-
-import com.android.tv.common.feature.CommonFeatures;
-
-import java.io.File;
-
-/**
- * A utility class for storage usage of DVR recording.
- */
-public class DvrTunerStorageUtils {
- // STOPSHIP: turn off ALLOW_REMOVABLE_STORAGE. b/30768857
- private static final boolean ALLOW_REMOVABLE_STORAGE = true;
-
- private static final long MIN_STORAGE_SIZE_FOR_DVR_IN_BYTES = 50 * 1024 * 1024 * 1024L;
- private static final long MIN_FREE_STORAGE_SIZE_FOR_DVR_IN_BYTES = 10 * 1024 * 1024 * 1024L;
- private static final String RECORDING_DATA_SUB_PATH = "/recording/";
- // Since {@link StorageVolume#getUuid} will return null for internal storage and {@code null}
- // should be used for missing storage status, we need the internal storage specifier.
- private static final String INTERNAL_STORAGE_UUID = "internal_storage_uuid";
-
- /**
- * Returns the path to DVR recording data directory.
- * @param context {@link Context}
- * @param recordingId unique {@link String} specifier for each recording
- * @return {@link File}
- */
- public static File getRecordingDataDirectory(Context context, String recordingId) {
- File recordingDataRootDir = getRootDirectory(context);
- if (recordingDataRootDir == null) {
- return null;
- }
- return new File(recordingDataRootDir + RECORDING_DATA_SUB_PATH + recordingId);
- }
-
- /**
- * Returns the unique identifier for the storage which will be used to store recordings.
- * @param context {@link Context}
- * @return {@link String} of the unique identifier when storage exists, {@code null} otherwise
- */
- public static String getRecordingStorageUuid(Context context) {
- File recordingDataRootDir = getRootDirectory(context);
- StorageManager manager = (StorageManager) context.getSystemService(context.STORAGE_SERVICE);
- StorageVolume volume = manager.getStorageVolume(recordingDataRootDir);
- if (volume == null) {
- return null;
- }
- if (!Environment.MEDIA_MOUNTED.equals(volume.getState())) {
- return null;
- }
- String uuid = volume.getUuid();
- return uuid == null ? INTERNAL_STORAGE_UUID : uuid;
- }
-
- /**
- * Returns whether the storage has sufficient storage.
- * @param context {@link Context}
- * @return {@code true} when there is sufficient storage, {@code false} otherwise
- */
- public static boolean isStorageSufficient(Context context) {
- File recordingDataRootDir = getRootDirectory(context);
- if (recordingDataRootDir == null || !recordingDataRootDir.isDirectory()) {
- return false;
- }
- if (CommonFeatures.FORCE_RECORDING_UNTIL_NO_SPACE.isEnabled(context)) {
- return true;
- }
- StatFs statFs = new StatFs(recordingDataRootDir.toString());
- return statFs.getTotalBytes() >= MIN_STORAGE_SIZE_FOR_DVR_IN_BYTES
- && statFs.getAvailableBytes() >= MIN_FREE_STORAGE_SIZE_FOR_DVR_IN_BYTES;
- }
-
- private static File getRootDirectory(Context context) {
- if (!ALLOW_REMOVABLE_STORAGE) {
- return context.getExternalFilesDir(null);
- }
- File[] dirs = context.getExternalFilesDirs(null);
- if (dirs == null) {
- return null;
- }
- for (File dir : dirs) {
- if (dir == null) {
- continue;
- }
- StatFs statFs = new StatFs(dir.toString());
- if (statFs.getTotalBytes() >= MIN_STORAGE_SIZE_FOR_DVR_IN_BYTES
- && statFs.getAvailableBytes() >= MIN_FREE_STORAGE_SIZE_FOR_DVR_IN_BYTES) {
- return dir;
- }
- }
- return dirs[0];
- }
-}
diff --git a/src/com/android/tv/util/LocationUtils.java b/src/com/android/tv/util/LocationUtils.java
index 406a9d88..8e3b59e9 100644
--- a/src/com/android/tv/util/LocationUtils.java
+++ b/src/com/android/tv/util/LocationUtils.java
@@ -25,6 +25,7 @@ import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
+
import java.io.IOException;
import java.util.List;
import java.util.Locale;
@@ -36,36 +37,6 @@ public class LocationUtils {
private static final String TAG = "LocationUtils";
private static final boolean DEBUG = false;
- private static final LocationListener LOCATION_LISTENER = new LocationListener() {
- @Override
- public void onLocationChanged(Location location) {
- Geocoder geocoder = new Geocoder(sApplicationContext, Locale.getDefault());
- try {
- List<Address> addresses = geocoder.getFromLocation(location.getLatitude(),
- location.getLongitude(), 1);
- if (addresses != null) {
- sAddress = addresses.get(0);
- if (DEBUG) Log.d(TAG, "returned address: " + sAddress);
- } else {
- if (DEBUG) Log.d(TAG, "No address returned");
- }
- sError = null;
- } catch (IOException e) {
- Log.w(TAG, "Error in retrieving address", e);
- sError = e;
- }
- }
-
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) { }
-
- @Override
- public void onProviderEnabled(String provider) { }
-
- @Override
- public void onProviderDisabled(String provider) { }
- };
-
private static Context sApplicationContext;
private static Address sAddress;
private static IOException sError;
@@ -83,19 +54,67 @@ public class LocationUtils {
}
if (sApplicationContext == null) {
sApplicationContext = context.getApplicationContext();
- LocationManager mLocationManager = (LocationManager) context.getSystemService(
- Context.LOCATION_SERVICE);
- try {
- mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 10,
- LOCATION_LISTENER, null);
- } catch (SecurityException e) {
- // Enables requesting the location updates again.
- sApplicationContext = null;
- throw e;
- }
}
+ LocationUtilsHelper.startLocationUpdates();
return null;
}
+ private static void updateAddress(Location location) {
+ if (DEBUG) Log.d(TAG, "Updating address with " + location);
+ if (location == null) {
+ return;
+ }
+ Geocoder geocoder = new Geocoder(sApplicationContext, Locale.getDefault());
+ try {
+ List<Address> addresses = geocoder.getFromLocation(
+ location.getLatitude(), location.getLongitude(), 1);
+ if (addresses != null) {
+ sAddress = addresses.get(0);
+ if (DEBUG) Log.d(TAG, "Got " + sAddress);
+ } else {
+ if (DEBUG) Log.d(TAG, "No address returned");
+ }
+ sError = null;
+ } catch (IOException e) {
+ Log.w(TAG, "Error in updating address", e);
+ sError = e;
+ }
+ }
+
private LocationUtils() { }
+
+ private static class LocationUtilsHelper {
+ private static final LocationListener LOCATION_LISTENER = new LocationListener() {
+ @Override
+ public void onLocationChanged(Location location) {
+ updateAddress(location);
+ }
+
+ @Override
+ public void onStatusChanged(String provider, int status, Bundle extras) { }
+
+ @Override
+ public void onProviderEnabled(String provider) { }
+
+ @Override
+ public void onProviderDisabled(String provider) { }
+ };
+
+ private static LocationManager sLocationManager;
+
+ public static void startLocationUpdates() {
+ if (sLocationManager == null) {
+ sLocationManager = (LocationManager) sApplicationContext.getSystemService(
+ Context.LOCATION_SERVICE);
+ try {
+ sLocationManager.requestLocationUpdates(
+ LocationManager.NETWORK_PROVIDER, 1000, 10, LOCATION_LISTENER, null);
+ } catch (SecurityException e) {
+ // Enables requesting the location updates again.
+ sLocationManager = null;
+ throw e;
+ }
+ }
+ }
+ }
}
diff --git a/src/com/android/tv/util/PermissionUtils.java b/src/com/android/tv/util/PermissionUtils.java
index a443ede7..453885a4 100644
--- a/src/com/android/tv/util/PermissionUtils.java
+++ b/src/com/android/tv/util/PermissionUtils.java
@@ -7,6 +7,11 @@ import android.content.pm.PackageManager;
* Util class to handle permissions.
*/
public class PermissionUtils {
+ /**
+ * Permission to read the TV listings.
+ */
+ public static final String PERMISSION_READ_TV_LISTINGS = "android.permission.READ_TV_LISTINGS";
+
private static Boolean sHasAccessAllEpgPermission;
private static Boolean sHasAccessWatchedHistoryPermission;
private static Boolean sHasModifyParentalControlsPermission;
@@ -39,7 +44,7 @@ public class PermissionUtils {
}
public static boolean hasReadTvListings(Context context) {
- return context.checkSelfPermission("android.permission.READ_TV_LISTINGS")
+ return context.checkSelfPermission(PERMISSION_READ_TV_LISTINGS)
== PackageManager.PERMISSION_GRANTED;
}
}
diff --git a/src/com/android/tv/util/PipInputManager.java b/src/com/android/tv/util/PipInputManager.java
index 03bdc681..2c51d5a0 100644
--- a/src/com/android/tv/util/PipInputManager.java
+++ b/src/com/android/tv/util/PipInputManager.java
@@ -149,6 +149,7 @@ public class PipInputManager {
if (mStarted) {
return;
}
+ mStarted = true;
mInputManager.addCallback(mTvInputCallback);
mChannelTuner.addListener(mChannelTunerListener);
initializePipInputList();
@@ -161,6 +162,7 @@ public class PipInputManager {
if (!mStarted) {
return;
}
+ mStarted = false;
mInputManager.removeCallback(mTvInputCallback);
mChannelTuner.removeListener(mChannelTunerListener);
mPipInputMap.clear();
diff --git a/src/com/android/tv/util/RecurringRunner.java b/src/com/android/tv/util/RecurringRunner.java
index 469170ed..4135bd4e 100644
--- a/src/com/android/tv/util/RecurringRunner.java
+++ b/src/com/android/tv/util/RecurringRunner.java
@@ -126,10 +126,7 @@ public final class RecurringRunner {
return next;
}
- /**
- * Resets the next run time.
- */
- public long resetNextRunTime() {
+ private long resetNextRunTime() {
long next = System.currentTimeMillis() + mIntervalMs;
getSharedPreferences().edit().putLong(mName, next).apply();
return next;
diff --git a/src/com/android/tv/util/SetupUtils.java b/src/com/android/tv/util/SetupUtils.java
index 1213d317..8223a81c 100644
--- a/src/com/android/tv/util/SetupUtils.java
+++ b/src/com/android/tv/util/SetupUtils.java
@@ -20,6 +20,8 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.media.tv.TvContract;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager;
@@ -35,6 +37,8 @@ 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.data.epg.EpgFetcher;
+import com.android.tv.experiments.Experiments;
import com.android.tv.tuner.tvinput.TunerTvInputService;
import java.util.Collections;
@@ -267,7 +271,8 @@ public class SetupUtils {
// Find all already-verified packages.
Set<String> setUpPackages = new HashSet<>();
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
- for (String input : sp.getStringSet(PREF_KEY_SET_UP_INPUTS, Collections.<String>emptySet())) {
+ for (String input : sp.getStringSet(PREF_KEY_SET_UP_INPUTS,
+ Collections.<String>emptySet())) {
if (!TextUtils.isEmpty(input)) {
ComponentName componentName = ComponentName.unflattenFromString(input);
if (componentName != null) {
@@ -330,14 +335,28 @@ public class SetupUtils {
removedInputList.remove(mTunerInputId);
if (!removedInputList.isEmpty()) {
+ boolean inputPackageDeleted = false;
for (String input : removedInputList) {
- mRecognizedInputs.remove(input);
- mSetUpInputs.remove(input);
- mKnownInputs.remove(input);
+ try {
+ // Just after booting, input list from TvInputManager are not reliable.
+ // So we need to double-check package existence. b/29034900
+ mTvApplication.getPackageManager().getPackageInfo(
+ ComponentName.unflattenFromString(input)
+ .getPackageName(), PackageManager.GET_ACTIVITIES);
+ Log.i(TAG, "TV input (" + input + ") is removed but package is not deleted");
+ } catch (NameNotFoundException e) {
+ Log.i(TAG, "TV input (" + input + ") and its package are removed");
+ mRecognizedInputs.remove(input);
+ mSetUpInputs.remove(input);
+ mKnownInputs.remove(input);
+ inputPackageDeleted = true;
+ }
+ }
+ if (inputPackageDeleted) {
+ mSharedPreferences.edit().putStringSet(PREF_KEY_SET_UP_INPUTS, mSetUpInputs)
+ .putStringSet(PREF_KEY_KNOWN_INPUTS, mKnownInputs)
+ .putStringSet(PREF_KEY_RECOGNIZED_INPUTS, mRecognizedInputs).apply();
}
- mSharedPreferences.edit().putStringSet(PREF_KEY_SET_UP_INPUTS, mSetUpInputs)
- .putStringSet(PREF_KEY_KNOWN_INPUTS, mKnownInputs)
- .putStringSet(PREF_KEY_RECOGNIZED_INPUTS, mRecognizedInputs).apply();
}
}
@@ -345,7 +364,7 @@ public class SetupUtils {
* Called when an setup is done. Once it is called, {@link #isSetupDone} returns {@code true}
* for {@code inputId}.
*/
- public void onSetupDone(String inputId) {
+ private void onSetupDone(String inputId) {
SoftPreconditions.checkState(inputId != null);
if (DEBUG) Log.d(TAG, "onSetupDone: input=" + inputId);
if (!mRecognizedInputs.contains(inputId)) {
@@ -363,5 +382,13 @@ public class SetupUtils {
mSetUpInputs.add(inputId);
mSharedPreferences.edit().putStringSet(PREF_KEY_SET_UP_INPUTS, mSetUpInputs).apply();
}
+ // Start fetching program guide data for internal tuners.
+ Context context = mTvApplication.getApplicationContext();
+ if (Utils.isInternalTvInput(context, inputId)) {
+ if (context.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
+ == PackageManager.PERMISSION_GRANTED && Experiments.CLOUD_EPG.get()) {
+ EpgFetcher.getInstance(context).startImmediately();
+ }
+ }
}
}
diff --git a/src/com/android/tv/util/SystemProperties.java b/src/com/android/tv/util/SystemProperties.java
index 235161b6..e737f233 100644
--- a/src/com/android/tv/util/SystemProperties.java
+++ b/src/com/android/tv/util/SystemProperties.java
@@ -36,12 +36,6 @@ public final class SystemProperties {
"tv_allow_strict_mode", true);
/**
- * Allow Strict death penalty for eng builds.
- */
- public static final BooleanSystemProperty ALLOW_DEATH_PENALTY = new BooleanSystemProperty(
- "tv_allow_death_penalty", true);
-
- /**
* When true {@link android.view.KeyEvent}s are logged. Defaults to false.
*/
public static final BooleanSystemProperty LOG_KEYEVENT = new BooleanSystemProperty(
diff --git a/src/com/android/tv/util/ToastUtils.java b/src/com/android/tv/util/ToastUtils.java
new file mode 100644
index 00000000..34346b2a
--- /dev/null
+++ b/src/com/android/tv/util/ToastUtils.java
@@ -0,0 +1,43 @@
+/*
+ * 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 android.content.Context;
+import android.support.annotation.MainThread;
+import android.widget.Toast;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * A utility class for the toast message.
+ */
+public class ToastUtils {
+ private static WeakReference<Toast> sToast;
+
+ /**
+ * Shows the toast message after canceling the previous one.
+ */
+ @MainThread
+ public static void show(Context context, CharSequence text, int duration) {
+ if (sToast != null && sToast.get() != null) {
+ sToast.get().cancel();
+ }
+ Toast toast = Toast.makeText(context, text, duration);
+ toast.show();
+ sToast = new WeakReference<>(toast);
+ }
+}
diff --git a/src/com/android/tv/util/TvSettings.java b/src/com/android/tv/util/TvSettings.java
index 4a65cbbe..97ff59d6 100644
--- a/src/com/android/tv/util/TvSettings.java
+++ b/src/com/android/tv/util/TvSettings.java
@@ -34,9 +34,6 @@ import java.util.Set;
public final class TvSettings {
private TvSettings() {}
- public static final String PREFS_FILE = "settings";
- public static final String PREF_TV_WATCH_LOGGING_ENABLED = "tv_watch_logging_enabled";
- public static final String PREF_CLOSED_CAPTION_ENABLED = "is_cc_enabled"; // boolean value
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
@@ -49,7 +46,6 @@ public final class TvSettings {
public @interface PipSound {}
public static final int PIP_SOUND_MAIN = 0;
public static final int PIP_SOUND_PIP_WINDOW = PIP_SOUND_MAIN + 1;
- public static final int PIP_SOUND_LAST = PIP_SOUND_PIP_WINDOW;
// PIP layouts
@Retention(RetentionPolicy.SOURCE)
diff --git a/src/com/android/tv/util/Utils.java b/src/com/android/tv/util/Utils.java
index 9f90c69f..99d34431 100644
--- a/src/com/android/tv/util/Utils.java
+++ b/src/com/android/tv/util/Utils.java
@@ -37,6 +37,7 @@ import android.support.annotation.VisibleForTesting;
import android.support.annotation.WorkerThread;
import android.text.TextUtils;
import android.text.format.DateUtils;
+import android.util.ArraySet;
import android.util.Log;
import android.view.View;
@@ -77,7 +78,6 @@ public class Utils {
public static final String EXTRA_KEY_ACTION = "action";
public static final String EXTRA_ACTION_SHOW_TV_INPUT ="show_tv_input";
public static final String EXTRA_KEY_FROM_LAUNCHER = "from_launcher";
- public static final String EXTRA_KEY_RECORDING_URI = "recording_uri";
public static final String EXTRA_KEY_RECORDED_PROGRAM_ID = "recorded_program_id";
public static final String EXTRA_KEY_RECORDED_PROGRAM_SEEK_TIME = "recorded_program_seek_time";
public static final String EXTRA_KEY_RECORDED_PROGRAM_PIN_CHECKED =
@@ -119,7 +119,7 @@ public class Utils {
// Hardcoded list for known bundled inputs not written by OEM/SOCs.
// Bundled (system) inputs not in the list will get the high priority
// so they and their channels come first in the UI.
- private static final Set<String> BUNDLED_PACKAGE_SET = new HashSet<>();
+ private static final Set<String> BUNDLED_PACKAGE_SET = new ArraySet<>();
static {
BUNDLED_PACKAGE_SET.add("com.android.tv");
@@ -803,6 +803,18 @@ public class Utils {
}
/**
+ * Checks whether a given input is a bundled input.
+ */
+ public static boolean isBundledInput(String inputId) {
+ for (String prefix : BUNDLED_PACKAGE_SET) {
+ if (inputId.startsWith(prefix + "/")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Returns the canonical genre ID's from the {@code genres}.
*/
public static int[] getCanonicalGenreIds(String genres) {
diff --git a/tests/common/res/drawable-xhdpi/blue.png b/tests/common/res/drawable-xhdpi/blue.png
index dd2044ca..a0c4eced 100644
--- a/tests/common/res/drawable-xhdpi/blue.png
+++ b/tests/common/res/drawable-xhdpi/blue.png
Binary files differ
diff --git a/tests/common/res/drawable-xhdpi/blue_small.png b/tests/common/res/drawable-xhdpi/blue_small.png
index 22394ebb..ae9c9608 100644
--- a/tests/common/res/drawable-xhdpi/blue_small.png
+++ b/tests/common/res/drawable-xhdpi/blue_small.png
Binary files differ
diff --git a/tests/common/res/drawable-xhdpi/crash_test_android_logo.png b/tests/common/res/drawable-xhdpi/crash_test_android_logo.png
index 2442cf04..5d6d5826 100644
--- a/tests/common/res/drawable-xhdpi/crash_test_android_logo.png
+++ b/tests/common/res/drawable-xhdpi/crash_test_android_logo.png
Binary files differ
diff --git a/tests/common/res/drawable-xhdpi/green.png b/tests/common/res/drawable-xhdpi/green.png
index 8306b9c3..54f1319a 100644
--- a/tests/common/res/drawable-xhdpi/green.png
+++ b/tests/common/res/drawable-xhdpi/green.png
Binary files differ
diff --git a/tests/common/res/drawable-xhdpi/green_large.png b/tests/common/res/drawable-xhdpi/green_large.png
index 77bbb231..928c348b 100644
--- a/tests/common/res/drawable-xhdpi/green_large.png
+++ b/tests/common/res/drawable-xhdpi/green_large.png
Binary files differ
diff --git a/tests/common/res/drawable-xhdpi/red.png b/tests/common/res/drawable-xhdpi/red.png
index 89f889b9..4ddd30e3 100644
--- a/tests/common/res/drawable-xhdpi/red.png
+++ b/tests/common/res/drawable-xhdpi/red.png
Binary files differ
diff --git a/tests/common/res/drawable-xhdpi/red_large.png b/tests/common/res/drawable-xhdpi/red_large.png
index c52a1242..58682b15 100644
--- a/tests/common/res/drawable-xhdpi/red_large.png
+++ b/tests/common/res/drawable-xhdpi/red_large.png
Binary files differ
diff --git a/tests/common/src/com/android/tv/testing/ChannelInfo.java b/tests/common/src/com/android/tv/testing/ChannelInfo.java
index 99430461..af1c9891 100644
--- a/tests/common/src/com/android/tv/testing/ChannelInfo.java
+++ b/tests/common/src/com/android/tv/testing/ChannelInfo.java
@@ -42,8 +42,6 @@ public final class ChannelInfo {
* If this is specify for logo, it will be selected randomly including null.
*/
public static final String GENERATE_LOGO = "GEN";
- // If the logo is set to {@link ChannelInfo#GENERATE_LOGO}, pick one randomly from this list.
- private static final int[] LOGOS_RES = {0, R.drawable.crash_test_android_logo};
public static final String[] PROJECTION = {
TvContract.Channels.COLUMN_DISPLAY_NUMBER,
diff --git a/tests/common/src/com/android/tv/testing/Constants.java b/tests/common/src/com/android/tv/testing/Constants.java
index 83d8d293..4c9cb5fb 100644
--- a/tests/common/src/com/android/tv/testing/Constants.java
+++ b/tests/common/src/com/android/tv/testing/Constants.java
@@ -36,8 +36,6 @@ public final class Constants {
.setVideoFrameRate(50).build();
public static final TvTrackInfo SVGA_VIDEO_TRACK = new TvTrackInfo.Builder(
TvTrackInfo.TYPE_VIDEO, "SVGA Video").setVideoHeight(600).setVideoWidth(800).build();
- public static final TvTrackInfo GENERIC_VIDEO_TRACK = new TvTrackInfo.Builder(
- TvTrackInfo.TYPE_VIDEO, "Generic Video").build();
private Constants() {
}
diff --git a/tests/common/src/com/android/tv/testing/ProgramUtils.java b/tests/common/src/com/android/tv/testing/ProgramUtils.java
index f7f26431..08c6a033 100644
--- a/tests/common/src/com/android/tv/testing/ProgramUtils.java
+++ b/tests/common/src/com/android/tv/testing/ProgramUtils.java
@@ -20,6 +20,7 @@ import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
+import android.database.sqlite.SQLiteException;
import android.media.tv.TvContract;
import android.media.tv.TvContract.Programs;
import android.net.Uri;
@@ -82,8 +83,13 @@ public class ProgramUtils {
if (list.size() >= MAX_DB_INSERT_COUNT_AT_ONCE
|| timeMs >= targetEndTimeMs) {
- context.getContentResolver().bulkInsert(Programs.CONTENT_URI,
- list.toArray(new ContentValues[list.size()]));
+ try {
+ context.getContentResolver().bulkInsert(Programs.CONTENT_URI,
+ list.toArray(new ContentValues[list.size()]));
+ } catch (SQLiteException e) {
+ Log.e(TAG, "Can't insert EPG.", e);
+ return;
+ }
if (DEBUG) Log.d(TAG, "Inserted " + list.size() + " programs for " + channelUri);
list.clear();
}
diff --git a/tests/common/src/com/android/tv/testing/TvContentRatingConstants.java b/tests/common/src/com/android/tv/testing/TvContentRatingConstants.java
index b80d56f9..c4c96fed 100644
--- a/tests/common/src/com/android/tv/testing/TvContentRatingConstants.java
+++ b/tests/common/src/com/android/tv/testing/TvContentRatingConstants.java
@@ -58,7 +58,4 @@ public final class TvContentRatingConstants {
public static final TvContentRating CONTENT_RATING_US_TV_PG_US_TV_L_US_TV_S =
TvContentRating.createRating("com.android.tv", "US_TV", "US_TV_PG", "US_TV_L",
"US_TV_S");
-
- public static String STRING_US_TV_PG_US_TV_L_US_TV_S
- = "com.android.tv/US_TV/US_TV_Y7/US_TV_L/US_TV_S";
}
diff --git a/tests/input/res/drawable-xhdpi/android_48dp.png b/tests/input/res/drawable-xhdpi/android_48dp.png
index 9ea1cd14..9359abe5 100644
--- a/tests/input/res/drawable-xhdpi/android_48dp.png
+++ b/tests/input/res/drawable-xhdpi/android_48dp.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_1000_logo.png b/tests/input/res/drawable-xhdpi/ch_1000_logo.png
index 1fb2569d..eec6d373 100644
--- a/tests/input/res/drawable-xhdpi/ch_1000_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_1000_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_100_logo.png b/tests/input/res/drawable-xhdpi/ch_100_logo.png
index fd627a6d..3a8b6731 100644
--- a/tests/input/res/drawable-xhdpi/ch_100_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_100_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_101_logo.png b/tests/input/res/drawable-xhdpi/ch_101_logo.png
index 5cb4c11a..2977ef1d 100644
--- a/tests/input/res/drawable-xhdpi/ch_101_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_101_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_102_logo.png b/tests/input/res/drawable-xhdpi/ch_102_logo.png
index b590b2ef..978112e1 100644
--- a/tests/input/res/drawable-xhdpi/ch_102_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_102_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_103_logo.png b/tests/input/res/drawable-xhdpi/ch_103_logo.png
index 3228ec01..ceb1fd6a 100644
--- a/tests/input/res/drawable-xhdpi/ch_103_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_103_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_104_logo.png b/tests/input/res/drawable-xhdpi/ch_104_logo.png
index 17d497cb..c927568d 100644
--- a/tests/input/res/drawable-xhdpi/ch_104_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_104_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_105_logo.png b/tests/input/res/drawable-xhdpi/ch_105_logo.png
index e6282624..8e1be19d 100644
--- a/tests/input/res/drawable-xhdpi/ch_105_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_105_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_106_logo.png b/tests/input/res/drawable-xhdpi/ch_106_logo.png
index 9f7d11c8..a19c9ef8 100644
--- a/tests/input/res/drawable-xhdpi/ch_106_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_106_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_107_logo.png b/tests/input/res/drawable-xhdpi/ch_107_logo.png
index acf25db1..9d36a488 100644
--- a/tests/input/res/drawable-xhdpi/ch_107_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_107_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_108_logo.png b/tests/input/res/drawable-xhdpi/ch_108_logo.png
index a9a0446f..700ae189 100644
--- a/tests/input/res/drawable-xhdpi/ch_108_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_108_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_109_logo.png b/tests/input/res/drawable-xhdpi/ch_109_logo.png
index 6bba9f5a..209e3b47 100644
--- a/tests/input/res/drawable-xhdpi/ch_109_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_109_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_10_logo.png b/tests/input/res/drawable-xhdpi/ch_10_logo.png
index 7f7041ac..76b3a9b2 100644
--- a/tests/input/res/drawable-xhdpi/ch_10_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_10_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_110_logo.png b/tests/input/res/drawable-xhdpi/ch_110_logo.png
index d3f04154..0c0c1920 100644
--- a/tests/input/res/drawable-xhdpi/ch_110_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_110_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_111_logo.png b/tests/input/res/drawable-xhdpi/ch_111_logo.png
index 08a8a272..07c7ee83 100644
--- a/tests/input/res/drawable-xhdpi/ch_111_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_111_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_112_logo.png b/tests/input/res/drawable-xhdpi/ch_112_logo.png
index 46bfd644..1675e54d 100644
--- a/tests/input/res/drawable-xhdpi/ch_112_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_112_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_113_logo.png b/tests/input/res/drawable-xhdpi/ch_113_logo.png
index dfd5bb0e..57cc81ce 100644
--- a/tests/input/res/drawable-xhdpi/ch_113_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_113_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_114_logo.png b/tests/input/res/drawable-xhdpi/ch_114_logo.png
index f5e5b8ec..3d57f201 100644
--- a/tests/input/res/drawable-xhdpi/ch_114_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_114_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_115_logo.png b/tests/input/res/drawable-xhdpi/ch_115_logo.png
index 9c507671..3897f5c9 100644
--- a/tests/input/res/drawable-xhdpi/ch_115_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_115_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_116_logo.png b/tests/input/res/drawable-xhdpi/ch_116_logo.png
index f05f3d55..83a55a67 100644
--- a/tests/input/res/drawable-xhdpi/ch_116_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_116_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_117_logo.png b/tests/input/res/drawable-xhdpi/ch_117_logo.png
index 0d4d0164..4b4eccf0 100644
--- a/tests/input/res/drawable-xhdpi/ch_117_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_117_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_118_logo.png b/tests/input/res/drawable-xhdpi/ch_118_logo.png
index 6c4aaea0..4a682f67 100644
--- a/tests/input/res/drawable-xhdpi/ch_118_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_118_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_119_logo.png b/tests/input/res/drawable-xhdpi/ch_119_logo.png
index 4f7c9584..2a2aed5e 100644
--- a/tests/input/res/drawable-xhdpi/ch_119_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_119_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_11_logo.png b/tests/input/res/drawable-xhdpi/ch_11_logo.png
index 94cd25aa..62268929 100644
--- a/tests/input/res/drawable-xhdpi/ch_11_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_11_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_120_logo.png b/tests/input/res/drawable-xhdpi/ch_120_logo.png
index d8f5c667..46c5f97a 100644
--- a/tests/input/res/drawable-xhdpi/ch_120_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_120_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_121_logo.png b/tests/input/res/drawable-xhdpi/ch_121_logo.png
index 5e0c64ea..650bd3e4 100644
--- a/tests/input/res/drawable-xhdpi/ch_121_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_121_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_122_logo.png b/tests/input/res/drawable-xhdpi/ch_122_logo.png
index 8e36412a..5a3c5d7b 100644
--- a/tests/input/res/drawable-xhdpi/ch_122_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_122_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_123_logo.png b/tests/input/res/drawable-xhdpi/ch_123_logo.png
index 0ab2f45f..ade9ab29 100644
--- a/tests/input/res/drawable-xhdpi/ch_123_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_123_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_124_logo.png b/tests/input/res/drawable-xhdpi/ch_124_logo.png
index 5f3ae948..62d15c06 100644
--- a/tests/input/res/drawable-xhdpi/ch_124_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_124_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_125_logo.png b/tests/input/res/drawable-xhdpi/ch_125_logo.png
index e3b0614d..34af08a9 100644
--- a/tests/input/res/drawable-xhdpi/ch_125_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_125_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_126_logo.png b/tests/input/res/drawable-xhdpi/ch_126_logo.png
index d9ef549f..8d10d163 100644
--- a/tests/input/res/drawable-xhdpi/ch_126_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_126_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_127_logo.png b/tests/input/res/drawable-xhdpi/ch_127_logo.png
index 46630a6d..428f8e0d 100644
--- a/tests/input/res/drawable-xhdpi/ch_127_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_127_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_128_logo.png b/tests/input/res/drawable-xhdpi/ch_128_logo.png
index fa0cd533..536e04fa 100644
--- a/tests/input/res/drawable-xhdpi/ch_128_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_128_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_129_logo.png b/tests/input/res/drawable-xhdpi/ch_129_logo.png
index a169cf1b..79fc8dc8 100644
--- a/tests/input/res/drawable-xhdpi/ch_129_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_129_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_12_logo.png b/tests/input/res/drawable-xhdpi/ch_12_logo.png
index aafcc88e..5f155f41 100644
--- a/tests/input/res/drawable-xhdpi/ch_12_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_12_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_130_logo.png b/tests/input/res/drawable-xhdpi/ch_130_logo.png
index e575b055..b2bc041f 100644
--- a/tests/input/res/drawable-xhdpi/ch_130_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_130_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_131_logo.png b/tests/input/res/drawable-xhdpi/ch_131_logo.png
index d711d0fb..06081906 100644
--- a/tests/input/res/drawable-xhdpi/ch_131_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_131_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_132_logo.png b/tests/input/res/drawable-xhdpi/ch_132_logo.png
index cb9b097e..18a0bdef 100644
--- a/tests/input/res/drawable-xhdpi/ch_132_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_132_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_133_logo.png b/tests/input/res/drawable-xhdpi/ch_133_logo.png
index 855328ac..312027b2 100644
--- a/tests/input/res/drawable-xhdpi/ch_133_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_133_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_134_logo.png b/tests/input/res/drawable-xhdpi/ch_134_logo.png
index 2c5086e8..c551922e 100644
--- a/tests/input/res/drawable-xhdpi/ch_134_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_134_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_135_logo.png b/tests/input/res/drawable-xhdpi/ch_135_logo.png
index ed914baa..64d7b889 100644
--- a/tests/input/res/drawable-xhdpi/ch_135_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_135_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_136_logo.png b/tests/input/res/drawable-xhdpi/ch_136_logo.png
index 923462c0..31021239 100644
--- a/tests/input/res/drawable-xhdpi/ch_136_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_136_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_137_logo.png b/tests/input/res/drawable-xhdpi/ch_137_logo.png
index 28e5a4af..a7f8cfb8 100644
--- a/tests/input/res/drawable-xhdpi/ch_137_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_137_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_138_logo.png b/tests/input/res/drawable-xhdpi/ch_138_logo.png
index 677cfaab..981425f0 100644
--- a/tests/input/res/drawable-xhdpi/ch_138_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_138_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_139_logo.png b/tests/input/res/drawable-xhdpi/ch_139_logo.png
index 2d343ea4..03170e5e 100644
--- a/tests/input/res/drawable-xhdpi/ch_139_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_139_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_13_logo.png b/tests/input/res/drawable-xhdpi/ch_13_logo.png
index b54a709f..817922f8 100644
--- a/tests/input/res/drawable-xhdpi/ch_13_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_13_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_140_logo.png b/tests/input/res/drawable-xhdpi/ch_140_logo.png
index b109d1cf..f26cf917 100644
--- a/tests/input/res/drawable-xhdpi/ch_140_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_140_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_141_logo.png b/tests/input/res/drawable-xhdpi/ch_141_logo.png
index 7541a9de..0064d436 100644
--- a/tests/input/res/drawable-xhdpi/ch_141_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_141_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_142_logo.png b/tests/input/res/drawable-xhdpi/ch_142_logo.png
index 0f333da5..1d28785e 100644
--- a/tests/input/res/drawable-xhdpi/ch_142_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_142_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_143_logo.png b/tests/input/res/drawable-xhdpi/ch_143_logo.png
index dc437d8e..6f6bb7ea 100644
--- a/tests/input/res/drawable-xhdpi/ch_143_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_143_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_144_logo.png b/tests/input/res/drawable-xhdpi/ch_144_logo.png
index 5f0d01c1..afa678cc 100644
--- a/tests/input/res/drawable-xhdpi/ch_144_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_144_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_145_logo.png b/tests/input/res/drawable-xhdpi/ch_145_logo.png
index 9bba8991..0e989ba5 100644
--- a/tests/input/res/drawable-xhdpi/ch_145_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_145_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_146_logo.png b/tests/input/res/drawable-xhdpi/ch_146_logo.png
index badc014b..4ee0082c 100644
--- a/tests/input/res/drawable-xhdpi/ch_146_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_146_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_147_logo.png b/tests/input/res/drawable-xhdpi/ch_147_logo.png
index 0f8449e2..ddcc91dd 100644
--- a/tests/input/res/drawable-xhdpi/ch_147_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_147_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_148_logo.png b/tests/input/res/drawable-xhdpi/ch_148_logo.png
index 49c7f238..c7f0c42a 100644
--- a/tests/input/res/drawable-xhdpi/ch_148_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_148_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_149_logo.png b/tests/input/res/drawable-xhdpi/ch_149_logo.png
index b05d9511..f2d38ace 100644
--- a/tests/input/res/drawable-xhdpi/ch_149_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_149_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_14_logo.png b/tests/input/res/drawable-xhdpi/ch_14_logo.png
index b053d12a..f66db228 100644
--- a/tests/input/res/drawable-xhdpi/ch_14_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_14_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_150_logo.png b/tests/input/res/drawable-xhdpi/ch_150_logo.png
index 435b113d..6efad527 100644
--- a/tests/input/res/drawable-xhdpi/ch_150_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_150_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_151_logo.png b/tests/input/res/drawable-xhdpi/ch_151_logo.png
index e572bf4f..b37e11ea 100644
--- a/tests/input/res/drawable-xhdpi/ch_151_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_151_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_152_logo.png b/tests/input/res/drawable-xhdpi/ch_152_logo.png
index 2df1a6b1..81f872a5 100644
--- a/tests/input/res/drawable-xhdpi/ch_152_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_152_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_153_logo.png b/tests/input/res/drawable-xhdpi/ch_153_logo.png
index 71a4ac20..e564739d 100644
--- a/tests/input/res/drawable-xhdpi/ch_153_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_153_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_154_logo.png b/tests/input/res/drawable-xhdpi/ch_154_logo.png
index 559f52e6..331498e8 100644
--- a/tests/input/res/drawable-xhdpi/ch_154_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_154_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_155_logo.png b/tests/input/res/drawable-xhdpi/ch_155_logo.png
index c61f7f00..da8c34d4 100644
--- a/tests/input/res/drawable-xhdpi/ch_155_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_155_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_156_logo.png b/tests/input/res/drawable-xhdpi/ch_156_logo.png
index b98c6788..5ca6d550 100644
--- a/tests/input/res/drawable-xhdpi/ch_156_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_156_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_157_logo.png b/tests/input/res/drawable-xhdpi/ch_157_logo.png
index e0cad6c8..460ece79 100644
--- a/tests/input/res/drawable-xhdpi/ch_157_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_157_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_158_logo.png b/tests/input/res/drawable-xhdpi/ch_158_logo.png
index 30dad457..8d11e42e 100644
--- a/tests/input/res/drawable-xhdpi/ch_158_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_158_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_159_logo.png b/tests/input/res/drawable-xhdpi/ch_159_logo.png
index 64c1577f..a10cf881 100644
--- a/tests/input/res/drawable-xhdpi/ch_159_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_159_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_15_logo.png b/tests/input/res/drawable-xhdpi/ch_15_logo.png
index bc7133aa..ae4fc936 100644
--- a/tests/input/res/drawable-xhdpi/ch_15_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_15_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_160_logo.png b/tests/input/res/drawable-xhdpi/ch_160_logo.png
index 97333899..c219ea72 100644
--- a/tests/input/res/drawable-xhdpi/ch_160_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_160_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_161_logo.png b/tests/input/res/drawable-xhdpi/ch_161_logo.png
index 1749aeeb..2b13ad83 100644
--- a/tests/input/res/drawable-xhdpi/ch_161_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_161_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_162_logo.png b/tests/input/res/drawable-xhdpi/ch_162_logo.png
index ef7466c0..11bfadca 100644
--- a/tests/input/res/drawable-xhdpi/ch_162_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_162_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_163_logo.png b/tests/input/res/drawable-xhdpi/ch_163_logo.png
index ceabbd01..9c41b03a 100644
--- a/tests/input/res/drawable-xhdpi/ch_163_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_163_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_164_logo.png b/tests/input/res/drawable-xhdpi/ch_164_logo.png
index 89ab660b..ec4a101e 100644
--- a/tests/input/res/drawable-xhdpi/ch_164_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_164_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_165_logo.png b/tests/input/res/drawable-xhdpi/ch_165_logo.png
index b8c5020a..1aceac38 100644
--- a/tests/input/res/drawable-xhdpi/ch_165_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_165_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_166_logo.png b/tests/input/res/drawable-xhdpi/ch_166_logo.png
index 81929866..f731014f 100644
--- a/tests/input/res/drawable-xhdpi/ch_166_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_166_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_167_logo.png b/tests/input/res/drawable-xhdpi/ch_167_logo.png
index dc2de092..08c82fbf 100644
--- a/tests/input/res/drawable-xhdpi/ch_167_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_167_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_168_logo.png b/tests/input/res/drawable-xhdpi/ch_168_logo.png
index d02097f5..0c5707bc 100644
--- a/tests/input/res/drawable-xhdpi/ch_168_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_168_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_169_logo.png b/tests/input/res/drawable-xhdpi/ch_169_logo.png
index afb0b63c..a9710cec 100644
--- a/tests/input/res/drawable-xhdpi/ch_169_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_169_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_16_logo.png b/tests/input/res/drawable-xhdpi/ch_16_logo.png
index 27df7079..76aee2de 100644
--- a/tests/input/res/drawable-xhdpi/ch_16_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_16_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_170_logo.png b/tests/input/res/drawable-xhdpi/ch_170_logo.png
index 2e33612c..1bf43fa7 100644
--- a/tests/input/res/drawable-xhdpi/ch_170_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_170_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_171_logo.png b/tests/input/res/drawable-xhdpi/ch_171_logo.png
index 730bbdaf..8c6d6fde 100644
--- a/tests/input/res/drawable-xhdpi/ch_171_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_171_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_172_logo.png b/tests/input/res/drawable-xhdpi/ch_172_logo.png
index 5af80238..13d73ec7 100644
--- a/tests/input/res/drawable-xhdpi/ch_172_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_172_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_173_logo.png b/tests/input/res/drawable-xhdpi/ch_173_logo.png
index 367d53e7..2423b0ab 100644
--- a/tests/input/res/drawable-xhdpi/ch_173_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_173_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_174_logo.png b/tests/input/res/drawable-xhdpi/ch_174_logo.png
index 0b562ae0..2f752dce 100644
--- a/tests/input/res/drawable-xhdpi/ch_174_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_174_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_175_logo.png b/tests/input/res/drawable-xhdpi/ch_175_logo.png
index 4265d9fc..ffe3b45e 100644
--- a/tests/input/res/drawable-xhdpi/ch_175_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_175_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_176_logo.png b/tests/input/res/drawable-xhdpi/ch_176_logo.png
index ccaeda9d..d35592de 100644
--- a/tests/input/res/drawable-xhdpi/ch_176_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_176_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_177_logo.png b/tests/input/res/drawable-xhdpi/ch_177_logo.png
index 5710e37e..c50df44f 100644
--- a/tests/input/res/drawable-xhdpi/ch_177_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_177_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_178_logo.png b/tests/input/res/drawable-xhdpi/ch_178_logo.png
index 0d6e2300..22539784 100644
--- a/tests/input/res/drawable-xhdpi/ch_178_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_178_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_179_logo.png b/tests/input/res/drawable-xhdpi/ch_179_logo.png
index a974eaba..a2c1946b 100644
--- a/tests/input/res/drawable-xhdpi/ch_179_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_179_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_17_logo.png b/tests/input/res/drawable-xhdpi/ch_17_logo.png
index 0a12c236..0189498f 100644
--- a/tests/input/res/drawable-xhdpi/ch_17_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_17_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_180_logo.png b/tests/input/res/drawable-xhdpi/ch_180_logo.png
index fa0bf275..9c72f2ab 100644
--- a/tests/input/res/drawable-xhdpi/ch_180_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_180_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_181_logo.png b/tests/input/res/drawable-xhdpi/ch_181_logo.png
index fb29917b..23610936 100644
--- a/tests/input/res/drawable-xhdpi/ch_181_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_181_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_182_logo.png b/tests/input/res/drawable-xhdpi/ch_182_logo.png
index 4120522e..c36bc811 100644
--- a/tests/input/res/drawable-xhdpi/ch_182_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_182_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_183_logo.png b/tests/input/res/drawable-xhdpi/ch_183_logo.png
index 72bcc596..e0e75a41 100644
--- a/tests/input/res/drawable-xhdpi/ch_183_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_183_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_184_logo.png b/tests/input/res/drawable-xhdpi/ch_184_logo.png
index b007b58f..334598f7 100644
--- a/tests/input/res/drawable-xhdpi/ch_184_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_184_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_185_logo.png b/tests/input/res/drawable-xhdpi/ch_185_logo.png
index e1e0cc00..6891720d 100644
--- a/tests/input/res/drawable-xhdpi/ch_185_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_185_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_186_logo.png b/tests/input/res/drawable-xhdpi/ch_186_logo.png
index 646d1ca1..58fc146a 100644
--- a/tests/input/res/drawable-xhdpi/ch_186_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_186_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_187_logo.png b/tests/input/res/drawable-xhdpi/ch_187_logo.png
index 6e4d3de5..6d4f46fc 100644
--- a/tests/input/res/drawable-xhdpi/ch_187_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_187_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_188_logo.png b/tests/input/res/drawable-xhdpi/ch_188_logo.png
index cf25ed3c..96fc401c 100644
--- a/tests/input/res/drawable-xhdpi/ch_188_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_188_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_189_logo.png b/tests/input/res/drawable-xhdpi/ch_189_logo.png
index 54fbefb6..93dd4050 100644
--- a/tests/input/res/drawable-xhdpi/ch_189_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_189_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_18_logo.png b/tests/input/res/drawable-xhdpi/ch_18_logo.png
index 26d7c79b..2025821b 100644
--- a/tests/input/res/drawable-xhdpi/ch_18_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_18_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_190_logo.png b/tests/input/res/drawable-xhdpi/ch_190_logo.png
index dcfecac0..ea257681 100644
--- a/tests/input/res/drawable-xhdpi/ch_190_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_190_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_191_logo.png b/tests/input/res/drawable-xhdpi/ch_191_logo.png
index b45f2491..2ac4c189 100644
--- a/tests/input/res/drawable-xhdpi/ch_191_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_191_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_192_logo.png b/tests/input/res/drawable-xhdpi/ch_192_logo.png
index 4f884b8c..14728cd3 100644
--- a/tests/input/res/drawable-xhdpi/ch_192_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_192_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_193_logo.png b/tests/input/res/drawable-xhdpi/ch_193_logo.png
index c321ba96..dbbf2a1f 100644
--- a/tests/input/res/drawable-xhdpi/ch_193_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_193_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_194_logo.png b/tests/input/res/drawable-xhdpi/ch_194_logo.png
index 47fa3348..aabcefda 100644
--- a/tests/input/res/drawable-xhdpi/ch_194_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_194_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_195_logo.png b/tests/input/res/drawable-xhdpi/ch_195_logo.png
index e91b9d9b..e0158d09 100644
--- a/tests/input/res/drawable-xhdpi/ch_195_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_195_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_196_logo.png b/tests/input/res/drawable-xhdpi/ch_196_logo.png
index 43e9d3a6..a1087785 100644
--- a/tests/input/res/drawable-xhdpi/ch_196_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_196_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_197_logo.png b/tests/input/res/drawable-xhdpi/ch_197_logo.png
index 21fb6ad5..5644e83c 100644
--- a/tests/input/res/drawable-xhdpi/ch_197_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_197_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_198_logo.png b/tests/input/res/drawable-xhdpi/ch_198_logo.png
index 5626d6c5..c06acf55 100644
--- a/tests/input/res/drawable-xhdpi/ch_198_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_198_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_199_logo.png b/tests/input/res/drawable-xhdpi/ch_199_logo.png
index 493bb6bb..6d5ec3ab 100644
--- a/tests/input/res/drawable-xhdpi/ch_199_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_199_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_19_logo.png b/tests/input/res/drawable-xhdpi/ch_19_logo.png
index ac3eb0a2..5e729625 100644
--- a/tests/input/res/drawable-xhdpi/ch_19_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_19_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_1_logo.png b/tests/input/res/drawable-xhdpi/ch_1_logo.png
index 79824607..0a39d154 100644
--- a/tests/input/res/drawable-xhdpi/ch_1_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_1_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_200_logo.png b/tests/input/res/drawable-xhdpi/ch_200_logo.png
index 1b36f263..7999b2f6 100644
--- a/tests/input/res/drawable-xhdpi/ch_200_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_200_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_201_logo.png b/tests/input/res/drawable-xhdpi/ch_201_logo.png
index 2aae3a45..68c868e9 100644
--- a/tests/input/res/drawable-xhdpi/ch_201_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_201_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_202_logo.png b/tests/input/res/drawable-xhdpi/ch_202_logo.png
index 2f4d7ff9..abd838fa 100644
--- a/tests/input/res/drawable-xhdpi/ch_202_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_202_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_203_logo.png b/tests/input/res/drawable-xhdpi/ch_203_logo.png
index 467dd943..f91c34cc 100644
--- a/tests/input/res/drawable-xhdpi/ch_203_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_203_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_204_logo.png b/tests/input/res/drawable-xhdpi/ch_204_logo.png
index 9046979b..8e8582c6 100644
--- a/tests/input/res/drawable-xhdpi/ch_204_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_204_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_205_logo.png b/tests/input/res/drawable-xhdpi/ch_205_logo.png
index ad27bb8a..4e3f4d94 100644
--- a/tests/input/res/drawable-xhdpi/ch_205_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_205_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_206_logo.png b/tests/input/res/drawable-xhdpi/ch_206_logo.png
index 06a4a65f..584bb98c 100644
--- a/tests/input/res/drawable-xhdpi/ch_206_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_206_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_207_logo.png b/tests/input/res/drawable-xhdpi/ch_207_logo.png
index 9bcbca6e..e6b2748e 100644
--- a/tests/input/res/drawable-xhdpi/ch_207_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_207_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_208_logo.png b/tests/input/res/drawable-xhdpi/ch_208_logo.png
index 737145c5..5a18dcad 100644
--- a/tests/input/res/drawable-xhdpi/ch_208_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_208_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_209_logo.png b/tests/input/res/drawable-xhdpi/ch_209_logo.png
index 73f5b15f..c4de3050 100644
--- a/tests/input/res/drawable-xhdpi/ch_209_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_209_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_20_logo.png b/tests/input/res/drawable-xhdpi/ch_20_logo.png
index 8bf17352..6b4d6104 100644
--- a/tests/input/res/drawable-xhdpi/ch_20_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_20_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_210_logo.png b/tests/input/res/drawable-xhdpi/ch_210_logo.png
index cfc35f2e..e4eed085 100644
--- a/tests/input/res/drawable-xhdpi/ch_210_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_210_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_211_logo.png b/tests/input/res/drawable-xhdpi/ch_211_logo.png
index 42a32d17..d5881047 100644
--- a/tests/input/res/drawable-xhdpi/ch_211_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_211_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_212_logo.png b/tests/input/res/drawable-xhdpi/ch_212_logo.png
index 3deeb0ff..c849f6f2 100644
--- a/tests/input/res/drawable-xhdpi/ch_212_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_212_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_213_logo.png b/tests/input/res/drawable-xhdpi/ch_213_logo.png
index 21f15ffb..92def1c5 100644
--- a/tests/input/res/drawable-xhdpi/ch_213_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_213_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_214_logo.png b/tests/input/res/drawable-xhdpi/ch_214_logo.png
index 327bf5c2..51f749fd 100644
--- a/tests/input/res/drawable-xhdpi/ch_214_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_214_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_215_logo.png b/tests/input/res/drawable-xhdpi/ch_215_logo.png
index 8f70a773..5425aaad 100644
--- a/tests/input/res/drawable-xhdpi/ch_215_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_215_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_216_logo.png b/tests/input/res/drawable-xhdpi/ch_216_logo.png
index 4db98a3b..53fed3c2 100644
--- a/tests/input/res/drawable-xhdpi/ch_216_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_216_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_217_logo.png b/tests/input/res/drawable-xhdpi/ch_217_logo.png
index a5be7a53..d253f9cd 100644
--- a/tests/input/res/drawable-xhdpi/ch_217_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_217_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_218_logo.png b/tests/input/res/drawable-xhdpi/ch_218_logo.png
index 9a407691..3c7b0698 100644
--- a/tests/input/res/drawable-xhdpi/ch_218_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_218_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_219_logo.png b/tests/input/res/drawable-xhdpi/ch_219_logo.png
index dd3947ec..7b96dd6e 100644
--- a/tests/input/res/drawable-xhdpi/ch_219_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_219_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_21_logo.png b/tests/input/res/drawable-xhdpi/ch_21_logo.png
index bd177b27..f2848346 100644
--- a/tests/input/res/drawable-xhdpi/ch_21_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_21_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_220_logo.png b/tests/input/res/drawable-xhdpi/ch_220_logo.png
index 53bdd383..f9d20884 100644
--- a/tests/input/res/drawable-xhdpi/ch_220_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_220_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_221_logo.png b/tests/input/res/drawable-xhdpi/ch_221_logo.png
index 1134ef84..9213142d 100644
--- a/tests/input/res/drawable-xhdpi/ch_221_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_221_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_222_logo.png b/tests/input/res/drawable-xhdpi/ch_222_logo.png
index 227a9d5e..66cb9a8b 100644
--- a/tests/input/res/drawable-xhdpi/ch_222_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_222_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_223_logo.png b/tests/input/res/drawable-xhdpi/ch_223_logo.png
index b99511d6..11a44724 100644
--- a/tests/input/res/drawable-xhdpi/ch_223_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_223_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_224_logo.png b/tests/input/res/drawable-xhdpi/ch_224_logo.png
index 5a6d4410..cdba6bf5 100644
--- a/tests/input/res/drawable-xhdpi/ch_224_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_224_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_225_logo.png b/tests/input/res/drawable-xhdpi/ch_225_logo.png
index 5562344f..e9416bfd 100644
--- a/tests/input/res/drawable-xhdpi/ch_225_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_225_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_226_logo.png b/tests/input/res/drawable-xhdpi/ch_226_logo.png
index 8588c73c..88792532 100644
--- a/tests/input/res/drawable-xhdpi/ch_226_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_226_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_227_logo.png b/tests/input/res/drawable-xhdpi/ch_227_logo.png
index 2c97997b..7ae8205b 100644
--- a/tests/input/res/drawable-xhdpi/ch_227_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_227_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_228_logo.png b/tests/input/res/drawable-xhdpi/ch_228_logo.png
index f0d2829e..718d93e2 100644
--- a/tests/input/res/drawable-xhdpi/ch_228_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_228_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_229_logo.png b/tests/input/res/drawable-xhdpi/ch_229_logo.png
index d83db934..eb4f9129 100644
--- a/tests/input/res/drawable-xhdpi/ch_229_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_229_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_22_logo.png b/tests/input/res/drawable-xhdpi/ch_22_logo.png
index 517f8205..9aa987d1 100644
--- a/tests/input/res/drawable-xhdpi/ch_22_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_22_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_230_logo.png b/tests/input/res/drawable-xhdpi/ch_230_logo.png
index a143b9b6..a1bb57d3 100644
--- a/tests/input/res/drawable-xhdpi/ch_230_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_230_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_231_logo.png b/tests/input/res/drawable-xhdpi/ch_231_logo.png
index 099a451e..e748e868 100644
--- a/tests/input/res/drawable-xhdpi/ch_231_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_231_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_232_logo.png b/tests/input/res/drawable-xhdpi/ch_232_logo.png
index f674e86c..5d4f1d69 100644
--- a/tests/input/res/drawable-xhdpi/ch_232_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_232_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_233_logo.png b/tests/input/res/drawable-xhdpi/ch_233_logo.png
index e2ad8ed5..7ff780ab 100644
--- a/tests/input/res/drawable-xhdpi/ch_233_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_233_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_234_logo.png b/tests/input/res/drawable-xhdpi/ch_234_logo.png
index a24d0a80..a4e10dfb 100644
--- a/tests/input/res/drawable-xhdpi/ch_234_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_234_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_235_logo.png b/tests/input/res/drawable-xhdpi/ch_235_logo.png
index d9122ba4..c318ac0b 100644
--- a/tests/input/res/drawable-xhdpi/ch_235_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_235_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_236_logo.png b/tests/input/res/drawable-xhdpi/ch_236_logo.png
index 4726b5c6..2ab86fd6 100644
--- a/tests/input/res/drawable-xhdpi/ch_236_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_236_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_237_logo.png b/tests/input/res/drawable-xhdpi/ch_237_logo.png
index 91e0e172..04fa9d61 100644
--- a/tests/input/res/drawable-xhdpi/ch_237_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_237_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_238_logo.png b/tests/input/res/drawable-xhdpi/ch_238_logo.png
index a18f8152..6649b9db 100644
--- a/tests/input/res/drawable-xhdpi/ch_238_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_238_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_239_logo.png b/tests/input/res/drawable-xhdpi/ch_239_logo.png
index 04baed0b..6eaf887d 100644
--- a/tests/input/res/drawable-xhdpi/ch_239_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_239_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_23_logo.png b/tests/input/res/drawable-xhdpi/ch_23_logo.png
index b4c2f91e..c3dcf172 100644
--- a/tests/input/res/drawable-xhdpi/ch_23_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_23_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_240_logo.png b/tests/input/res/drawable-xhdpi/ch_240_logo.png
index 76998dfb..50d0d0df 100644
--- a/tests/input/res/drawable-xhdpi/ch_240_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_240_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_241_logo.png b/tests/input/res/drawable-xhdpi/ch_241_logo.png
index a033502e..779d53b5 100644
--- a/tests/input/res/drawable-xhdpi/ch_241_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_241_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_242_logo.png b/tests/input/res/drawable-xhdpi/ch_242_logo.png
index 877fb101..717aaae5 100644
--- a/tests/input/res/drawable-xhdpi/ch_242_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_242_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_243_logo.png b/tests/input/res/drawable-xhdpi/ch_243_logo.png
index d7f4e8d1..fd04b2a2 100644
--- a/tests/input/res/drawable-xhdpi/ch_243_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_243_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_244_logo.png b/tests/input/res/drawable-xhdpi/ch_244_logo.png
index 8494f5dc..d8b1b710 100644
--- a/tests/input/res/drawable-xhdpi/ch_244_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_244_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_245_logo.png b/tests/input/res/drawable-xhdpi/ch_245_logo.png
index 24a3614b..3a08f595 100644
--- a/tests/input/res/drawable-xhdpi/ch_245_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_245_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_246_logo.png b/tests/input/res/drawable-xhdpi/ch_246_logo.png
index 1fb507f0..404bd8f0 100644
--- a/tests/input/res/drawable-xhdpi/ch_246_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_246_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_247_logo.png b/tests/input/res/drawable-xhdpi/ch_247_logo.png
index 79cc5d9d..46ee0163 100644
--- a/tests/input/res/drawable-xhdpi/ch_247_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_247_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_248_logo.png b/tests/input/res/drawable-xhdpi/ch_248_logo.png
index 9e30777a..ebfeb6d8 100644
--- a/tests/input/res/drawable-xhdpi/ch_248_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_248_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_249_logo.png b/tests/input/res/drawable-xhdpi/ch_249_logo.png
index 65961a99..f49dc8c4 100644
--- a/tests/input/res/drawable-xhdpi/ch_249_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_249_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_24_logo.png b/tests/input/res/drawable-xhdpi/ch_24_logo.png
index 5cd4932d..8fda8dcc 100644
--- a/tests/input/res/drawable-xhdpi/ch_24_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_24_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_250_logo.png b/tests/input/res/drawable-xhdpi/ch_250_logo.png
index 0a5fb825..3c464624 100644
--- a/tests/input/res/drawable-xhdpi/ch_250_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_250_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_251_logo.png b/tests/input/res/drawable-xhdpi/ch_251_logo.png
index 972a7ae2..58f3f7d2 100644
--- a/tests/input/res/drawable-xhdpi/ch_251_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_251_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_252_logo.png b/tests/input/res/drawable-xhdpi/ch_252_logo.png
index 91a464db..f0284549 100644
--- a/tests/input/res/drawable-xhdpi/ch_252_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_252_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_253_logo.png b/tests/input/res/drawable-xhdpi/ch_253_logo.png
index 7a96f676..47a8f91d 100644
--- a/tests/input/res/drawable-xhdpi/ch_253_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_253_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_254_logo.png b/tests/input/res/drawable-xhdpi/ch_254_logo.png
index 20b690b1..e2505fc0 100644
--- a/tests/input/res/drawable-xhdpi/ch_254_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_254_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_255_logo.png b/tests/input/res/drawable-xhdpi/ch_255_logo.png
index 2db8df71..55e7116b 100644
--- a/tests/input/res/drawable-xhdpi/ch_255_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_255_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_256_logo.png b/tests/input/res/drawable-xhdpi/ch_256_logo.png
index f16050e5..d31964ab 100644
--- a/tests/input/res/drawable-xhdpi/ch_256_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_256_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_257_logo.png b/tests/input/res/drawable-xhdpi/ch_257_logo.png
index e796edfc..cf850f90 100644
--- a/tests/input/res/drawable-xhdpi/ch_257_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_257_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_258_logo.png b/tests/input/res/drawable-xhdpi/ch_258_logo.png
index dc949df7..148d0ee4 100644
--- a/tests/input/res/drawable-xhdpi/ch_258_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_258_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_259_logo.png b/tests/input/res/drawable-xhdpi/ch_259_logo.png
index 95e11e65..aa84697d 100644
--- a/tests/input/res/drawable-xhdpi/ch_259_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_259_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_25_logo.png b/tests/input/res/drawable-xhdpi/ch_25_logo.png
index 39959a8b..401e785e 100644
--- a/tests/input/res/drawable-xhdpi/ch_25_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_25_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_260_logo.png b/tests/input/res/drawable-xhdpi/ch_260_logo.png
index 4184495a..dc4f67f7 100644
--- a/tests/input/res/drawable-xhdpi/ch_260_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_260_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_261_logo.png b/tests/input/res/drawable-xhdpi/ch_261_logo.png
index 530644ea..dfbecb37 100644
--- a/tests/input/res/drawable-xhdpi/ch_261_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_261_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_262_logo.png b/tests/input/res/drawable-xhdpi/ch_262_logo.png
index 27de42c0..2fa3185b 100644
--- a/tests/input/res/drawable-xhdpi/ch_262_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_262_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_263_logo.png b/tests/input/res/drawable-xhdpi/ch_263_logo.png
index 8606e576..d1e84b38 100644
--- a/tests/input/res/drawable-xhdpi/ch_263_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_263_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_264_logo.png b/tests/input/res/drawable-xhdpi/ch_264_logo.png
index 2b35de28..3f52decb 100644
--- a/tests/input/res/drawable-xhdpi/ch_264_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_264_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_265_logo.png b/tests/input/res/drawable-xhdpi/ch_265_logo.png
index b205acb3..f60c362a 100644
--- a/tests/input/res/drawable-xhdpi/ch_265_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_265_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_266_logo.png b/tests/input/res/drawable-xhdpi/ch_266_logo.png
index f4b87fe6..94dc4463 100644
--- a/tests/input/res/drawable-xhdpi/ch_266_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_266_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_267_logo.png b/tests/input/res/drawable-xhdpi/ch_267_logo.png
index 39f406e6..48ac79ed 100644
--- a/tests/input/res/drawable-xhdpi/ch_267_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_267_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_268_logo.png b/tests/input/res/drawable-xhdpi/ch_268_logo.png
index 36794586..b6f1ad64 100644
--- a/tests/input/res/drawable-xhdpi/ch_268_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_268_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_269_logo.png b/tests/input/res/drawable-xhdpi/ch_269_logo.png
index 813d85f7..0d98d378 100644
--- a/tests/input/res/drawable-xhdpi/ch_269_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_269_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_26_logo.png b/tests/input/res/drawable-xhdpi/ch_26_logo.png
index cf1212f3..a8835e4a 100644
--- a/tests/input/res/drawable-xhdpi/ch_26_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_26_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_270_logo.png b/tests/input/res/drawable-xhdpi/ch_270_logo.png
index f21a39fb..27a0aead 100644
--- a/tests/input/res/drawable-xhdpi/ch_270_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_270_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_271_logo.png b/tests/input/res/drawable-xhdpi/ch_271_logo.png
index 0aac87e8..7fa6feb3 100644
--- a/tests/input/res/drawable-xhdpi/ch_271_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_271_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_272_logo.png b/tests/input/res/drawable-xhdpi/ch_272_logo.png
index 74466267..af7e34e6 100644
--- a/tests/input/res/drawable-xhdpi/ch_272_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_272_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_273_logo.png b/tests/input/res/drawable-xhdpi/ch_273_logo.png
index ef2d379a..a8a041af 100644
--- a/tests/input/res/drawable-xhdpi/ch_273_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_273_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_274_logo.png b/tests/input/res/drawable-xhdpi/ch_274_logo.png
index 8c1cb1b8..0f498f23 100644
--- a/tests/input/res/drawable-xhdpi/ch_274_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_274_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_275_logo.png b/tests/input/res/drawable-xhdpi/ch_275_logo.png
index a3e2b915..d598fb35 100644
--- a/tests/input/res/drawable-xhdpi/ch_275_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_275_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_276_logo.png b/tests/input/res/drawable-xhdpi/ch_276_logo.png
index cbcab727..7cbac69a 100644
--- a/tests/input/res/drawable-xhdpi/ch_276_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_276_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_277_logo.png b/tests/input/res/drawable-xhdpi/ch_277_logo.png
index a291b95b..70a7f3ea 100644
--- a/tests/input/res/drawable-xhdpi/ch_277_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_277_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_278_logo.png b/tests/input/res/drawable-xhdpi/ch_278_logo.png
index 03fc4154..fcb332a5 100644
--- a/tests/input/res/drawable-xhdpi/ch_278_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_278_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_279_logo.png b/tests/input/res/drawable-xhdpi/ch_279_logo.png
index 6d64901e..a95b4a96 100644
--- a/tests/input/res/drawable-xhdpi/ch_279_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_279_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_27_logo.png b/tests/input/res/drawable-xhdpi/ch_27_logo.png
index a9b23816..138b7dc8 100644
--- a/tests/input/res/drawable-xhdpi/ch_27_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_27_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_280_logo.png b/tests/input/res/drawable-xhdpi/ch_280_logo.png
index c01599d4..2f862b39 100644
--- a/tests/input/res/drawable-xhdpi/ch_280_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_280_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_281_logo.png b/tests/input/res/drawable-xhdpi/ch_281_logo.png
index 5015b975..6d888d16 100644
--- a/tests/input/res/drawable-xhdpi/ch_281_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_281_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_282_logo.png b/tests/input/res/drawable-xhdpi/ch_282_logo.png
index 9ddb94c4..81db1656 100644
--- a/tests/input/res/drawable-xhdpi/ch_282_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_282_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_283_logo.png b/tests/input/res/drawable-xhdpi/ch_283_logo.png
index b72a1fb4..4933bc3c 100644
--- a/tests/input/res/drawable-xhdpi/ch_283_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_283_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_284_logo.png b/tests/input/res/drawable-xhdpi/ch_284_logo.png
index 3c9358b3..b4880b8b 100644
--- a/tests/input/res/drawable-xhdpi/ch_284_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_284_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_285_logo.png b/tests/input/res/drawable-xhdpi/ch_285_logo.png
index 5c661286..eea6175e 100644
--- a/tests/input/res/drawable-xhdpi/ch_285_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_285_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_286_logo.png b/tests/input/res/drawable-xhdpi/ch_286_logo.png
index 156693b0..d2b5b5bd 100644
--- a/tests/input/res/drawable-xhdpi/ch_286_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_286_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_287_logo.png b/tests/input/res/drawable-xhdpi/ch_287_logo.png
index cd835f37..f374d9d0 100644
--- a/tests/input/res/drawable-xhdpi/ch_287_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_287_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_288_logo.png b/tests/input/res/drawable-xhdpi/ch_288_logo.png
index fa207e55..16072cfa 100644
--- a/tests/input/res/drawable-xhdpi/ch_288_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_288_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_289_logo.png b/tests/input/res/drawable-xhdpi/ch_289_logo.png
index f3a8c5a7..b76c2f48 100644
--- a/tests/input/res/drawable-xhdpi/ch_289_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_289_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_28_logo.png b/tests/input/res/drawable-xhdpi/ch_28_logo.png
index 6c45dd1f..284301b0 100644
--- a/tests/input/res/drawable-xhdpi/ch_28_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_28_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_290_logo.png b/tests/input/res/drawable-xhdpi/ch_290_logo.png
index 9f106cb5..2778664f 100644
--- a/tests/input/res/drawable-xhdpi/ch_290_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_290_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_291_logo.png b/tests/input/res/drawable-xhdpi/ch_291_logo.png
index 88fbeadb..52da29f6 100644
--- a/tests/input/res/drawable-xhdpi/ch_291_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_291_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_292_logo.png b/tests/input/res/drawable-xhdpi/ch_292_logo.png
index 7d3f6cd9..a1d8e6f8 100644
--- a/tests/input/res/drawable-xhdpi/ch_292_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_292_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_293_logo.png b/tests/input/res/drawable-xhdpi/ch_293_logo.png
index 5e78c871..74020c30 100644
--- a/tests/input/res/drawable-xhdpi/ch_293_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_293_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_294_logo.png b/tests/input/res/drawable-xhdpi/ch_294_logo.png
index 78c99725..49d72b5d 100644
--- a/tests/input/res/drawable-xhdpi/ch_294_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_294_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_295_logo.png b/tests/input/res/drawable-xhdpi/ch_295_logo.png
index f7eaa8ed..cae47aeb 100644
--- a/tests/input/res/drawable-xhdpi/ch_295_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_295_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_296_logo.png b/tests/input/res/drawable-xhdpi/ch_296_logo.png
index eb062b9b..4b38d480 100644
--- a/tests/input/res/drawable-xhdpi/ch_296_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_296_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_297_logo.png b/tests/input/res/drawable-xhdpi/ch_297_logo.png
index 9eedeb10..3edd15d0 100644
--- a/tests/input/res/drawable-xhdpi/ch_297_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_297_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_298_logo.png b/tests/input/res/drawable-xhdpi/ch_298_logo.png
index 44565ee1..cb472f31 100644
--- a/tests/input/res/drawable-xhdpi/ch_298_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_298_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_299_logo.png b/tests/input/res/drawable-xhdpi/ch_299_logo.png
index 12f2a234..b672881e 100644
--- a/tests/input/res/drawable-xhdpi/ch_299_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_299_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_29_logo.png b/tests/input/res/drawable-xhdpi/ch_29_logo.png
index 87c282db..9f1c523f 100644
--- a/tests/input/res/drawable-xhdpi/ch_29_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_29_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_2_logo.png b/tests/input/res/drawable-xhdpi/ch_2_logo.png
index 47bf5543..d6887b05 100644
--- a/tests/input/res/drawable-xhdpi/ch_2_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_2_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_300_logo.png b/tests/input/res/drawable-xhdpi/ch_300_logo.png
index f34993d0..9b842d77 100644
--- a/tests/input/res/drawable-xhdpi/ch_300_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_300_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_301_logo.png b/tests/input/res/drawable-xhdpi/ch_301_logo.png
index 8362be93..4c7fda85 100644
--- a/tests/input/res/drawable-xhdpi/ch_301_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_301_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_302_logo.png b/tests/input/res/drawable-xhdpi/ch_302_logo.png
index d59cdddd..e39f5acb 100644
--- a/tests/input/res/drawable-xhdpi/ch_302_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_302_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_303_logo.png b/tests/input/res/drawable-xhdpi/ch_303_logo.png
index 3aa9dca8..78f057f7 100644
--- a/tests/input/res/drawable-xhdpi/ch_303_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_303_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_304_logo.png b/tests/input/res/drawable-xhdpi/ch_304_logo.png
index 154abfc6..b8a68630 100644
--- a/tests/input/res/drawable-xhdpi/ch_304_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_304_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_305_logo.png b/tests/input/res/drawable-xhdpi/ch_305_logo.png
index dd6e809d..7f698610 100644
--- a/tests/input/res/drawable-xhdpi/ch_305_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_305_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_306_logo.png b/tests/input/res/drawable-xhdpi/ch_306_logo.png
index 906ba315..0458b383 100644
--- a/tests/input/res/drawable-xhdpi/ch_306_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_306_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_307_logo.png b/tests/input/res/drawable-xhdpi/ch_307_logo.png
index 9031296c..f2a35cd5 100644
--- a/tests/input/res/drawable-xhdpi/ch_307_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_307_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_308_logo.png b/tests/input/res/drawable-xhdpi/ch_308_logo.png
index 2d388b4b..49d2b4b3 100644
--- a/tests/input/res/drawable-xhdpi/ch_308_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_308_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_309_logo.png b/tests/input/res/drawable-xhdpi/ch_309_logo.png
index 8deddd0b..81da237b 100644
--- a/tests/input/res/drawable-xhdpi/ch_309_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_309_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_30_logo.png b/tests/input/res/drawable-xhdpi/ch_30_logo.png
index 84947048..72db9c52 100644
--- a/tests/input/res/drawable-xhdpi/ch_30_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_30_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_310_logo.png b/tests/input/res/drawable-xhdpi/ch_310_logo.png
index 5ca898d7..901a9113 100644
--- a/tests/input/res/drawable-xhdpi/ch_310_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_310_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_311_logo.png b/tests/input/res/drawable-xhdpi/ch_311_logo.png
index ceda180c..0aa3b284 100644
--- a/tests/input/res/drawable-xhdpi/ch_311_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_311_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_312_logo.png b/tests/input/res/drawable-xhdpi/ch_312_logo.png
index d149b0d6..0cfead7e 100644
--- a/tests/input/res/drawable-xhdpi/ch_312_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_312_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_313_logo.png b/tests/input/res/drawable-xhdpi/ch_313_logo.png
index e8cde0d4..b552c871 100644
--- a/tests/input/res/drawable-xhdpi/ch_313_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_313_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_314_logo.png b/tests/input/res/drawable-xhdpi/ch_314_logo.png
index cab79a1a..354ab843 100644
--- a/tests/input/res/drawable-xhdpi/ch_314_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_314_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_315_logo.png b/tests/input/res/drawable-xhdpi/ch_315_logo.png
index de0229e1..2db60cca 100644
--- a/tests/input/res/drawable-xhdpi/ch_315_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_315_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_316_logo.png b/tests/input/res/drawable-xhdpi/ch_316_logo.png
index 21e074b3..da4d32a3 100644
--- a/tests/input/res/drawable-xhdpi/ch_316_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_316_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_317_logo.png b/tests/input/res/drawable-xhdpi/ch_317_logo.png
index a9a0e604..d344ef36 100644
--- a/tests/input/res/drawable-xhdpi/ch_317_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_317_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_318_logo.png b/tests/input/res/drawable-xhdpi/ch_318_logo.png
index fbdb3ab0..9150c2b1 100644
--- a/tests/input/res/drawable-xhdpi/ch_318_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_318_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_319_logo.png b/tests/input/res/drawable-xhdpi/ch_319_logo.png
index 9d23ae89..4b1b7c9d 100644
--- a/tests/input/res/drawable-xhdpi/ch_319_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_319_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_31_logo.png b/tests/input/res/drawable-xhdpi/ch_31_logo.png
index cf6f865e..5386601d 100644
--- a/tests/input/res/drawable-xhdpi/ch_31_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_31_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_320_logo.png b/tests/input/res/drawable-xhdpi/ch_320_logo.png
index 4dd5c201..4efe21d4 100644
--- a/tests/input/res/drawable-xhdpi/ch_320_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_320_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_321_logo.png b/tests/input/res/drawable-xhdpi/ch_321_logo.png
index cc0bf527..d523277d 100644
--- a/tests/input/res/drawable-xhdpi/ch_321_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_321_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_322_logo.png b/tests/input/res/drawable-xhdpi/ch_322_logo.png
index 5b2e3e2b..cf2500dc 100644
--- a/tests/input/res/drawable-xhdpi/ch_322_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_322_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_323_logo.png b/tests/input/res/drawable-xhdpi/ch_323_logo.png
index 213d10ff..e838c0c1 100644
--- a/tests/input/res/drawable-xhdpi/ch_323_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_323_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_324_logo.png b/tests/input/res/drawable-xhdpi/ch_324_logo.png
index 81bea5cc..cc0cf6d2 100644
--- a/tests/input/res/drawable-xhdpi/ch_324_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_324_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_325_logo.png b/tests/input/res/drawable-xhdpi/ch_325_logo.png
index 811da30e..adfda884 100644
--- a/tests/input/res/drawable-xhdpi/ch_325_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_325_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_326_logo.png b/tests/input/res/drawable-xhdpi/ch_326_logo.png
index 157dbb19..434d2cd6 100644
--- a/tests/input/res/drawable-xhdpi/ch_326_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_326_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_327_logo.png b/tests/input/res/drawable-xhdpi/ch_327_logo.png
index 57808898..0a7f0b95 100644
--- a/tests/input/res/drawable-xhdpi/ch_327_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_327_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_328_logo.png b/tests/input/res/drawable-xhdpi/ch_328_logo.png
index 1f95d3de..77129370 100644
--- a/tests/input/res/drawable-xhdpi/ch_328_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_328_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_329_logo.png b/tests/input/res/drawable-xhdpi/ch_329_logo.png
index 6eaf15a9..9ff0a89f 100644
--- a/tests/input/res/drawable-xhdpi/ch_329_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_329_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_32_logo.png b/tests/input/res/drawable-xhdpi/ch_32_logo.png
index 6618debe..39351ac1 100644
--- a/tests/input/res/drawable-xhdpi/ch_32_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_32_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_330_logo.png b/tests/input/res/drawable-xhdpi/ch_330_logo.png
index 936053a7..54adc2e7 100644
--- a/tests/input/res/drawable-xhdpi/ch_330_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_330_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_331_logo.png b/tests/input/res/drawable-xhdpi/ch_331_logo.png
index fa04e972..6c29286f 100644
--- a/tests/input/res/drawable-xhdpi/ch_331_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_331_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_332_logo.png b/tests/input/res/drawable-xhdpi/ch_332_logo.png
index 29621c61..ccab9144 100644
--- a/tests/input/res/drawable-xhdpi/ch_332_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_332_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_333_logo.png b/tests/input/res/drawable-xhdpi/ch_333_logo.png
index 4ff2396a..a35ce116 100644
--- a/tests/input/res/drawable-xhdpi/ch_333_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_333_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_334_logo.png b/tests/input/res/drawable-xhdpi/ch_334_logo.png
index 2222f42a..a191d804 100644
--- a/tests/input/res/drawable-xhdpi/ch_334_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_334_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_335_logo.png b/tests/input/res/drawable-xhdpi/ch_335_logo.png
index 138761b1..a5680b24 100644
--- a/tests/input/res/drawable-xhdpi/ch_335_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_335_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_336_logo.png b/tests/input/res/drawable-xhdpi/ch_336_logo.png
index 082c376f..42292bf8 100644
--- a/tests/input/res/drawable-xhdpi/ch_336_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_336_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_337_logo.png b/tests/input/res/drawable-xhdpi/ch_337_logo.png
index 3841ffc3..d231fca3 100644
--- a/tests/input/res/drawable-xhdpi/ch_337_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_337_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_338_logo.png b/tests/input/res/drawable-xhdpi/ch_338_logo.png
index 597524ce..000988ab 100644
--- a/tests/input/res/drawable-xhdpi/ch_338_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_338_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_339_logo.png b/tests/input/res/drawable-xhdpi/ch_339_logo.png
index 635bd339..3150c92c 100644
--- a/tests/input/res/drawable-xhdpi/ch_339_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_339_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_33_logo.png b/tests/input/res/drawable-xhdpi/ch_33_logo.png
index 28faf971..4931e205 100644
--- a/tests/input/res/drawable-xhdpi/ch_33_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_33_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_340_logo.png b/tests/input/res/drawable-xhdpi/ch_340_logo.png
index 84d8ca2b..d35d772e 100644
--- a/tests/input/res/drawable-xhdpi/ch_340_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_340_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_341_logo.png b/tests/input/res/drawable-xhdpi/ch_341_logo.png
index 0f8bf318..3ad19a0b 100644
--- a/tests/input/res/drawable-xhdpi/ch_341_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_341_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_342_logo.png b/tests/input/res/drawable-xhdpi/ch_342_logo.png
index dcfe9b8c..8d6cad2c 100644
--- a/tests/input/res/drawable-xhdpi/ch_342_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_342_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_343_logo.png b/tests/input/res/drawable-xhdpi/ch_343_logo.png
index 8d534621..6e16dc96 100644
--- a/tests/input/res/drawable-xhdpi/ch_343_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_343_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_344_logo.png b/tests/input/res/drawable-xhdpi/ch_344_logo.png
index cb9b5f29..e66c5a19 100644
--- a/tests/input/res/drawable-xhdpi/ch_344_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_344_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_345_logo.png b/tests/input/res/drawable-xhdpi/ch_345_logo.png
index ec566640..ed451fde 100644
--- a/tests/input/res/drawable-xhdpi/ch_345_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_345_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_346_logo.png b/tests/input/res/drawable-xhdpi/ch_346_logo.png
index ad013b18..31059671 100644
--- a/tests/input/res/drawable-xhdpi/ch_346_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_346_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_347_logo.png b/tests/input/res/drawable-xhdpi/ch_347_logo.png
index ae979990..65ee51eb 100644
--- a/tests/input/res/drawable-xhdpi/ch_347_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_347_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_348_logo.png b/tests/input/res/drawable-xhdpi/ch_348_logo.png
index 94ef1d40..54e9cca7 100644
--- a/tests/input/res/drawable-xhdpi/ch_348_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_348_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_349_logo.png b/tests/input/res/drawable-xhdpi/ch_349_logo.png
index 6b9eae58..7a11ae34 100644
--- a/tests/input/res/drawable-xhdpi/ch_349_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_349_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_34_logo.png b/tests/input/res/drawable-xhdpi/ch_34_logo.png
index ffe43d5b..27a217e8 100644
--- a/tests/input/res/drawable-xhdpi/ch_34_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_34_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_350_logo.png b/tests/input/res/drawable-xhdpi/ch_350_logo.png
index 5f764eb2..5c486ab7 100644
--- a/tests/input/res/drawable-xhdpi/ch_350_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_350_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_351_logo.png b/tests/input/res/drawable-xhdpi/ch_351_logo.png
index 1eff168b..17fff276 100644
--- a/tests/input/res/drawable-xhdpi/ch_351_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_351_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_352_logo.png b/tests/input/res/drawable-xhdpi/ch_352_logo.png
index 666784d6..2d9c412c 100644
--- a/tests/input/res/drawable-xhdpi/ch_352_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_352_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_353_logo.png b/tests/input/res/drawable-xhdpi/ch_353_logo.png
index d0db848d..38c76b38 100644
--- a/tests/input/res/drawable-xhdpi/ch_353_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_353_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_354_logo.png b/tests/input/res/drawable-xhdpi/ch_354_logo.png
index e4b4016a..8ea7d467 100644
--- a/tests/input/res/drawable-xhdpi/ch_354_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_354_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_355_logo.png b/tests/input/res/drawable-xhdpi/ch_355_logo.png
index 25061a42..0c94dcf6 100644
--- a/tests/input/res/drawable-xhdpi/ch_355_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_355_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_356_logo.png b/tests/input/res/drawable-xhdpi/ch_356_logo.png
index d7d2be0a..3f2b288a 100644
--- a/tests/input/res/drawable-xhdpi/ch_356_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_356_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_357_logo.png b/tests/input/res/drawable-xhdpi/ch_357_logo.png
index d8b991ea..63d43c31 100644
--- a/tests/input/res/drawable-xhdpi/ch_357_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_357_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_358_logo.png b/tests/input/res/drawable-xhdpi/ch_358_logo.png
index cc9babf0..1f5771fe 100644
--- a/tests/input/res/drawable-xhdpi/ch_358_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_358_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_359_logo.png b/tests/input/res/drawable-xhdpi/ch_359_logo.png
index 649e2bb1..7a4114bd 100644
--- a/tests/input/res/drawable-xhdpi/ch_359_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_359_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_35_logo.png b/tests/input/res/drawable-xhdpi/ch_35_logo.png
index 2c0cdee6..af2cae5d 100644
--- a/tests/input/res/drawable-xhdpi/ch_35_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_35_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_360_logo.png b/tests/input/res/drawable-xhdpi/ch_360_logo.png
index 3a026c6f..4e49a1f9 100644
--- a/tests/input/res/drawable-xhdpi/ch_360_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_360_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_361_logo.png b/tests/input/res/drawable-xhdpi/ch_361_logo.png
index f4bc741c..43b16ac6 100644
--- a/tests/input/res/drawable-xhdpi/ch_361_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_361_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_362_logo.png b/tests/input/res/drawable-xhdpi/ch_362_logo.png
index 36ed58de..efb32dab 100644
--- a/tests/input/res/drawable-xhdpi/ch_362_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_362_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_363_logo.png b/tests/input/res/drawable-xhdpi/ch_363_logo.png
index 121e8b89..c59eb0b3 100644
--- a/tests/input/res/drawable-xhdpi/ch_363_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_363_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_364_logo.png b/tests/input/res/drawable-xhdpi/ch_364_logo.png
index 27e6b9ec..9d649d47 100644
--- a/tests/input/res/drawable-xhdpi/ch_364_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_364_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_365_logo.png b/tests/input/res/drawable-xhdpi/ch_365_logo.png
index fb7839f0..96cae282 100644
--- a/tests/input/res/drawable-xhdpi/ch_365_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_365_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_366_logo.png b/tests/input/res/drawable-xhdpi/ch_366_logo.png
index a85568ae..3c3a5cf6 100644
--- a/tests/input/res/drawable-xhdpi/ch_366_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_366_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_367_logo.png b/tests/input/res/drawable-xhdpi/ch_367_logo.png
index 7eb14267..7467625a 100644
--- a/tests/input/res/drawable-xhdpi/ch_367_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_367_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_368_logo.png b/tests/input/res/drawable-xhdpi/ch_368_logo.png
index 9023261f..adb62ffc 100644
--- a/tests/input/res/drawable-xhdpi/ch_368_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_368_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_369_logo.png b/tests/input/res/drawable-xhdpi/ch_369_logo.png
index 07124c27..773f6c5c 100644
--- a/tests/input/res/drawable-xhdpi/ch_369_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_369_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_36_logo.png b/tests/input/res/drawable-xhdpi/ch_36_logo.png
index 66e59fcd..4580833f 100644
--- a/tests/input/res/drawable-xhdpi/ch_36_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_36_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_370_logo.png b/tests/input/res/drawable-xhdpi/ch_370_logo.png
index b2d0f4c1..d60583bc 100644
--- a/tests/input/res/drawable-xhdpi/ch_370_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_370_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_371_logo.png b/tests/input/res/drawable-xhdpi/ch_371_logo.png
index fe685db9..91958a07 100644
--- a/tests/input/res/drawable-xhdpi/ch_371_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_371_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_372_logo.png b/tests/input/res/drawable-xhdpi/ch_372_logo.png
index a083c6cd..4b2d757c 100644
--- a/tests/input/res/drawable-xhdpi/ch_372_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_372_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_373_logo.png b/tests/input/res/drawable-xhdpi/ch_373_logo.png
index 152bc6ce..f8aae527 100644
--- a/tests/input/res/drawable-xhdpi/ch_373_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_373_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_374_logo.png b/tests/input/res/drawable-xhdpi/ch_374_logo.png
index c0469e26..3549da94 100644
--- a/tests/input/res/drawable-xhdpi/ch_374_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_374_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_375_logo.png b/tests/input/res/drawable-xhdpi/ch_375_logo.png
index 0f1f4c2a..c19806e8 100644
--- a/tests/input/res/drawable-xhdpi/ch_375_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_375_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_376_logo.png b/tests/input/res/drawable-xhdpi/ch_376_logo.png
index 503c39ad..86144b73 100644
--- a/tests/input/res/drawable-xhdpi/ch_376_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_376_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_377_logo.png b/tests/input/res/drawable-xhdpi/ch_377_logo.png
index 1a16efea..74f693c1 100644
--- a/tests/input/res/drawable-xhdpi/ch_377_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_377_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_378_logo.png b/tests/input/res/drawable-xhdpi/ch_378_logo.png
index e23ddd77..40253dab 100644
--- a/tests/input/res/drawable-xhdpi/ch_378_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_378_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_379_logo.png b/tests/input/res/drawable-xhdpi/ch_379_logo.png
index ec6fa2dc..5459058f 100644
--- a/tests/input/res/drawable-xhdpi/ch_379_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_379_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_37_logo.png b/tests/input/res/drawable-xhdpi/ch_37_logo.png
index 6d0f27f3..7fce3b4d 100644
--- a/tests/input/res/drawable-xhdpi/ch_37_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_37_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_380_logo.png b/tests/input/res/drawable-xhdpi/ch_380_logo.png
index 31d2fafa..a47a40d8 100644
--- a/tests/input/res/drawable-xhdpi/ch_380_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_380_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_381_logo.png b/tests/input/res/drawable-xhdpi/ch_381_logo.png
index e7efb1c8..7059114c 100644
--- a/tests/input/res/drawable-xhdpi/ch_381_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_381_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_382_logo.png b/tests/input/res/drawable-xhdpi/ch_382_logo.png
index ee082821..a61201a5 100644
--- a/tests/input/res/drawable-xhdpi/ch_382_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_382_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_383_logo.png b/tests/input/res/drawable-xhdpi/ch_383_logo.png
index f9f69248..c126d6e3 100644
--- a/tests/input/res/drawable-xhdpi/ch_383_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_383_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_384_logo.png b/tests/input/res/drawable-xhdpi/ch_384_logo.png
index 1096faa8..0bd5f454 100644
--- a/tests/input/res/drawable-xhdpi/ch_384_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_384_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_385_logo.png b/tests/input/res/drawable-xhdpi/ch_385_logo.png
index cd0b9db4..864ff5c6 100644
--- a/tests/input/res/drawable-xhdpi/ch_385_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_385_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_386_logo.png b/tests/input/res/drawable-xhdpi/ch_386_logo.png
index 0b9fe16d..643db67a 100644
--- a/tests/input/res/drawable-xhdpi/ch_386_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_386_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_387_logo.png b/tests/input/res/drawable-xhdpi/ch_387_logo.png
index 45d0d225..206ec14f 100644
--- a/tests/input/res/drawable-xhdpi/ch_387_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_387_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_388_logo.png b/tests/input/res/drawable-xhdpi/ch_388_logo.png
index 8bcce1b4..37c9dbae 100644
--- a/tests/input/res/drawable-xhdpi/ch_388_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_388_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_389_logo.png b/tests/input/res/drawable-xhdpi/ch_389_logo.png
index a0251351..958ffb63 100644
--- a/tests/input/res/drawable-xhdpi/ch_389_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_389_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_38_logo.png b/tests/input/res/drawable-xhdpi/ch_38_logo.png
index 0e2539de..6e864bf8 100644
--- a/tests/input/res/drawable-xhdpi/ch_38_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_38_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_390_logo.png b/tests/input/res/drawable-xhdpi/ch_390_logo.png
index dbc5a19d..a5a6547e 100644
--- a/tests/input/res/drawable-xhdpi/ch_390_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_390_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_391_logo.png b/tests/input/res/drawable-xhdpi/ch_391_logo.png
index b0a7f9ca..0d1c076b 100644
--- a/tests/input/res/drawable-xhdpi/ch_391_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_391_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_392_logo.png b/tests/input/res/drawable-xhdpi/ch_392_logo.png
index 1a303e63..25e3a87a 100644
--- a/tests/input/res/drawable-xhdpi/ch_392_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_392_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_393_logo.png b/tests/input/res/drawable-xhdpi/ch_393_logo.png
index 69f7e765..92ebefe2 100644
--- a/tests/input/res/drawable-xhdpi/ch_393_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_393_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_394_logo.png b/tests/input/res/drawable-xhdpi/ch_394_logo.png
index c1e08355..b220319a 100644
--- a/tests/input/res/drawable-xhdpi/ch_394_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_394_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_395_logo.png b/tests/input/res/drawable-xhdpi/ch_395_logo.png
index c8df82e2..29df3f8f 100644
--- a/tests/input/res/drawable-xhdpi/ch_395_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_395_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_396_logo.png b/tests/input/res/drawable-xhdpi/ch_396_logo.png
index 61fa2b7b..f1e6f983 100644
--- a/tests/input/res/drawable-xhdpi/ch_396_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_396_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_397_logo.png b/tests/input/res/drawable-xhdpi/ch_397_logo.png
index 01bea3af..7f44d63c 100644
--- a/tests/input/res/drawable-xhdpi/ch_397_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_397_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_398_logo.png b/tests/input/res/drawable-xhdpi/ch_398_logo.png
index c6f3c193..03b14271 100644
--- a/tests/input/res/drawable-xhdpi/ch_398_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_398_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_399_logo.png b/tests/input/res/drawable-xhdpi/ch_399_logo.png
index 036cb786..a15aaa4e 100644
--- a/tests/input/res/drawable-xhdpi/ch_399_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_399_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_39_logo.png b/tests/input/res/drawable-xhdpi/ch_39_logo.png
index 3b719c30..633a1172 100644
--- a/tests/input/res/drawable-xhdpi/ch_39_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_39_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_3_logo.png b/tests/input/res/drawable-xhdpi/ch_3_logo.png
index b0e29425..9c921385 100644
--- a/tests/input/res/drawable-xhdpi/ch_3_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_3_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_400_logo.png b/tests/input/res/drawable-xhdpi/ch_400_logo.png
index 8680df86..15442662 100644
--- a/tests/input/res/drawable-xhdpi/ch_400_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_400_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_401_logo.png b/tests/input/res/drawable-xhdpi/ch_401_logo.png
index 987dd616..c4d06916 100644
--- a/tests/input/res/drawable-xhdpi/ch_401_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_401_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_402_logo.png b/tests/input/res/drawable-xhdpi/ch_402_logo.png
index 00c6d6fe..b8719f32 100644
--- a/tests/input/res/drawable-xhdpi/ch_402_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_402_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_403_logo.png b/tests/input/res/drawable-xhdpi/ch_403_logo.png
index 2929a7bd..054b98b7 100644
--- a/tests/input/res/drawable-xhdpi/ch_403_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_403_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_404_logo.png b/tests/input/res/drawable-xhdpi/ch_404_logo.png
index eae3f461..64566990 100644
--- a/tests/input/res/drawable-xhdpi/ch_404_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_404_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_405_logo.png b/tests/input/res/drawable-xhdpi/ch_405_logo.png
index 8672cb0f..2ceab3fb 100644
--- a/tests/input/res/drawable-xhdpi/ch_405_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_405_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_406_logo.png b/tests/input/res/drawable-xhdpi/ch_406_logo.png
index cbd69f3e..f7557109 100644
--- a/tests/input/res/drawable-xhdpi/ch_406_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_406_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_407_logo.png b/tests/input/res/drawable-xhdpi/ch_407_logo.png
index 003b3e42..8228e1c5 100644
--- a/tests/input/res/drawable-xhdpi/ch_407_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_407_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_408_logo.png b/tests/input/res/drawable-xhdpi/ch_408_logo.png
index 1b2a0dc5..d9c09b85 100644
--- a/tests/input/res/drawable-xhdpi/ch_408_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_408_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_409_logo.png b/tests/input/res/drawable-xhdpi/ch_409_logo.png
index 1d4dd21e..fd2b76e5 100644
--- a/tests/input/res/drawable-xhdpi/ch_409_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_409_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_40_logo.png b/tests/input/res/drawable-xhdpi/ch_40_logo.png
index 1e0c8720..63600168 100644
--- a/tests/input/res/drawable-xhdpi/ch_40_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_40_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_410_logo.png b/tests/input/res/drawable-xhdpi/ch_410_logo.png
index 49bec68d..8b05de2e 100644
--- a/tests/input/res/drawable-xhdpi/ch_410_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_410_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_411_logo.png b/tests/input/res/drawable-xhdpi/ch_411_logo.png
index e002d190..7306991e 100644
--- a/tests/input/res/drawable-xhdpi/ch_411_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_411_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_412_logo.png b/tests/input/res/drawable-xhdpi/ch_412_logo.png
index f2add1e1..55964214 100644
--- a/tests/input/res/drawable-xhdpi/ch_412_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_412_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_413_logo.png b/tests/input/res/drawable-xhdpi/ch_413_logo.png
index 4c400c26..c744901d 100644
--- a/tests/input/res/drawable-xhdpi/ch_413_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_413_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_414_logo.png b/tests/input/res/drawable-xhdpi/ch_414_logo.png
index 3119a703..304dc7da 100644
--- a/tests/input/res/drawable-xhdpi/ch_414_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_414_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_415_logo.png b/tests/input/res/drawable-xhdpi/ch_415_logo.png
index 9f634433..1a9b1f19 100644
--- a/tests/input/res/drawable-xhdpi/ch_415_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_415_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_416_logo.png b/tests/input/res/drawable-xhdpi/ch_416_logo.png
index a0bf863a..53318edf 100644
--- a/tests/input/res/drawable-xhdpi/ch_416_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_416_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_417_logo.png b/tests/input/res/drawable-xhdpi/ch_417_logo.png
index a475f405..763bad1b 100644
--- a/tests/input/res/drawable-xhdpi/ch_417_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_417_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_418_logo.png b/tests/input/res/drawable-xhdpi/ch_418_logo.png
index 1c8b9af4..afa06409 100644
--- a/tests/input/res/drawable-xhdpi/ch_418_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_418_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_419_logo.png b/tests/input/res/drawable-xhdpi/ch_419_logo.png
index e0e3aeec..4741b659 100644
--- a/tests/input/res/drawable-xhdpi/ch_419_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_419_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_41_logo.png b/tests/input/res/drawable-xhdpi/ch_41_logo.png
index a3e80d91..6002ae31 100644
--- a/tests/input/res/drawable-xhdpi/ch_41_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_41_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_420_logo.png b/tests/input/res/drawable-xhdpi/ch_420_logo.png
index a34ce714..22a72aec 100644
--- a/tests/input/res/drawable-xhdpi/ch_420_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_420_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_421_logo.png b/tests/input/res/drawable-xhdpi/ch_421_logo.png
index a6539075..f4c301dd 100644
--- a/tests/input/res/drawable-xhdpi/ch_421_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_421_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_422_logo.png b/tests/input/res/drawable-xhdpi/ch_422_logo.png
index 4eb3189a..e70d59ac 100644
--- a/tests/input/res/drawable-xhdpi/ch_422_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_422_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_423_logo.png b/tests/input/res/drawable-xhdpi/ch_423_logo.png
index 8d83bd46..a4c96fbd 100644
--- a/tests/input/res/drawable-xhdpi/ch_423_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_423_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_424_logo.png b/tests/input/res/drawable-xhdpi/ch_424_logo.png
index 3eed5fa1..9dc1713e 100644
--- a/tests/input/res/drawable-xhdpi/ch_424_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_424_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_425_logo.png b/tests/input/res/drawable-xhdpi/ch_425_logo.png
index 2ffca333..a79e8f5c 100644
--- a/tests/input/res/drawable-xhdpi/ch_425_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_425_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_426_logo.png b/tests/input/res/drawable-xhdpi/ch_426_logo.png
index 5a9ee457..34bcbef0 100644
--- a/tests/input/res/drawable-xhdpi/ch_426_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_426_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_427_logo.png b/tests/input/res/drawable-xhdpi/ch_427_logo.png
index 28ebd5dd..6133494d 100644
--- a/tests/input/res/drawable-xhdpi/ch_427_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_427_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_428_logo.png b/tests/input/res/drawable-xhdpi/ch_428_logo.png
index 68769207..d91391a4 100644
--- a/tests/input/res/drawable-xhdpi/ch_428_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_428_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_429_logo.png b/tests/input/res/drawable-xhdpi/ch_429_logo.png
index c8b71730..f24a64f9 100644
--- a/tests/input/res/drawable-xhdpi/ch_429_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_429_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_42_logo.png b/tests/input/res/drawable-xhdpi/ch_42_logo.png
index 806d0186..c2f641c0 100644
--- a/tests/input/res/drawable-xhdpi/ch_42_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_42_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_430_logo.png b/tests/input/res/drawable-xhdpi/ch_430_logo.png
index be69f765..e656d6da 100644
--- a/tests/input/res/drawable-xhdpi/ch_430_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_430_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_431_logo.png b/tests/input/res/drawable-xhdpi/ch_431_logo.png
index 23869ee5..4827d71d 100644
--- a/tests/input/res/drawable-xhdpi/ch_431_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_431_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_432_logo.png b/tests/input/res/drawable-xhdpi/ch_432_logo.png
index 023f2467..bb5493e2 100644
--- a/tests/input/res/drawable-xhdpi/ch_432_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_432_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_433_logo.png b/tests/input/res/drawable-xhdpi/ch_433_logo.png
index 4d089a91..f777f36a 100644
--- a/tests/input/res/drawable-xhdpi/ch_433_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_433_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_434_logo.png b/tests/input/res/drawable-xhdpi/ch_434_logo.png
index 80be3347..f342df85 100644
--- a/tests/input/res/drawable-xhdpi/ch_434_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_434_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_435_logo.png b/tests/input/res/drawable-xhdpi/ch_435_logo.png
index ee68a104..70667e7a 100644
--- a/tests/input/res/drawable-xhdpi/ch_435_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_435_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_436_logo.png b/tests/input/res/drawable-xhdpi/ch_436_logo.png
index 1cbecf67..1895a238 100644
--- a/tests/input/res/drawable-xhdpi/ch_436_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_436_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_437_logo.png b/tests/input/res/drawable-xhdpi/ch_437_logo.png
index 86f0051d..9b6b335b 100644
--- a/tests/input/res/drawable-xhdpi/ch_437_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_437_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_438_logo.png b/tests/input/res/drawable-xhdpi/ch_438_logo.png
index 68e96389..5070cdb1 100644
--- a/tests/input/res/drawable-xhdpi/ch_438_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_438_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_439_logo.png b/tests/input/res/drawable-xhdpi/ch_439_logo.png
index 6cb790f7..adcad27b 100644
--- a/tests/input/res/drawable-xhdpi/ch_439_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_439_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_43_logo.png b/tests/input/res/drawable-xhdpi/ch_43_logo.png
index 20aaff1b..5ea7d814 100644
--- a/tests/input/res/drawable-xhdpi/ch_43_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_43_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_440_logo.png b/tests/input/res/drawable-xhdpi/ch_440_logo.png
index ff8a9967..0b1f76c6 100644
--- a/tests/input/res/drawable-xhdpi/ch_440_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_440_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_441_logo.png b/tests/input/res/drawable-xhdpi/ch_441_logo.png
index 691bdb1f..65870b6e 100644
--- a/tests/input/res/drawable-xhdpi/ch_441_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_441_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_442_logo.png b/tests/input/res/drawable-xhdpi/ch_442_logo.png
index c2180054..9812a1cb 100644
--- a/tests/input/res/drawable-xhdpi/ch_442_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_442_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_443_logo.png b/tests/input/res/drawable-xhdpi/ch_443_logo.png
index 865b0101..d539f5c1 100644
--- a/tests/input/res/drawable-xhdpi/ch_443_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_443_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_444_logo.png b/tests/input/res/drawable-xhdpi/ch_444_logo.png
index ed770663..fbf615d9 100644
--- a/tests/input/res/drawable-xhdpi/ch_444_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_444_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_445_logo.png b/tests/input/res/drawable-xhdpi/ch_445_logo.png
index 1d8c4996..440085aa 100644
--- a/tests/input/res/drawable-xhdpi/ch_445_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_445_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_446_logo.png b/tests/input/res/drawable-xhdpi/ch_446_logo.png
index 1fc1b386..d26f1c37 100644
--- a/tests/input/res/drawable-xhdpi/ch_446_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_446_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_447_logo.png b/tests/input/res/drawable-xhdpi/ch_447_logo.png
index 59a8adc8..0967878d 100644
--- a/tests/input/res/drawable-xhdpi/ch_447_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_447_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_448_logo.png b/tests/input/res/drawable-xhdpi/ch_448_logo.png
index 820d61f9..b979c062 100644
--- a/tests/input/res/drawable-xhdpi/ch_448_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_448_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_449_logo.png b/tests/input/res/drawable-xhdpi/ch_449_logo.png
index 94a1a70f..2232b90e 100644
--- a/tests/input/res/drawable-xhdpi/ch_449_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_449_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_44_logo.png b/tests/input/res/drawable-xhdpi/ch_44_logo.png
index 409b5df4..be6cbd3b 100644
--- a/tests/input/res/drawable-xhdpi/ch_44_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_44_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_450_logo.png b/tests/input/res/drawable-xhdpi/ch_450_logo.png
index bdcd5bdb..8e25df9a 100644
--- a/tests/input/res/drawable-xhdpi/ch_450_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_450_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_451_logo.png b/tests/input/res/drawable-xhdpi/ch_451_logo.png
index 4339f74c..c744e56e 100644
--- a/tests/input/res/drawable-xhdpi/ch_451_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_451_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_452_logo.png b/tests/input/res/drawable-xhdpi/ch_452_logo.png
index b7a403fa..050b0196 100644
--- a/tests/input/res/drawable-xhdpi/ch_452_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_452_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_453_logo.png b/tests/input/res/drawable-xhdpi/ch_453_logo.png
index 4e234270..4ccdbf14 100644
--- a/tests/input/res/drawable-xhdpi/ch_453_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_453_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_454_logo.png b/tests/input/res/drawable-xhdpi/ch_454_logo.png
index 4873c1ec..10aa3779 100644
--- a/tests/input/res/drawable-xhdpi/ch_454_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_454_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_455_logo.png b/tests/input/res/drawable-xhdpi/ch_455_logo.png
index 2c7dcffe..7b607a6c 100644
--- a/tests/input/res/drawable-xhdpi/ch_455_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_455_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_456_logo.png b/tests/input/res/drawable-xhdpi/ch_456_logo.png
index 05a2db14..f2d57066 100644
--- a/tests/input/res/drawable-xhdpi/ch_456_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_456_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_457_logo.png b/tests/input/res/drawable-xhdpi/ch_457_logo.png
index 7772b418..483e5912 100644
--- a/tests/input/res/drawable-xhdpi/ch_457_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_457_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_458_logo.png b/tests/input/res/drawable-xhdpi/ch_458_logo.png
index e44d6c92..447d5942 100644
--- a/tests/input/res/drawable-xhdpi/ch_458_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_458_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_459_logo.png b/tests/input/res/drawable-xhdpi/ch_459_logo.png
index a946b148..80d6c5b6 100644
--- a/tests/input/res/drawable-xhdpi/ch_459_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_459_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_45_logo.png b/tests/input/res/drawable-xhdpi/ch_45_logo.png
index fc725dbf..0db467c8 100644
--- a/tests/input/res/drawable-xhdpi/ch_45_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_45_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_460_logo.png b/tests/input/res/drawable-xhdpi/ch_460_logo.png
index bb19236d..22d785cb 100644
--- a/tests/input/res/drawable-xhdpi/ch_460_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_460_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_461_logo.png b/tests/input/res/drawable-xhdpi/ch_461_logo.png
index be531cf0..658a1046 100644
--- a/tests/input/res/drawable-xhdpi/ch_461_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_461_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_462_logo.png b/tests/input/res/drawable-xhdpi/ch_462_logo.png
index c7568f3e..dd0c5d14 100644
--- a/tests/input/res/drawable-xhdpi/ch_462_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_462_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_463_logo.png b/tests/input/res/drawable-xhdpi/ch_463_logo.png
index 3ac05577..7b72b915 100644
--- a/tests/input/res/drawable-xhdpi/ch_463_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_463_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_464_logo.png b/tests/input/res/drawable-xhdpi/ch_464_logo.png
index 35d263e2..cc15444c 100644
--- a/tests/input/res/drawable-xhdpi/ch_464_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_464_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_465_logo.png b/tests/input/res/drawable-xhdpi/ch_465_logo.png
index 44e94fa8..a17cb719 100644
--- a/tests/input/res/drawable-xhdpi/ch_465_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_465_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_466_logo.png b/tests/input/res/drawable-xhdpi/ch_466_logo.png
index 453b1085..604644f4 100644
--- a/tests/input/res/drawable-xhdpi/ch_466_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_466_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_467_logo.png b/tests/input/res/drawable-xhdpi/ch_467_logo.png
index c1577d0f..4c74b50d 100644
--- a/tests/input/res/drawable-xhdpi/ch_467_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_467_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_468_logo.png b/tests/input/res/drawable-xhdpi/ch_468_logo.png
index 11238603..8e329206 100644
--- a/tests/input/res/drawable-xhdpi/ch_468_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_468_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_469_logo.png b/tests/input/res/drawable-xhdpi/ch_469_logo.png
index e0373ea6..14a1d99e 100644
--- a/tests/input/res/drawable-xhdpi/ch_469_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_469_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_46_logo.png b/tests/input/res/drawable-xhdpi/ch_46_logo.png
index 0c9b740e..f9d83ea9 100644
--- a/tests/input/res/drawable-xhdpi/ch_46_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_46_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_470_logo.png b/tests/input/res/drawable-xhdpi/ch_470_logo.png
index aa04ce40..567e879a 100644
--- a/tests/input/res/drawable-xhdpi/ch_470_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_470_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_471_logo.png b/tests/input/res/drawable-xhdpi/ch_471_logo.png
index b2793a22..4a128a0e 100644
--- a/tests/input/res/drawable-xhdpi/ch_471_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_471_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_472_logo.png b/tests/input/res/drawable-xhdpi/ch_472_logo.png
index d00ea6a4..f00d1cb0 100644
--- a/tests/input/res/drawable-xhdpi/ch_472_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_472_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_473_logo.png b/tests/input/res/drawable-xhdpi/ch_473_logo.png
index 9fcb5c65..ee7bbfc9 100644
--- a/tests/input/res/drawable-xhdpi/ch_473_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_473_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_474_logo.png b/tests/input/res/drawable-xhdpi/ch_474_logo.png
index 8e13450c..a1b7e0eb 100644
--- a/tests/input/res/drawable-xhdpi/ch_474_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_474_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_475_logo.png b/tests/input/res/drawable-xhdpi/ch_475_logo.png
index ebb96f74..14db7abe 100644
--- a/tests/input/res/drawable-xhdpi/ch_475_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_475_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_476_logo.png b/tests/input/res/drawable-xhdpi/ch_476_logo.png
index 39a81c4b..89c71e80 100644
--- a/tests/input/res/drawable-xhdpi/ch_476_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_476_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_477_logo.png b/tests/input/res/drawable-xhdpi/ch_477_logo.png
index 48ec00de..60509130 100644
--- a/tests/input/res/drawable-xhdpi/ch_477_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_477_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_478_logo.png b/tests/input/res/drawable-xhdpi/ch_478_logo.png
index b6e08715..a2c3069b 100644
--- a/tests/input/res/drawable-xhdpi/ch_478_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_478_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_479_logo.png b/tests/input/res/drawable-xhdpi/ch_479_logo.png
index 5d964709..2be6ae4f 100644
--- a/tests/input/res/drawable-xhdpi/ch_479_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_479_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_47_logo.png b/tests/input/res/drawable-xhdpi/ch_47_logo.png
index b4aee717..ed4b464a 100644
--- a/tests/input/res/drawable-xhdpi/ch_47_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_47_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_480_logo.png b/tests/input/res/drawable-xhdpi/ch_480_logo.png
index 708ab0cb..f2a2d6fa 100644
--- a/tests/input/res/drawable-xhdpi/ch_480_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_480_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_481_logo.png b/tests/input/res/drawable-xhdpi/ch_481_logo.png
index 019de9d6..b71fcfa8 100644
--- a/tests/input/res/drawable-xhdpi/ch_481_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_481_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_482_logo.png b/tests/input/res/drawable-xhdpi/ch_482_logo.png
index 1399a206..8d317e47 100644
--- a/tests/input/res/drawable-xhdpi/ch_482_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_482_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_483_logo.png b/tests/input/res/drawable-xhdpi/ch_483_logo.png
index cca5aef0..ea417f9e 100644
--- a/tests/input/res/drawable-xhdpi/ch_483_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_483_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_484_logo.png b/tests/input/res/drawable-xhdpi/ch_484_logo.png
index 5c2fd6b2..b46584a4 100644
--- a/tests/input/res/drawable-xhdpi/ch_484_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_484_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_485_logo.png b/tests/input/res/drawable-xhdpi/ch_485_logo.png
index 7e239c2b..3564dcd5 100644
--- a/tests/input/res/drawable-xhdpi/ch_485_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_485_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_486_logo.png b/tests/input/res/drawable-xhdpi/ch_486_logo.png
index 7b26dc96..8227575f 100644
--- a/tests/input/res/drawable-xhdpi/ch_486_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_486_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_487_logo.png b/tests/input/res/drawable-xhdpi/ch_487_logo.png
index 24c5f25b..edb15bee 100644
--- a/tests/input/res/drawable-xhdpi/ch_487_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_487_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_488_logo.png b/tests/input/res/drawable-xhdpi/ch_488_logo.png
index ca4c76fc..f358d335 100644
--- a/tests/input/res/drawable-xhdpi/ch_488_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_488_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_489_logo.png b/tests/input/res/drawable-xhdpi/ch_489_logo.png
index a139bbc4..5122c67e 100644
--- a/tests/input/res/drawable-xhdpi/ch_489_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_489_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_48_logo.png b/tests/input/res/drawable-xhdpi/ch_48_logo.png
index 28e01441..e1be7313 100644
--- a/tests/input/res/drawable-xhdpi/ch_48_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_48_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_490_logo.png b/tests/input/res/drawable-xhdpi/ch_490_logo.png
index 25634d4f..1901d995 100644
--- a/tests/input/res/drawable-xhdpi/ch_490_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_490_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_491_logo.png b/tests/input/res/drawable-xhdpi/ch_491_logo.png
index fa5b6d3f..04b0a021 100644
--- a/tests/input/res/drawable-xhdpi/ch_491_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_491_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_492_logo.png b/tests/input/res/drawable-xhdpi/ch_492_logo.png
index ce5443fd..b18dea9b 100644
--- a/tests/input/res/drawable-xhdpi/ch_492_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_492_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_493_logo.png b/tests/input/res/drawable-xhdpi/ch_493_logo.png
index 717787cf..19044655 100644
--- a/tests/input/res/drawable-xhdpi/ch_493_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_493_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_494_logo.png b/tests/input/res/drawable-xhdpi/ch_494_logo.png
index 46d78ffb..b5b0f76c 100644
--- a/tests/input/res/drawable-xhdpi/ch_494_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_494_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_495_logo.png b/tests/input/res/drawable-xhdpi/ch_495_logo.png
index d55b34df..6124dc83 100644
--- a/tests/input/res/drawable-xhdpi/ch_495_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_495_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_496_logo.png b/tests/input/res/drawable-xhdpi/ch_496_logo.png
index 85fc1f89..6b0e472b 100644
--- a/tests/input/res/drawable-xhdpi/ch_496_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_496_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_497_logo.png b/tests/input/res/drawable-xhdpi/ch_497_logo.png
index c4e9843d..31fcd048 100644
--- a/tests/input/res/drawable-xhdpi/ch_497_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_497_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_498_logo.png b/tests/input/res/drawable-xhdpi/ch_498_logo.png
index 1b027ad4..472c09b6 100644
--- a/tests/input/res/drawable-xhdpi/ch_498_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_498_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_499_logo.png b/tests/input/res/drawable-xhdpi/ch_499_logo.png
index 25464c7a..2d653f61 100644
--- a/tests/input/res/drawable-xhdpi/ch_499_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_499_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_49_logo.png b/tests/input/res/drawable-xhdpi/ch_49_logo.png
index 979d7a16..46bc774d 100644
--- a/tests/input/res/drawable-xhdpi/ch_49_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_49_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_4_logo.png b/tests/input/res/drawable-xhdpi/ch_4_logo.png
index bdcba74f..d5e6517c 100644
--- a/tests/input/res/drawable-xhdpi/ch_4_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_4_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_500_logo.png b/tests/input/res/drawable-xhdpi/ch_500_logo.png
index c7666c60..ecfa17ec 100644
--- a/tests/input/res/drawable-xhdpi/ch_500_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_500_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_501_logo.png b/tests/input/res/drawable-xhdpi/ch_501_logo.png
index f3902ad6..0c81a787 100644
--- a/tests/input/res/drawable-xhdpi/ch_501_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_501_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_502_logo.png b/tests/input/res/drawable-xhdpi/ch_502_logo.png
index 6d3d3a56..5dd20644 100644
--- a/tests/input/res/drawable-xhdpi/ch_502_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_502_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_503_logo.png b/tests/input/res/drawable-xhdpi/ch_503_logo.png
index 8e729042..a48ec52d 100644
--- a/tests/input/res/drawable-xhdpi/ch_503_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_503_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_504_logo.png b/tests/input/res/drawable-xhdpi/ch_504_logo.png
index 72347b6e..999a641e 100644
--- a/tests/input/res/drawable-xhdpi/ch_504_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_504_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_505_logo.png b/tests/input/res/drawable-xhdpi/ch_505_logo.png
index c50cce8c..d7c600e4 100644
--- a/tests/input/res/drawable-xhdpi/ch_505_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_505_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_506_logo.png b/tests/input/res/drawable-xhdpi/ch_506_logo.png
index a56cbe5d..ac80e6dd 100644
--- a/tests/input/res/drawable-xhdpi/ch_506_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_506_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_507_logo.png b/tests/input/res/drawable-xhdpi/ch_507_logo.png
index f5dbb30f..c4d434f8 100644
--- a/tests/input/res/drawable-xhdpi/ch_507_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_507_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_508_logo.png b/tests/input/res/drawable-xhdpi/ch_508_logo.png
index 62ed0c19..35330059 100644
--- a/tests/input/res/drawable-xhdpi/ch_508_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_508_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_509_logo.png b/tests/input/res/drawable-xhdpi/ch_509_logo.png
index 513444a0..2077eac5 100644
--- a/tests/input/res/drawable-xhdpi/ch_509_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_509_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_50_logo.png b/tests/input/res/drawable-xhdpi/ch_50_logo.png
index 8d347d77..901373e6 100644
--- a/tests/input/res/drawable-xhdpi/ch_50_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_50_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_510_logo.png b/tests/input/res/drawable-xhdpi/ch_510_logo.png
index ebf5f565..469bf77d 100644
--- a/tests/input/res/drawable-xhdpi/ch_510_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_510_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_511_logo.png b/tests/input/res/drawable-xhdpi/ch_511_logo.png
index 3a062b08..80d727bb 100644
--- a/tests/input/res/drawable-xhdpi/ch_511_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_511_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_512_logo.png b/tests/input/res/drawable-xhdpi/ch_512_logo.png
index 1660c8fe..37ba7e2b 100644
--- a/tests/input/res/drawable-xhdpi/ch_512_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_512_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_513_logo.png b/tests/input/res/drawable-xhdpi/ch_513_logo.png
index 24a4ac12..ef7c4f2a 100644
--- a/tests/input/res/drawable-xhdpi/ch_513_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_513_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_514_logo.png b/tests/input/res/drawable-xhdpi/ch_514_logo.png
index 83b7c4ce..450f5963 100644
--- a/tests/input/res/drawable-xhdpi/ch_514_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_514_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_515_logo.png b/tests/input/res/drawable-xhdpi/ch_515_logo.png
index dcd64054..6533b2fd 100644
--- a/tests/input/res/drawable-xhdpi/ch_515_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_515_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_516_logo.png b/tests/input/res/drawable-xhdpi/ch_516_logo.png
index 20f6f8f2..08cd2f0d 100644
--- a/tests/input/res/drawable-xhdpi/ch_516_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_516_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_517_logo.png b/tests/input/res/drawable-xhdpi/ch_517_logo.png
index 9630234e..1935d709 100644
--- a/tests/input/res/drawable-xhdpi/ch_517_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_517_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_518_logo.png b/tests/input/res/drawable-xhdpi/ch_518_logo.png
index 65f85a37..806fbbbf 100644
--- a/tests/input/res/drawable-xhdpi/ch_518_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_518_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_519_logo.png b/tests/input/res/drawable-xhdpi/ch_519_logo.png
index c963ef2a..938bb559 100644
--- a/tests/input/res/drawable-xhdpi/ch_519_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_519_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_51_logo.png b/tests/input/res/drawable-xhdpi/ch_51_logo.png
index ecf8f5d5..07a5f4ad 100644
--- a/tests/input/res/drawable-xhdpi/ch_51_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_51_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_520_logo.png b/tests/input/res/drawable-xhdpi/ch_520_logo.png
index b6ad9b49..7f9f68b2 100644
--- a/tests/input/res/drawable-xhdpi/ch_520_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_520_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_521_logo.png b/tests/input/res/drawable-xhdpi/ch_521_logo.png
index 874185ea..e8d0432c 100644
--- a/tests/input/res/drawable-xhdpi/ch_521_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_521_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_522_logo.png b/tests/input/res/drawable-xhdpi/ch_522_logo.png
index ea273252..d7345b8c 100644
--- a/tests/input/res/drawable-xhdpi/ch_522_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_522_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_523_logo.png b/tests/input/res/drawable-xhdpi/ch_523_logo.png
index eb27f052..61573120 100644
--- a/tests/input/res/drawable-xhdpi/ch_523_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_523_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_524_logo.png b/tests/input/res/drawable-xhdpi/ch_524_logo.png
index e3ea1563..9a8b2fdd 100644
--- a/tests/input/res/drawable-xhdpi/ch_524_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_524_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_525_logo.png b/tests/input/res/drawable-xhdpi/ch_525_logo.png
index 2321e786..9ed318fa 100644
--- a/tests/input/res/drawable-xhdpi/ch_525_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_525_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_526_logo.png b/tests/input/res/drawable-xhdpi/ch_526_logo.png
index 57c0e5f2..5000af2a 100644
--- a/tests/input/res/drawable-xhdpi/ch_526_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_526_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_527_logo.png b/tests/input/res/drawable-xhdpi/ch_527_logo.png
index cad756c2..38fbd9eb 100644
--- a/tests/input/res/drawable-xhdpi/ch_527_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_527_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_528_logo.png b/tests/input/res/drawable-xhdpi/ch_528_logo.png
index be46d47f..565e8b2a 100644
--- a/tests/input/res/drawable-xhdpi/ch_528_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_528_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_529_logo.png b/tests/input/res/drawable-xhdpi/ch_529_logo.png
index 54fece7f..b0924df7 100644
--- a/tests/input/res/drawable-xhdpi/ch_529_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_529_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_52_logo.png b/tests/input/res/drawable-xhdpi/ch_52_logo.png
index ec3eb477..6faa9702 100644
--- a/tests/input/res/drawable-xhdpi/ch_52_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_52_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_530_logo.png b/tests/input/res/drawable-xhdpi/ch_530_logo.png
index 27709060..0eec0234 100644
--- a/tests/input/res/drawable-xhdpi/ch_530_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_530_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_531_logo.png b/tests/input/res/drawable-xhdpi/ch_531_logo.png
index 44c6b84a..2f0243d1 100644
--- a/tests/input/res/drawable-xhdpi/ch_531_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_531_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_532_logo.png b/tests/input/res/drawable-xhdpi/ch_532_logo.png
index e6076ce1..a6ece89e 100644
--- a/tests/input/res/drawable-xhdpi/ch_532_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_532_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_533_logo.png b/tests/input/res/drawable-xhdpi/ch_533_logo.png
index 3d19a963..a1695158 100644
--- a/tests/input/res/drawable-xhdpi/ch_533_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_533_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_534_logo.png b/tests/input/res/drawable-xhdpi/ch_534_logo.png
index 50784977..00ad0b07 100644
--- a/tests/input/res/drawable-xhdpi/ch_534_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_534_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_535_logo.png b/tests/input/res/drawable-xhdpi/ch_535_logo.png
index 8163a96f..a536ff32 100644
--- a/tests/input/res/drawable-xhdpi/ch_535_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_535_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_536_logo.png b/tests/input/res/drawable-xhdpi/ch_536_logo.png
index a03f9e04..60fcdf33 100644
--- a/tests/input/res/drawable-xhdpi/ch_536_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_536_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_537_logo.png b/tests/input/res/drawable-xhdpi/ch_537_logo.png
index 17434611..0446d9bc 100644
--- a/tests/input/res/drawable-xhdpi/ch_537_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_537_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_538_logo.png b/tests/input/res/drawable-xhdpi/ch_538_logo.png
index 3141c0dc..6f98e08d 100644
--- a/tests/input/res/drawable-xhdpi/ch_538_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_538_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_539_logo.png b/tests/input/res/drawable-xhdpi/ch_539_logo.png
index b110e032..b6f17bbb 100644
--- a/tests/input/res/drawable-xhdpi/ch_539_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_539_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_53_logo.png b/tests/input/res/drawable-xhdpi/ch_53_logo.png
index 0e656758..441e1d97 100644
--- a/tests/input/res/drawable-xhdpi/ch_53_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_53_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_540_logo.png b/tests/input/res/drawable-xhdpi/ch_540_logo.png
index 8ebf4165..61950bff 100644
--- a/tests/input/res/drawable-xhdpi/ch_540_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_540_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_541_logo.png b/tests/input/res/drawable-xhdpi/ch_541_logo.png
index 3e1af08b..eea9a988 100644
--- a/tests/input/res/drawable-xhdpi/ch_541_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_541_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_542_logo.png b/tests/input/res/drawable-xhdpi/ch_542_logo.png
index d5f22057..684cf6d1 100644
--- a/tests/input/res/drawable-xhdpi/ch_542_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_542_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_543_logo.png b/tests/input/res/drawable-xhdpi/ch_543_logo.png
index 3e0f7509..44e4e6e0 100644
--- a/tests/input/res/drawable-xhdpi/ch_543_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_543_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_544_logo.png b/tests/input/res/drawable-xhdpi/ch_544_logo.png
index d86af336..adf6c97a 100644
--- a/tests/input/res/drawable-xhdpi/ch_544_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_544_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_545_logo.png b/tests/input/res/drawable-xhdpi/ch_545_logo.png
index 17660161..57f8edc6 100644
--- a/tests/input/res/drawable-xhdpi/ch_545_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_545_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_546_logo.png b/tests/input/res/drawable-xhdpi/ch_546_logo.png
index 50f6511f..4ac92311 100644
--- a/tests/input/res/drawable-xhdpi/ch_546_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_546_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_547_logo.png b/tests/input/res/drawable-xhdpi/ch_547_logo.png
index cea4ddc5..ca857974 100644
--- a/tests/input/res/drawable-xhdpi/ch_547_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_547_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_548_logo.png b/tests/input/res/drawable-xhdpi/ch_548_logo.png
index 22e8cde1..1037011c 100644
--- a/tests/input/res/drawable-xhdpi/ch_548_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_548_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_549_logo.png b/tests/input/res/drawable-xhdpi/ch_549_logo.png
index 517abc60..fd10a2ee 100644
--- a/tests/input/res/drawable-xhdpi/ch_549_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_549_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_54_logo.png b/tests/input/res/drawable-xhdpi/ch_54_logo.png
index b5ab64d8..50f22f48 100644
--- a/tests/input/res/drawable-xhdpi/ch_54_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_54_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_550_logo.png b/tests/input/res/drawable-xhdpi/ch_550_logo.png
index 34000a65..992666b6 100644
--- a/tests/input/res/drawable-xhdpi/ch_550_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_550_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_551_logo.png b/tests/input/res/drawable-xhdpi/ch_551_logo.png
index f64a3f9b..41369f0b 100644
--- a/tests/input/res/drawable-xhdpi/ch_551_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_551_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_552_logo.png b/tests/input/res/drawable-xhdpi/ch_552_logo.png
index 2c814f31..56be3e73 100644
--- a/tests/input/res/drawable-xhdpi/ch_552_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_552_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_553_logo.png b/tests/input/res/drawable-xhdpi/ch_553_logo.png
index 6feb5fd5..04812119 100644
--- a/tests/input/res/drawable-xhdpi/ch_553_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_553_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_554_logo.png b/tests/input/res/drawable-xhdpi/ch_554_logo.png
index 4fc0815a..b7e943a3 100644
--- a/tests/input/res/drawable-xhdpi/ch_554_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_554_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_555_logo.png b/tests/input/res/drawable-xhdpi/ch_555_logo.png
index b156f760..fb74741b 100644
--- a/tests/input/res/drawable-xhdpi/ch_555_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_555_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_556_logo.png b/tests/input/res/drawable-xhdpi/ch_556_logo.png
index 6db0f725..8c6d4046 100644
--- a/tests/input/res/drawable-xhdpi/ch_556_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_556_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_557_logo.png b/tests/input/res/drawable-xhdpi/ch_557_logo.png
index b718c7d4..fe65c25c 100644
--- a/tests/input/res/drawable-xhdpi/ch_557_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_557_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_558_logo.png b/tests/input/res/drawable-xhdpi/ch_558_logo.png
index 3a031f7c..598e6424 100644
--- a/tests/input/res/drawable-xhdpi/ch_558_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_558_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_559_logo.png b/tests/input/res/drawable-xhdpi/ch_559_logo.png
index 21e086d3..68a46085 100644
--- a/tests/input/res/drawable-xhdpi/ch_559_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_559_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_55_logo.png b/tests/input/res/drawable-xhdpi/ch_55_logo.png
index d5aa5fc9..59f21e84 100644
--- a/tests/input/res/drawable-xhdpi/ch_55_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_55_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_560_logo.png b/tests/input/res/drawable-xhdpi/ch_560_logo.png
index 0862c7e2..db6d6693 100644
--- a/tests/input/res/drawable-xhdpi/ch_560_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_560_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_561_logo.png b/tests/input/res/drawable-xhdpi/ch_561_logo.png
index 0ae7b9fb..b53f08f0 100644
--- a/tests/input/res/drawable-xhdpi/ch_561_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_561_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_562_logo.png b/tests/input/res/drawable-xhdpi/ch_562_logo.png
index e3b0e337..970f0174 100644
--- a/tests/input/res/drawable-xhdpi/ch_562_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_562_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_563_logo.png b/tests/input/res/drawable-xhdpi/ch_563_logo.png
index 35d8552f..1c426378 100644
--- a/tests/input/res/drawable-xhdpi/ch_563_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_563_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_564_logo.png b/tests/input/res/drawable-xhdpi/ch_564_logo.png
index 1e5d0750..61a89f16 100644
--- a/tests/input/res/drawable-xhdpi/ch_564_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_564_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_565_logo.png b/tests/input/res/drawable-xhdpi/ch_565_logo.png
index c5e0c341..956342b2 100644
--- a/tests/input/res/drawable-xhdpi/ch_565_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_565_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_566_logo.png b/tests/input/res/drawable-xhdpi/ch_566_logo.png
index a2178ba0..a935ec4a 100644
--- a/tests/input/res/drawable-xhdpi/ch_566_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_566_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_567_logo.png b/tests/input/res/drawable-xhdpi/ch_567_logo.png
index 66b56918..4d6e407e 100644
--- a/tests/input/res/drawable-xhdpi/ch_567_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_567_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_568_logo.png b/tests/input/res/drawable-xhdpi/ch_568_logo.png
index ef977e4c..f4578ed0 100644
--- a/tests/input/res/drawable-xhdpi/ch_568_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_568_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_569_logo.png b/tests/input/res/drawable-xhdpi/ch_569_logo.png
index f234dfd2..807c7323 100644
--- a/tests/input/res/drawable-xhdpi/ch_569_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_569_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_56_logo.png b/tests/input/res/drawable-xhdpi/ch_56_logo.png
index da62a21a..dc296510 100644
--- a/tests/input/res/drawable-xhdpi/ch_56_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_56_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_570_logo.png b/tests/input/res/drawable-xhdpi/ch_570_logo.png
index 61e8e57a..ef03c654 100644
--- a/tests/input/res/drawable-xhdpi/ch_570_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_570_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_571_logo.png b/tests/input/res/drawable-xhdpi/ch_571_logo.png
index 4a62e9f0..422f9aa4 100644
--- a/tests/input/res/drawable-xhdpi/ch_571_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_571_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_572_logo.png b/tests/input/res/drawable-xhdpi/ch_572_logo.png
index c4b7638a..68d08376 100644
--- a/tests/input/res/drawable-xhdpi/ch_572_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_572_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_573_logo.png b/tests/input/res/drawable-xhdpi/ch_573_logo.png
index 458544be..1d8ca402 100644
--- a/tests/input/res/drawable-xhdpi/ch_573_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_573_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_574_logo.png b/tests/input/res/drawable-xhdpi/ch_574_logo.png
index 0c29bf9f..f582224a 100644
--- a/tests/input/res/drawable-xhdpi/ch_574_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_574_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_575_logo.png b/tests/input/res/drawable-xhdpi/ch_575_logo.png
index 51397746..44fc827b 100644
--- a/tests/input/res/drawable-xhdpi/ch_575_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_575_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_576_logo.png b/tests/input/res/drawable-xhdpi/ch_576_logo.png
index ba443bd8..a8c9b36d 100644
--- a/tests/input/res/drawable-xhdpi/ch_576_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_576_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_577_logo.png b/tests/input/res/drawable-xhdpi/ch_577_logo.png
index d7fa7f31..328c67a9 100644
--- a/tests/input/res/drawable-xhdpi/ch_577_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_577_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_578_logo.png b/tests/input/res/drawable-xhdpi/ch_578_logo.png
index 30464d8e..d856dac5 100644
--- a/tests/input/res/drawable-xhdpi/ch_578_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_578_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_579_logo.png b/tests/input/res/drawable-xhdpi/ch_579_logo.png
index a43e8d6f..2a989c37 100644
--- a/tests/input/res/drawable-xhdpi/ch_579_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_579_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_57_logo.png b/tests/input/res/drawable-xhdpi/ch_57_logo.png
index ce0f92f8..72981424 100644
--- a/tests/input/res/drawable-xhdpi/ch_57_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_57_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_580_logo.png b/tests/input/res/drawable-xhdpi/ch_580_logo.png
index 97db5776..4c8034c8 100644
--- a/tests/input/res/drawable-xhdpi/ch_580_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_580_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_581_logo.png b/tests/input/res/drawable-xhdpi/ch_581_logo.png
index f2c1dc72..7423ef65 100644
--- a/tests/input/res/drawable-xhdpi/ch_581_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_581_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_582_logo.png b/tests/input/res/drawable-xhdpi/ch_582_logo.png
index 0941a065..ffbc803d 100644
--- a/tests/input/res/drawable-xhdpi/ch_582_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_582_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_583_logo.png b/tests/input/res/drawable-xhdpi/ch_583_logo.png
index 02de0c0b..d6b92dce 100644
--- a/tests/input/res/drawable-xhdpi/ch_583_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_583_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_584_logo.png b/tests/input/res/drawable-xhdpi/ch_584_logo.png
index 213822f2..cecbe6c7 100644
--- a/tests/input/res/drawable-xhdpi/ch_584_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_584_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_585_logo.png b/tests/input/res/drawable-xhdpi/ch_585_logo.png
index dedf2b25..99b994f7 100644
--- a/tests/input/res/drawable-xhdpi/ch_585_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_585_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_586_logo.png b/tests/input/res/drawable-xhdpi/ch_586_logo.png
index a2b6b734..a54afdd4 100644
--- a/tests/input/res/drawable-xhdpi/ch_586_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_586_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_587_logo.png b/tests/input/res/drawable-xhdpi/ch_587_logo.png
index 7fad4ebb..e09f40ff 100644
--- a/tests/input/res/drawable-xhdpi/ch_587_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_587_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_588_logo.png b/tests/input/res/drawable-xhdpi/ch_588_logo.png
index 95bac09c..e4b3c192 100644
--- a/tests/input/res/drawable-xhdpi/ch_588_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_588_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_589_logo.png b/tests/input/res/drawable-xhdpi/ch_589_logo.png
index a991b260..2c451a54 100644
--- a/tests/input/res/drawable-xhdpi/ch_589_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_589_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_58_logo.png b/tests/input/res/drawable-xhdpi/ch_58_logo.png
index ac701108..07f71a01 100644
--- a/tests/input/res/drawable-xhdpi/ch_58_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_58_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_590_logo.png b/tests/input/res/drawable-xhdpi/ch_590_logo.png
index a34664f7..56e5e60c 100644
--- a/tests/input/res/drawable-xhdpi/ch_590_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_590_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_591_logo.png b/tests/input/res/drawable-xhdpi/ch_591_logo.png
index 67809b8a..09e1a554 100644
--- a/tests/input/res/drawable-xhdpi/ch_591_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_591_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_592_logo.png b/tests/input/res/drawable-xhdpi/ch_592_logo.png
index 7af17289..82635ce4 100644
--- a/tests/input/res/drawable-xhdpi/ch_592_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_592_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_593_logo.png b/tests/input/res/drawable-xhdpi/ch_593_logo.png
index a07c2451..21f8e54c 100644
--- a/tests/input/res/drawable-xhdpi/ch_593_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_593_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_594_logo.png b/tests/input/res/drawable-xhdpi/ch_594_logo.png
index 59b8565b..8de16c08 100644
--- a/tests/input/res/drawable-xhdpi/ch_594_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_594_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_595_logo.png b/tests/input/res/drawable-xhdpi/ch_595_logo.png
index 063905a4..7fd01896 100644
--- a/tests/input/res/drawable-xhdpi/ch_595_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_595_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_596_logo.png b/tests/input/res/drawable-xhdpi/ch_596_logo.png
index 1ab7ff66..35452d61 100644
--- a/tests/input/res/drawable-xhdpi/ch_596_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_596_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_597_logo.png b/tests/input/res/drawable-xhdpi/ch_597_logo.png
index f8be3409..c812338a 100644
--- a/tests/input/res/drawable-xhdpi/ch_597_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_597_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_598_logo.png b/tests/input/res/drawable-xhdpi/ch_598_logo.png
index 55f93ba1..6a7a4da0 100644
--- a/tests/input/res/drawable-xhdpi/ch_598_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_598_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_599_logo.png b/tests/input/res/drawable-xhdpi/ch_599_logo.png
index b1038a22..9bb000ac 100644
--- a/tests/input/res/drawable-xhdpi/ch_599_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_599_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_59_logo.png b/tests/input/res/drawable-xhdpi/ch_59_logo.png
index df3f65ad..a7a0155f 100644
--- a/tests/input/res/drawable-xhdpi/ch_59_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_59_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_5_logo.png b/tests/input/res/drawable-xhdpi/ch_5_logo.png
index b9a72610..2de0c9cc 100644
--- a/tests/input/res/drawable-xhdpi/ch_5_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_5_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_600_logo.png b/tests/input/res/drawable-xhdpi/ch_600_logo.png
index de16f61c..e3b247e9 100644
--- a/tests/input/res/drawable-xhdpi/ch_600_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_600_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_601_logo.png b/tests/input/res/drawable-xhdpi/ch_601_logo.png
index 9bbf9dad..ff572b8c 100644
--- a/tests/input/res/drawable-xhdpi/ch_601_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_601_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_602_logo.png b/tests/input/res/drawable-xhdpi/ch_602_logo.png
index 72b291c5..56d0505a 100644
--- a/tests/input/res/drawable-xhdpi/ch_602_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_602_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_603_logo.png b/tests/input/res/drawable-xhdpi/ch_603_logo.png
index 14c3a5eb..e0d30043 100644
--- a/tests/input/res/drawable-xhdpi/ch_603_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_603_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_604_logo.png b/tests/input/res/drawable-xhdpi/ch_604_logo.png
index c4b9edc7..4a592ff9 100644
--- a/tests/input/res/drawable-xhdpi/ch_604_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_604_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_605_logo.png b/tests/input/res/drawable-xhdpi/ch_605_logo.png
index 2f1150af..e415b276 100644
--- a/tests/input/res/drawable-xhdpi/ch_605_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_605_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_606_logo.png b/tests/input/res/drawable-xhdpi/ch_606_logo.png
index e87a1d30..2c7b490b 100644
--- a/tests/input/res/drawable-xhdpi/ch_606_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_606_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_607_logo.png b/tests/input/res/drawable-xhdpi/ch_607_logo.png
index 73fb5fec..649d0327 100644
--- a/tests/input/res/drawable-xhdpi/ch_607_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_607_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_608_logo.png b/tests/input/res/drawable-xhdpi/ch_608_logo.png
index 0a084556..5581b4d9 100644
--- a/tests/input/res/drawable-xhdpi/ch_608_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_608_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_609_logo.png b/tests/input/res/drawable-xhdpi/ch_609_logo.png
index fb9b4d49..da8f4bb3 100644
--- a/tests/input/res/drawable-xhdpi/ch_609_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_609_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_60_logo.png b/tests/input/res/drawable-xhdpi/ch_60_logo.png
index 2d98ef39..0ee771f8 100644
--- a/tests/input/res/drawable-xhdpi/ch_60_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_60_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_610_logo.png b/tests/input/res/drawable-xhdpi/ch_610_logo.png
index 468b1d90..7cdbcbd6 100644
--- a/tests/input/res/drawable-xhdpi/ch_610_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_610_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_611_logo.png b/tests/input/res/drawable-xhdpi/ch_611_logo.png
index 0ae9d397..b14d3f54 100644
--- a/tests/input/res/drawable-xhdpi/ch_611_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_611_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_612_logo.png b/tests/input/res/drawable-xhdpi/ch_612_logo.png
index c2f003dc..d56de9ff 100644
--- a/tests/input/res/drawable-xhdpi/ch_612_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_612_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_613_logo.png b/tests/input/res/drawable-xhdpi/ch_613_logo.png
index d8ddd450..7cfec8b5 100644
--- a/tests/input/res/drawable-xhdpi/ch_613_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_613_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_614_logo.png b/tests/input/res/drawable-xhdpi/ch_614_logo.png
index 2db895ce..cc7841ce 100644
--- a/tests/input/res/drawable-xhdpi/ch_614_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_614_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_615_logo.png b/tests/input/res/drawable-xhdpi/ch_615_logo.png
index e5bd8e5a..6c38d269 100644
--- a/tests/input/res/drawable-xhdpi/ch_615_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_615_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_616_logo.png b/tests/input/res/drawable-xhdpi/ch_616_logo.png
index ca6d8baf..e11b777d 100644
--- a/tests/input/res/drawable-xhdpi/ch_616_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_616_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_617_logo.png b/tests/input/res/drawable-xhdpi/ch_617_logo.png
index 830998f6..78aeb608 100644
--- a/tests/input/res/drawable-xhdpi/ch_617_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_617_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_618_logo.png b/tests/input/res/drawable-xhdpi/ch_618_logo.png
index b95b2235..e1f883fb 100644
--- a/tests/input/res/drawable-xhdpi/ch_618_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_618_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_619_logo.png b/tests/input/res/drawable-xhdpi/ch_619_logo.png
index fcb8b5b6..75f4eeba 100644
--- a/tests/input/res/drawable-xhdpi/ch_619_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_619_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_61_logo.png b/tests/input/res/drawable-xhdpi/ch_61_logo.png
index 46f8a3c6..801cb923 100644
--- a/tests/input/res/drawable-xhdpi/ch_61_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_61_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_620_logo.png b/tests/input/res/drawable-xhdpi/ch_620_logo.png
index a9120460..b6380b73 100644
--- a/tests/input/res/drawable-xhdpi/ch_620_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_620_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_621_logo.png b/tests/input/res/drawable-xhdpi/ch_621_logo.png
index 552af5ef..e6a53185 100644
--- a/tests/input/res/drawable-xhdpi/ch_621_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_621_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_622_logo.png b/tests/input/res/drawable-xhdpi/ch_622_logo.png
index 87e1bcfd..1cde4b8f 100644
--- a/tests/input/res/drawable-xhdpi/ch_622_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_622_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_623_logo.png b/tests/input/res/drawable-xhdpi/ch_623_logo.png
index eb187bbc..f271e516 100644
--- a/tests/input/res/drawable-xhdpi/ch_623_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_623_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_624_logo.png b/tests/input/res/drawable-xhdpi/ch_624_logo.png
index 8615a41f..21343a8c 100644
--- a/tests/input/res/drawable-xhdpi/ch_624_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_624_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_625_logo.png b/tests/input/res/drawable-xhdpi/ch_625_logo.png
index d75d7c0f..e15b9853 100644
--- a/tests/input/res/drawable-xhdpi/ch_625_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_625_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_626_logo.png b/tests/input/res/drawable-xhdpi/ch_626_logo.png
index 41d8d0df..c1f8e273 100644
--- a/tests/input/res/drawable-xhdpi/ch_626_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_626_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_627_logo.png b/tests/input/res/drawable-xhdpi/ch_627_logo.png
index 5dd145bf..c07973b5 100644
--- a/tests/input/res/drawable-xhdpi/ch_627_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_627_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_628_logo.png b/tests/input/res/drawable-xhdpi/ch_628_logo.png
index 455eb4dd..369240ca 100644
--- a/tests/input/res/drawable-xhdpi/ch_628_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_628_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_629_logo.png b/tests/input/res/drawable-xhdpi/ch_629_logo.png
index 41f69d00..ac9f7bd7 100644
--- a/tests/input/res/drawable-xhdpi/ch_629_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_629_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_62_logo.png b/tests/input/res/drawable-xhdpi/ch_62_logo.png
index f5f4e383..c4b48ea7 100644
--- a/tests/input/res/drawable-xhdpi/ch_62_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_62_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_630_logo.png b/tests/input/res/drawable-xhdpi/ch_630_logo.png
index bdb78df6..4959855a 100644
--- a/tests/input/res/drawable-xhdpi/ch_630_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_630_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_631_logo.png b/tests/input/res/drawable-xhdpi/ch_631_logo.png
index 548526c3..e03e2706 100644
--- a/tests/input/res/drawable-xhdpi/ch_631_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_631_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_632_logo.png b/tests/input/res/drawable-xhdpi/ch_632_logo.png
index 708ee74c..5be9d478 100644
--- a/tests/input/res/drawable-xhdpi/ch_632_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_632_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_633_logo.png b/tests/input/res/drawable-xhdpi/ch_633_logo.png
index 996cf780..9c51c4a7 100644
--- a/tests/input/res/drawable-xhdpi/ch_633_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_633_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_634_logo.png b/tests/input/res/drawable-xhdpi/ch_634_logo.png
index 2fe92b32..72d30bc6 100644
--- a/tests/input/res/drawable-xhdpi/ch_634_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_634_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_635_logo.png b/tests/input/res/drawable-xhdpi/ch_635_logo.png
index 353c3b42..6c03f3c5 100644
--- a/tests/input/res/drawable-xhdpi/ch_635_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_635_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_636_logo.png b/tests/input/res/drawable-xhdpi/ch_636_logo.png
index aef47ced..928a67c2 100644
--- a/tests/input/res/drawable-xhdpi/ch_636_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_636_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_637_logo.png b/tests/input/res/drawable-xhdpi/ch_637_logo.png
index 5f61016c..4a07f186 100644
--- a/tests/input/res/drawable-xhdpi/ch_637_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_637_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_638_logo.png b/tests/input/res/drawable-xhdpi/ch_638_logo.png
index 5b280f70..33813958 100644
--- a/tests/input/res/drawable-xhdpi/ch_638_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_638_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_639_logo.png b/tests/input/res/drawable-xhdpi/ch_639_logo.png
index 81b537e5..be6ba122 100644
--- a/tests/input/res/drawable-xhdpi/ch_639_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_639_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_63_logo.png b/tests/input/res/drawable-xhdpi/ch_63_logo.png
index 128205f7..dd84e2e6 100644
--- a/tests/input/res/drawable-xhdpi/ch_63_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_63_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_640_logo.png b/tests/input/res/drawable-xhdpi/ch_640_logo.png
index 17935dcd..f6e1750c 100644
--- a/tests/input/res/drawable-xhdpi/ch_640_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_640_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_641_logo.png b/tests/input/res/drawable-xhdpi/ch_641_logo.png
index bae9b10e..421019c8 100644
--- a/tests/input/res/drawable-xhdpi/ch_641_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_641_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_642_logo.png b/tests/input/res/drawable-xhdpi/ch_642_logo.png
index b0f9f91c..e441876c 100644
--- a/tests/input/res/drawable-xhdpi/ch_642_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_642_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_643_logo.png b/tests/input/res/drawable-xhdpi/ch_643_logo.png
index a8b84a80..29745014 100644
--- a/tests/input/res/drawable-xhdpi/ch_643_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_643_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_644_logo.png b/tests/input/res/drawable-xhdpi/ch_644_logo.png
index 05940f12..f5e4f2a0 100644
--- a/tests/input/res/drawable-xhdpi/ch_644_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_644_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_645_logo.png b/tests/input/res/drawable-xhdpi/ch_645_logo.png
index 6f99f635..bfa0d2cd 100644
--- a/tests/input/res/drawable-xhdpi/ch_645_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_645_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_646_logo.png b/tests/input/res/drawable-xhdpi/ch_646_logo.png
index dc114cbc..d148f910 100644
--- a/tests/input/res/drawable-xhdpi/ch_646_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_646_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_647_logo.png b/tests/input/res/drawable-xhdpi/ch_647_logo.png
index 8a5fd7e4..cccc2c66 100644
--- a/tests/input/res/drawable-xhdpi/ch_647_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_647_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_648_logo.png b/tests/input/res/drawable-xhdpi/ch_648_logo.png
index 0aa2f162..1fa3cad7 100644
--- a/tests/input/res/drawable-xhdpi/ch_648_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_648_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_649_logo.png b/tests/input/res/drawable-xhdpi/ch_649_logo.png
index 507a0856..0958fd36 100644
--- a/tests/input/res/drawable-xhdpi/ch_649_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_649_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_64_logo.png b/tests/input/res/drawable-xhdpi/ch_64_logo.png
index c65289ce..9a6a84ec 100644
--- a/tests/input/res/drawable-xhdpi/ch_64_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_64_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_650_logo.png b/tests/input/res/drawable-xhdpi/ch_650_logo.png
index 9f523276..bd3ab1f0 100644
--- a/tests/input/res/drawable-xhdpi/ch_650_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_650_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_651_logo.png b/tests/input/res/drawable-xhdpi/ch_651_logo.png
index 73bc87ca..03e859a0 100644
--- a/tests/input/res/drawable-xhdpi/ch_651_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_651_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_652_logo.png b/tests/input/res/drawable-xhdpi/ch_652_logo.png
index f99d75c8..81b61689 100644
--- a/tests/input/res/drawable-xhdpi/ch_652_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_652_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_653_logo.png b/tests/input/res/drawable-xhdpi/ch_653_logo.png
index 9edeef1e..f6665e5f 100644
--- a/tests/input/res/drawable-xhdpi/ch_653_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_653_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_654_logo.png b/tests/input/res/drawable-xhdpi/ch_654_logo.png
index c94b8708..6ca0e57c 100644
--- a/tests/input/res/drawable-xhdpi/ch_654_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_654_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_655_logo.png b/tests/input/res/drawable-xhdpi/ch_655_logo.png
index ea3251c0..51e7b392 100644
--- a/tests/input/res/drawable-xhdpi/ch_655_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_655_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_656_logo.png b/tests/input/res/drawable-xhdpi/ch_656_logo.png
index 5ea07b59..bae25480 100644
--- a/tests/input/res/drawable-xhdpi/ch_656_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_656_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_657_logo.png b/tests/input/res/drawable-xhdpi/ch_657_logo.png
index 2cce7067..029e91c9 100644
--- a/tests/input/res/drawable-xhdpi/ch_657_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_657_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_658_logo.png b/tests/input/res/drawable-xhdpi/ch_658_logo.png
index 28b87454..61a77eac 100644
--- a/tests/input/res/drawable-xhdpi/ch_658_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_658_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_659_logo.png b/tests/input/res/drawable-xhdpi/ch_659_logo.png
index 73285caf..f12e97ee 100644
--- a/tests/input/res/drawable-xhdpi/ch_659_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_659_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_65_logo.png b/tests/input/res/drawable-xhdpi/ch_65_logo.png
index 81d7ac20..b770749e 100644
--- a/tests/input/res/drawable-xhdpi/ch_65_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_65_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_660_logo.png b/tests/input/res/drawable-xhdpi/ch_660_logo.png
index b49cfac0..1408fb45 100644
--- a/tests/input/res/drawable-xhdpi/ch_660_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_660_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_661_logo.png b/tests/input/res/drawable-xhdpi/ch_661_logo.png
index 3ce1072b..f8224b76 100644
--- a/tests/input/res/drawable-xhdpi/ch_661_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_661_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_662_logo.png b/tests/input/res/drawable-xhdpi/ch_662_logo.png
index e29aa8f8..08d36a1b 100644
--- a/tests/input/res/drawable-xhdpi/ch_662_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_662_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_663_logo.png b/tests/input/res/drawable-xhdpi/ch_663_logo.png
index 0f8da210..b95c596c 100644
--- a/tests/input/res/drawable-xhdpi/ch_663_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_663_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_664_logo.png b/tests/input/res/drawable-xhdpi/ch_664_logo.png
index 9b1d9111..4c42427a 100644
--- a/tests/input/res/drawable-xhdpi/ch_664_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_664_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_665_logo.png b/tests/input/res/drawable-xhdpi/ch_665_logo.png
index d8fae363..c8918dce 100644
--- a/tests/input/res/drawable-xhdpi/ch_665_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_665_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_666_logo.png b/tests/input/res/drawable-xhdpi/ch_666_logo.png
index e3efa18c..6839f828 100644
--- a/tests/input/res/drawable-xhdpi/ch_666_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_666_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_667_logo.png b/tests/input/res/drawable-xhdpi/ch_667_logo.png
index 70572014..28702195 100644
--- a/tests/input/res/drawable-xhdpi/ch_667_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_667_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_668_logo.png b/tests/input/res/drawable-xhdpi/ch_668_logo.png
index 04b3f3ac..944a8d46 100644
--- a/tests/input/res/drawable-xhdpi/ch_668_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_668_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_669_logo.png b/tests/input/res/drawable-xhdpi/ch_669_logo.png
index 6067444b..2677744f 100644
--- a/tests/input/res/drawable-xhdpi/ch_669_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_669_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_66_logo.png b/tests/input/res/drawable-xhdpi/ch_66_logo.png
index d07139c0..e298eb86 100644
--- a/tests/input/res/drawable-xhdpi/ch_66_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_66_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_670_logo.png b/tests/input/res/drawable-xhdpi/ch_670_logo.png
index e2e7206b..bcb1d377 100644
--- a/tests/input/res/drawable-xhdpi/ch_670_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_670_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_671_logo.png b/tests/input/res/drawable-xhdpi/ch_671_logo.png
index 51e54b94..3e01dba8 100644
--- a/tests/input/res/drawable-xhdpi/ch_671_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_671_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_672_logo.png b/tests/input/res/drawable-xhdpi/ch_672_logo.png
index 88dfea80..478d3f22 100644
--- a/tests/input/res/drawable-xhdpi/ch_672_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_672_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_673_logo.png b/tests/input/res/drawable-xhdpi/ch_673_logo.png
index 00090169..123522db 100644
--- a/tests/input/res/drawable-xhdpi/ch_673_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_673_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_674_logo.png b/tests/input/res/drawable-xhdpi/ch_674_logo.png
index 4931fadb..25c44806 100644
--- a/tests/input/res/drawable-xhdpi/ch_674_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_674_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_675_logo.png b/tests/input/res/drawable-xhdpi/ch_675_logo.png
index d82d3bdb..223ba448 100644
--- a/tests/input/res/drawable-xhdpi/ch_675_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_675_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_676_logo.png b/tests/input/res/drawable-xhdpi/ch_676_logo.png
index c4735ac7..12cca720 100644
--- a/tests/input/res/drawable-xhdpi/ch_676_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_676_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_677_logo.png b/tests/input/res/drawable-xhdpi/ch_677_logo.png
index 4d099f48..ec735de1 100644
--- a/tests/input/res/drawable-xhdpi/ch_677_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_677_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_678_logo.png b/tests/input/res/drawable-xhdpi/ch_678_logo.png
index 3680766d..1eee9496 100644
--- a/tests/input/res/drawable-xhdpi/ch_678_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_678_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_679_logo.png b/tests/input/res/drawable-xhdpi/ch_679_logo.png
index c36ef2e5..231b68eb 100644
--- a/tests/input/res/drawable-xhdpi/ch_679_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_679_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_67_logo.png b/tests/input/res/drawable-xhdpi/ch_67_logo.png
index d01eade6..5fcf7946 100644
--- a/tests/input/res/drawable-xhdpi/ch_67_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_67_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_680_logo.png b/tests/input/res/drawable-xhdpi/ch_680_logo.png
index 2fef4629..24c09b87 100644
--- a/tests/input/res/drawable-xhdpi/ch_680_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_680_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_681_logo.png b/tests/input/res/drawable-xhdpi/ch_681_logo.png
index ae68f8c6..2bae5da6 100644
--- a/tests/input/res/drawable-xhdpi/ch_681_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_681_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_682_logo.png b/tests/input/res/drawable-xhdpi/ch_682_logo.png
index 7eac1354..6bb1047f 100644
--- a/tests/input/res/drawable-xhdpi/ch_682_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_682_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_683_logo.png b/tests/input/res/drawable-xhdpi/ch_683_logo.png
index 27a8fdf4..04be69f4 100644
--- a/tests/input/res/drawable-xhdpi/ch_683_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_683_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_684_logo.png b/tests/input/res/drawable-xhdpi/ch_684_logo.png
index 1eba95fe..02e0666d 100644
--- a/tests/input/res/drawable-xhdpi/ch_684_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_684_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_685_logo.png b/tests/input/res/drawable-xhdpi/ch_685_logo.png
index 21f49b0e..ff410e54 100644
--- a/tests/input/res/drawable-xhdpi/ch_685_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_685_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_686_logo.png b/tests/input/res/drawable-xhdpi/ch_686_logo.png
index 0b3f511f..f93e7d7f 100644
--- a/tests/input/res/drawable-xhdpi/ch_686_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_686_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_687_logo.png b/tests/input/res/drawable-xhdpi/ch_687_logo.png
index 37d380c5..a97a96f4 100644
--- a/tests/input/res/drawable-xhdpi/ch_687_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_687_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_688_logo.png b/tests/input/res/drawable-xhdpi/ch_688_logo.png
index 5d0d78fd..f094f64c 100644
--- a/tests/input/res/drawable-xhdpi/ch_688_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_688_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_689_logo.png b/tests/input/res/drawable-xhdpi/ch_689_logo.png
index 4f3ae717..c557b3f1 100644
--- a/tests/input/res/drawable-xhdpi/ch_689_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_689_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_68_logo.png b/tests/input/res/drawable-xhdpi/ch_68_logo.png
index 28284848..957bcb55 100644
--- a/tests/input/res/drawable-xhdpi/ch_68_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_68_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_690_logo.png b/tests/input/res/drawable-xhdpi/ch_690_logo.png
index 50d8ccfb..ee692d35 100644
--- a/tests/input/res/drawable-xhdpi/ch_690_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_690_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_691_logo.png b/tests/input/res/drawable-xhdpi/ch_691_logo.png
index 2a6957b0..7087605e 100644
--- a/tests/input/res/drawable-xhdpi/ch_691_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_691_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_692_logo.png b/tests/input/res/drawable-xhdpi/ch_692_logo.png
index 245e0b28..902b536f 100644
--- a/tests/input/res/drawable-xhdpi/ch_692_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_692_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_693_logo.png b/tests/input/res/drawable-xhdpi/ch_693_logo.png
index ccc1d79c..3fb1634e 100644
--- a/tests/input/res/drawable-xhdpi/ch_693_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_693_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_694_logo.png b/tests/input/res/drawable-xhdpi/ch_694_logo.png
index 3141e0fc..baaa7b69 100644
--- a/tests/input/res/drawable-xhdpi/ch_694_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_694_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_695_logo.png b/tests/input/res/drawable-xhdpi/ch_695_logo.png
index 96eabf5d..1d957bfd 100644
--- a/tests/input/res/drawable-xhdpi/ch_695_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_695_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_696_logo.png b/tests/input/res/drawable-xhdpi/ch_696_logo.png
index 1e127f7c..ca8ed9e8 100644
--- a/tests/input/res/drawable-xhdpi/ch_696_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_696_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_697_logo.png b/tests/input/res/drawable-xhdpi/ch_697_logo.png
index 45f91a89..e01c4825 100644
--- a/tests/input/res/drawable-xhdpi/ch_697_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_697_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_698_logo.png b/tests/input/res/drawable-xhdpi/ch_698_logo.png
index 920ec7af..c6540359 100644
--- a/tests/input/res/drawable-xhdpi/ch_698_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_698_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_699_logo.png b/tests/input/res/drawable-xhdpi/ch_699_logo.png
index 0f2c79f4..70a22946 100644
--- a/tests/input/res/drawable-xhdpi/ch_699_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_699_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_69_logo.png b/tests/input/res/drawable-xhdpi/ch_69_logo.png
index f4ba87ce..6ccbe33b 100644
--- a/tests/input/res/drawable-xhdpi/ch_69_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_69_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_6_logo.png b/tests/input/res/drawable-xhdpi/ch_6_logo.png
index 017af150..22887a6c 100644
--- a/tests/input/res/drawable-xhdpi/ch_6_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_6_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_700_logo.png b/tests/input/res/drawable-xhdpi/ch_700_logo.png
index 764bf18d..1cbf5379 100644
--- a/tests/input/res/drawable-xhdpi/ch_700_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_700_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_701_logo.png b/tests/input/res/drawable-xhdpi/ch_701_logo.png
index 02385412..9b438c00 100644
--- a/tests/input/res/drawable-xhdpi/ch_701_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_701_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_702_logo.png b/tests/input/res/drawable-xhdpi/ch_702_logo.png
index 812cfe7d..92bef76d 100644
--- a/tests/input/res/drawable-xhdpi/ch_702_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_702_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_703_logo.png b/tests/input/res/drawable-xhdpi/ch_703_logo.png
index 2a8173b6..78d680b0 100644
--- a/tests/input/res/drawable-xhdpi/ch_703_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_703_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_704_logo.png b/tests/input/res/drawable-xhdpi/ch_704_logo.png
index 320f5833..fcb61adb 100644
--- a/tests/input/res/drawable-xhdpi/ch_704_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_704_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_705_logo.png b/tests/input/res/drawable-xhdpi/ch_705_logo.png
index a92a1e1f..87566617 100644
--- a/tests/input/res/drawable-xhdpi/ch_705_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_705_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_706_logo.png b/tests/input/res/drawable-xhdpi/ch_706_logo.png
index 6e159bea..fe9d775b 100644
--- a/tests/input/res/drawable-xhdpi/ch_706_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_706_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_707_logo.png b/tests/input/res/drawable-xhdpi/ch_707_logo.png
index 3e61c6c8..b3b0451c 100644
--- a/tests/input/res/drawable-xhdpi/ch_707_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_707_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_708_logo.png b/tests/input/res/drawable-xhdpi/ch_708_logo.png
index b8a8ce34..2a95b3a4 100644
--- a/tests/input/res/drawable-xhdpi/ch_708_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_708_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_709_logo.png b/tests/input/res/drawable-xhdpi/ch_709_logo.png
index 2ca3238b..55111fbe 100644
--- a/tests/input/res/drawable-xhdpi/ch_709_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_709_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_70_logo.png b/tests/input/res/drawable-xhdpi/ch_70_logo.png
index 7d72badf..1860ec9c 100644
--- a/tests/input/res/drawable-xhdpi/ch_70_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_70_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_710_logo.png b/tests/input/res/drawable-xhdpi/ch_710_logo.png
index 563b7493..6284e6ee 100644
--- a/tests/input/res/drawable-xhdpi/ch_710_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_710_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_711_logo.png b/tests/input/res/drawable-xhdpi/ch_711_logo.png
index 6c8de85b..d55d32ca 100644
--- a/tests/input/res/drawable-xhdpi/ch_711_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_711_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_712_logo.png b/tests/input/res/drawable-xhdpi/ch_712_logo.png
index 1b0fa6fb..7268941c 100644
--- a/tests/input/res/drawable-xhdpi/ch_712_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_712_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_713_logo.png b/tests/input/res/drawable-xhdpi/ch_713_logo.png
index c2f89dc8..781301e4 100644
--- a/tests/input/res/drawable-xhdpi/ch_713_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_713_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_714_logo.png b/tests/input/res/drawable-xhdpi/ch_714_logo.png
index 83a159d6..8145eaac 100644
--- a/tests/input/res/drawable-xhdpi/ch_714_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_714_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_715_logo.png b/tests/input/res/drawable-xhdpi/ch_715_logo.png
index 07b54ade..b7715dc5 100644
--- a/tests/input/res/drawable-xhdpi/ch_715_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_715_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_716_logo.png b/tests/input/res/drawable-xhdpi/ch_716_logo.png
index 2d0e1320..0c1f26e4 100644
--- a/tests/input/res/drawable-xhdpi/ch_716_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_716_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_717_logo.png b/tests/input/res/drawable-xhdpi/ch_717_logo.png
index dbe319b3..de20828f 100644
--- a/tests/input/res/drawable-xhdpi/ch_717_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_717_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_718_logo.png b/tests/input/res/drawable-xhdpi/ch_718_logo.png
index 91525ffc..8d915ecc 100644
--- a/tests/input/res/drawable-xhdpi/ch_718_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_718_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_719_logo.png b/tests/input/res/drawable-xhdpi/ch_719_logo.png
index f0219111..bd1c668d 100644
--- a/tests/input/res/drawable-xhdpi/ch_719_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_719_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_71_logo.png b/tests/input/res/drawable-xhdpi/ch_71_logo.png
index 286b88a0..e3f8b550 100644
--- a/tests/input/res/drawable-xhdpi/ch_71_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_71_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_720_logo.png b/tests/input/res/drawable-xhdpi/ch_720_logo.png
index a26db569..66a60923 100644
--- a/tests/input/res/drawable-xhdpi/ch_720_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_720_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_721_logo.png b/tests/input/res/drawable-xhdpi/ch_721_logo.png
index bda52ec3..c877d396 100644
--- a/tests/input/res/drawable-xhdpi/ch_721_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_721_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_722_logo.png b/tests/input/res/drawable-xhdpi/ch_722_logo.png
index 9d1dfc5e..9fe37161 100644
--- a/tests/input/res/drawable-xhdpi/ch_722_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_722_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_723_logo.png b/tests/input/res/drawable-xhdpi/ch_723_logo.png
index 0148215f..94563ccd 100644
--- a/tests/input/res/drawable-xhdpi/ch_723_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_723_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_724_logo.png b/tests/input/res/drawable-xhdpi/ch_724_logo.png
index 4a07ad49..52e5fcd9 100644
--- a/tests/input/res/drawable-xhdpi/ch_724_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_724_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_725_logo.png b/tests/input/res/drawable-xhdpi/ch_725_logo.png
index 833fc93d..518fefaa 100644
--- a/tests/input/res/drawable-xhdpi/ch_725_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_725_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_726_logo.png b/tests/input/res/drawable-xhdpi/ch_726_logo.png
index 074a4321..1f28222e 100644
--- a/tests/input/res/drawable-xhdpi/ch_726_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_726_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_727_logo.png b/tests/input/res/drawable-xhdpi/ch_727_logo.png
index df12c2a6..bffbc57f 100644
--- a/tests/input/res/drawable-xhdpi/ch_727_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_727_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_728_logo.png b/tests/input/res/drawable-xhdpi/ch_728_logo.png
index 9f2be10b..f036778b 100644
--- a/tests/input/res/drawable-xhdpi/ch_728_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_728_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_729_logo.png b/tests/input/res/drawable-xhdpi/ch_729_logo.png
index c73e460e..a2838d56 100644
--- a/tests/input/res/drawable-xhdpi/ch_729_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_729_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_72_logo.png b/tests/input/res/drawable-xhdpi/ch_72_logo.png
index e50d00f1..5b2f971c 100644
--- a/tests/input/res/drawable-xhdpi/ch_72_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_72_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_730_logo.png b/tests/input/res/drawable-xhdpi/ch_730_logo.png
index d822f3b5..443d08b8 100644
--- a/tests/input/res/drawable-xhdpi/ch_730_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_730_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_731_logo.png b/tests/input/res/drawable-xhdpi/ch_731_logo.png
index c0a057b4..d07e52a1 100644
--- a/tests/input/res/drawable-xhdpi/ch_731_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_731_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_732_logo.png b/tests/input/res/drawable-xhdpi/ch_732_logo.png
index 323da948..56f51b3f 100644
--- a/tests/input/res/drawable-xhdpi/ch_732_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_732_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_733_logo.png b/tests/input/res/drawable-xhdpi/ch_733_logo.png
index 62a6d9b5..18248b0a 100644
--- a/tests/input/res/drawable-xhdpi/ch_733_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_733_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_734_logo.png b/tests/input/res/drawable-xhdpi/ch_734_logo.png
index 19995ea4..fb740e33 100644
--- a/tests/input/res/drawable-xhdpi/ch_734_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_734_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_735_logo.png b/tests/input/res/drawable-xhdpi/ch_735_logo.png
index 3c5f9686..9f83309f 100644
--- a/tests/input/res/drawable-xhdpi/ch_735_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_735_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_736_logo.png b/tests/input/res/drawable-xhdpi/ch_736_logo.png
index 741abecb..768fc5ef 100644
--- a/tests/input/res/drawable-xhdpi/ch_736_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_736_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_737_logo.png b/tests/input/res/drawable-xhdpi/ch_737_logo.png
index f0ee672b..6af65c67 100644
--- a/tests/input/res/drawable-xhdpi/ch_737_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_737_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_738_logo.png b/tests/input/res/drawable-xhdpi/ch_738_logo.png
index 666ffb32..3b908312 100644
--- a/tests/input/res/drawable-xhdpi/ch_738_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_738_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_739_logo.png b/tests/input/res/drawable-xhdpi/ch_739_logo.png
index 8680c2db..fea61e37 100644
--- a/tests/input/res/drawable-xhdpi/ch_739_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_739_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_73_logo.png b/tests/input/res/drawable-xhdpi/ch_73_logo.png
index 604af9a4..13556e6d 100644
--- a/tests/input/res/drawable-xhdpi/ch_73_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_73_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_740_logo.png b/tests/input/res/drawable-xhdpi/ch_740_logo.png
index f666e327..7fe9aa19 100644
--- a/tests/input/res/drawable-xhdpi/ch_740_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_740_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_741_logo.png b/tests/input/res/drawable-xhdpi/ch_741_logo.png
index 2527ce5d..a437fd22 100644
--- a/tests/input/res/drawable-xhdpi/ch_741_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_741_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_742_logo.png b/tests/input/res/drawable-xhdpi/ch_742_logo.png
index c9b1c397..5674dccb 100644
--- a/tests/input/res/drawable-xhdpi/ch_742_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_742_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_743_logo.png b/tests/input/res/drawable-xhdpi/ch_743_logo.png
index 4284b6c4..dbfcaa51 100644
--- a/tests/input/res/drawable-xhdpi/ch_743_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_743_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_744_logo.png b/tests/input/res/drawable-xhdpi/ch_744_logo.png
index 5daf188f..fe6dd633 100644
--- a/tests/input/res/drawable-xhdpi/ch_744_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_744_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_745_logo.png b/tests/input/res/drawable-xhdpi/ch_745_logo.png
index 45a7ff51..703bc014 100644
--- a/tests/input/res/drawable-xhdpi/ch_745_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_745_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_746_logo.png b/tests/input/res/drawable-xhdpi/ch_746_logo.png
index 54a79c1a..15775a4c 100644
--- a/tests/input/res/drawable-xhdpi/ch_746_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_746_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_747_logo.png b/tests/input/res/drawable-xhdpi/ch_747_logo.png
index f854c2e1..d5666758 100644
--- a/tests/input/res/drawable-xhdpi/ch_747_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_747_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_748_logo.png b/tests/input/res/drawable-xhdpi/ch_748_logo.png
index fb7cf30f..3bb80444 100644
--- a/tests/input/res/drawable-xhdpi/ch_748_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_748_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_749_logo.png b/tests/input/res/drawable-xhdpi/ch_749_logo.png
index 332b8bd2..92a6954a 100644
--- a/tests/input/res/drawable-xhdpi/ch_749_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_749_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_74_logo.png b/tests/input/res/drawable-xhdpi/ch_74_logo.png
index cf0250e7..484f4c0d 100644
--- a/tests/input/res/drawable-xhdpi/ch_74_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_74_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_750_logo.png b/tests/input/res/drawable-xhdpi/ch_750_logo.png
index 47300227..96af0fa6 100644
--- a/tests/input/res/drawable-xhdpi/ch_750_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_750_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_751_logo.png b/tests/input/res/drawable-xhdpi/ch_751_logo.png
index 06ad62d8..bddc6d97 100644
--- a/tests/input/res/drawable-xhdpi/ch_751_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_751_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_752_logo.png b/tests/input/res/drawable-xhdpi/ch_752_logo.png
index b263daa3..38d693f7 100644
--- a/tests/input/res/drawable-xhdpi/ch_752_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_752_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_753_logo.png b/tests/input/res/drawable-xhdpi/ch_753_logo.png
index a7aa046c..3c383de7 100644
--- a/tests/input/res/drawable-xhdpi/ch_753_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_753_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_754_logo.png b/tests/input/res/drawable-xhdpi/ch_754_logo.png
index cc3f9f39..04d7b62b 100644
--- a/tests/input/res/drawable-xhdpi/ch_754_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_754_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_755_logo.png b/tests/input/res/drawable-xhdpi/ch_755_logo.png
index e3f5a1ea..d7846b43 100644
--- a/tests/input/res/drawable-xhdpi/ch_755_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_755_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_756_logo.png b/tests/input/res/drawable-xhdpi/ch_756_logo.png
index bd0374bd..6b51e7d1 100644
--- a/tests/input/res/drawable-xhdpi/ch_756_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_756_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_757_logo.png b/tests/input/res/drawable-xhdpi/ch_757_logo.png
index 3d355b6d..b396d7c3 100644
--- a/tests/input/res/drawable-xhdpi/ch_757_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_757_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_758_logo.png b/tests/input/res/drawable-xhdpi/ch_758_logo.png
index 95d35d59..d77783b7 100644
--- a/tests/input/res/drawable-xhdpi/ch_758_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_758_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_759_logo.png b/tests/input/res/drawable-xhdpi/ch_759_logo.png
index dbac83cc..ca26792b 100644
--- a/tests/input/res/drawable-xhdpi/ch_759_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_759_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_75_logo.png b/tests/input/res/drawable-xhdpi/ch_75_logo.png
index 93690282..aa78479e 100644
--- a/tests/input/res/drawable-xhdpi/ch_75_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_75_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_760_logo.png b/tests/input/res/drawable-xhdpi/ch_760_logo.png
index 6a4b3515..5d56db66 100644
--- a/tests/input/res/drawable-xhdpi/ch_760_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_760_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_761_logo.png b/tests/input/res/drawable-xhdpi/ch_761_logo.png
index 90dfd653..e505365d 100644
--- a/tests/input/res/drawable-xhdpi/ch_761_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_761_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_762_logo.png b/tests/input/res/drawable-xhdpi/ch_762_logo.png
index 43aa7a9e..202b7572 100644
--- a/tests/input/res/drawable-xhdpi/ch_762_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_762_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_763_logo.png b/tests/input/res/drawable-xhdpi/ch_763_logo.png
index 3a7a22cc..14af6ab4 100644
--- a/tests/input/res/drawable-xhdpi/ch_763_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_763_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_764_logo.png b/tests/input/res/drawable-xhdpi/ch_764_logo.png
index 1decc311..c4e1ea66 100644
--- a/tests/input/res/drawable-xhdpi/ch_764_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_764_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_765_logo.png b/tests/input/res/drawable-xhdpi/ch_765_logo.png
index 377aecce..3b5ded8e 100644
--- a/tests/input/res/drawable-xhdpi/ch_765_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_765_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_766_logo.png b/tests/input/res/drawable-xhdpi/ch_766_logo.png
index 212a1e2b..61391524 100644
--- a/tests/input/res/drawable-xhdpi/ch_766_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_766_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_767_logo.png b/tests/input/res/drawable-xhdpi/ch_767_logo.png
index d237213e..4fa0441e 100644
--- a/tests/input/res/drawable-xhdpi/ch_767_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_767_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_768_logo.png b/tests/input/res/drawable-xhdpi/ch_768_logo.png
index 863c4be5..80e8293b 100644
--- a/tests/input/res/drawable-xhdpi/ch_768_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_768_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_769_logo.png b/tests/input/res/drawable-xhdpi/ch_769_logo.png
index 9543ddb0..63c2e6cc 100644
--- a/tests/input/res/drawable-xhdpi/ch_769_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_769_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_76_logo.png b/tests/input/res/drawable-xhdpi/ch_76_logo.png
index 3107f033..3ebf6807 100644
--- a/tests/input/res/drawable-xhdpi/ch_76_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_76_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_770_logo.png b/tests/input/res/drawable-xhdpi/ch_770_logo.png
index 2ae7bff5..b2ee3584 100644
--- a/tests/input/res/drawable-xhdpi/ch_770_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_770_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_771_logo.png b/tests/input/res/drawable-xhdpi/ch_771_logo.png
index 3b8e6299..9a53a498 100644
--- a/tests/input/res/drawable-xhdpi/ch_771_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_771_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_772_logo.png b/tests/input/res/drawable-xhdpi/ch_772_logo.png
index b439232b..1da9e70d 100644
--- a/tests/input/res/drawable-xhdpi/ch_772_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_772_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_773_logo.png b/tests/input/res/drawable-xhdpi/ch_773_logo.png
index b3bb644f..0f35e46a 100644
--- a/tests/input/res/drawable-xhdpi/ch_773_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_773_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_774_logo.png b/tests/input/res/drawable-xhdpi/ch_774_logo.png
index 147df7bf..acaa8857 100644
--- a/tests/input/res/drawable-xhdpi/ch_774_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_774_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_775_logo.png b/tests/input/res/drawable-xhdpi/ch_775_logo.png
index 06fb2934..70ca99e8 100644
--- a/tests/input/res/drawable-xhdpi/ch_775_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_775_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_776_logo.png b/tests/input/res/drawable-xhdpi/ch_776_logo.png
index c73f2bd7..ab54947d 100644
--- a/tests/input/res/drawable-xhdpi/ch_776_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_776_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_777_logo.png b/tests/input/res/drawable-xhdpi/ch_777_logo.png
index 2fc8f34b..ed378329 100644
--- a/tests/input/res/drawable-xhdpi/ch_777_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_777_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_778_logo.png b/tests/input/res/drawable-xhdpi/ch_778_logo.png
index 66546159..01cdc4e8 100644
--- a/tests/input/res/drawable-xhdpi/ch_778_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_778_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_779_logo.png b/tests/input/res/drawable-xhdpi/ch_779_logo.png
index 6d8841c4..ca5175f7 100644
--- a/tests/input/res/drawable-xhdpi/ch_779_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_779_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_77_logo.png b/tests/input/res/drawable-xhdpi/ch_77_logo.png
index 01927e94..c22abf24 100644
--- a/tests/input/res/drawable-xhdpi/ch_77_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_77_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_780_logo.png b/tests/input/res/drawable-xhdpi/ch_780_logo.png
index 59683d8f..2e5f24e2 100644
--- a/tests/input/res/drawable-xhdpi/ch_780_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_780_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_781_logo.png b/tests/input/res/drawable-xhdpi/ch_781_logo.png
index a553b0e6..81e5ed66 100644
--- a/tests/input/res/drawable-xhdpi/ch_781_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_781_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_782_logo.png b/tests/input/res/drawable-xhdpi/ch_782_logo.png
index 04dccb8e..3236afa9 100644
--- a/tests/input/res/drawable-xhdpi/ch_782_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_782_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_783_logo.png b/tests/input/res/drawable-xhdpi/ch_783_logo.png
index f1d7afca..a600800e 100644
--- a/tests/input/res/drawable-xhdpi/ch_783_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_783_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_784_logo.png b/tests/input/res/drawable-xhdpi/ch_784_logo.png
index 5feead87..cd97c5eb 100644
--- a/tests/input/res/drawable-xhdpi/ch_784_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_784_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_785_logo.png b/tests/input/res/drawable-xhdpi/ch_785_logo.png
index 393340a3..d50fd82a 100644
--- a/tests/input/res/drawable-xhdpi/ch_785_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_785_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_786_logo.png b/tests/input/res/drawable-xhdpi/ch_786_logo.png
index b3fa139f..7a93ef71 100644
--- a/tests/input/res/drawable-xhdpi/ch_786_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_786_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_787_logo.png b/tests/input/res/drawable-xhdpi/ch_787_logo.png
index d84af6e4..62b5cf6b 100644
--- a/tests/input/res/drawable-xhdpi/ch_787_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_787_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_788_logo.png b/tests/input/res/drawable-xhdpi/ch_788_logo.png
index 1578e21b..c82602d3 100644
--- a/tests/input/res/drawable-xhdpi/ch_788_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_788_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_789_logo.png b/tests/input/res/drawable-xhdpi/ch_789_logo.png
index ac2db334..7dfbeeb3 100644
--- a/tests/input/res/drawable-xhdpi/ch_789_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_789_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_78_logo.png b/tests/input/res/drawable-xhdpi/ch_78_logo.png
index a1b4243b..03fb415f 100644
--- a/tests/input/res/drawable-xhdpi/ch_78_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_78_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_790_logo.png b/tests/input/res/drawable-xhdpi/ch_790_logo.png
index c5d9823e..d44c2181 100644
--- a/tests/input/res/drawable-xhdpi/ch_790_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_790_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_791_logo.png b/tests/input/res/drawable-xhdpi/ch_791_logo.png
index f7e1dacb..ee81b961 100644
--- a/tests/input/res/drawable-xhdpi/ch_791_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_791_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_792_logo.png b/tests/input/res/drawable-xhdpi/ch_792_logo.png
index c15a0044..37715025 100644
--- a/tests/input/res/drawable-xhdpi/ch_792_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_792_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_793_logo.png b/tests/input/res/drawable-xhdpi/ch_793_logo.png
index 280f46f1..eca3a477 100644
--- a/tests/input/res/drawable-xhdpi/ch_793_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_793_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_794_logo.png b/tests/input/res/drawable-xhdpi/ch_794_logo.png
index 9ae6b17f..fbbfc372 100644
--- a/tests/input/res/drawable-xhdpi/ch_794_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_794_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_795_logo.png b/tests/input/res/drawable-xhdpi/ch_795_logo.png
index 7efd3347..0366a2bd 100644
--- a/tests/input/res/drawable-xhdpi/ch_795_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_795_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_796_logo.png b/tests/input/res/drawable-xhdpi/ch_796_logo.png
index 7dda53ce..e13e6bc1 100644
--- a/tests/input/res/drawable-xhdpi/ch_796_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_796_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_797_logo.png b/tests/input/res/drawable-xhdpi/ch_797_logo.png
index 2c93401f..e45decc0 100644
--- a/tests/input/res/drawable-xhdpi/ch_797_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_797_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_798_logo.png b/tests/input/res/drawable-xhdpi/ch_798_logo.png
index 7ee1dd73..6b9659e2 100644
--- a/tests/input/res/drawable-xhdpi/ch_798_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_798_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_799_logo.png b/tests/input/res/drawable-xhdpi/ch_799_logo.png
index ad318c0c..e8cb2ef8 100644
--- a/tests/input/res/drawable-xhdpi/ch_799_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_799_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_79_logo.png b/tests/input/res/drawable-xhdpi/ch_79_logo.png
index e5319376..237fa7b2 100644
--- a/tests/input/res/drawable-xhdpi/ch_79_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_79_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_7_logo.png b/tests/input/res/drawable-xhdpi/ch_7_logo.png
index cf7e0607..df78066a 100644
--- a/tests/input/res/drawable-xhdpi/ch_7_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_7_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_800_logo.png b/tests/input/res/drawable-xhdpi/ch_800_logo.png
index 8a337024..6c775941 100644
--- a/tests/input/res/drawable-xhdpi/ch_800_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_800_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_801_logo.png b/tests/input/res/drawable-xhdpi/ch_801_logo.png
index 46fc4670..f0006515 100644
--- a/tests/input/res/drawable-xhdpi/ch_801_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_801_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_802_logo.png b/tests/input/res/drawable-xhdpi/ch_802_logo.png
index 353122bc..4c504b58 100644
--- a/tests/input/res/drawable-xhdpi/ch_802_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_802_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_803_logo.png b/tests/input/res/drawable-xhdpi/ch_803_logo.png
index 4ec39903..edfa6869 100644
--- a/tests/input/res/drawable-xhdpi/ch_803_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_803_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_804_logo.png b/tests/input/res/drawable-xhdpi/ch_804_logo.png
index 90346cb4..c7b0dba0 100644
--- a/tests/input/res/drawable-xhdpi/ch_804_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_804_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_805_logo.png b/tests/input/res/drawable-xhdpi/ch_805_logo.png
index 6db24339..bcd6ee28 100644
--- a/tests/input/res/drawable-xhdpi/ch_805_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_805_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_806_logo.png b/tests/input/res/drawable-xhdpi/ch_806_logo.png
index f17943d7..e926e9f4 100644
--- a/tests/input/res/drawable-xhdpi/ch_806_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_806_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_807_logo.png b/tests/input/res/drawable-xhdpi/ch_807_logo.png
index c348272c..25334551 100644
--- a/tests/input/res/drawable-xhdpi/ch_807_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_807_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_808_logo.png b/tests/input/res/drawable-xhdpi/ch_808_logo.png
index 3a5a14d6..5d7b51a9 100644
--- a/tests/input/res/drawable-xhdpi/ch_808_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_808_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_809_logo.png b/tests/input/res/drawable-xhdpi/ch_809_logo.png
index ae20572e..2f6a8e31 100644
--- a/tests/input/res/drawable-xhdpi/ch_809_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_809_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_80_logo.png b/tests/input/res/drawable-xhdpi/ch_80_logo.png
index f5572bc1..ff7a55c1 100644
--- a/tests/input/res/drawable-xhdpi/ch_80_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_80_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_810_logo.png b/tests/input/res/drawable-xhdpi/ch_810_logo.png
index 361fb2de..1a083992 100644
--- a/tests/input/res/drawable-xhdpi/ch_810_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_810_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_811_logo.png b/tests/input/res/drawable-xhdpi/ch_811_logo.png
index b006af1e..070df630 100644
--- a/tests/input/res/drawable-xhdpi/ch_811_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_811_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_812_logo.png b/tests/input/res/drawable-xhdpi/ch_812_logo.png
index 9d30f844..376e68cb 100644
--- a/tests/input/res/drawable-xhdpi/ch_812_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_812_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_813_logo.png b/tests/input/res/drawable-xhdpi/ch_813_logo.png
index c1ba8f91..d72f0a8e 100644
--- a/tests/input/res/drawable-xhdpi/ch_813_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_813_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_814_logo.png b/tests/input/res/drawable-xhdpi/ch_814_logo.png
index 68fc2305..b50d9ad1 100644
--- a/tests/input/res/drawable-xhdpi/ch_814_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_814_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_815_logo.png b/tests/input/res/drawable-xhdpi/ch_815_logo.png
index bed3a701..fdbc4cdd 100644
--- a/tests/input/res/drawable-xhdpi/ch_815_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_815_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_816_logo.png b/tests/input/res/drawable-xhdpi/ch_816_logo.png
index 4e67a117..f1212200 100644
--- a/tests/input/res/drawable-xhdpi/ch_816_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_816_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_817_logo.png b/tests/input/res/drawable-xhdpi/ch_817_logo.png
index 59b778f0..be4fa008 100644
--- a/tests/input/res/drawable-xhdpi/ch_817_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_817_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_818_logo.png b/tests/input/res/drawable-xhdpi/ch_818_logo.png
index 9ba78efb..c9d087d7 100644
--- a/tests/input/res/drawable-xhdpi/ch_818_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_818_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_819_logo.png b/tests/input/res/drawable-xhdpi/ch_819_logo.png
index df51ee72..b8cab83d 100644
--- a/tests/input/res/drawable-xhdpi/ch_819_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_819_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_81_logo.png b/tests/input/res/drawable-xhdpi/ch_81_logo.png
index ee3b863a..58f6fc00 100644
--- a/tests/input/res/drawable-xhdpi/ch_81_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_81_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_820_logo.png b/tests/input/res/drawable-xhdpi/ch_820_logo.png
index 729d7e22..3bf591fb 100644
--- a/tests/input/res/drawable-xhdpi/ch_820_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_820_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_821_logo.png b/tests/input/res/drawable-xhdpi/ch_821_logo.png
index 4d23dedf..16046f46 100644
--- a/tests/input/res/drawable-xhdpi/ch_821_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_821_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_822_logo.png b/tests/input/res/drawable-xhdpi/ch_822_logo.png
index c46c673a..58d688c9 100644
--- a/tests/input/res/drawable-xhdpi/ch_822_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_822_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_823_logo.png b/tests/input/res/drawable-xhdpi/ch_823_logo.png
index 587c1cfa..6b70ecc1 100644
--- a/tests/input/res/drawable-xhdpi/ch_823_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_823_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_824_logo.png b/tests/input/res/drawable-xhdpi/ch_824_logo.png
index af3a67e4..4c90c96e 100644
--- a/tests/input/res/drawable-xhdpi/ch_824_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_824_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_825_logo.png b/tests/input/res/drawable-xhdpi/ch_825_logo.png
index 7d03bd53..5111136c 100644
--- a/tests/input/res/drawable-xhdpi/ch_825_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_825_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_826_logo.png b/tests/input/res/drawable-xhdpi/ch_826_logo.png
index 081bf5fe..f35941e8 100644
--- a/tests/input/res/drawable-xhdpi/ch_826_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_826_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_827_logo.png b/tests/input/res/drawable-xhdpi/ch_827_logo.png
index 5a6a0b03..49add1ab 100644
--- a/tests/input/res/drawable-xhdpi/ch_827_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_827_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_828_logo.png b/tests/input/res/drawable-xhdpi/ch_828_logo.png
index 7d480133..67936aa4 100644
--- a/tests/input/res/drawable-xhdpi/ch_828_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_828_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_829_logo.png b/tests/input/res/drawable-xhdpi/ch_829_logo.png
index 8cca81b3..7bc97945 100644
--- a/tests/input/res/drawable-xhdpi/ch_829_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_829_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_82_logo.png b/tests/input/res/drawable-xhdpi/ch_82_logo.png
index f92064a9..ddd21127 100644
--- a/tests/input/res/drawable-xhdpi/ch_82_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_82_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_830_logo.png b/tests/input/res/drawable-xhdpi/ch_830_logo.png
index f15a64b4..3aa669d8 100644
--- a/tests/input/res/drawable-xhdpi/ch_830_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_830_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_831_logo.png b/tests/input/res/drawable-xhdpi/ch_831_logo.png
index e37ae3c4..f7c2cf1c 100644
--- a/tests/input/res/drawable-xhdpi/ch_831_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_831_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_832_logo.png b/tests/input/res/drawable-xhdpi/ch_832_logo.png
index 6083ee11..19096734 100644
--- a/tests/input/res/drawable-xhdpi/ch_832_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_832_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_833_logo.png b/tests/input/res/drawable-xhdpi/ch_833_logo.png
index 70cfab74..d0a1af2f 100644
--- a/tests/input/res/drawable-xhdpi/ch_833_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_833_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_834_logo.png b/tests/input/res/drawable-xhdpi/ch_834_logo.png
index b73153e2..52e2ef58 100644
--- a/tests/input/res/drawable-xhdpi/ch_834_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_834_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_835_logo.png b/tests/input/res/drawable-xhdpi/ch_835_logo.png
index dc4c8faf..7ac421e1 100644
--- a/tests/input/res/drawable-xhdpi/ch_835_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_835_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_836_logo.png b/tests/input/res/drawable-xhdpi/ch_836_logo.png
index 8be46e7c..7f4577b4 100644
--- a/tests/input/res/drawable-xhdpi/ch_836_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_836_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_837_logo.png b/tests/input/res/drawable-xhdpi/ch_837_logo.png
index 3916215f..df5e1c86 100644
--- a/tests/input/res/drawable-xhdpi/ch_837_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_837_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_838_logo.png b/tests/input/res/drawable-xhdpi/ch_838_logo.png
index 72f06bc2..579557ed 100644
--- a/tests/input/res/drawable-xhdpi/ch_838_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_838_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_839_logo.png b/tests/input/res/drawable-xhdpi/ch_839_logo.png
index eeaa5b9a..3988cc5b 100644
--- a/tests/input/res/drawable-xhdpi/ch_839_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_839_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_83_logo.png b/tests/input/res/drawable-xhdpi/ch_83_logo.png
index 240d1191..dd97e15c 100644
--- a/tests/input/res/drawable-xhdpi/ch_83_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_83_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_840_logo.png b/tests/input/res/drawable-xhdpi/ch_840_logo.png
index d5ac3d08..29e88d2a 100644
--- a/tests/input/res/drawable-xhdpi/ch_840_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_840_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_841_logo.png b/tests/input/res/drawable-xhdpi/ch_841_logo.png
index 07aaf457..9ee069a4 100644
--- a/tests/input/res/drawable-xhdpi/ch_841_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_841_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_842_logo.png b/tests/input/res/drawable-xhdpi/ch_842_logo.png
index e475f029..edbd8c57 100644
--- a/tests/input/res/drawable-xhdpi/ch_842_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_842_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_843_logo.png b/tests/input/res/drawable-xhdpi/ch_843_logo.png
index b96dc6f3..7ee70de2 100644
--- a/tests/input/res/drawable-xhdpi/ch_843_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_843_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_844_logo.png b/tests/input/res/drawable-xhdpi/ch_844_logo.png
index cac18521..6a0a95a8 100644
--- a/tests/input/res/drawable-xhdpi/ch_844_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_844_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_845_logo.png b/tests/input/res/drawable-xhdpi/ch_845_logo.png
index 70f28fe8..ae4aa7eb 100644
--- a/tests/input/res/drawable-xhdpi/ch_845_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_845_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_846_logo.png b/tests/input/res/drawable-xhdpi/ch_846_logo.png
index 6d039538..79eb61d9 100644
--- a/tests/input/res/drawable-xhdpi/ch_846_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_846_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_847_logo.png b/tests/input/res/drawable-xhdpi/ch_847_logo.png
index 55052554..2a8fd743 100644
--- a/tests/input/res/drawable-xhdpi/ch_847_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_847_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_848_logo.png b/tests/input/res/drawable-xhdpi/ch_848_logo.png
index cd7d3b1d..c2e82237 100644
--- a/tests/input/res/drawable-xhdpi/ch_848_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_848_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_849_logo.png b/tests/input/res/drawable-xhdpi/ch_849_logo.png
index 87df8860..44d58b8d 100644
--- a/tests/input/res/drawable-xhdpi/ch_849_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_849_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_84_logo.png b/tests/input/res/drawable-xhdpi/ch_84_logo.png
index 21ea6fc6..5ad6a473 100644
--- a/tests/input/res/drawable-xhdpi/ch_84_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_84_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_850_logo.png b/tests/input/res/drawable-xhdpi/ch_850_logo.png
index 68813ef1..358dc326 100644
--- a/tests/input/res/drawable-xhdpi/ch_850_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_850_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_851_logo.png b/tests/input/res/drawable-xhdpi/ch_851_logo.png
index b07cf2d3..7c5ef9cd 100644
--- a/tests/input/res/drawable-xhdpi/ch_851_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_851_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_852_logo.png b/tests/input/res/drawable-xhdpi/ch_852_logo.png
index 61b162ea..0ab1e98b 100644
--- a/tests/input/res/drawable-xhdpi/ch_852_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_852_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_853_logo.png b/tests/input/res/drawable-xhdpi/ch_853_logo.png
index 69942aba..c5b6a11b 100644
--- a/tests/input/res/drawable-xhdpi/ch_853_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_853_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_854_logo.png b/tests/input/res/drawable-xhdpi/ch_854_logo.png
index b0799590..5c34d4e2 100644
--- a/tests/input/res/drawable-xhdpi/ch_854_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_854_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_855_logo.png b/tests/input/res/drawable-xhdpi/ch_855_logo.png
index 3b7696f6..b8f10da8 100644
--- a/tests/input/res/drawable-xhdpi/ch_855_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_855_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_856_logo.png b/tests/input/res/drawable-xhdpi/ch_856_logo.png
index a7e34292..1b790da7 100644
--- a/tests/input/res/drawable-xhdpi/ch_856_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_856_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_857_logo.png b/tests/input/res/drawable-xhdpi/ch_857_logo.png
index 25d4fa7d..a7f3b55d 100644
--- a/tests/input/res/drawable-xhdpi/ch_857_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_857_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_858_logo.png b/tests/input/res/drawable-xhdpi/ch_858_logo.png
index ed1eef3c..e3555be6 100644
--- a/tests/input/res/drawable-xhdpi/ch_858_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_858_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_859_logo.png b/tests/input/res/drawable-xhdpi/ch_859_logo.png
index 1cb63e24..970ee63e 100644
--- a/tests/input/res/drawable-xhdpi/ch_859_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_859_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_85_logo.png b/tests/input/res/drawable-xhdpi/ch_85_logo.png
index a30f2d04..35c5c992 100644
--- a/tests/input/res/drawable-xhdpi/ch_85_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_85_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_860_logo.png b/tests/input/res/drawable-xhdpi/ch_860_logo.png
index d029798d..72720501 100644
--- a/tests/input/res/drawable-xhdpi/ch_860_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_860_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_861_logo.png b/tests/input/res/drawable-xhdpi/ch_861_logo.png
index 3cb709ec..bf6d0be9 100644
--- a/tests/input/res/drawable-xhdpi/ch_861_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_861_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_862_logo.png b/tests/input/res/drawable-xhdpi/ch_862_logo.png
index bd6c8b80..ee6c88f2 100644
--- a/tests/input/res/drawable-xhdpi/ch_862_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_862_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_863_logo.png b/tests/input/res/drawable-xhdpi/ch_863_logo.png
index 4e09cd24..9b92ef30 100644
--- a/tests/input/res/drawable-xhdpi/ch_863_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_863_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_864_logo.png b/tests/input/res/drawable-xhdpi/ch_864_logo.png
index 2682aa31..2024e828 100644
--- a/tests/input/res/drawable-xhdpi/ch_864_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_864_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_865_logo.png b/tests/input/res/drawable-xhdpi/ch_865_logo.png
index 44e6f672..80b87668 100644
--- a/tests/input/res/drawable-xhdpi/ch_865_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_865_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_866_logo.png b/tests/input/res/drawable-xhdpi/ch_866_logo.png
index 00d100d7..6dfe8538 100644
--- a/tests/input/res/drawable-xhdpi/ch_866_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_866_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_867_logo.png b/tests/input/res/drawable-xhdpi/ch_867_logo.png
index 4ff7f1cb..6cb51f22 100644
--- a/tests/input/res/drawable-xhdpi/ch_867_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_867_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_868_logo.png b/tests/input/res/drawable-xhdpi/ch_868_logo.png
index 21b71275..e179e5cf 100644
--- a/tests/input/res/drawable-xhdpi/ch_868_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_868_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_869_logo.png b/tests/input/res/drawable-xhdpi/ch_869_logo.png
index 3b4e1ed1..940780eb 100644
--- a/tests/input/res/drawable-xhdpi/ch_869_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_869_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_86_logo.png b/tests/input/res/drawable-xhdpi/ch_86_logo.png
index 7946763d..93bbad73 100644
--- a/tests/input/res/drawable-xhdpi/ch_86_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_86_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_870_logo.png b/tests/input/res/drawable-xhdpi/ch_870_logo.png
index 402aaaec..caa05fe8 100644
--- a/tests/input/res/drawable-xhdpi/ch_870_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_870_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_871_logo.png b/tests/input/res/drawable-xhdpi/ch_871_logo.png
index 7f10c50b..9085b8a8 100644
--- a/tests/input/res/drawable-xhdpi/ch_871_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_871_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_872_logo.png b/tests/input/res/drawable-xhdpi/ch_872_logo.png
index 78f48b88..695dabaf 100644
--- a/tests/input/res/drawable-xhdpi/ch_872_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_872_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_873_logo.png b/tests/input/res/drawable-xhdpi/ch_873_logo.png
index 57991ed2..21871509 100644
--- a/tests/input/res/drawable-xhdpi/ch_873_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_873_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_874_logo.png b/tests/input/res/drawable-xhdpi/ch_874_logo.png
index 51f28d29..2bbcf9cc 100644
--- a/tests/input/res/drawable-xhdpi/ch_874_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_874_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_875_logo.png b/tests/input/res/drawable-xhdpi/ch_875_logo.png
index 267e6ef9..494b8ebc 100644
--- a/tests/input/res/drawable-xhdpi/ch_875_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_875_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_876_logo.png b/tests/input/res/drawable-xhdpi/ch_876_logo.png
index 948d90d8..eded05e4 100644
--- a/tests/input/res/drawable-xhdpi/ch_876_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_876_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_877_logo.png b/tests/input/res/drawable-xhdpi/ch_877_logo.png
index cdf9884b..cf22732d 100644
--- a/tests/input/res/drawable-xhdpi/ch_877_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_877_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_878_logo.png b/tests/input/res/drawable-xhdpi/ch_878_logo.png
index bdf6a7ee..3ca881cf 100644
--- a/tests/input/res/drawable-xhdpi/ch_878_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_878_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_879_logo.png b/tests/input/res/drawable-xhdpi/ch_879_logo.png
index 24b14eca..8f629b25 100644
--- a/tests/input/res/drawable-xhdpi/ch_879_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_879_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_87_logo.png b/tests/input/res/drawable-xhdpi/ch_87_logo.png
index 01e471c3..1a661da8 100644
--- a/tests/input/res/drawable-xhdpi/ch_87_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_87_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_880_logo.png b/tests/input/res/drawable-xhdpi/ch_880_logo.png
index df7f5bb2..f23459d8 100644
--- a/tests/input/res/drawable-xhdpi/ch_880_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_880_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_881_logo.png b/tests/input/res/drawable-xhdpi/ch_881_logo.png
index 00b73120..810320be 100644
--- a/tests/input/res/drawable-xhdpi/ch_881_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_881_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_882_logo.png b/tests/input/res/drawable-xhdpi/ch_882_logo.png
index 3e0b72f3..cee19fc9 100644
--- a/tests/input/res/drawable-xhdpi/ch_882_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_882_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_883_logo.png b/tests/input/res/drawable-xhdpi/ch_883_logo.png
index d1682429..b7cd2a11 100644
--- a/tests/input/res/drawable-xhdpi/ch_883_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_883_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_884_logo.png b/tests/input/res/drawable-xhdpi/ch_884_logo.png
index 0370ba77..ee24315c 100644
--- a/tests/input/res/drawable-xhdpi/ch_884_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_884_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_885_logo.png b/tests/input/res/drawable-xhdpi/ch_885_logo.png
index 2a602c75..aac4f31f 100644
--- a/tests/input/res/drawable-xhdpi/ch_885_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_885_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_886_logo.png b/tests/input/res/drawable-xhdpi/ch_886_logo.png
index 9366a7e3..d929436e 100644
--- a/tests/input/res/drawable-xhdpi/ch_886_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_886_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_887_logo.png b/tests/input/res/drawable-xhdpi/ch_887_logo.png
index b820c72a..4d38b4c9 100644
--- a/tests/input/res/drawable-xhdpi/ch_887_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_887_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_888_logo.png b/tests/input/res/drawable-xhdpi/ch_888_logo.png
index 8db876d5..b8bf4191 100644
--- a/tests/input/res/drawable-xhdpi/ch_888_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_888_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_889_logo.png b/tests/input/res/drawable-xhdpi/ch_889_logo.png
index 93a4af97..e38f60dd 100644
--- a/tests/input/res/drawable-xhdpi/ch_889_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_889_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_88_logo.png b/tests/input/res/drawable-xhdpi/ch_88_logo.png
index 55277a75..9cf19a3b 100644
--- a/tests/input/res/drawable-xhdpi/ch_88_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_88_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_890_logo.png b/tests/input/res/drawable-xhdpi/ch_890_logo.png
index c7a83324..46e8755c 100644
--- a/tests/input/res/drawable-xhdpi/ch_890_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_890_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_891_logo.png b/tests/input/res/drawable-xhdpi/ch_891_logo.png
index aadf15ab..8fcae156 100644
--- a/tests/input/res/drawable-xhdpi/ch_891_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_891_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_892_logo.png b/tests/input/res/drawable-xhdpi/ch_892_logo.png
index 79a0fed1..4672b7e1 100644
--- a/tests/input/res/drawable-xhdpi/ch_892_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_892_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_893_logo.png b/tests/input/res/drawable-xhdpi/ch_893_logo.png
index a3a9b50f..170586f5 100644
--- a/tests/input/res/drawable-xhdpi/ch_893_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_893_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_894_logo.png b/tests/input/res/drawable-xhdpi/ch_894_logo.png
index a87d9621..4b366898 100644
--- a/tests/input/res/drawable-xhdpi/ch_894_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_894_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_895_logo.png b/tests/input/res/drawable-xhdpi/ch_895_logo.png
index d3a49991..1855d24c 100644
--- a/tests/input/res/drawable-xhdpi/ch_895_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_895_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_896_logo.png b/tests/input/res/drawable-xhdpi/ch_896_logo.png
index 40a75e8a..dc47d447 100644
--- a/tests/input/res/drawable-xhdpi/ch_896_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_896_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_897_logo.png b/tests/input/res/drawable-xhdpi/ch_897_logo.png
index be4eeb27..909a60e0 100644
--- a/tests/input/res/drawable-xhdpi/ch_897_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_897_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_898_logo.png b/tests/input/res/drawable-xhdpi/ch_898_logo.png
index 9a37a1fc..a57a6344 100644
--- a/tests/input/res/drawable-xhdpi/ch_898_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_898_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_899_logo.png b/tests/input/res/drawable-xhdpi/ch_899_logo.png
index 962af4e7..fa99418a 100644
--- a/tests/input/res/drawable-xhdpi/ch_899_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_899_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_89_logo.png b/tests/input/res/drawable-xhdpi/ch_89_logo.png
index 6aadc018..0c7edc8c 100644
--- a/tests/input/res/drawable-xhdpi/ch_89_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_89_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_8_logo.png b/tests/input/res/drawable-xhdpi/ch_8_logo.png
index f34a325b..0886b851 100644
--- a/tests/input/res/drawable-xhdpi/ch_8_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_8_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_900_logo.png b/tests/input/res/drawable-xhdpi/ch_900_logo.png
index fcb8864e..cf6327bb 100644
--- a/tests/input/res/drawable-xhdpi/ch_900_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_900_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_901_logo.png b/tests/input/res/drawable-xhdpi/ch_901_logo.png
index e789fbfd..17e1c9ef 100644
--- a/tests/input/res/drawable-xhdpi/ch_901_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_901_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_902_logo.png b/tests/input/res/drawable-xhdpi/ch_902_logo.png
index 64483003..f98b40cb 100644
--- a/tests/input/res/drawable-xhdpi/ch_902_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_902_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_903_logo.png b/tests/input/res/drawable-xhdpi/ch_903_logo.png
index c8659821..d3d331d8 100644
--- a/tests/input/res/drawable-xhdpi/ch_903_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_903_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_904_logo.png b/tests/input/res/drawable-xhdpi/ch_904_logo.png
index e10b556c..d3e29be6 100644
--- a/tests/input/res/drawable-xhdpi/ch_904_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_904_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_905_logo.png b/tests/input/res/drawable-xhdpi/ch_905_logo.png
index cd328c0a..65ab0adc 100644
--- a/tests/input/res/drawable-xhdpi/ch_905_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_905_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_906_logo.png b/tests/input/res/drawable-xhdpi/ch_906_logo.png
index 546301f1..1cc924d7 100644
--- a/tests/input/res/drawable-xhdpi/ch_906_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_906_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_907_logo.png b/tests/input/res/drawable-xhdpi/ch_907_logo.png
index c281e3ab..9fd37e6e 100644
--- a/tests/input/res/drawable-xhdpi/ch_907_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_907_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_908_logo.png b/tests/input/res/drawable-xhdpi/ch_908_logo.png
index c4d8ef58..15597dba 100644
--- a/tests/input/res/drawable-xhdpi/ch_908_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_908_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_909_logo.png b/tests/input/res/drawable-xhdpi/ch_909_logo.png
index a365e213..db80fbef 100644
--- a/tests/input/res/drawable-xhdpi/ch_909_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_909_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_90_logo.png b/tests/input/res/drawable-xhdpi/ch_90_logo.png
index 5f7d97b6..2f2960da 100644
--- a/tests/input/res/drawable-xhdpi/ch_90_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_90_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_910_logo.png b/tests/input/res/drawable-xhdpi/ch_910_logo.png
index caab3966..dd6f8a31 100644
--- a/tests/input/res/drawable-xhdpi/ch_910_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_910_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_911_logo.png b/tests/input/res/drawable-xhdpi/ch_911_logo.png
index 758aca0a..23266b64 100644
--- a/tests/input/res/drawable-xhdpi/ch_911_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_911_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_912_logo.png b/tests/input/res/drawable-xhdpi/ch_912_logo.png
index 0354e02f..677197d5 100644
--- a/tests/input/res/drawable-xhdpi/ch_912_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_912_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_913_logo.png b/tests/input/res/drawable-xhdpi/ch_913_logo.png
index 03e8d6df..41c4ae03 100644
--- a/tests/input/res/drawable-xhdpi/ch_913_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_913_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_914_logo.png b/tests/input/res/drawable-xhdpi/ch_914_logo.png
index 2604331d..2a2b4a2d 100644
--- a/tests/input/res/drawable-xhdpi/ch_914_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_914_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_915_logo.png b/tests/input/res/drawable-xhdpi/ch_915_logo.png
index 13e5fa97..85941edf 100644
--- a/tests/input/res/drawable-xhdpi/ch_915_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_915_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_916_logo.png b/tests/input/res/drawable-xhdpi/ch_916_logo.png
index e79b57fa..fbf4a41e 100644
--- a/tests/input/res/drawable-xhdpi/ch_916_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_916_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_917_logo.png b/tests/input/res/drawable-xhdpi/ch_917_logo.png
index a964fae1..018dff5e 100644
--- a/tests/input/res/drawable-xhdpi/ch_917_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_917_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_918_logo.png b/tests/input/res/drawable-xhdpi/ch_918_logo.png
index 6ac64434..2c8b0b80 100644
--- a/tests/input/res/drawable-xhdpi/ch_918_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_918_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_919_logo.png b/tests/input/res/drawable-xhdpi/ch_919_logo.png
index e2e6903e..de2e6073 100644
--- a/tests/input/res/drawable-xhdpi/ch_919_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_919_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_91_logo.png b/tests/input/res/drawable-xhdpi/ch_91_logo.png
index 389baf71..3992165b 100644
--- a/tests/input/res/drawable-xhdpi/ch_91_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_91_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_920_logo.png b/tests/input/res/drawable-xhdpi/ch_920_logo.png
index 2e52e5da..33839469 100644
--- a/tests/input/res/drawable-xhdpi/ch_920_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_920_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_921_logo.png b/tests/input/res/drawable-xhdpi/ch_921_logo.png
index 894a745f..019c36f5 100644
--- a/tests/input/res/drawable-xhdpi/ch_921_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_921_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_922_logo.png b/tests/input/res/drawable-xhdpi/ch_922_logo.png
index fc298ce8..79e4e07d 100644
--- a/tests/input/res/drawable-xhdpi/ch_922_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_922_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_923_logo.png b/tests/input/res/drawable-xhdpi/ch_923_logo.png
index a6da18a3..6738d938 100644
--- a/tests/input/res/drawable-xhdpi/ch_923_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_923_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_924_logo.png b/tests/input/res/drawable-xhdpi/ch_924_logo.png
index 47f4eb44..3cbc4e30 100644
--- a/tests/input/res/drawable-xhdpi/ch_924_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_924_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_925_logo.png b/tests/input/res/drawable-xhdpi/ch_925_logo.png
index c0eef60f..500111c1 100644
--- a/tests/input/res/drawable-xhdpi/ch_925_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_925_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_926_logo.png b/tests/input/res/drawable-xhdpi/ch_926_logo.png
index 22e8e23c..bd3f94ad 100644
--- a/tests/input/res/drawable-xhdpi/ch_926_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_926_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_927_logo.png b/tests/input/res/drawable-xhdpi/ch_927_logo.png
index c12e0323..51ad2eaa 100644
--- a/tests/input/res/drawable-xhdpi/ch_927_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_927_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_928_logo.png b/tests/input/res/drawable-xhdpi/ch_928_logo.png
index dde2ba6d..6f579bb3 100644
--- a/tests/input/res/drawable-xhdpi/ch_928_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_928_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_929_logo.png b/tests/input/res/drawable-xhdpi/ch_929_logo.png
index 45ee2aac..79f11bb1 100644
--- a/tests/input/res/drawable-xhdpi/ch_929_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_929_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_92_logo.png b/tests/input/res/drawable-xhdpi/ch_92_logo.png
index 330e7356..25508036 100644
--- a/tests/input/res/drawable-xhdpi/ch_92_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_92_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_930_logo.png b/tests/input/res/drawable-xhdpi/ch_930_logo.png
index ff069e4f..4c06ad09 100644
--- a/tests/input/res/drawable-xhdpi/ch_930_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_930_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_931_logo.png b/tests/input/res/drawable-xhdpi/ch_931_logo.png
index 6be9e00d..b7ac61ff 100644
--- a/tests/input/res/drawable-xhdpi/ch_931_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_931_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_932_logo.png b/tests/input/res/drawable-xhdpi/ch_932_logo.png
index 3e88eb1a..cac5a477 100644
--- a/tests/input/res/drawable-xhdpi/ch_932_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_932_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_933_logo.png b/tests/input/res/drawable-xhdpi/ch_933_logo.png
index 2ea636c3..959f957f 100644
--- a/tests/input/res/drawable-xhdpi/ch_933_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_933_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_934_logo.png b/tests/input/res/drawable-xhdpi/ch_934_logo.png
index 851c63cc..e9e5b263 100644
--- a/tests/input/res/drawable-xhdpi/ch_934_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_934_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_935_logo.png b/tests/input/res/drawable-xhdpi/ch_935_logo.png
index 62633a1e..9741307e 100644
--- a/tests/input/res/drawable-xhdpi/ch_935_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_935_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_936_logo.png b/tests/input/res/drawable-xhdpi/ch_936_logo.png
index 02999f66..2c5964de 100644
--- a/tests/input/res/drawable-xhdpi/ch_936_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_936_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_937_logo.png b/tests/input/res/drawable-xhdpi/ch_937_logo.png
index ba9379d5..5392a73c 100644
--- a/tests/input/res/drawable-xhdpi/ch_937_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_937_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_938_logo.png b/tests/input/res/drawable-xhdpi/ch_938_logo.png
index e2b26506..8350910c 100644
--- a/tests/input/res/drawable-xhdpi/ch_938_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_938_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_939_logo.png b/tests/input/res/drawable-xhdpi/ch_939_logo.png
index 79d16fb7..f0635df0 100644
--- a/tests/input/res/drawable-xhdpi/ch_939_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_939_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_93_logo.png b/tests/input/res/drawable-xhdpi/ch_93_logo.png
index 761b7ab1..976c07cb 100644
--- a/tests/input/res/drawable-xhdpi/ch_93_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_93_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_940_logo.png b/tests/input/res/drawable-xhdpi/ch_940_logo.png
index a324cb67..b9c76dbc 100644
--- a/tests/input/res/drawable-xhdpi/ch_940_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_940_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_941_logo.png b/tests/input/res/drawable-xhdpi/ch_941_logo.png
index e071c1cd..d9e3361f 100644
--- a/tests/input/res/drawable-xhdpi/ch_941_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_941_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_942_logo.png b/tests/input/res/drawable-xhdpi/ch_942_logo.png
index 2e59e50a..997643c1 100644
--- a/tests/input/res/drawable-xhdpi/ch_942_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_942_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_943_logo.png b/tests/input/res/drawable-xhdpi/ch_943_logo.png
index f5d2323a..4c6f1752 100644
--- a/tests/input/res/drawable-xhdpi/ch_943_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_943_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_944_logo.png b/tests/input/res/drawable-xhdpi/ch_944_logo.png
index 823dbba1..40a11f40 100644
--- a/tests/input/res/drawable-xhdpi/ch_944_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_944_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_945_logo.png b/tests/input/res/drawable-xhdpi/ch_945_logo.png
index 0c3cba72..9cc401a7 100644
--- a/tests/input/res/drawable-xhdpi/ch_945_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_945_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_946_logo.png b/tests/input/res/drawable-xhdpi/ch_946_logo.png
index 598f23af..bdb5bab4 100644
--- a/tests/input/res/drawable-xhdpi/ch_946_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_946_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_947_logo.png b/tests/input/res/drawable-xhdpi/ch_947_logo.png
index 735649f3..541b632d 100644
--- a/tests/input/res/drawable-xhdpi/ch_947_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_947_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_948_logo.png b/tests/input/res/drawable-xhdpi/ch_948_logo.png
index 8d032694..4db04738 100644
--- a/tests/input/res/drawable-xhdpi/ch_948_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_948_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_949_logo.png b/tests/input/res/drawable-xhdpi/ch_949_logo.png
index 999a2ea3..399a4e51 100644
--- a/tests/input/res/drawable-xhdpi/ch_949_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_949_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_94_logo.png b/tests/input/res/drawable-xhdpi/ch_94_logo.png
index c9603dbb..e22800b8 100644
--- a/tests/input/res/drawable-xhdpi/ch_94_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_94_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_950_logo.png b/tests/input/res/drawable-xhdpi/ch_950_logo.png
index da6acbff..5db6be41 100644
--- a/tests/input/res/drawable-xhdpi/ch_950_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_950_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_951_logo.png b/tests/input/res/drawable-xhdpi/ch_951_logo.png
index 8104bf96..6fbf5951 100644
--- a/tests/input/res/drawable-xhdpi/ch_951_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_951_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_952_logo.png b/tests/input/res/drawable-xhdpi/ch_952_logo.png
index 57637c99..0e5e39aa 100644
--- a/tests/input/res/drawable-xhdpi/ch_952_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_952_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_953_logo.png b/tests/input/res/drawable-xhdpi/ch_953_logo.png
index ae1843c0..430a5e4d 100644
--- a/tests/input/res/drawable-xhdpi/ch_953_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_953_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_954_logo.png b/tests/input/res/drawable-xhdpi/ch_954_logo.png
index c14b6c6b..8ddc6cee 100644
--- a/tests/input/res/drawable-xhdpi/ch_954_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_954_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_955_logo.png b/tests/input/res/drawable-xhdpi/ch_955_logo.png
index f43422f8..69ec92b5 100644
--- a/tests/input/res/drawable-xhdpi/ch_955_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_955_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_956_logo.png b/tests/input/res/drawable-xhdpi/ch_956_logo.png
index 260962ca..bc1edbd7 100644
--- a/tests/input/res/drawable-xhdpi/ch_956_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_956_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_957_logo.png b/tests/input/res/drawable-xhdpi/ch_957_logo.png
index 45a19f55..20db4202 100644
--- a/tests/input/res/drawable-xhdpi/ch_957_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_957_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_958_logo.png b/tests/input/res/drawable-xhdpi/ch_958_logo.png
index 6532fd2a..8e9a7a68 100644
--- a/tests/input/res/drawable-xhdpi/ch_958_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_958_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_959_logo.png b/tests/input/res/drawable-xhdpi/ch_959_logo.png
index 4dddf7d4..4d61c092 100644
--- a/tests/input/res/drawable-xhdpi/ch_959_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_959_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_95_logo.png b/tests/input/res/drawable-xhdpi/ch_95_logo.png
index 0b1d8483..50cc5990 100644
--- a/tests/input/res/drawable-xhdpi/ch_95_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_95_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_960_logo.png b/tests/input/res/drawable-xhdpi/ch_960_logo.png
index 27ed3984..b2a54413 100644
--- a/tests/input/res/drawable-xhdpi/ch_960_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_960_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_961_logo.png b/tests/input/res/drawable-xhdpi/ch_961_logo.png
index f10900f1..5dc31323 100644
--- a/tests/input/res/drawable-xhdpi/ch_961_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_961_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_962_logo.png b/tests/input/res/drawable-xhdpi/ch_962_logo.png
index 7d66bc64..4ef2a219 100644
--- a/tests/input/res/drawable-xhdpi/ch_962_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_962_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_963_logo.png b/tests/input/res/drawable-xhdpi/ch_963_logo.png
index ed5923bd..22633d33 100644
--- a/tests/input/res/drawable-xhdpi/ch_963_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_963_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_964_logo.png b/tests/input/res/drawable-xhdpi/ch_964_logo.png
index 7907b72f..ba8ad46c 100644
--- a/tests/input/res/drawable-xhdpi/ch_964_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_964_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_965_logo.png b/tests/input/res/drawable-xhdpi/ch_965_logo.png
index 9b2fa082..2c935852 100644
--- a/tests/input/res/drawable-xhdpi/ch_965_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_965_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_966_logo.png b/tests/input/res/drawable-xhdpi/ch_966_logo.png
index 48bc04d1..8b751988 100644
--- a/tests/input/res/drawable-xhdpi/ch_966_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_966_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_967_logo.png b/tests/input/res/drawable-xhdpi/ch_967_logo.png
index d15299cd..974712fd 100644
--- a/tests/input/res/drawable-xhdpi/ch_967_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_967_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_968_logo.png b/tests/input/res/drawable-xhdpi/ch_968_logo.png
index cfe29e4c..d1edc191 100644
--- a/tests/input/res/drawable-xhdpi/ch_968_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_968_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_969_logo.png b/tests/input/res/drawable-xhdpi/ch_969_logo.png
index 1d97435c..7774ed92 100644
--- a/tests/input/res/drawable-xhdpi/ch_969_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_969_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_96_logo.png b/tests/input/res/drawable-xhdpi/ch_96_logo.png
index 24cf0845..e37da468 100644
--- a/tests/input/res/drawable-xhdpi/ch_96_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_96_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_970_logo.png b/tests/input/res/drawable-xhdpi/ch_970_logo.png
index c077ec06..5dd52457 100644
--- a/tests/input/res/drawable-xhdpi/ch_970_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_970_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_971_logo.png b/tests/input/res/drawable-xhdpi/ch_971_logo.png
index c9148c51..0aca871c 100644
--- a/tests/input/res/drawable-xhdpi/ch_971_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_971_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_972_logo.png b/tests/input/res/drawable-xhdpi/ch_972_logo.png
index 3c9004a5..2f8803b5 100644
--- a/tests/input/res/drawable-xhdpi/ch_972_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_972_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_973_logo.png b/tests/input/res/drawable-xhdpi/ch_973_logo.png
index c8c114b8..35ec5c90 100644
--- a/tests/input/res/drawable-xhdpi/ch_973_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_973_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_974_logo.png b/tests/input/res/drawable-xhdpi/ch_974_logo.png
index a336e295..98f9a7aa 100644
--- a/tests/input/res/drawable-xhdpi/ch_974_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_974_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_975_logo.png b/tests/input/res/drawable-xhdpi/ch_975_logo.png
index b9d917c2..bdc31316 100644
--- a/tests/input/res/drawable-xhdpi/ch_975_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_975_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_976_logo.png b/tests/input/res/drawable-xhdpi/ch_976_logo.png
index 02fc087f..078d35b7 100644
--- a/tests/input/res/drawable-xhdpi/ch_976_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_976_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_977_logo.png b/tests/input/res/drawable-xhdpi/ch_977_logo.png
index 377ee44f..c6fbb7be 100644
--- a/tests/input/res/drawable-xhdpi/ch_977_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_977_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_978_logo.png b/tests/input/res/drawable-xhdpi/ch_978_logo.png
index 09e6fba9..00a6e5e1 100644
--- a/tests/input/res/drawable-xhdpi/ch_978_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_978_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_979_logo.png b/tests/input/res/drawable-xhdpi/ch_979_logo.png
index e0f91625..fd1f56d1 100644
--- a/tests/input/res/drawable-xhdpi/ch_979_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_979_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_97_logo.png b/tests/input/res/drawable-xhdpi/ch_97_logo.png
index 04243156..f852548a 100644
--- a/tests/input/res/drawable-xhdpi/ch_97_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_97_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_980_logo.png b/tests/input/res/drawable-xhdpi/ch_980_logo.png
index e74e48d9..362a1988 100644
--- a/tests/input/res/drawable-xhdpi/ch_980_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_980_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_981_logo.png b/tests/input/res/drawable-xhdpi/ch_981_logo.png
index fd8eea25..9f879c4b 100644
--- a/tests/input/res/drawable-xhdpi/ch_981_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_981_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_982_logo.png b/tests/input/res/drawable-xhdpi/ch_982_logo.png
index 53902f70..0d945a11 100644
--- a/tests/input/res/drawable-xhdpi/ch_982_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_982_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_983_logo.png b/tests/input/res/drawable-xhdpi/ch_983_logo.png
index 0700c680..ffeaddfc 100644
--- a/tests/input/res/drawable-xhdpi/ch_983_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_983_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_984_logo.png b/tests/input/res/drawable-xhdpi/ch_984_logo.png
index b812b238..d8f92211 100644
--- a/tests/input/res/drawable-xhdpi/ch_984_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_984_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_985_logo.png b/tests/input/res/drawable-xhdpi/ch_985_logo.png
index 0b2b5ead..b6c6f0dc 100644
--- a/tests/input/res/drawable-xhdpi/ch_985_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_985_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_986_logo.png b/tests/input/res/drawable-xhdpi/ch_986_logo.png
index 22edb80a..8e2c0b50 100644
--- a/tests/input/res/drawable-xhdpi/ch_986_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_986_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_987_logo.png b/tests/input/res/drawable-xhdpi/ch_987_logo.png
index 53a13ea0..ce8c107a 100644
--- a/tests/input/res/drawable-xhdpi/ch_987_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_987_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_988_logo.png b/tests/input/res/drawable-xhdpi/ch_988_logo.png
index 8f33cfd0..ffa8ded7 100644
--- a/tests/input/res/drawable-xhdpi/ch_988_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_988_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_989_logo.png b/tests/input/res/drawable-xhdpi/ch_989_logo.png
index ca89cd04..8522a03a 100644
--- a/tests/input/res/drawable-xhdpi/ch_989_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_989_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_98_logo.png b/tests/input/res/drawable-xhdpi/ch_98_logo.png
index c95bb658..13fe760f 100644
--- a/tests/input/res/drawable-xhdpi/ch_98_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_98_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_990_logo.png b/tests/input/res/drawable-xhdpi/ch_990_logo.png
index 809e64b6..bd6df061 100644
--- a/tests/input/res/drawable-xhdpi/ch_990_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_990_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_991_logo.png b/tests/input/res/drawable-xhdpi/ch_991_logo.png
index 9774f198..8611d57d 100644
--- a/tests/input/res/drawable-xhdpi/ch_991_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_991_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_992_logo.png b/tests/input/res/drawable-xhdpi/ch_992_logo.png
index 01381a84..36d26bc0 100644
--- a/tests/input/res/drawable-xhdpi/ch_992_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_992_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_993_logo.png b/tests/input/res/drawable-xhdpi/ch_993_logo.png
index 2f470e98..f67e0eec 100644
--- a/tests/input/res/drawable-xhdpi/ch_993_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_993_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_994_logo.png b/tests/input/res/drawable-xhdpi/ch_994_logo.png
index 6c6cf86f..a63d5ee1 100644
--- a/tests/input/res/drawable-xhdpi/ch_994_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_994_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_995_logo.png b/tests/input/res/drawable-xhdpi/ch_995_logo.png
index 0d8e14b2..b7b45167 100644
--- a/tests/input/res/drawable-xhdpi/ch_995_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_995_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_996_logo.png b/tests/input/res/drawable-xhdpi/ch_996_logo.png
index e904fe21..82c042c3 100644
--- a/tests/input/res/drawable-xhdpi/ch_996_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_996_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_997_logo.png b/tests/input/res/drawable-xhdpi/ch_997_logo.png
index 9d608a58..d70e4793 100644
--- a/tests/input/res/drawable-xhdpi/ch_997_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_997_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_998_logo.png b/tests/input/res/drawable-xhdpi/ch_998_logo.png
index 14386f70..f6c69d2e 100644
--- a/tests/input/res/drawable-xhdpi/ch_998_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_998_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_999_logo.png b/tests/input/res/drawable-xhdpi/ch_999_logo.png
index 6cc6cd2a..844c06fd 100644
--- a/tests/input/res/drawable-xhdpi/ch_999_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_999_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_99_logo.png b/tests/input/res/drawable-xhdpi/ch_99_logo.png
index b9d94a8e..d8be447d 100644
--- a/tests/input/res/drawable-xhdpi/ch_99_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_99_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/ch_9_logo.png b/tests/input/res/drawable-xhdpi/ch_9_logo.png
index 8e7c246d..8ba6bc55 100644
--- a/tests/input/res/drawable-xhdpi/ch_9_logo.png
+++ b/tests/input/res/drawable-xhdpi/ch_9_logo.png
Binary files differ
diff --git a/tests/input/res/drawable-xhdpi/icon.png b/tests/input/res/drawable-xhdpi/icon.png
index 8497c28c..87af81e3 100644
--- a/tests/input/res/drawable-xhdpi/icon.png
+++ b/tests/input/res/drawable-xhdpi/icon.png
Binary files differ
diff --git a/tests/unit/Android.mk b/tests/unit/Android.mk
index 1e2f7c3b..7ed100d0 100644
--- a/tests/unit/Android.mk
+++ b/tests/unit/Android.mk
@@ -9,7 +9,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
- mockito-target-minus-junit4 \
+ mockito-target \
tv-test-common \
LOCAL_PACKAGE_NAME := TVUnitTests
diff --git a/tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java b/tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java
index 19ee62ec..85e35c4d 100644
--- a/tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java
+++ b/tests/unit/src/com/android/tv/dvr/DvrDataManagerInMemoryImpl.java
@@ -64,7 +64,7 @@ final class DvrDataManagerInMemoryImpl extends BaseDvrDataManager {
}
private List<ScheduledRecording> getScheduledRecordingsPrograms() {
- return new ArrayList(mScheduledRecordings.values());
+ return new ArrayList<>(mScheduledRecordings.values());
}
@Override
@@ -159,7 +159,7 @@ final class DvrDataManagerInMemoryImpl extends BaseDvrDataManager {
long id = r.getId();
if (mRecordedPrograms.containsKey(id)) {
mRecordedPrograms.put(id, r);
- notifyRecordedProgramChanged(r);
+ notifyRecordedProgramsChanged(r);
} else {
throw new IllegalArgumentException("Recording not found:" + r);
}
@@ -167,7 +167,7 @@ final class DvrDataManagerInMemoryImpl extends BaseDvrDataManager {
public void removeRecordedProgram(RecordedProgram scheduledRecording) {
mRecordedPrograms.remove(scheduledRecording.getId());
- notifyRecordedProgramRemoved(scheduledRecording);
+ notifyRecordedProgramsRemoved(scheduledRecording);
}
@@ -191,7 +191,7 @@ final class DvrDataManagerInMemoryImpl extends BaseDvrDataManager {
.setId(mNextId.incrementAndGet())
.build();
mRecordedPrograms.put(recordedProgram.getId(), recordedProgram);
- notifyRecordedProgramAdded(recordedProgram);
+ notifyRecordedProgramsAdded(recordedProgram);
return recordedProgram;
}
@@ -212,6 +212,11 @@ final class DvrDataManagerInMemoryImpl extends BaseDvrDataManager {
}
@Override
+ public void removeScheduledRecording(boolean forceRemove, ScheduledRecording... schedule) {
+ removeScheduledRecording(schedule);
+ }
+
+ @Override
public void removeSeriesRecording(SeriesRecording... seriesRecordings) {
for (SeriesRecording r : seriesRecordings) {
mSeriesRecordings.remove(r.getId());
diff --git a/tests/unit/src/com/android/tv/dvr/DvrDbSyncTest.java b/tests/unit/src/com/android/tv/dvr/DvrDbSyncTest.java
index 1aa1d125..7cb3721c 100644
--- a/tests/unit/src/com/android/tv/dvr/DvrDbSyncTest.java
+++ b/tests/unit/src/com/android/tv/dvr/DvrDbSyncTest.java
@@ -27,6 +27,7 @@ import android.support.test.filters.SdkSuppress;
import android.support.test.filters.SmallTest;
import android.test.AndroidTestCase;
+import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.Program;
import org.mockito.Mock;
@@ -52,12 +53,14 @@ public class DvrDbSyncTest extends AndroidTestCase {
private DvrDbSync mDbSync;
@Mock private DvrDataManagerImpl mDataManager;
+ @Mock private ChannelDataManager mChannelDataManager;
@Override
protected void setUp() throws Exception {
super.setUp();
MockitoAnnotations.initMocks(this);
- mDbSync = new DvrDbSync(getContext(), mDataManager);
+ when(mChannelDataManager.isDbLoadFinished()).thenReturn(true);
+ mDbSync = new DvrDbSync(getContext(), mDataManager, mChannelDataManager);
}
public void testHandleUpdateProgram_null() {
diff --git a/tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java b/tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java
index 2f7670c7..2850a5f7 100644
--- a/tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java
+++ b/tests/unit/src/com/android/tv/dvr/DvrScheduleManagerTest.java
@@ -25,8 +25,10 @@ import com.android.tv.testing.dvr.RecordingTestUtils;
import junit.framework.TestCase;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
/**
* Tests for {@link DvrScheduleManager}
@@ -275,8 +277,8 @@ public class DvrScheduleManagerTest extends TestCase {
schedules.add(r2);
MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(schedules, 1,
Collections.singletonList(new Range<>(10L, 20L))), r1);
- MoreAsserts.assertEmpty(DvrScheduleManager.getConflictingSchedules(schedules, 1,
- Collections.singletonList(new Range<>(110L, 120L))));
+ MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(schedules, 1,
+ Collections.singletonList(new Range<>(110L, 120L))), r1);
}
public void testGetConflictingSchedules_period2() {
@@ -290,8 +292,8 @@ public class DvrScheduleManagerTest extends TestCase {
ScheduledRecording r2 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
++channelId, ++priority, 100L, 200L);
schedules.add(r2);
- MoreAsserts.assertEmpty(DvrScheduleManager.getConflictingSchedules(schedules, 1,
- Collections.singletonList(new Range<>(10L, 20L))));
+ MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(schedules, 1,
+ Collections.singletonList(new Range<>(10L, 20L))), r1);
MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(schedules, 1,
Collections.singletonList(new Range<>(110L, 120L))), r1);
}
@@ -337,14 +339,15 @@ public class DvrScheduleManagerTest extends TestCase {
ScheduledRecording r2 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
++channelId, ++priority, 0L, 100L);
schedules.add(r2);
- // The result doesn't include r1 because r1 is already canceled when the tuner count is 1.
MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(
Collections.singletonList(
- ScheduledRecording.builder(INPUT_ID, ++channelId, 10L, 20L).build()),
+ ScheduledRecording.builder(INPUT_ID, ++channelId, 10L, 20L)
+ .setPriority(++priority).build()),
schedules, 1), r2, r1);
MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(
Collections.singletonList(
- ScheduledRecording.builder(INPUT_ID, ++channelId, 110L, 120L).build()),
+ ScheduledRecording.builder(INPUT_ID, ++channelId, 110L, 120L)
+ .setPriority(++priority).build()),
schedules, 1), r1);
}
@@ -359,33 +362,36 @@ public class DvrScheduleManagerTest extends TestCase {
ScheduledRecording r2 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
++channelId, ++priority, 100L, 200L);
schedules.add(r2);
- // The result doesn't include r1 because r1 is already canceled when the tuner count is 1.
MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(
Collections.singletonList(
- ScheduledRecording.builder(INPUT_ID, ++channelId, 10L, 20L).build()),
+ ScheduledRecording.builder(INPUT_ID, ++channelId, 10L, 20L)
+ .setPriority(++priority).build()),
schedules, 1), r1);
MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(
Collections.singletonList(
- ScheduledRecording.builder(INPUT_ID, ++channelId, 110L, 120L).build()),
+ ScheduledRecording.builder(INPUT_ID, ++channelId, 110L, 120L)
+ .setPriority(++priority).build()),
schedules, 1), r2, r1);
}
- public void testGetConflictingSchedules_emptyDuration() {
+ public void testGetConflictingSchedules_addLowestPriority() {
long priority = 0;
long channelId = 0;
List<ScheduledRecording> schedules = new ArrayList<>();
- schedules.add(RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
- ++priority, 0L, 200L));
- // Ignore empty duration.
- schedules.add(RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
- ++priority, 0L, 0L));
- schedules.add(RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
- ++priority, 100L, 100L));
- schedules.add(RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
- ++priority, 200L, 200L));
- MoreAsserts.assertEmpty(DvrScheduleManager.getConflictingSchedules(schedules, 1));
- MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(schedules, 0),
- schedules.get(0));
+
+ ScheduledRecording r1 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
+ ++channelId, ++priority, 0L, 400L);
+ schedules.add(r1);
+ ScheduledRecording r2 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
+ ++channelId, ++priority, 100L, 200L);
+ schedules.add(r2);
+ // Returning r1 even though r1 has the higher priority than the new one. That's because r1
+ // starts at 0 and stops at 100, and the new one will be recorded successfully.
+ MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(
+ Collections.singletonList(
+ ScheduledRecording.builder(INPUT_ID, ++channelId, 200L, 300L)
+ .setPriority(0).build()),
+ schedules, 1), r1);
}
public void testGetConflictingSchedules_sameChannel() {
@@ -396,8 +402,43 @@ public class DvrScheduleManagerTest extends TestCase {
++priority, 0L, 200L));
schedules.add(RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(channelId,
++priority, 0L, 200L));
- MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(schedules, 3),
- schedules.get(0));
+ MoreAsserts.assertEmpty(DvrScheduleManager.getConflictingSchedules(schedules, 3));
+ }
+
+ public void testGetConflictingSchedule_startEarlyAndFail() {
+ long priority = 0;
+ long channelId = 0;
+ List<ScheduledRecording> schedules = new ArrayList<>();
+ ScheduledRecording r1 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
+ ++channelId, ++priority, 200L, 300L);
+ schedules.add(r1);
+ ScheduledRecording r2 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
+ ++channelId, ++priority, 0L, 400L);
+ schedules.add(r2);
+ ScheduledRecording r3 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
+ ++channelId, ++priority, 100L, 200L);
+ schedules.add(r3);
+ // r2 starts recording and fails when r3 starts. r1 is recorded successfully.
+ MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(schedules, 1),
+ r2);
+ }
+
+ public void testGetConflictingSchedule_startLate() {
+ long priority = 0;
+ long channelId = 0;
+ List<ScheduledRecording> schedules = new ArrayList<>();
+ ScheduledRecording r1 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
+ ++channelId, ++priority, 200L, 400L);
+ schedules.add(r1);
+ ScheduledRecording r2 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
+ ++channelId, ++priority, 100L, 300L);
+ schedules.add(r2);
+ ScheduledRecording r3 = RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(
+ ++channelId, ++priority, 0L, 200L);
+ schedules.add(r3);
+ // r2 and r1 are clipped.
+ MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedules(schedules, 1),
+ r2, r1);
}
public void testGetConflictingSchedulesForTune_canTune() {
@@ -517,4 +558,77 @@ public class DvrScheduleManagerTest extends TestCase {
MoreAsserts.assertContentsInOrder(DvrScheduleManager.getConflictingSchedulesForWatching(
INPUT_ID, channelToWatch, 0L, ++priority, schedules, 1), r3, r1);
}
-}
+
+ public void testPartiallyConflictingSchedules() {
+ long priority = 100;
+ long channelId = 0;
+ List<ScheduledRecording> schedules = new ArrayList<>(Arrays.asList(
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 0L, 400L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 0L, 200L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 200L, 500L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 400L, 600L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 700L, 800L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 600L, 900L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 800L, 900L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 800L, 900L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 750L, 850L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 300L, 450L),
+ RecordingTestUtils.createTestRecordingWithPriorityAndPeriod(++channelId,
+ --priority, 50L, 900L)
+ ));
+ 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/RecordingTaskTest.java b/tests/unit/src/com/android/tv/dvr/RecordingTaskTest.java
index 3b84200a..13ad9b0c 100644
--- a/tests/unit/src/com/android/tv/dvr/RecordingTaskTest.java
+++ b/tests/unit/src/com/android/tv/dvr/RecordingTaskTest.java
@@ -84,12 +84,12 @@ public class RecordingTaskTest extends AndroidTestCase {
RecordingTask task = createRecordingTask(r, channel);
String inputId = channel.getInputId();
when(mMockSessionManager.createRecordingSession(eq(inputId), anyString(), eq(task),
- eq(mMockHandler))).thenReturn(mMockRecordingSession);
+ eq(mMockHandler), anyLong())).thenReturn(mMockRecordingSession);
when(mMockHandler.sendMessageAtTime(anyObject(), anyLong())).thenReturn(true);
assertTrue(task.handleMessage(createMessage(RecordingTask.MSG_INITIALIZE)));
assertEquals(State.CONNECTION_PENDING, task.getState());
verify(mMockSessionManager).createRecordingSession(eq(inputId), anyString(), eq(task),
- eq(mMockHandler));
+ eq(mMockHandler), anyLong());
verify(mMockRecordingSession).tune(eq(inputId), eq(channel.getUri()));
verifyNoMoreInteractions(mMockHandler, mMockRecordingSession, mMockSessionManager);
}
@@ -106,7 +106,7 @@ public class RecordingTaskTest extends AndroidTestCase {
RecordingTask task = createRecordingTask(r, channel);
String inputId = channel.getInputId();
when(mMockSessionManager.createRecordingSession(eq(inputId), anyString(), eq(task),
- eq(mMockHandler))).thenReturn(mMockRecordingSession);
+ eq(mMockHandler), anyLong())).thenReturn(mMockRecordingSession);
when(mMockHandler.sendMessageAtTime(anyObject(), anyLong())).thenReturn(true);
task.handleMessage(createMessage(RecordingTask.MSG_INITIALIZE));
task.onTuned(channel.getUri());
diff --git a/tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java b/tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java
index a5adf3d7..96036418 100644
--- a/tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java
+++ b/tests/unit/src/com/android/tv/dvr/ScheduledRecordingTest.java
@@ -89,11 +89,11 @@ public class ScheduledRecordingTest extends TestCase {
createTestRecordingWithIdAndPeriod(3, INPUT_ID, CHANNEL_ID, 10L, 20L));
// default priority
- MoreAsserts.assertContentsInOrder(sortByPriority(a, b, c), c, b, a);
+ MoreAsserts.assertContentsInOrder(sortByPriority(c, b, a), a, b, c);
// make A preferred over B
- a = ScheduledRecording.buildFrom(a).setPriority(b.getPriority() + 1).build();
- MoreAsserts.assertContentsInOrder(sortByPriority(c, b, a), c, a, b);
+ a = ScheduledRecording.buildFrom(a).setPriority(b.getPriority() + 2).build();
+ MoreAsserts.assertContentsInOrder(sortByPriority(a, b, c), b, c, a);
}
public Collection<ScheduledRecording> sortByPriority(ScheduledRecording a, ScheduledRecording b,
diff --git a/tests/unit/src/com/android/tv/dvr/SchedulerTest.java b/tests/unit/src/com/android/tv/dvr/SchedulerTest.java
index c53a8a64..30ac1ff1 100644
--- a/tests/unit/src/com/android/tv/dvr/SchedulerTest.java
+++ b/tests/unit/src/com/android/tv/dvr/SchedulerTest.java
@@ -49,7 +49,6 @@ import java.util.concurrent.TimeUnit;
public class SchedulerTest extends AndroidTestCase {
private static final String INPUT_ID = "input_id";
private static final int CHANNEL_ID = 273;
- private static final long LISTENER_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(1);
private FakeClock mFakeClock;
private DvrDataManagerInMemoryImpl mDataManager;
diff --git a/tests/unit/src/com/android/tv/dvr/SeriesRecordingSchedulerTest.java b/tests/unit/src/com/android/tv/dvr/SeriesRecordingSchedulerTest.java
index 2c69406c..efefb93c 100644
--- a/tests/unit/src/com/android/tv/dvr/SeriesRecordingSchedulerTest.java
+++ b/tests/unit/src/com/android/tv/dvr/SeriesRecordingSchedulerTest.java
@@ -21,15 +21,14 @@ import android.support.test.filters.SdkSuppress;
import android.support.test.filters.SmallTest;
import android.test.AndroidTestCase;
import android.test.MoreAsserts;
+import android.util.LongSparseArray;
import com.android.tv.data.Program;
-import com.android.tv.dvr.SeriesRecordingScheduler.ScheduledEpisode;
import com.android.tv.testing.FakeClock;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
/**
* Tests for {@link SeriesRecordingScheduler}
@@ -40,7 +39,6 @@ public class SeriesRecordingSchedulerTest extends AndroidTestCase {
private static final String PROGRAM_TITLE = "MyProgram";
private static final long CHANNEL_ID = 123;
private static final long SERIES_RECORDING_ID1 = 1;
- private static final long SERIES_RECORDING_ID2 = 2;
private static final String SERIES_ID = "SERIES_ID";
private static final String SEASON_NUMBER1 = "SEASON NUMBER1";
private static final String SEASON_NUMBER2 = "SEASON NUMBER2";
@@ -49,8 +47,6 @@ public class SeriesRecordingSchedulerTest extends AndroidTestCase {
private final SeriesRecording mBaseSeriesRecording = new SeriesRecording.Builder()
.setTitle(PROGRAM_TITLE).setChannelId(CHANNEL_ID).setSeriesId(SERIES_ID).build();
- private final SeriesRecording mSeriesRecordingSeason2 = SeriesRecording
- .buildFrom(mBaseSeriesRecording).setStartFromSeason(2).build();
private final Program mBaseProgram = new Program.Builder().setTitle(PROGRAM_TITLE)
.setChannelId(CHANNEL_ID).setSeriesId(SERIES_ID).build();
@@ -63,40 +59,6 @@ public class SeriesRecordingSchedulerTest extends AndroidTestCase {
mDataManager = new DvrDataManagerInMemoryImpl(getContext(), fakeClock);
}
- public void testEpisodeAlreadyScheduled_true() {
- List<ScheduledEpisode> episodes = new ArrayList<>();
- ScheduledEpisode episode = new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER1,
- EPISODE_NUMBER1);
- episodes.add(episode);
- assertTrue(SeriesRecordingScheduler.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(SeriesRecordingScheduler.isEpisodeScheduled(episodes,
- new ScheduledEpisode(SERIES_RECORDING_ID2, SEASON_NUMBER1, EPISODE_NUMBER1)));
- assertFalse(SeriesRecordingScheduler.isEpisodeScheduled(episodes,
- new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER2, EPISODE_NUMBER1)));
- assertFalse(SeriesRecordingScheduler.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(SeriesRecordingScheduler.isEpisodeScheduled(episodes,
- new ScheduledEpisode(SERIES_RECORDING_ID1, null, EPISODE_NUMBER1)));
- assertFalse(SeriesRecordingScheduler.isEpisodeScheduled(episodes,
- new ScheduledEpisode(SERIES_RECORDING_ID1, SEASON_NUMBER1, null)));
- assertFalse(SeriesRecordingScheduler.isEpisodeScheduled(episodes,
- new ScheduledEpisode(SERIES_RECORDING_ID1, null, null)));
- }
public void testPickOneProgramPerEpisode_onePerEpisode() {
SeriesRecording seriesRecording = SeriesRecording.buildFrom(mBaseSeriesRecording)
.setId(SERIES_RECORDING_ID1).build();
@@ -108,7 +70,7 @@ public class SeriesRecordingSchedulerTest extends AndroidTestCase {
Program program2 = new Program.Builder(mBaseProgram).setSeasonNumber(SEASON_NUMBER2)
.setEpisodeNumber(EPISODE_NUMBER2).build();
programs.add(program2);
- Map<Long, List<Program>> result = SeriesRecordingScheduler.pickOneProgramPerEpisode(
+ LongSparseArray<List<Program>> result = SeriesRecordingScheduler.pickOneProgramPerEpisode(
mDataManager, Collections.singletonList(seriesRecording), programs);
MoreAsserts.assertContentsInAnyOrder(result.get(SERIES_RECORDING_ID1), program1, program2);
}
@@ -128,7 +90,7 @@ public class SeriesRecordingSchedulerTest extends AndroidTestCase {
programs.add(program3);
Program program4 = new Program.Builder(program1).setStartTimeUtcMillis(1).build();
programs.add(program4);
- Map<Long, List<Program>> result = SeriesRecordingScheduler.pickOneProgramPerEpisode(
+ LongSparseArray<List<Program>> result = SeriesRecordingScheduler.pickOneProgramPerEpisode(
mDataManager, Collections.singletonList(seriesRecording), programs);
MoreAsserts.assertContentsInAnyOrder(result.get(SERIES_RECORDING_ID1), program1, program3);
}
@@ -142,7 +104,7 @@ public class SeriesRecordingSchedulerTest extends AndroidTestCase {
programs.add(program1);
Program program2 = new Program.Builder(mBaseProgram).setStartTimeUtcMillis(1).build();
programs.add(program2);
- Map<Long, List<Program>> result = SeriesRecordingScheduler.pickOneProgramPerEpisode(
+ LongSparseArray<List<Program>> result = SeriesRecordingScheduler.pickOneProgramPerEpisode(
mDataManager, Collections.singletonList(seriesRecording), programs);
MoreAsserts.assertContentsInAnyOrder(result.get(SERIES_RECORDING_ID1), program1, program2);
}
diff --git a/usbtuner-res/drawable-xhdpi/ic_setup_antenna.png b/usbtuner-res/drawable-xhdpi/ic_setup_antenna.png
index 1f9e0673..bb6d416e 100644
--- a/usbtuner-res/drawable-xhdpi/ic_setup_antenna.png
+++ b/usbtuner-res/drawable-xhdpi/ic_setup_antenna.png
Binary files differ
diff --git a/usbtuner-res/drawable-xhdpi/recommendation_antenna.png b/usbtuner-res/drawable-xhdpi/recommendation_antenna.png
index d4152d56..c4710bcc 100644
--- a/usbtuner-res/drawable-xhdpi/recommendation_antenna.png
+++ b/usbtuner-res/drawable-xhdpi/recommendation_antenna.png
Binary files differ
diff --git a/usbtuner-res/drawable-xhdpi/usb_antenna.png b/usbtuner-res/drawable-xhdpi/usb_antenna.png
index ba7bde19..ca5b2d72 100644
--- a/usbtuner-res/drawable-xhdpi/usb_antenna.png
+++ b/usbtuner-res/drawable-xhdpi/usb_antenna.png
Binary files differ
diff --git a/usbtuner-res/values-af/strings.xml b/usbtuner-res/values-af/strings.xml
index a5149100..4337a696 100644
--- a/usbtuner-res/values-af/strings.xml
+++ b/usbtuner-res/values-af/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3-oudio is nie beskikbaar nie"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Aktiveer omringklank in stelselklankinstellings om oudio te aktiveer"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d kanale is gevind</item>
<item quantity="one">%1$d kanaal is gevind</item>
diff --git a/usbtuner-res/values-am/strings.xml b/usbtuner-res/values-am/strings.xml
index 77551fc8..a903ee76 100644
--- a/usbtuner-res/values-am/strings.xml
+++ b/usbtuner-res/values-am/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ኦዲዮ አይገኝም"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ኦዲዮን ለማንቃት በስርዓት ድምጽ ቅንብሮች ውስጥ የዙሪያ ድምጽን ያንቁ"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"የቴሌቪዥን መቃኛ ማዋቀር"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"የዩኤስቢ ጣቢያ መቃኛ ማዋቀር"</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">
<item quantity="one">%1$d ጣቢያዎች ተገኝተዋል</item>
<item quantity="other">%1$d ጣቢያዎች ተገኝተዋል</item>
diff --git a/usbtuner-res/values-ar/strings.xml b/usbtuner-res/values-ar/strings.xml
index 56c0f0c4..ecfde3e8 100644
--- a/usbtuner-res/values-ar/strings.xml
+++ b/usbtuner-res/values-ar/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"‏لا يتوفر صوت AC3"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"يمكنك تشغيل الصوت المحيطي في إعدادات صوت النظام لتفعيل الصوت"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"إعداد موالف التلفزيون"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"‏إعداد موالف قنوات USB"</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">
<item quantity="zero">‏تم العثور على %1$d قناة</item>
<item quantity="two">‏تم العثور على قناتين (%1$d)</item>
diff --git a/usbtuner-res/values-az-rAZ/strings.xml b/usbtuner-res/values-az-rAZ/strings.xml
index f57bf079..f5305817 100644
--- a/usbtuner-res/values-az-rAZ/strings.xml
+++ b/usbtuner-res/values-az-rAZ/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 audiosu mövcud deyil"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d kanal tapıldı</item>
<item quantity="one">%1$d kanal tapıldı</item>
diff --git a/usbtuner-res/values-bg/strings.xml b/usbtuner-res/values-bg/strings.xml
index 7e134305..0854c09e 100644
--- a/usbtuner-res/values-bg/strings.xml
+++ b/usbtuner-res/values-bg/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Не се поддържа аудио във формат AC3"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Активирайте обемния звук от настройките за системния, за да включите аудиото"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Настройване на телевизионния тунер"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Настройване на USB тунера за канали"</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">
<item quantity="other">Намерени са %1$d канала</item>
<item quantity="one">Намерен е %1$d канал</item>
diff --git a/usbtuner-res/values-bn-rBD/strings.xml b/usbtuner-res/values-bn-rBD/strings.xml
index 86a909b8..236e2d96 100644
--- a/usbtuner-res/values-bn-rBD/strings.xml
+++ b/usbtuner-res/values-bn-rBD/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 অডিও অনুপলব্ধ"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"অডিও সক্ষম করতে সিস্টেম সাউন্ড সেটিংসে সারাউন্ড সাউন্ড সক্ষম করুন"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"TV টিউনার সেট আপ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB চ্যানেল টিউনার সেটআপ"</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">
<item quantity="one">%1$dটি চ্যানেল পাওয়া গেছে</item>
<item quantity="other">%1$dটি চ্যানেল পাওয়া গেছে</item>
diff --git a/usbtuner-res/values-ca/strings.xml b/usbtuner-res/values-ca/strings.xml
index 4c8290d6..af90c3d6 100644
--- a/usbtuner-res/values-ca/strings.xml
+++ b/usbtuner-res/values-ca/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"L\'àudio AC3 no està disponible"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">S\'han trobat %1$d canals</item>
<item quantity="one">S\'ha trobat %1$d canal</item>
diff --git a/usbtuner-res/values-cs/strings.xml b/usbtuner-res/values-cs/strings.xml
index 2a90308f..151083c6 100644
--- a/usbtuner-res/values-cs/strings.xml
+++ b/usbtuner-res/values-cs/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Zvuk AC3 není k dispozici"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="few">Byly nalezeny %1$d kanály</item>
<item quantity="many">Bylo nalezeno %1$d kanálu</item>
diff --git a/usbtuner-res/values-da/strings.xml b/usbtuner-res/values-da/strings.xml
index 3625c8ac..cea5d3c3 100644
--- a/usbtuner-res/values-da/strings.xml
+++ b/usbtuner-res/values-da/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3-lyd er ikke tilgængelig"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Aktivér surroundsound i systemets lydindstillinger for at aktivere lyd"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">Der blev fundet %1$d kanal</item>
<item quantity="other">Der blev fundet %1$d kanaler</item>
diff --git a/usbtuner-res/values-de/strings.xml b/usbtuner-res/values-de/strings.xml
index e1a9c5f4..eab5fb1d 100644
--- a/usbtuner-res/values-de/strings.xml
+++ b/usbtuner-res/values-de/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC-3-Audio nicht verfügbar"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d Kanäle gefunden</item>
<item quantity="one">%1$d Kanal gefunden</item>
diff --git a/usbtuner-res/values-el/strings.xml b/usbtuner-res/values-el/strings.xml
index 19e4d0a0..6a033e3c 100644
--- a/usbtuner-res/values-el/strings.xml
+++ b/usbtuner-res/values-el/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Δεν υπάρχει διαθέσιμος ήχος AC3"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Ενεργοποιήστε τον περιφερειακό ήχο στις ρυθμίσεις ήχου συστήματος για να ενεργοποιήσετε τον ήχο"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Ρύθμιση δέκτη τηλεόρασης"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Ρύθμιση δέκτη καναλιών USB"</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">
<item quantity="other">Βρέθηκαν %1$d κανάλια</item>
<item quantity="one">Βρέθηκε %1$d κανάλι</item>
diff --git a/usbtuner-res/values-en-rAU/strings.xml b/usbtuner-res/values-en-rAU/strings.xml
index 70bd01c9..11e639fd 100644
--- a/usbtuner-res/values-en-rAU/strings.xml
+++ b/usbtuner-res/values-en-rAU/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 audio not available"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"To enable audio, enable surround sound in system sound settings"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d channels found</item>
<item quantity="one">%1$d channel found</item>
diff --git a/usbtuner-res/values-en-rGB/strings.xml b/usbtuner-res/values-en-rGB/strings.xml
index 70bd01c9..11e639fd 100644
--- a/usbtuner-res/values-en-rGB/strings.xml
+++ b/usbtuner-res/values-en-rGB/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 audio not available"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"To enable audio, enable surround sound in system sound settings"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d channels found</item>
<item quantity="one">%1$d channel found</item>
diff --git a/usbtuner-res/values-en-rIN/strings.xml b/usbtuner-res/values-en-rIN/strings.xml
index 70bd01c9..11e639fd 100644
--- a/usbtuner-res/values-en-rIN/strings.xml
+++ b/usbtuner-res/values-en-rIN/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 audio not available"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"To enable audio, enable surround sound in system sound settings"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d channels found</item>
<item quantity="one">%1$d channel found</item>
diff --git a/usbtuner-res/values-es-rUS/strings.xml b/usbtuner-res/values-es-rUS/strings.xml
index 6339c2fa..da7ec699 100644
--- a/usbtuner-res/values-es-rUS/strings.xml
+++ b/usbtuner-res/values-es-rUS/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"El audio AC3 no está disponible"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">Se encontraron %1$d canales</item>
<item quantity="one">Se encontró %1$d canal</item>
diff --git a/usbtuner-res/values-es/strings.xml b/usbtuner-res/values-es/strings.xml
index eee2d589..e8e34cb2 100644
--- a/usbtuner-res/values-es/strings.xml
+++ b/usbtuner-res/values-es/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Audio AC3 no disponible"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d canales encontrados</item>
<item quantity="one">%1$d canal encontrado</item>
diff --git a/usbtuner-res/values-et-rEE/strings.xml b/usbtuner-res/values-et-rEE/strings.xml
index 63bd3859..70cb238a 100644
--- a/usbtuner-res/values-et-rEE/strings.xml
+++ b/usbtuner-res/values-et-rEE/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3-heli pole saadaval"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Heli lubamiseks lubage ruumiline heli süsteemi heliseadetes"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Telerituuneri seadistus"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB-kanalituuneri 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">
<item quantity="other">Leiti %1$d kanalit</item>
<item quantity="one">Leiti %1$d kanal</item>
diff --git a/usbtuner-res/values-eu-rES/strings.xml b/usbtuner-res/values-eu-rES/strings.xml
index 409b5ee1..a0d456eb 100644
--- a/usbtuner-res/values-eu-rES/strings.xml
+++ b/usbtuner-res/values-eu-rES/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 audioa ez dago erabilgarri"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Audioa gaitzeko, joan sistemaren soinuaren ezarpenetara eta gaitu soinu inguratzailea"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Sintonizadorearen konfigurazioa"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB kanal-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">
<item quantity="other">%1$d kanal aurkitu dira</item>
<item quantity="one">%1$d kanal aurkitu da</item>
diff --git a/usbtuner-res/values-fa/strings.xml b/usbtuner-res/values-fa/strings.xml
index 91c99284..8a51a4fc 100644
--- a/usbtuner-res/values-fa/strings.xml
+++ b/usbtuner-res/values-fa/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"‏صوت AC3 در دسترس نیست"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"برای فعال کردن صدا، صدای فراگیر را در تنظیمات صدای سیستم فعال کنید"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"راه‌اندازی تنظیم‌کننده تلویزیون"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"‏راه‌اندازی تنظیم‌کننده کانال USB"</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">
<item quantity="one">‏%1$d کانال پیدا شد</item>
<item quantity="other">‏%1$d کانال پیدا شد</item>
diff --git a/usbtuner-res/values-fi/strings.xml b/usbtuner-res/values-fi/strings.xml
index e24230c5..79d0c7f5 100644
--- a/usbtuner-res/values-fi/strings.xml
+++ b/usbtuner-res/values-fi/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3-ääni ei ole käytettävissä."</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d kanavaa löytyi.</item>
<item quantity="one">%1$d kanava löytyi.</item>
diff --git a/usbtuner-res/values-fr-rCA/strings.xml b/usbtuner-res/values-fr-rCA/strings.xml
index ea812f44..54e8759e 100644
--- a/usbtuner-res/values-fr-rCA/strings.xml
+++ b/usbtuner-res/values-fr-rCA/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"L\'audio au format AC3 n\'est pas pris en charge"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">%1$d chaîne détectée</item>
<item quantity="other">%1$d chaînes détectées</item>
diff --git a/usbtuner-res/values-fr/strings.xml b/usbtuner-res/values-fr/strings.xml
index 87eab840..4cb551f7 100644
--- a/usbtuner-res/values-fr/strings.xml
+++ b/usbtuner-res/values-fr/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Audio au format AC3 indisponible"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">%1$d chaîne a été détectée.</item>
<item quantity="other">%1$d chaînes ont été détectées.</item>
diff --git a/usbtuner-res/values-gl-rES/strings.xml b/usbtuner-res/values-gl-rES/strings.xml
index e7b01289..58c14605 100644
--- a/usbtuner-res/values-gl-rES/strings.xml
+++ b/usbtuner-res/values-gl-rES/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Non está dispoñible o audio AC3"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">Atopáronse %1$d canles</item>
<item quantity="one">Atopouse %1$d canle</item>
diff --git a/usbtuner-res/values-hi/strings.xml b/usbtuner-res/values-hi/strings.xml
index 57149111..ea0d51c1 100644
--- a/usbtuner-res/values-hi/strings.xml
+++ b/usbtuner-res/values-hi/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ऑडियो उपलब्‍ध नहीं है"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ऑडियो सक्षम करने के लिए सिस्टम साउंड सेटिंग में सराउंड साउंड सक्षम करें"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"टीवी ट्यूनर सेटअप"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB चैनल ट्यूनर सेटअप"</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">
<item quantity="one">%1$d चैनल मिले</item>
<item quantity="other">%1$d चैनल मिले</item>
diff --git a/usbtuner-res/values-hr/strings.xml b/usbtuner-res/values-hr/strings.xml
index 75fa0031..4a00deaf 100644
--- a/usbtuner-res/values-hr/strings.xml
+++ b/usbtuner-res/values-hr/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 audio nije dostupan"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">Pronađen je %1$d kanal</item>
<item quantity="few">Pronađena su %1$d kanala</item>
diff --git a/usbtuner-res/values-hu/strings.xml b/usbtuner-res/values-hu/strings.xml
index b4ee2b06..e2bca51c 100644
--- a/usbtuner-res/values-hu/strings.xml
+++ b/usbtuner-res/values-hu/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Nem áll rendelkezésre AC3-hang"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d csatorna észlelve</item>
<item quantity="one">%1$d csatorna észlelve</item>
diff --git a/usbtuner-res/values-hy-rAM/strings.xml b/usbtuner-res/values-hy-rAM/strings.xml
index fcb264da..a8e33eac 100644
--- a/usbtuner-res/values-hy-rAM/strings.xml
+++ b/usbtuner-res/values-hy-rAM/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ձայնը անհասանելի է"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Ձայնը միացնելու համար համակարգի ձայնի կարգավորումներում ակտիվացրեք ծավալային ձայնը"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Հեռուստակարգավորիչի տեղադրում"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Ալիքների USB կարգավորիչի տեղադրում"</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">
<item quantity="one">%1$d channels found</item>
<item quantity="other">Գտնվել է %1$d ալիք</item>
diff --git a/usbtuner-res/values-in/strings.xml b/usbtuner-res/values-in/strings.xml
index 07633473..e534c9c6 100644
--- a/usbtuner-res/values-in/strings.xml
+++ b/usbtuner-res/values-in/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Audio AC3 tidak tersedia"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Aktifkan suara surround di setelan suara sistem untuk mengaktifkan audio"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d saluran ditemukan</item>
<item quantity="one">%1$d saluran ditemukan</item>
diff --git a/usbtuner-res/values-is-rIS/strings.xml b/usbtuner-res/values-is-rIS/strings.xml
index 2c5c940e..f63d9810 100644
--- a/usbtuner-res/values-is-rIS/strings.xml
+++ b/usbtuner-res/values-is-rIS/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3-hljóð er ekki í boði"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Kveikja á víðómastillingu í hljóðstillingum kerfisins til að kveikja á hljóði"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">%1$d rás fannst</item>
<item quantity="other">%1$d rásir fundust</item>
diff --git a/usbtuner-res/values-it/strings.xml b/usbtuner-res/values-it/strings.xml
index edc44039..7787d019 100644
--- a/usbtuner-res/values-it/strings.xml
+++ b/usbtuner-res/values-it/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Audio AC3 non disponibile"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Per attivare l\'audio, attiva l\'audio surround nelle impostazioni del sistema"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d canali trovati</item>
<item quantity="one">%1$d canale trovato</item>
diff --git a/usbtuner-res/values-iw/strings.xml b/usbtuner-res/values-iw/strings.xml
index 32524757..5dab5f15 100644
--- a/usbtuner-res/values-iw/strings.xml
+++ b/usbtuner-res/values-iw/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"‏אודיו מסוג AC3 אינו זמין"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"הפעל סראונד בהגדרות צלילי מערכת כדי להפעיל אודיו"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"הגדרת טיונר טלוויזיה"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"‏הגדרת טיונר ערוצים בחיבור USB"</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">
<item quantity="two">‏נמצאו %1$d ערוצים</item>
<item quantity="many">‏נמצאו %1$d ערוצים</item>
diff --git a/usbtuner-res/values-ja/strings.xml b/usbtuner-res/values-ja/strings.xml
index adec2004..88af255a 100644
--- a/usbtuner-res/values-ja/strings.xml
+++ b/usbtuner-res/values-ja/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 オーディオは利用できません"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"音声を有効にするには、システムのサウンド設定でサラウンド サウンドをオンにしてください"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"テレビ チューナーのセットアップ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB チャンネル チューナーのセットアップ"</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">
<item quantity="other">%1$d 件のチャンネルが見つかりました</item>
<item quantity="one">%1$d 件のチャンネルが見つかりました</item>
diff --git a/usbtuner-res/values-ka-rGE/strings.xml b/usbtuner-res/values-ka-rGE/strings.xml
index c2a302d2..e09428d7 100644
--- a/usbtuner-res/values-ka-rGE/strings.xml
+++ b/usbtuner-res/values-ka-rGE/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 აუდიო მიუწვდომელია"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"აუდიოს ჩასართავად, სისტემის ხმის პარამეტრებში ჩართეთ მოცულობითი ხმა"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"TV-ტუნერის დაყენება"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"არხების USB ტუნერის დაყენება"</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">
<item quantity="other">მოიძებნა %1$d არხი</item>
<item quantity="one">მოიძებნა %1$d არხი</item>
diff --git a/usbtuner-res/values-kk-rKZ/strings.xml b/usbtuner-res/values-kk-rKZ/strings.xml
index addb4890..3c2ba4f3 100644
--- a/usbtuner-res/values-kk-rKZ/strings.xml
+++ b/usbtuner-res/values-kk-rKZ/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 форматындағы аудио қолжетімді емес"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Аудиомазмұнды қосу үшін жүйенің параметрлерінде көлемдік дыбысты қосыңыз"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"ТД тюнерін орнату"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB арна тюнерін орнату"</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">
<item quantity="other">%1$d арна табылды</item>
<item quantity="one">%1$d арна табылды</item>
diff --git a/usbtuner-res/values-km-rKH/strings.xml b/usbtuner-res/values-km-rKH/strings.xml
index 51eaf380..904f3e5d 100644
--- a/usbtuner-res/values-km-rKH/strings.xml
+++ b/usbtuner-res/values-km-rKH/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"មិនមានសំឡេង AC3 ទេ"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"បើកដំណើរការសំឡេងជុំវិញនៅក្នុងការកំណត់សំឡេងប្រព័ន្ធដើម្បីបើកដំណើរការអូឌីយ៉ូ"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"ការដំឡើងអង្គរាវប៉ុស្តិ៍ទូរទស្សន៍"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"ការដំឡើងឧបករណ៍ USB រាវប៉ុស្តិ៍ទូរទស្សន៍"</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">
<item quantity="other">បានរកឃើញប៉ុស្តិ៍ %1$d</item>
<item quantity="one">បានរកឃើញប៉ុស្តិ៍ %1$d</item>
diff --git a/usbtuner-res/values-kn-rIN/strings.xml b/usbtuner-res/values-kn-rIN/strings.xml
index 95244b89..fb97ae2b 100644
--- a/usbtuner-res/values-kn-rIN/strings.xml
+++ b/usbtuner-res/values-kn-rIN/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ಆಡಿಯೊ ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ಆಡಿಯೊ ಸಕ್ರಿಯಗೊಳಿಸಲು ಸಿಸ್ಟಂ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಸರೌಂಡ್ ಧ್ವನಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"ಟಿವಿ ಟ್ಯೂನರ್ ಸೆಟಪ್"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB ಚಾನಲ್ ಟ್ಯೂನರ್ ಸೆಟಪ್"</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">
<item quantity="one">%1$d ಚಾನಲ್‌ಗಳು ಕಂಡುಬಂದಿವೆ</item>
<item quantity="other">%1$d ಚಾನಲ್‌ಗಳು ಕಂಡುಬಂದಿವೆ</item>
diff --git a/usbtuner-res/values-ko/strings.xml b/usbtuner-res/values-ko/strings.xml
index f53703bf..2c67ab6f 100644
--- a/usbtuner-res/values-ko/strings.xml
+++ b/usbtuner-res/values-ko/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 오디오를 사용할 수 없습니다."</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"오디오를 사용하려면 시스템 사운드 설정에서 서라운드 사운드를 사용 설정하세요."</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"TV 튜너 설정"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB 채널 튜너 설정"</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">
<item quantity="other">채널 %1$d개 발견</item>
<item quantity="one">채널 %1$d개 발견</item>
diff --git a/usbtuner-res/values-ky-rKG/strings.xml b/usbtuner-res/values-ky-rKG/strings.xml
index b8556288..39e9d1df 100644
--- a/usbtuner-res/values-ky-rKG/strings.xml
+++ b/usbtuner-res/values-ky-rKG/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 аудио жеткиликтүү эмес"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Каналдын үнүн чыгаруу үчүн тутумдун үн жөндөөлөрүнө өтүп, көлөмдүү добушту иштетүү керек"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Сыналгы күүлөгүчүн жөндөө"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB канал күүлөгүчүн жөндөө"</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">
<item quantity="other">%1$d канал табылды</item>
<item quantity="one">%1$d канал табылды</item>
diff --git a/usbtuner-res/values-lo-rLA/strings.xml b/usbtuner-res/values-lo-rLA/strings.xml
index 1028ffc0..954baabe 100644
--- a/usbtuner-res/values-lo-rLA/strings.xml
+++ b/usbtuner-res/values-lo-rLA/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"ບໍ່ມີສຽງ AC3 ຢູ່"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ເປີດໃຊ້ສຽງຮອບທິດທາງໃນການຕັ້ງຄ່າລະບົບສຽງເພື່ອເປີດໃຊ້ສຽງ."</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"ຕັ້ງຄ່າຕົວຮັບສັນຍານໂທລະພາບ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"ການຕັ້ງເຄື່ອງຮັບສັນຍານຊ່ອງ USB"</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">
<item quantity="other">ພົບ %1$d ຊ່ອງ</item>
<item quantity="one">ພົບ %1$d ຊ່ອງ</item>
diff --git a/usbtuner-res/values-lt/strings.xml b/usbtuner-res/values-lt/strings.xml
index c0b11839..3ce2efc7 100644
--- a/usbtuner-res/values-lt/strings.xml
+++ b/usbtuner-res/values-lt/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 garso įrašas nepasiekiamas"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Įgalinkite erdvinį garsą sistemos garso nustatymuose, kad galėtumėte įgalinti garsą"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">Rastas %1$d kanalas</item>
<item quantity="few">Rasti %1$d kanalai</item>
diff --git a/usbtuner-res/values-lv/strings.xml b/usbtuner-res/values-lv/strings.xml
index 553b5375..9337e7b3 100644
--- a/usbtuner-res/values-lv/strings.xml
+++ b/usbtuner-res/values-lv/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 audio nav pieejams."</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="zero">Atrasti %1$d kanāli</item>
<item quantity="one">Atrasts %1$d kanāls</item>
diff --git a/usbtuner-res/values-mk-rMK/strings.xml b/usbtuner-res/values-mk-rMK/strings.xml
index db7f999c..fb2e71e7 100644
--- a/usbtuner-res/values-mk-rMK/strings.xml
+++ b/usbtuner-res/values-mk-rMK/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3-аудио не е достапно"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Овозможете опкружувачки звук во поставките за звуци на системот за да овозможите аудио"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Поставување ТВ приемник"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Поставување на USB-приемникот за канали"</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">
<item quantity="one">Пронајден е %1$d канал</item>
<item quantity="other">Пронајдени се %1$d канали</item>
diff --git a/usbtuner-res/values-ml-rIN/strings.xml b/usbtuner-res/values-ml-rIN/strings.xml
index affe0a31..d025ec7b 100644
--- a/usbtuner-res/values-ml-rIN/strings.xml
+++ b/usbtuner-res/values-ml-rIN/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ഓഡിയോ ലഭ്യമല്ല"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ഓഡിയോ പ്രവർത്തനക്ഷമമാക്കുന്നതിന് സിസ്റ്റം ശബ്ദ ക്രമീകരണത്തിൽ സറൗണ്ട് ശബ്‌ദം പ്രവർത്തനക്ഷമമാക്കുക"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"ടിവി ട്യൂണർ സജ്ജമാക്കല്‍‌"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB ചാനൽ ട്യൂണർ സജ്ജമാക്കല്‍‌"</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">
<item quantity="other">%1$d ചാനലുകൾ കണ്ടെത്തി</item>
<item quantity="one">%1$d ചാനൽ കണ്ടെത്തി</item>
diff --git a/usbtuner-res/values-mn-rMN/strings.xml b/usbtuner-res/values-mn-rMN/strings.xml
index 666d667a..51f7a8dd 100644
--- a/usbtuner-res/values-mn-rMN/strings.xml
+++ b/usbtuner-res/values-mn-rMN/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 аудио боломжгүй байна"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Аудиог идэвхжүүлэхийн тулд орчны дууны системийг дууны тохиргоонд идэвхжүүлнэ үү"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"ТВ тохируулагчийн тохиргоо"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB суваг тохируулагчийн тохиргоо"</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">
<item quantity="other">%1$d суваг оллоо</item>
<item quantity="one">%1$d суваг оллоо</item>
diff --git a/usbtuner-res/values-mr-rIN/strings.xml b/usbtuner-res/values-mr-rIN/strings.xml
index d9518ed4..2ea242f1 100644
--- a/usbtuner-res/values-mr-rIN/strings.xml
+++ b/usbtuner-res/values-mr-rIN/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ऑडिओ उपलब्ध नाही"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ऑडिओ सक्षम करण्यासाठी सिस्टीम ध्वनी सेटिंग्ज मध्ये सराउंड ध्वनी सक्षम करा"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"टीव्ही ट्यूनर सेटअप"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB चॅनेल ट्यूनर सेटअप"</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">
<item quantity="one">%1$d चॅनेल सापडले</item>
<item quantity="other">%1$d चॅनेल सापडले</item>
diff --git a/usbtuner-res/values-ms-rMY/strings.xml b/usbtuner-res/values-ms-rMY/strings.xml
index ccc933aa..578e8ae5 100644
--- a/usbtuner-res/values-ms-rMY/strings.xml
+++ b/usbtuner-res/values-ms-rMY/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Audio AC3 tidak tersedia"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Dayakan bunyi keliling dalam tetapan bunyi sistem untuk mendayakan audio"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d saluran ditemui</item>
<item quantity="one">%1$d saluran ditemui</item>
diff --git a/usbtuner-res/values-my-rMM/strings.xml b/usbtuner-res/values-my-rMM/strings.xml
index 00762d7d..56a29e51 100644
--- a/usbtuner-res/values-my-rMM/strings.xml
+++ b/usbtuner-res/values-my-rMM/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 အသံစနစ်ကို အသုံးမပြုနိုင်သေးပါ"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"အသံဖွင့်ရန် ပတ်ပတ်လည်အသံစနစ်ဆက်တင်များကို ဖွင့်ပါ"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"တီဗီချန်နယ်ချိန်ကိရိယာ ပြင်ဆင်သတ်မှတ်မှု"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB ချန်နယ်ချိန်ကိရိယာ ပြင်ဆင်သတ်မှတ်မှု"</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">
<item quantity="other">ချန်နယ် %1$d လိုင်းတွေ့သည်</item>
<item quantity="one">ချန်နယ် %1$d လိုင်းတွေ့သည်</item>
diff --git a/usbtuner-res/values-nb/strings.xml b/usbtuner-res/values-nb/strings.xml
index e56f5945..bce9e176 100644
--- a/usbtuner-res/values-nb/strings.xml
+++ b/usbtuner-res/values-nb/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3-lyd er ikke tilgjengelig"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Slå på surroundlyd i innstillingene for systemlyd for å slå på lyd"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d kanaler er funnet</item>
<item quantity="one">%1$d kanal er funnet</item>
diff --git a/usbtuner-res/values-ne-rNP/strings.xml b/usbtuner-res/values-ne-rNP/strings.xml
index 13fbad4c..07d68e2c 100644
--- a/usbtuner-res/values-ne-rNP/strings.xml
+++ b/usbtuner-res/values-ne-rNP/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 अडियो उपलब्ध छैन"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"अडियोलाई सक्षम पार्न प्रणालीको ध्वनि सम्बन्धी सेटिङहरूमा गई सराउन्ड साउन्डलाई सक्षम पार्नुहोस्"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"TV ट्युनरको सेटअप"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB च्यानल ट्युनरको सेटअप"</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">
<item quantity="other">%1$d च्यानलहरू भेट्टिए</item>
<item quantity="one">%1$d च्यानल भेट्टियो</item>
diff --git a/usbtuner-res/values-nl/strings.xml b/usbtuner-res/values-nl/strings.xml
index 3fd6d114..b9e18682 100644
--- a/usbtuner-res/values-nl/strings.xml
+++ b/usbtuner-res/values-nl/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3-audio niet beschikbaar"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d kanalen gevonden</item>
<item quantity="one">%1$d kanaal gevonden</item>
diff --git a/usbtuner-res/values-pl/strings.xml b/usbtuner-res/values-pl/strings.xml
index 1b432b9c..0bc7e734 100644
--- a/usbtuner-res/values-pl/strings.xml
+++ b/usbtuner-res/values-pl/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Dźwięk AC3 jest niedostępny"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="few">Znaleziono %1$d kanały</item>
<item quantity="many">Znaleziono %1$d kanałów</item>
diff --git a/usbtuner-res/values-pt-rPT/strings.xml b/usbtuner-res/values-pt-rPT/strings.xml
index 2b20d789..c78c92c1 100644
--- a/usbtuner-res/values-pt-rPT/strings.xml
+++ b/usbtuner-res/values-pt-rPT/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Áudio AC3 não disponível"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d canais encontrados</item>
<item quantity="one">%1$d canal encontrado</item>
diff --git a/usbtuner-res/values-pt/strings.xml b/usbtuner-res/values-pt/strings.xml
index de18caaf..3dfd30c0 100644
--- a/usbtuner-res/values-pt/strings.xml
+++ b/usbtuner-res/values-pt/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"O áudio AC3 não está disponível"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">%1$d canal encontrado</item>
<item quantity="other">%1$d canais encontrados</item>
diff --git a/usbtuner-res/values-ro/strings.xml b/usbtuner-res/values-ro/strings.xml
index 17885158..57f1ca48 100644
--- a/usbtuner-res/values-ro/strings.xml
+++ b/usbtuner-res/values-ro/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Conținutul audio AC3 nu este disponibil"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="few">%1$d canale găsite</item>
<item quantity="other">%1$d de canale găsite</item>
diff --git a/usbtuner-res/values-ru/strings.xml b/usbtuner-res/values-ru/strings.xml
index a48ba638..7509ff19 100644
--- a/usbtuner-res/values-ru/strings.xml
+++ b/usbtuner-res/values-ru/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Аудио в формате AC3 недоступно"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Включите объемный звук в системных настройках"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Настройка ТВ-тюнера"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Настройка USB-тюнера"</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">
<item quantity="one">Найден %1$d канал</item>
<item quantity="few">Найдено %1$d канала</item>
diff --git a/usbtuner-res/values-si-rLK/strings.xml b/usbtuner-res/values-si-rLK/strings.xml
index 620f7106..a792b2c0 100644
--- a/usbtuner-res/values-si-rLK/strings.xml
+++ b/usbtuner-res/values-si-rLK/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ශ්‍රව්‍ය ලබාගත නොහැකිය"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ශ්‍රව්‍ය සබල කිරීමට හඬ සැකසීම් තුළ අවට හඬ සබල කරන්න"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"TV සුසරක පිහිටුවීම"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB නාලිකා සුසරක පිහිටුවීම"</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">
<item quantity="one">නාලිකා %1$dක් සොයා ගන්නා ලදී</item>
<item quantity="other">නාලිකා %1$dක් සොයා ගන්නා ලදී</item>
diff --git a/usbtuner-res/values-sk/strings.xml b/usbtuner-res/values-sk/strings.xml
index 5ad23eef..67f9829e 100644
--- a/usbtuner-res/values-sk/strings.xml
+++ b/usbtuner-res/values-sk/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Zvuk AC3 nie je k dispozícii"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="few">Našli sa %1$d kanály</item>
<item quantity="many">Našlo sa %1$d kanála</item>
diff --git a/usbtuner-res/values-sl/strings.xml b/usbtuner-res/values-sl/strings.xml
index 5890588b..e454e971 100644
--- a/usbtuner-res/values-sl/strings.xml
+++ b/usbtuner-res/values-sl/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Zvok AC3 ni na voljo"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">Najden je bil %1$d kanal</item>
<item quantity="two">Najdena sta bila %1$d kanala</item>
diff --git a/usbtuner-res/values-sr/strings.xml b/usbtuner-res/values-sr/strings.xml
index 8d36db24..6c1fa1bf 100644
--- a/usbtuner-res/values-sr/strings.xml
+++ b/usbtuner-res/values-sr/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 аудио није доступан"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Омогући звучни систем у подешавањима звука да бисте омогућили аудио"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Подешавање тјунера за ТВ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Подешавање USB тјунера за канале"</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">
<item quantity="one">Пронађен је %1$d канал</item>
<item quantity="few">Пронађена су %1$d канала</item>
diff --git a/usbtuner-res/values-sv/strings.xml b/usbtuner-res/values-sv/strings.xml
index a372e88a..dea421bb 100644
--- a/usbtuner-res/values-sv/strings.xml
+++ b/usbtuner-res/values-sv/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3-ljud är inte tillgängligt"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d kanaler hittades</item>
<item quantity="one">%1$d kanal hittades</item>
diff --git a/usbtuner-res/values-sw/strings.xml b/usbtuner-res/values-sw/strings.xml
index c7ccd34f..1ade7516 100644
--- a/usbtuner-res/values-sw/strings.xml
+++ b/usbtuner-res/values-sw/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Kipengele cha sauti cha AC3 hakipatikani"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">Vituo %1$d vimepatikana</item>
<item quantity="one">Kituo %1$d kimepatikana</item>
diff --git a/usbtuner-res/values-ta-rIN/strings.xml b/usbtuner-res/values-ta-rIN/strings.xml
index c6465dd1..dd09420d 100644
--- a/usbtuner-res/values-ta-rIN/strings.xml
+++ b/usbtuner-res/values-ta-rIN/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ஆடியோ இல்லை"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ஆடியோவை இயக்க, சாதன ஒலி அமைப்புகளில் \"சரவுண்ட் சவுண்ட்\" என்பதை இயக்கவும்"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"டிவி ட்யூனர் அமைவு"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB சேனல் ட்யூனர் அமைவு"</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">
<item quantity="other">%1$d சேனல்கள் கண்டறியப்பட்டன</item>
<item quantity="one">%1$d சேனல் கண்டறியப்பட்டது</item>
diff --git a/usbtuner-res/values-te-rIN/strings.xml b/usbtuner-res/values-te-rIN/strings.xml
index c354ba64..a80bd1c7 100644
--- a/usbtuner-res/values-te-rIN/strings.xml
+++ b/usbtuner-res/values-te-rIN/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ఆడియో అందుబాటులో లేదు"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"ఆడియోను ప్రారంభించడానికి సిస్టమ్ శబ్ద సెట్టింగ్‌ల్లో పరిసర వ్యాప్త శబ్దాన్ని ప్రారంభించండి"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"టీవీ ట్యూనర్ సెటప్"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB ఛానెల్ ట్యూనర్ సెటప్"</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">
<item quantity="other">%1$d ఛానెల్‌లు కనుగొనబడ్డాయి</item>
<item quantity="one">%1$d ఛానెల్ కనుగొనబడింది</item>
diff --git a/usbtuner-res/values-th/strings.xml b/usbtuner-res/values-th/strings.xml
index e1457135..217520df 100644
--- a/usbtuner-res/values-th/strings.xml
+++ b/usbtuner-res/values-th/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"ไม่สามารถใช้สัญญาณเสียง AC3"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"เปิดใช้เสียงเซอร์ราวด์ในการตั้งค่าเสียงของระบบเพื่อเปิดใช้เสียง"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"ตั้งค่าตัวรับสัญญาณทีวี"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"ตั้งค่าตัวรับสัญญาณช่องแบบ USB"</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">
<item quantity="other">พบ %1$d ช่อง</item>
<item quantity="one">พบ %1$d ช่อง</item>
diff --git a/usbtuner-res/values-tl/strings.xml b/usbtuner-res/values-tl/strings.xml
index 59d51a47..7a0ce826 100644
--- a/usbtuner-res/values-tl/strings.xml
+++ b/usbtuner-res/values-tl/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Hindi available ang AC3 audio"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">Nakahanap ng %1$d channel</item>
<item quantity="other">Nakahanap ng %1$d na channel</item>
diff --git a/usbtuner-res/values-tr/strings.xml b/usbtuner-res/values-tr/strings.xml
index c0ec34a6..29910f9e 100644
--- a/usbtuner-res/values-tr/strings.xml
+++ b/usbtuner-res/values-tr/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 ses kullanılamıyor"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">%1$d kanal bulundu</item>
<item quantity="one">%1$d kanal bulundu</item>
diff --git a/usbtuner-res/values-uk/strings.xml b/usbtuner-res/values-uk/strings.xml
index ba67402c..cf7cc85e 100644
--- a/usbtuner-res/values-uk/strings.xml
+++ b/usbtuner-res/values-uk/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Аудіо у форматі AC3 не підтримується"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Увімкнути об’ємний звук у налаштуваннях системи, щоб слухати аудіо"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"Налаштування ТВ-тюнера"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"Налаштування USB-тюнера"</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">
<item quantity="one">Знайдено %1$d канал</item>
<item quantity="few">Знайдено %1$d канали</item>
diff --git a/usbtuner-res/values-ur-rPK/strings.xml b/usbtuner-res/values-ur-rPK/strings.xml
index f4dcac68..68c85d05 100644
--- a/usbtuner-res/values-ur-rPK/strings.xml
+++ b/usbtuner-res/values-ur-rPK/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"‏AC3 آڈیو دستیاب نہیں ہے"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"آڈیو کو فعال کرنے کیلئے سسٹم کی آواز کی ترتیبات میں محیط آواز فعال کریں"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"‏TV ٹیونر سیٹ اپ"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"‏USB چینل ٹیونر سیٹ اپ"</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">
<item quantity="other">‏%1$d چینلز ملے</item>
<item quantity="one">‏%1$d چینل ملا</item>
diff --git a/usbtuner-res/values-uz-rUZ/strings.xml b/usbtuner-res/values-uz-rUZ/strings.xml
index c141479d..9aefd57b 100644
--- a/usbtuner-res/values-uz-rUZ/strings.xml
+++ b/usbtuner-res/values-uz-rUZ/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"AC3 formatidagi audio qo‘llab-quvvatlanmaydi"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Audioni yoqish uchun tizim ovozi sozlamalari orqali qamrovli ovozni yoqing"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"TV-tyunerni sozlash"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB-tyunerni 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">
<item quantity="other">%1$d ta kanal topildi</item>
<item quantity="one">%1$d ta kanal topildi</item>
diff --git a/usbtuner-res/values-vi/strings.xml b/usbtuner-res/values-vi/strings.xml
index 69a88e1d..605234e4 100644
--- a/usbtuner-res/values-vi/strings.xml
+++ b/usbtuner-res/values-vi/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Không có âm thanh AC3"</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="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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="other">Đã tìm thấy %1$d kênh</item>
<item quantity="one">Đã tìm thấy %1$d kênh</item>
diff --git a/usbtuner-res/values-zh-rCN/strings.xml b/usbtuner-res/values-zh-rCN/strings.xml
index 91e4780c..a4f6da22 100644
--- a/usbtuner-res/values-zh-rCN/strings.xml
+++ b/usbtuner-res/values-zh-rCN/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"无法播放 AC3 音频"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"在系统声音设置中启用环绕声即可启用音频"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"电视调谐器设置"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB 频道调谐器设置"</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">
<item quantity="other">找到 %1$d 个频道</item>
<item quantity="one">找到 %1$d 个频道</item>
diff --git a/usbtuner-res/values-zh-rHK/strings.xml b/usbtuner-res/values-zh-rHK/strings.xml
index 0854b548..6d40401e 100644
--- a/usbtuner-res/values-zh-rHK/strings.xml
+++ b/usbtuner-res/values-zh-rHK/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"無法使用 AC3 音效"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"在系統音效設定中啟用環迴立體聲功能即可啟用音效"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"電視調諧器設定"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB 頻道調諧器設定"</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">
<item quantity="other">已找到 %1$d 個頻道</item>
<item quantity="one">已找到 %1$d 個頻道</item>
diff --git a/usbtuner-res/values-zh-rTW/strings.xml b/usbtuner-res/values-zh-rTW/strings.xml
index c0153bd7..802d8b73 100644
--- a/usbtuner-res/values-zh-rTW/strings.xml
+++ b/usbtuner-res/values-zh-rTW/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"無法使用 AC3 音訊"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"前往系統音效設定開啟環繞音效即可啟用音訊"</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>
@@ -55,6 +55,7 @@
<string name="bt_channel_scan" msgid="3291924771702347469">"電視調諧器設定"</string>
<string name="ut_channel_scan" msgid="6100090671500464604">"USB 頻道調諧器設定"</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">
<item quantity="other">找到 %1$d 個頻道</item>
<item quantity="one">找到 %1$d 個頻道</item>
diff --git a/usbtuner-res/values-zu/strings.xml b/usbtuner-res/values-zu/strings.xml
index 99908abc..905e9a16 100644
--- a/usbtuner-res/values-zu/strings.xml
+++ b/usbtuner-res/values-zu/strings.xml
@@ -27,7 +27,7 @@
<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_ac3_passthrough_unavailable" msgid="7523756232660190058">"Umsindo we-AC3 awutholakali"</string>
+ <string name="ut_surround_sound_disabled" msgid="6465044734143962900">"Nika amandla umsindo ozungezile kuzilungiselelo zomsindo wesistimu"</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>
@@ -55,6 +55,7 @@
<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="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">
<item quantity="one">%1$d iziteshi ezitholakele</item>
<item quantity="other">%1$d iziteshi ezitholakele</item>
diff --git a/usbtuner-res/values/strings.xml b/usbtuner-res/values/strings.xml
index 51bbc55e..e3a8586d 100644
--- a/usbtuner-res/values/strings.xml
+++ b/usbtuner-res/values/strings.xml
@@ -42,9 +42,9 @@
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
channels.</string>
- <!-- Message that says audio of the current channel is not available due to TV device
- lacking the support of the feature AC3 audio passthrough -->
- <string name="ut_ac3_passthrough_unavailable">AC3 audio not available</string>
+ <!-- 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>
<!-- 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 -->
@@ -111,6 +111,9 @@
<string name="ut_channel_scan">USB 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 -->
+ <string name="ut_channel_scan_tuner_unavailable">Tuner is temporarily not available or already
+ used by recording.</string>
<!-- Message that says channels are found during channel scanning process -->
<plurals name="ut_channel_scan_message">
<item quantity="one">%1$d channel found</item>
@@ -167,4 +170,4 @@
<!-- Message when usb tuner device is unplugged. [CHAR LIMIT=NONE] -->
<string name="msg_usb_device_detached">USB TV tuner disconnected.</string>
-</resources> \ No newline at end of file
+</resources>
diff --git a/version.mk b/version.mk
index 026f2aae..f63f5834 100644
--- a/version.mk
+++ b/version.mk
@@ -54,7 +54,7 @@ base_version_minor := 11
code_version_major := $(shell echo $$(($(base_version_major)+3)))
# x86 and arm sometimes don't match.
-code_version_build := 006
+code_version_build := 011
#####################################################
#####################################################
# Collect automatic version code parameters